Statistics
| Branch: | Revision:

root / tracetool @ c276b17d

History | View | Annotate | Download (9.7 kB)

1 94a420b1 Stefan Hajnoczi
#!/bin/sh
2 94a420b1 Stefan Hajnoczi
#
3 94a420b1 Stefan Hajnoczi
# Code generator for trace events
4 94a420b1 Stefan Hajnoczi
#
5 94a420b1 Stefan Hajnoczi
# Copyright IBM, Corp. 2010
6 94a420b1 Stefan Hajnoczi
#
7 94a420b1 Stefan Hajnoczi
# This work is licensed under the terms of the GNU GPL, version 2.  See
8 94a420b1 Stefan Hajnoczi
# the COPYING file in the top-level directory.
9 94a420b1 Stefan Hajnoczi
10 94a420b1 Stefan Hajnoczi
# Disable pathname expansion, makes processing text with '*' characters simpler
11 94a420b1 Stefan Hajnoczi
set -f
12 94a420b1 Stefan Hajnoczi
13 94a420b1 Stefan Hajnoczi
usage()
14 94a420b1 Stefan Hajnoczi
{
15 94a420b1 Stefan Hajnoczi
    cat >&2 <<EOF
16 7e24e92a Stefan Hajnoczi
usage: $0 [--nop | --simple | --ust] [-h | -c]
17 94a420b1 Stefan Hajnoczi
Generate tracing code for a file on stdin.
18 94a420b1 Stefan Hajnoczi
19 94a420b1 Stefan Hajnoczi
Backends:
20 26f7227b Stefan Hajnoczi
  --nop     Tracing disabled
21 26f7227b Stefan Hajnoczi
  --simple  Simple built-in backend
22 7e24e92a Stefan Hajnoczi
  --ust     LTTng User Space Tracing backend
23 b3d08c02 Daniel P. Berrange
  --dtrace  DTrace/SystemTAP backend
24 94a420b1 Stefan Hajnoczi
25 94a420b1 Stefan Hajnoczi
Output formats:
26 c276b17d Daniel P. Berrange
  -h     Generate .h file
27 c276b17d Daniel P. Berrange
  -c     Generate .c file
28 c276b17d Daniel P. Berrange
  -d     Generate .d file (DTrace only)
29 c276b17d Daniel P. Berrange
  --stap Generate .stp file (DTrace with SystemTAP only)
30 c276b17d Daniel P. Berrange
31 c276b17d Daniel P. Berrange
Options:
32 c276b17d Daniel P. Berrange
  --binary      [path]  Full path to QEMU binary
33 c276b17d Daniel P. Berrange
  --target-arch [arch]  QEMU emulator target arch
34 c276b17d Daniel P. Berrange
  --target-type [type]  QEMU emulator target type ('system' or 'user')
35 c276b17d Daniel P. Berrange
36 94a420b1 Stefan Hajnoczi
EOF
37 94a420b1 Stefan Hajnoczi
    exit 1
38 94a420b1 Stefan Hajnoczi
}
39 94a420b1 Stefan Hajnoczi
40 94a420b1 Stefan Hajnoczi
# Get the name of a trace event
41 94a420b1 Stefan Hajnoczi
get_name()
42 94a420b1 Stefan Hajnoczi
{
43 94a420b1 Stefan Hajnoczi
    echo ${1%%\(*}
44 94a420b1 Stefan Hajnoczi
}
45 94a420b1 Stefan Hajnoczi
46 94a420b1 Stefan Hajnoczi
# Get the argument list of a trace event, including types and names
47 94a420b1 Stefan Hajnoczi
get_args()
48 94a420b1 Stefan Hajnoczi
{
49 94a420b1 Stefan Hajnoczi
    local args
50 94a420b1 Stefan Hajnoczi
    args=${1#*\(}
51 2184d75b Blue Swirl
    args=${args%\)*}
52 94a420b1 Stefan Hajnoczi
    echo "$args"
53 94a420b1 Stefan Hajnoczi
}
54 94a420b1 Stefan Hajnoczi
55 94a420b1 Stefan Hajnoczi
# Get the argument name list of a trace event
56 94a420b1 Stefan Hajnoczi
get_argnames()
57 94a420b1 Stefan Hajnoczi
{
58 b3d08c02 Daniel P. Berrange
    local nfields field name sep
59 94a420b1 Stefan Hajnoczi
    nfields=0
60 b3d08c02 Daniel P. Berrange
    sep="$2"
61 94a420b1 Stefan Hajnoczi
    for field in $(get_args "$1"); do
62 94a420b1 Stefan Hajnoczi
        nfields=$((nfields + 1))
63 94a420b1 Stefan Hajnoczi
64 94a420b1 Stefan Hajnoczi
        # Drop pointer star
65 94a420b1 Stefan Hajnoczi
        field=${field#\*}
66 94a420b1 Stefan Hajnoczi
67 94a420b1 Stefan Hajnoczi
        # Only argument names have commas at the end
68 94a420b1 Stefan Hajnoczi
        name=${field%,}
69 94a420b1 Stefan Hajnoczi
        test "$field" = "$name" && continue
70 94a420b1 Stefan Hajnoczi
71 b3d08c02 Daniel P. Berrange
        printf "%s%s " $name $sep
72 94a420b1 Stefan Hajnoczi
    done
73 94a420b1 Stefan Hajnoczi
74 94a420b1 Stefan Hajnoczi
    # Last argument name
75 94a420b1 Stefan Hajnoczi
    if [ "$nfields" -gt 1 ]
76 94a420b1 Stefan Hajnoczi
    then
77 94a420b1 Stefan Hajnoczi
        printf "%s" "$name"
78 94a420b1 Stefan Hajnoczi
    fi
79 94a420b1 Stefan Hajnoczi
}
80 94a420b1 Stefan Hajnoczi
81 26f7227b Stefan Hajnoczi
# Get the number of arguments to a trace event
82 26f7227b Stefan Hajnoczi
get_argc()
83 26f7227b Stefan Hajnoczi
{
84 26f7227b Stefan Hajnoczi
    local name argc
85 26f7227b Stefan Hajnoczi
    argc=0
86 b3d08c02 Daniel P. Berrange
    for name in $(get_argnames "$1", ","); do
87 26f7227b Stefan Hajnoczi
        argc=$((argc + 1))
88 26f7227b Stefan Hajnoczi
    done
89 26f7227b Stefan Hajnoczi
    echo $argc
90 26f7227b Stefan Hajnoczi
}
91 26f7227b Stefan Hajnoczi
92 94a420b1 Stefan Hajnoczi
# Get the format string for a trace event
93 94a420b1 Stefan Hajnoczi
get_fmt()
94 94a420b1 Stefan Hajnoczi
{
95 94a420b1 Stefan Hajnoczi
    local fmt
96 94a420b1 Stefan Hajnoczi
    fmt=${1#*\"}
97 94a420b1 Stefan Hajnoczi
    fmt=${fmt%\"*}
98 94a420b1 Stefan Hajnoczi
    echo "$fmt"
99 94a420b1 Stefan Hajnoczi
}
100 94a420b1 Stefan Hajnoczi
101 1e2cf2bc Stefan Hajnoczi
# Get the state of a trace event
102 1e2cf2bc Stefan Hajnoczi
get_state()
103 1e2cf2bc Stefan Hajnoczi
{
104 1e2cf2bc Stefan Hajnoczi
    local str disable state
105 1e2cf2bc Stefan Hajnoczi
    str=$(get_name "$1")
106 1e2cf2bc Stefan Hajnoczi
    disable=${str##disable }
107 1e2cf2bc Stefan Hajnoczi
    if [ "$disable" = "$str" ] ; then
108 1e2cf2bc Stefan Hajnoczi
        state=1
109 1e2cf2bc Stefan Hajnoczi
    else
110 1e2cf2bc Stefan Hajnoczi
        state=0
111 1e2cf2bc Stefan Hajnoczi
    fi
112 1e2cf2bc Stefan Hajnoczi
    echo "$state"
113 1e2cf2bc Stefan Hajnoczi
}
114 1e2cf2bc Stefan Hajnoczi
115 94a420b1 Stefan Hajnoczi
linetoh_begin_nop()
116 94a420b1 Stefan Hajnoczi
{
117 94a420b1 Stefan Hajnoczi
    return
118 94a420b1 Stefan Hajnoczi
}
119 94a420b1 Stefan Hajnoczi
120 94a420b1 Stefan Hajnoczi
linetoh_nop()
121 94a420b1 Stefan Hajnoczi
{
122 94a420b1 Stefan Hajnoczi
    local name args
123 94a420b1 Stefan Hajnoczi
    name=$(get_name "$1")
124 94a420b1 Stefan Hajnoczi
    args=$(get_args "$1")
125 94a420b1 Stefan Hajnoczi
126 94a420b1 Stefan Hajnoczi
    # Define an empty function for the trace event
127 94a420b1 Stefan Hajnoczi
    cat <<EOF
128 94a420b1 Stefan Hajnoczi
static inline void trace_$name($args)
129 94a420b1 Stefan Hajnoczi
{
130 94a420b1 Stefan Hajnoczi
}
131 94a420b1 Stefan Hajnoczi
EOF
132 94a420b1 Stefan Hajnoczi
}
133 94a420b1 Stefan Hajnoczi
134 94a420b1 Stefan Hajnoczi
linetoh_end_nop()
135 94a420b1 Stefan Hajnoczi
{
136 94a420b1 Stefan Hajnoczi
    return
137 94a420b1 Stefan Hajnoczi
}
138 94a420b1 Stefan Hajnoczi
139 94a420b1 Stefan Hajnoczi
linetoc_begin_nop()
140 94a420b1 Stefan Hajnoczi
{
141 94a420b1 Stefan Hajnoczi
    return
142 94a420b1 Stefan Hajnoczi
}
143 94a420b1 Stefan Hajnoczi
144 94a420b1 Stefan Hajnoczi
linetoc_nop()
145 94a420b1 Stefan Hajnoczi
{
146 94a420b1 Stefan Hajnoczi
    # No need for function definitions in nop backend
147 94a420b1 Stefan Hajnoczi
    return
148 94a420b1 Stefan Hajnoczi
}
149 94a420b1 Stefan Hajnoczi
150 94a420b1 Stefan Hajnoczi
linetoc_end_nop()
151 94a420b1 Stefan Hajnoczi
{
152 94a420b1 Stefan Hajnoczi
    return
153 94a420b1 Stefan Hajnoczi
}
154 94a420b1 Stefan Hajnoczi
155 26f7227b Stefan Hajnoczi
linetoh_begin_simple()
156 26f7227b Stefan Hajnoczi
{
157 26f7227b Stefan Hajnoczi
    cat <<EOF
158 26f7227b Stefan Hajnoczi
#include "simpletrace.h"
159 26f7227b Stefan Hajnoczi
EOF
160 26f7227b Stefan Hajnoczi
161 26f7227b Stefan Hajnoczi
    simple_event_num=0
162 26f7227b Stefan Hajnoczi
}
163 26f7227b Stefan Hajnoczi
164 26f7227b Stefan Hajnoczi
cast_args_to_uint64_t()
165 26f7227b Stefan Hajnoczi
{
166 26f7227b Stefan Hajnoczi
    local arg
167 b3d08c02 Daniel P. Berrange
    for arg in $(get_argnames "$1", ","); do
168 26f7227b Stefan Hajnoczi
        printf "%s" "(uint64_t)(uintptr_t)$arg"
169 26f7227b Stefan Hajnoczi
    done
170 26f7227b Stefan Hajnoczi
}
171 26f7227b Stefan Hajnoczi
172 26f7227b Stefan Hajnoczi
linetoh_simple()
173 26f7227b Stefan Hajnoczi
{
174 1e2cf2bc Stefan Hajnoczi
    local name args argc trace_args state
175 26f7227b Stefan Hajnoczi
    name=$(get_name "$1")
176 26f7227b Stefan Hajnoczi
    args=$(get_args "$1")
177 26f7227b Stefan Hajnoczi
    argc=$(get_argc "$1")
178 1e2cf2bc Stefan Hajnoczi
    state=$(get_state "$1")
179 1e2cf2bc Stefan Hajnoczi
    if [ "$state" = "0" ]; then
180 1e2cf2bc Stefan Hajnoczi
        name=${name##disable }
181 1e2cf2bc Stefan Hajnoczi
    fi
182 26f7227b Stefan Hajnoczi
183 26f7227b Stefan Hajnoczi
    trace_args="$simple_event_num"
184 26f7227b Stefan Hajnoczi
    if [ "$argc" -gt 0 ]
185 26f7227b Stefan Hajnoczi
    then
186 26f7227b Stefan Hajnoczi
        trace_args="$trace_args, $(cast_args_to_uint64_t "$1")"
187 26f7227b Stefan Hajnoczi
    fi
188 26f7227b Stefan Hajnoczi
189 26f7227b Stefan Hajnoczi
    cat <<EOF
190 26f7227b Stefan Hajnoczi
static inline void trace_$name($args)
191 26f7227b Stefan Hajnoczi
{
192 26f7227b Stefan Hajnoczi
    trace$argc($trace_args);
193 26f7227b Stefan Hajnoczi
}
194 26f7227b Stefan Hajnoczi
EOF
195 26f7227b Stefan Hajnoczi
196 26f7227b Stefan Hajnoczi
    simple_event_num=$((simple_event_num + 1))
197 26f7227b Stefan Hajnoczi
}
198 26f7227b Stefan Hajnoczi
199 26f7227b Stefan Hajnoczi
linetoh_end_simple()
200 26f7227b Stefan Hajnoczi
{
201 22890ab5 Prerna Saxena
    cat <<EOF
202 22890ab5 Prerna Saxena
#define NR_TRACE_EVENTS $simple_event_num
203 22890ab5 Prerna Saxena
extern TraceEvent trace_list[NR_TRACE_EVENTS];
204 22890ab5 Prerna Saxena
EOF
205 26f7227b Stefan Hajnoczi
}
206 26f7227b Stefan Hajnoczi
207 26f7227b Stefan Hajnoczi
linetoc_begin_simple()
208 26f7227b Stefan Hajnoczi
{
209 22890ab5 Prerna Saxena
    cat <<EOF
210 22890ab5 Prerna Saxena
#include "trace.h"
211 22890ab5 Prerna Saxena
212 22890ab5 Prerna Saxena
TraceEvent trace_list[] = {
213 22890ab5 Prerna Saxena
EOF
214 22890ab5 Prerna Saxena
    simple_event_num=0
215 22890ab5 Prerna Saxena
216 26f7227b Stefan Hajnoczi
}
217 26f7227b Stefan Hajnoczi
218 26f7227b Stefan Hajnoczi
linetoc_simple()
219 26f7227b Stefan Hajnoczi
{
220 1e2cf2bc Stefan Hajnoczi
    local name state
221 22890ab5 Prerna Saxena
    name=$(get_name "$1")
222 1e2cf2bc Stefan Hajnoczi
    state=$(get_state "$1")
223 1e2cf2bc Stefan Hajnoczi
    if [ "$state" = "0" ] ; then
224 1e2cf2bc Stefan Hajnoczi
        name=${name##disable }
225 1e2cf2bc Stefan Hajnoczi
    fi
226 22890ab5 Prerna Saxena
    cat <<EOF
227 1e2cf2bc Stefan Hajnoczi
{.tp_name = "$name", .state=$state},
228 22890ab5 Prerna Saxena
EOF
229 22890ab5 Prerna Saxena
    simple_event_num=$((simple_event_num + 1))
230 26f7227b Stefan Hajnoczi
}
231 26f7227b Stefan Hajnoczi
232 26f7227b Stefan Hajnoczi
linetoc_end_simple()
233 26f7227b Stefan Hajnoczi
{
234 22890ab5 Prerna Saxena
    cat <<EOF
235 22890ab5 Prerna Saxena
};
236 22890ab5 Prerna Saxena
EOF
237 26f7227b Stefan Hajnoczi
}
238 26f7227b Stefan Hajnoczi
239 7e24e92a Stefan Hajnoczi
# Clean up after UST headers which pollute the namespace
240 7e24e92a Stefan Hajnoczi
ust_clean_namespace() {
241 7e24e92a Stefan Hajnoczi
    cat <<EOF
242 7e24e92a Stefan Hajnoczi
#undef mutex_lock
243 7e24e92a Stefan Hajnoczi
#undef mutex_unlock
244 7e24e92a Stefan Hajnoczi
#undef inline
245 7e24e92a Stefan Hajnoczi
#undef wmb
246 7e24e92a Stefan Hajnoczi
EOF
247 7e24e92a Stefan Hajnoczi
}
248 7e24e92a Stefan Hajnoczi
249 7e24e92a Stefan Hajnoczi
linetoh_begin_ust()
250 7e24e92a Stefan Hajnoczi
{
251 7e24e92a Stefan Hajnoczi
    echo "#include <ust/tracepoint.h>"
252 7e24e92a Stefan Hajnoczi
    ust_clean_namespace
253 7e24e92a Stefan Hajnoczi
}
254 7e24e92a Stefan Hajnoczi
255 7e24e92a Stefan Hajnoczi
linetoh_ust()
256 7e24e92a Stefan Hajnoczi
{
257 7e24e92a Stefan Hajnoczi
    local name args argnames
258 7e24e92a Stefan Hajnoczi
    name=$(get_name "$1")
259 7e24e92a Stefan Hajnoczi
    args=$(get_args "$1")
260 b3d08c02 Daniel P. Berrange
    argnames=$(get_argnames "$1", ",")
261 7e24e92a Stefan Hajnoczi
262 7e24e92a Stefan Hajnoczi
    cat <<EOF
263 ea9c1698 Stefan Hajnoczi
DECLARE_TRACE(ust_$name, TP_PROTO($args), TP_ARGS($argnames));
264 7e24e92a Stefan Hajnoczi
#define trace_$name trace_ust_$name
265 7e24e92a Stefan Hajnoczi
EOF
266 7e24e92a Stefan Hajnoczi
}
267 7e24e92a Stefan Hajnoczi
268 7e24e92a Stefan Hajnoczi
linetoh_end_ust()
269 7e24e92a Stefan Hajnoczi
{
270 7e24e92a Stefan Hajnoczi
    return
271 7e24e92a Stefan Hajnoczi
}
272 7e24e92a Stefan Hajnoczi
273 7e24e92a Stefan Hajnoczi
linetoc_begin_ust()
274 7e24e92a Stefan Hajnoczi
{
275 7e24e92a Stefan Hajnoczi
    cat <<EOF
276 7e24e92a Stefan Hajnoczi
#include <ust/marker.h>
277 7e24e92a Stefan Hajnoczi
$(ust_clean_namespace)
278 7e24e92a Stefan Hajnoczi
#include "trace.h"
279 7e24e92a Stefan Hajnoczi
EOF
280 7e24e92a Stefan Hajnoczi
}
281 7e24e92a Stefan Hajnoczi
282 7e24e92a Stefan Hajnoczi
linetoc_ust()
283 7e24e92a Stefan Hajnoczi
{
284 7e24e92a Stefan Hajnoczi
    local name args argnames fmt
285 7e24e92a Stefan Hajnoczi
    name=$(get_name "$1")
286 7e24e92a Stefan Hajnoczi
    args=$(get_args "$1")
287 b3d08c02 Daniel P. Berrange
    argnames=$(get_argnames "$1", ",")
288 7e24e92a Stefan Hajnoczi
    fmt=$(get_fmt "$1")
289 7e24e92a Stefan Hajnoczi
290 7e24e92a Stefan Hajnoczi
    cat <<EOF
291 7e24e92a Stefan Hajnoczi
DEFINE_TRACE(ust_$name);
292 7e24e92a Stefan Hajnoczi
293 7e24e92a Stefan Hajnoczi
static void ust_${name}_probe($args)
294 7e24e92a Stefan Hajnoczi
{
295 7e24e92a Stefan Hajnoczi
    trace_mark(ust, $name, "$fmt", $argnames);
296 7e24e92a Stefan Hajnoczi
}
297 7e24e92a Stefan Hajnoczi
EOF
298 7e24e92a Stefan Hajnoczi
299 7e24e92a Stefan Hajnoczi
    # Collect names for later
300 7e24e92a Stefan Hajnoczi
    names="$names $name"
301 7e24e92a Stefan Hajnoczi
}
302 7e24e92a Stefan Hajnoczi
303 7e24e92a Stefan Hajnoczi
linetoc_end_ust()
304 7e24e92a Stefan Hajnoczi
{
305 7e24e92a Stefan Hajnoczi
    cat <<EOF
306 7e24e92a Stefan Hajnoczi
static void __attribute__((constructor)) trace_init(void)
307 7e24e92a Stefan Hajnoczi
{
308 7e24e92a Stefan Hajnoczi
EOF
309 7e24e92a Stefan Hajnoczi
310 7e24e92a Stefan Hajnoczi
    for name in $names; do
311 7e24e92a Stefan Hajnoczi
        cat <<EOF
312 7e24e92a Stefan Hajnoczi
    register_trace_ust_$name(ust_${name}_probe);
313 7e24e92a Stefan Hajnoczi
EOF
314 7e24e92a Stefan Hajnoczi
    done
315 7e24e92a Stefan Hajnoczi
316 7e24e92a Stefan Hajnoczi
    echo "}"
317 7e24e92a Stefan Hajnoczi
}
318 7e24e92a Stefan Hajnoczi
319 b3d08c02 Daniel P. Berrange
linetoh_begin_dtrace()
320 b3d08c02 Daniel P. Berrange
{
321 b3d08c02 Daniel P. Berrange
    cat <<EOF
322 b3d08c02 Daniel P. Berrange
#include "trace-dtrace.h"
323 b3d08c02 Daniel P. Berrange
EOF
324 b3d08c02 Daniel P. Berrange
}
325 b3d08c02 Daniel P. Berrange
326 b3d08c02 Daniel P. Berrange
linetoh_dtrace()
327 b3d08c02 Daniel P. Berrange
{
328 b3d08c02 Daniel P. Berrange
    local name args argnames state nameupper
329 b3d08c02 Daniel P. Berrange
    name=$(get_name "$1")
330 b3d08c02 Daniel P. Berrange
    args=$(get_args "$1")
331 b3d08c02 Daniel P. Berrange
    argnames=$(get_argnames "$1", ",")
332 b3d08c02 Daniel P. Berrange
    state=$(get_state "$1")
333 b3d08c02 Daniel P. Berrange
    if [ "$state" = "0" ] ; then
334 b3d08c02 Daniel P. Berrange
        name=${name##disable }
335 b3d08c02 Daniel P. Berrange
    fi
336 b3d08c02 Daniel P. Berrange
337 b3d08c02 Daniel P. Berrange
    nameupper=`echo $name | tr '[:lower:]' '[:upper:]'`
338 b3d08c02 Daniel P. Berrange
339 b3d08c02 Daniel P. Berrange
    # Define an empty function for the trace event
340 b3d08c02 Daniel P. Berrange
    cat <<EOF
341 b3d08c02 Daniel P. Berrange
static inline void trace_$name($args) {
342 b3d08c02 Daniel P. Berrange
    if (QEMU_${nameupper}_ENABLED()) {
343 b3d08c02 Daniel P. Berrange
        QEMU_${nameupper}($argnames);
344 b3d08c02 Daniel P. Berrange
    }
345 b3d08c02 Daniel P. Berrange
}
346 b3d08c02 Daniel P. Berrange
EOF
347 b3d08c02 Daniel P. Berrange
}
348 b3d08c02 Daniel P. Berrange
349 b3d08c02 Daniel P. Berrange
linetoh_end_dtrace()
350 b3d08c02 Daniel P. Berrange
{
351 b3d08c02 Daniel P. Berrange
    return
352 b3d08c02 Daniel P. Berrange
}
353 b3d08c02 Daniel P. Berrange
354 b3d08c02 Daniel P. Berrange
linetoc_begin_dtrace()
355 b3d08c02 Daniel P. Berrange
{
356 b3d08c02 Daniel P. Berrange
    return
357 b3d08c02 Daniel P. Berrange
}
358 b3d08c02 Daniel P. Berrange
359 b3d08c02 Daniel P. Berrange
linetoc_dtrace()
360 b3d08c02 Daniel P. Berrange
{
361 b3d08c02 Daniel P. Berrange
    # No need for function definitions in dtrace backend
362 b3d08c02 Daniel P. Berrange
    return
363 b3d08c02 Daniel P. Berrange
}
364 b3d08c02 Daniel P. Berrange
365 b3d08c02 Daniel P. Berrange
linetoc_end_dtrace()
366 b3d08c02 Daniel P. Berrange
{
367 b3d08c02 Daniel P. Berrange
    return
368 b3d08c02 Daniel P. Berrange
}
369 b3d08c02 Daniel P. Berrange
370 b3d08c02 Daniel P. Berrange
linetod_begin_dtrace()
371 b3d08c02 Daniel P. Berrange
{
372 b3d08c02 Daniel P. Berrange
    cat <<EOF
373 b3d08c02 Daniel P. Berrange
provider qemu {
374 b3d08c02 Daniel P. Berrange
EOF
375 b3d08c02 Daniel P. Berrange
}
376 b3d08c02 Daniel P. Berrange
377 b3d08c02 Daniel P. Berrange
linetod_dtrace()
378 b3d08c02 Daniel P. Berrange
{
379 b3d08c02 Daniel P. Berrange
    local name args state
380 b3d08c02 Daniel P. Berrange
    name=$(get_name "$1")
381 b3d08c02 Daniel P. Berrange
    args=$(get_args "$1")
382 b3d08c02 Daniel P. Berrange
    state=$(get_state "$1")
383 b3d08c02 Daniel P. Berrange
    if [ "$state" = "0" ] ; then
384 b3d08c02 Daniel P. Berrange
        name=${name##disable }
385 b3d08c02 Daniel P. Berrange
    fi
386 b3d08c02 Daniel P. Berrange
387 b3d08c02 Daniel P. Berrange
    # DTrace provider syntax expects foo() for empty
388 b3d08c02 Daniel P. Berrange
    # params, not foo(void)
389 b3d08c02 Daniel P. Berrange
    if [ "$args" = "void" ]; then
390 b3d08c02 Daniel P. Berrange
       args=""
391 b3d08c02 Daniel P. Berrange
    fi
392 b3d08c02 Daniel P. Berrange
393 b3d08c02 Daniel P. Berrange
    # Define prototype for probe arguments
394 b3d08c02 Daniel P. Berrange
    cat <<EOF
395 b3d08c02 Daniel P. Berrange
        probe $name($args);
396 b3d08c02 Daniel P. Berrange
EOF
397 b3d08c02 Daniel P. Berrange
}
398 b3d08c02 Daniel P. Berrange
399 b3d08c02 Daniel P. Berrange
linetod_end_dtrace()
400 b3d08c02 Daniel P. Berrange
{
401 b3d08c02 Daniel P. Berrange
    cat <<EOF
402 b3d08c02 Daniel P. Berrange
};
403 b3d08c02 Daniel P. Berrange
EOF
404 b3d08c02 Daniel P. Berrange
}
405 b3d08c02 Daniel P. Berrange
406 c276b17d Daniel P. Berrange
linetostap_begin_dtrace()
407 c276b17d Daniel P. Berrange
{
408 c276b17d Daniel P. Berrange
    return
409 c276b17d Daniel P. Berrange
}
410 c276b17d Daniel P. Berrange
411 c276b17d Daniel P. Berrange
linetostap_dtrace()
412 c276b17d Daniel P. Berrange
{
413 c276b17d Daniel P. Berrange
    local i arg name args arglist state
414 c276b17d Daniel P. Berrange
    name=$(get_name "$1")
415 c276b17d Daniel P. Berrange
    args=$(get_args "$1")
416 c276b17d Daniel P. Berrange
    arglist=$(get_argnames "$1", "")
417 c276b17d Daniel P. Berrange
    state=$(get_state "$1")
418 c276b17d Daniel P. Berrange
    if [ "$state" = "0" ] ; then
419 c276b17d Daniel P. Berrange
        name=${name##disable }
420 c276b17d Daniel P. Berrange
    fi
421 c276b17d Daniel P. Berrange
422 c276b17d Daniel P. Berrange
    # Define prototype for probe arguments
423 c276b17d Daniel P. Berrange
    cat <<EOF
424 c276b17d Daniel P. Berrange
probe qemu.$targettype.$targetarch.$name = process("$binary").mark("$name")
425 c276b17d Daniel P. Berrange
{
426 c276b17d Daniel P. Berrange
EOF
427 c276b17d Daniel P. Berrange
428 c276b17d Daniel P. Berrange
    i=1
429 c276b17d Daniel P. Berrange
    for arg in $arglist
430 c276b17d Daniel P. Berrange
    do
431 c276b17d Daniel P. Berrange
        # 'limit' is a reserved keyword
432 c276b17d Daniel P. Berrange
        if [ "$arg" = "limit" ]; then
433 c276b17d Daniel P. Berrange
          arg="_limit"
434 c276b17d Daniel P. Berrange
        fi
435 c276b17d Daniel P. Berrange
        cat <<EOF
436 c276b17d Daniel P. Berrange
  $arg = \$arg$i;
437 c276b17d Daniel P. Berrange
EOF
438 c276b17d Daniel P. Berrange
	i="$((i+1))"
439 c276b17d Daniel P. Berrange
    done
440 c276b17d Daniel P. Berrange
441 c276b17d Daniel P. Berrange
    cat <<EOF
442 c276b17d Daniel P. Berrange
}
443 c276b17d Daniel P. Berrange
EOF
444 c276b17d Daniel P. Berrange
}
445 c276b17d Daniel P. Berrange
446 c276b17d Daniel P. Berrange
linetostap_end_dtrace()
447 c276b17d Daniel P. Berrange
{
448 c276b17d Daniel P. Berrange
    return
449 c276b17d Daniel P. Berrange
}
450 c276b17d Daniel P. Berrange
451 94a420b1 Stefan Hajnoczi
# Process stdin by calling begin, line, and end functions for the backend
452 94a420b1 Stefan Hajnoczi
convert()
453 94a420b1 Stefan Hajnoczi
{
454 1e2cf2bc Stefan Hajnoczi
    local begin process_line end str disable
455 94a420b1 Stefan Hajnoczi
    begin="lineto$1_begin_$backend"
456 94a420b1 Stefan Hajnoczi
    process_line="lineto$1_$backend"
457 94a420b1 Stefan Hajnoczi
    end="lineto$1_end_$backend"
458 94a420b1 Stefan Hajnoczi
459 94a420b1 Stefan Hajnoczi
    "$begin"
460 94a420b1 Stefan Hajnoczi
461 94a420b1 Stefan Hajnoczi
    while read -r str; do
462 94a420b1 Stefan Hajnoczi
        # Skip comments and empty lines
463 5eb5527b Stefan Hajnoczi
        test -z "${str%%#*}" && continue
464 94a420b1 Stefan Hajnoczi
465 1e2cf2bc Stefan Hajnoczi
        # Process the line.  The nop backend handles disabled lines.
466 1e2cf2bc Stefan Hajnoczi
        disable=${str%%disable *}
467 94a420b1 Stefan Hajnoczi
        echo
468 1e2cf2bc Stefan Hajnoczi
        if test -z "$disable"; then
469 b3d08c02 Daniel P. Berrange
            # Pass the disabled state as an arg for the simple
470 b3d08c02 Daniel P. Berrange
            # or DTrace backends which handle it dynamically.
471 b3d08c02 Daniel P. Berrange
            # For all other backends, call lineto$1_nop()
472 b3d08c02 Daniel P. Berrange
            if [ $backend = "simple" -o "$backend" = "dtrace" ]; then
473 1e2cf2bc Stefan Hajnoczi
                "$process_line" "$str"
474 1e2cf2bc Stefan Hajnoczi
            else
475 1e2cf2bc Stefan Hajnoczi
                "lineto$1_nop" "${str##disable }"
476 1e2cf2bc Stefan Hajnoczi
            fi
477 1e2cf2bc Stefan Hajnoczi
        else
478 1e2cf2bc Stefan Hajnoczi
            "$process_line" "$str"
479 1e2cf2bc Stefan Hajnoczi
        fi
480 94a420b1 Stefan Hajnoczi
    done
481 94a420b1 Stefan Hajnoczi
482 94a420b1 Stefan Hajnoczi
    echo
483 94a420b1 Stefan Hajnoczi
    "$end"
484 94a420b1 Stefan Hajnoczi
}
485 94a420b1 Stefan Hajnoczi
486 94a420b1 Stefan Hajnoczi
tracetoh()
487 94a420b1 Stefan Hajnoczi
{
488 94a420b1 Stefan Hajnoczi
    cat <<EOF
489 94a420b1 Stefan Hajnoczi
#ifndef TRACE_H
490 94a420b1 Stefan Hajnoczi
#define TRACE_H
491 94a420b1 Stefan Hajnoczi
492 94a420b1 Stefan Hajnoczi
/* This file is autogenerated by tracetool, do not edit. */
493 94a420b1 Stefan Hajnoczi
494 94a420b1 Stefan Hajnoczi
#include "qemu-common.h"
495 94a420b1 Stefan Hajnoczi
EOF
496 94a420b1 Stefan Hajnoczi
    convert h
497 94a420b1 Stefan Hajnoczi
    echo "#endif /* TRACE_H */"
498 94a420b1 Stefan Hajnoczi
}
499 94a420b1 Stefan Hajnoczi
500 94a420b1 Stefan Hajnoczi
tracetoc()
501 94a420b1 Stefan Hajnoczi
{
502 94a420b1 Stefan Hajnoczi
    echo "/* This file is autogenerated by tracetool, do not edit. */"
503 94a420b1 Stefan Hajnoczi
    convert c
504 94a420b1 Stefan Hajnoczi
}
505 94a420b1 Stefan Hajnoczi
506 b3d08c02 Daniel P. Berrange
tracetod()
507 b3d08c02 Daniel P. Berrange
{
508 b3d08c02 Daniel P. Berrange
    if [ $backend != "dtrace" ]; then
509 b3d08c02 Daniel P. Berrange
       echo "DTrace probe generator not applicable to $backend backend"
510 b3d08c02 Daniel P. Berrange
       exit 1
511 b3d08c02 Daniel P. Berrange
    fi
512 b3d08c02 Daniel P. Berrange
    echo "/* This file is autogenerated by tracetool, do not edit. */"
513 b3d08c02 Daniel P. Berrange
    convert d
514 b3d08c02 Daniel P. Berrange
}
515 b3d08c02 Daniel P. Berrange
516 c276b17d Daniel P. Berrange
tracetostap()
517 c276b17d Daniel P. Berrange
{
518 c276b17d Daniel P. Berrange
    if [ $backend != "dtrace" ]; then
519 c276b17d Daniel P. Berrange
       echo "SystemTAP tapset generator not applicable to $backend backend"
520 c276b17d Daniel P. Berrange
       exit 1
521 c276b17d Daniel P. Berrange
    fi
522 c276b17d Daniel P. Berrange
    if [ -z "$binary" ]; then
523 c276b17d Daniel P. Berrange
       echo "--binary is required for SystemTAP tapset generator"
524 c276b17d Daniel P. Berrange
       exit 1
525 c276b17d Daniel P. Berrange
    fi
526 c276b17d Daniel P. Berrange
    if [ -z "$targettype" ]; then
527 c276b17d Daniel P. Berrange
       echo "--target-type is required for SystemTAP tapset generator"
528 c276b17d Daniel P. Berrange
       exit 1
529 c276b17d Daniel P. Berrange
    fi
530 c276b17d Daniel P. Berrange
    if [ -z "$targetarch" ]; then
531 c276b17d Daniel P. Berrange
       echo "--target-arch is required for SystemTAP tapset generator"
532 c276b17d Daniel P. Berrange
       exit 1
533 c276b17d Daniel P. Berrange
    fi
534 c276b17d Daniel P. Berrange
    echo "/* This file is autogenerated by tracetool, do not edit. */"
535 c276b17d Daniel P. Berrange
    convert stap
536 c276b17d Daniel P. Berrange
}
537 c276b17d Daniel P. Berrange
538 c276b17d Daniel P. Berrange
539 c276b17d Daniel P. Berrange
backend=
540 c276b17d Daniel P. Berrange
output=
541 c276b17d Daniel P. Berrange
binary=
542 c276b17d Daniel P. Berrange
targettype=
543 c276b17d Daniel P. Berrange
targetarch=
544 c276b17d Daniel P. Berrange
545 c276b17d Daniel P. Berrange
546 c276b17d Daniel P. Berrange
until [ -z "$1" ]
547 c276b17d Daniel P. Berrange
do
548 c276b17d Daniel P. Berrange
  case "$1" in
549 c276b17d Daniel P. Berrange
    "--nop" | "--simple" | "--ust" | "--dtrace") backend="${1#--}" ;;
550 c276b17d Daniel P. Berrange
551 c276b17d Daniel P. Berrange
    "--binary") shift ; binary="$1" ;;
552 c276b17d Daniel P. Berrange
    "--target-arch") shift ; targetarch="$1" ;;
553 c276b17d Daniel P. Berrange
    "--target-type") shift ; targettype="$1" ;;
554 c276b17d Daniel P. Berrange
555 c276b17d Daniel P. Berrange
    "-h" | "-c" | "-d") output="${1#-}" ;;
556 c276b17d Daniel P. Berrange
    "--stap") output="${1#--}" ;;
557 c276b17d Daniel P. Berrange
558 c276b17d Daniel P. Berrange
    "--check-backend") exit 0 ;; # used by ./configure to test for backend
559 c276b17d Daniel P. Berrange
560 c276b17d Daniel P. Berrange
    *)
561 c276b17d Daniel P. Berrange
      usage;;
562 c276b17d Daniel P. Berrange
  esac
563 c276b17d Daniel P. Berrange
  shift
564 c276b17d Daniel P. Berrange
done
565 c276b17d Daniel P. Berrange
566 c276b17d Daniel P. Berrange
if [ "$backend" = "" -o "$output" = "" ]; then
567 c276b17d Daniel P. Berrange
  usage
568 c276b17d Daniel P. Berrange
fi
569 c276b17d Daniel P. Berrange
570 c276b17d Daniel P. Berrange
gen="traceto$output"
571 c276b17d Daniel P. Berrange
"$gen"
572 94a420b1 Stefan Hajnoczi
573 94a420b1 Stefan Hajnoczi
exit 0