Statistics
| Branch: | Revision:

root / tracetool @ 2834c3e0

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