Statistics
| Branch: | Revision:

root / scripts / tracetool @ 46115ac4

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