Statistics
| Branch: | Revision:

root / scripts / tracetool @ e323c93e

History | View | Annotate | Download (10.8 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 2184d75b Blue Swirl
    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 7e24e92a Stefan Hajnoczi
    fmt=$(get_fmt "$1")
342 7e24e92a Stefan Hajnoczi
343 7e24e92a Stefan Hajnoczi
    cat <<EOF
344 7e24e92a Stefan Hajnoczi
DEFINE_TRACE(ust_$name);
345 7e24e92a Stefan Hajnoczi
346 7e24e92a Stefan Hajnoczi
static void ust_${name}_probe($args)
347 7e24e92a Stefan Hajnoczi
{
348 7e24e92a Stefan Hajnoczi
    trace_mark(ust, $name, "$fmt", $argnames);
349 7e24e92a Stefan Hajnoczi
}
350 7e24e92a Stefan Hajnoczi
EOF
351 7e24e92a Stefan Hajnoczi
352 7e24e92a Stefan Hajnoczi
    # Collect names for later
353 7e24e92a Stefan Hajnoczi
    names="$names $name"
354 7e24e92a Stefan Hajnoczi
}
355 7e24e92a Stefan Hajnoczi
356 7e24e92a Stefan Hajnoczi
linetoc_end_ust()
357 7e24e92a Stefan Hajnoczi
{
358 7e24e92a Stefan Hajnoczi
    cat <<EOF
359 7e24e92a Stefan Hajnoczi
static void __attribute__((constructor)) trace_init(void)
360 7e24e92a Stefan Hajnoczi
{
361 7e24e92a Stefan Hajnoczi
EOF
362 7e24e92a Stefan Hajnoczi
363 7e24e92a Stefan Hajnoczi
    for name in $names; do
364 7e24e92a Stefan Hajnoczi
        cat <<EOF
365 7e24e92a Stefan Hajnoczi
    register_trace_ust_$name(ust_${name}_probe);
366 7e24e92a Stefan Hajnoczi
EOF
367 7e24e92a Stefan Hajnoczi
    done
368 7e24e92a Stefan Hajnoczi
369 7e24e92a Stefan Hajnoczi
    echo "}"
370 7e24e92a Stefan Hajnoczi
}
371 7e24e92a Stefan Hajnoczi
372 b3d08c02 Daniel P. Berrange
linetoh_begin_dtrace()
373 b3d08c02 Daniel P. Berrange
{
374 b3d08c02 Daniel P. Berrange
    cat <<EOF
375 b3d08c02 Daniel P. Berrange
#include "trace-dtrace.h"
376 b3d08c02 Daniel P. Berrange
EOF
377 b3d08c02 Daniel P. Berrange
}
378 b3d08c02 Daniel P. Berrange
379 b3d08c02 Daniel P. Berrange
linetoh_dtrace()
380 b3d08c02 Daniel P. Berrange
{
381 b3d08c02 Daniel P. Berrange
    local name args argnames state nameupper
382 b3d08c02 Daniel P. Berrange
    name=$(get_name "$1")
383 b3d08c02 Daniel P. Berrange
    args=$(get_args "$1")
384 b3d08c02 Daniel P. Berrange
    argnames=$(get_argnames "$1", ",")
385 b3d08c02 Daniel P. Berrange
    state=$(get_state "$1")
386 b3d08c02 Daniel P. Berrange
    if [ "$state" = "0" ] ; then
387 b3d08c02 Daniel P. Berrange
        name=${name##disable }
388 b3d08c02 Daniel P. Berrange
    fi
389 b3d08c02 Daniel P. Berrange
390 b3d08c02 Daniel P. Berrange
    nameupper=`echo $name | tr '[:lower:]' '[:upper:]'`
391 b3d08c02 Daniel P. Berrange
392 b3d08c02 Daniel P. Berrange
    # Define an empty function for the trace event
393 b3d08c02 Daniel P. Berrange
    cat <<EOF
394 b3d08c02 Daniel P. Berrange
static inline void trace_$name($args) {
395 b3d08c02 Daniel P. Berrange
    if (QEMU_${nameupper}_ENABLED()) {
396 b3d08c02 Daniel P. Berrange
        QEMU_${nameupper}($argnames);
397 b3d08c02 Daniel P. Berrange
    }
398 b3d08c02 Daniel P. Berrange
}
399 b3d08c02 Daniel P. Berrange
EOF
400 b3d08c02 Daniel P. Berrange
}
401 b3d08c02 Daniel P. Berrange
402 b3d08c02 Daniel P. Berrange
linetoh_end_dtrace()
403 b3d08c02 Daniel P. Berrange
{
404 b3d08c02 Daniel P. Berrange
    return
405 b3d08c02 Daniel P. Berrange
}
406 b3d08c02 Daniel P. Berrange
407 b3d08c02 Daniel P. Berrange
linetoc_begin_dtrace()
408 b3d08c02 Daniel P. Berrange
{
409 b3d08c02 Daniel P. Berrange
    return
410 b3d08c02 Daniel P. Berrange
}
411 b3d08c02 Daniel P. Berrange
412 b3d08c02 Daniel P. Berrange
linetoc_dtrace()
413 b3d08c02 Daniel P. Berrange
{
414 b3d08c02 Daniel P. Berrange
    # No need for function definitions in dtrace backend
415 b3d08c02 Daniel P. Berrange
    return
416 b3d08c02 Daniel P. Berrange
}
417 b3d08c02 Daniel P. Berrange
418 b3d08c02 Daniel P. Berrange
linetoc_end_dtrace()
419 b3d08c02 Daniel P. Berrange
{
420 b3d08c02 Daniel P. Berrange
    return
421 b3d08c02 Daniel P. Berrange
}
422 b3d08c02 Daniel P. Berrange
423 b3d08c02 Daniel P. Berrange
linetod_begin_dtrace()
424 b3d08c02 Daniel P. Berrange
{
425 b3d08c02 Daniel P. Berrange
    cat <<EOF
426 b3d08c02 Daniel P. Berrange
provider qemu {
427 b3d08c02 Daniel P. Berrange
EOF
428 b3d08c02 Daniel P. Berrange
}
429 b3d08c02 Daniel P. Berrange
430 b3d08c02 Daniel P. Berrange
linetod_dtrace()
431 b3d08c02 Daniel P. Berrange
{
432 b3d08c02 Daniel P. Berrange
    local name args state
433 b3d08c02 Daniel P. Berrange
    name=$(get_name "$1")
434 b3d08c02 Daniel P. Berrange
    args=$(get_args "$1")
435 b3d08c02 Daniel P. Berrange
    state=$(get_state "$1")
436 b3d08c02 Daniel P. Berrange
    if [ "$state" = "0" ] ; then
437 b3d08c02 Daniel P. Berrange
        name=${name##disable }
438 b3d08c02 Daniel P. Berrange
    fi
439 b3d08c02 Daniel P. Berrange
440 b3d08c02 Daniel P. Berrange
    # DTrace provider syntax expects foo() for empty
441 b3d08c02 Daniel P. Berrange
    # params, not foo(void)
442 b3d08c02 Daniel P. Berrange
    if [ "$args" = "void" ]; then
443 b3d08c02 Daniel P. Berrange
       args=""
444 b3d08c02 Daniel P. Berrange
    fi
445 b3d08c02 Daniel P. Berrange
446 b3d08c02 Daniel P. Berrange
    # Define prototype for probe arguments
447 b3d08c02 Daniel P. Berrange
    cat <<EOF
448 b3d08c02 Daniel P. Berrange
        probe $name($args);
449 b3d08c02 Daniel P. Berrange
EOF
450 b3d08c02 Daniel P. Berrange
}
451 b3d08c02 Daniel P. Berrange
452 b3d08c02 Daniel P. Berrange
linetod_end_dtrace()
453 b3d08c02 Daniel P. Berrange
{
454 b3d08c02 Daniel P. Berrange
    cat <<EOF
455 b3d08c02 Daniel P. Berrange
};
456 b3d08c02 Daniel P. Berrange
EOF
457 b3d08c02 Daniel P. Berrange
}
458 b3d08c02 Daniel P. Berrange
459 c276b17d Daniel P. Berrange
linetostap_begin_dtrace()
460 c276b17d Daniel P. Berrange
{
461 c276b17d Daniel P. Berrange
    return
462 c276b17d Daniel P. Berrange
}
463 c276b17d Daniel P. Berrange
464 c276b17d Daniel P. Berrange
linetostap_dtrace()
465 c276b17d Daniel P. Berrange
{
466 c276b17d Daniel P. Berrange
    local i arg name args arglist state
467 c276b17d Daniel P. Berrange
    name=$(get_name "$1")
468 c276b17d Daniel P. Berrange
    args=$(get_args "$1")
469 c276b17d Daniel P. Berrange
    arglist=$(get_argnames "$1", "")
470 c276b17d Daniel P. Berrange
    state=$(get_state "$1")
471 c276b17d Daniel P. Berrange
    if [ "$state" = "0" ] ; then
472 c276b17d Daniel P. Berrange
        name=${name##disable }
473 c276b17d Daniel P. Berrange
    fi
474 c276b17d Daniel P. Berrange
475 c276b17d Daniel P. Berrange
    # Define prototype for probe arguments
476 c276b17d Daniel P. Berrange
    cat <<EOF
477 e323c93e Jes Sorensen
probe $probeprefix.$name = process("$binary").mark("$name")
478 c276b17d Daniel P. Berrange
{
479 c276b17d Daniel P. Berrange
EOF
480 c276b17d Daniel P. Berrange
481 c276b17d Daniel P. Berrange
    i=1
482 c276b17d Daniel P. Berrange
    for arg in $arglist
483 c276b17d Daniel P. Berrange
    do
484 c276b17d Daniel P. Berrange
        # 'limit' is a reserved keyword
485 c276b17d Daniel P. Berrange
        if [ "$arg" = "limit" ]; then
486 c276b17d Daniel P. Berrange
          arg="_limit"
487 c276b17d Daniel P. Berrange
        fi
488 c276b17d Daniel P. Berrange
        cat <<EOF
489 c276b17d Daniel P. Berrange
  $arg = \$arg$i;
490 c276b17d Daniel P. Berrange
EOF
491 c276b17d Daniel P. Berrange
	i="$((i+1))"
492 c276b17d Daniel P. Berrange
    done
493 c276b17d Daniel P. Berrange
494 c276b17d Daniel P. Berrange
    cat <<EOF
495 c276b17d Daniel P. Berrange
}
496 c276b17d Daniel P. Berrange
EOF
497 c276b17d Daniel P. Berrange
}
498 c276b17d Daniel P. Berrange
499 c276b17d Daniel P. Berrange
linetostap_end_dtrace()
500 c276b17d Daniel P. Berrange
{
501 c276b17d Daniel P. Berrange
    return
502 c276b17d Daniel P. Berrange
}
503 c276b17d Daniel P. Berrange
504 94a420b1 Stefan Hajnoczi
# Process stdin by calling begin, line, and end functions for the backend
505 94a420b1 Stefan Hajnoczi
convert()
506 94a420b1 Stefan Hajnoczi
{
507 1e2cf2bc Stefan Hajnoczi
    local begin process_line end str disable
508 94a420b1 Stefan Hajnoczi
    begin="lineto$1_begin_$backend"
509 94a420b1 Stefan Hajnoczi
    process_line="lineto$1_$backend"
510 94a420b1 Stefan Hajnoczi
    end="lineto$1_end_$backend"
511 94a420b1 Stefan Hajnoczi
512 94a420b1 Stefan Hajnoczi
    "$begin"
513 94a420b1 Stefan Hajnoczi
514 94a420b1 Stefan Hajnoczi
    while read -r str; do
515 94a420b1 Stefan Hajnoczi
        # Skip comments and empty lines
516 5eb5527b Stefan Hajnoczi
        test -z "${str%%#*}" && continue
517 94a420b1 Stefan Hajnoczi
518 1e2cf2bc Stefan Hajnoczi
        # Process the line.  The nop backend handles disabled lines.
519 1e2cf2bc Stefan Hajnoczi
        disable=${str%%disable *}
520 94a420b1 Stefan Hajnoczi
        echo
521 1e2cf2bc Stefan Hajnoczi
        if test -z "$disable"; then
522 b3d08c02 Daniel P. Berrange
            # Pass the disabled state as an arg for the simple
523 b3d08c02 Daniel P. Berrange
            # or DTrace backends which handle it dynamically.
524 b3d08c02 Daniel P. Berrange
            # For all other backends, call lineto$1_nop()
525 b3d08c02 Daniel P. Berrange
            if [ $backend = "simple" -o "$backend" = "dtrace" ]; then
526 1e2cf2bc Stefan Hajnoczi
                "$process_line" "$str"
527 1e2cf2bc Stefan Hajnoczi
            else
528 1e2cf2bc Stefan Hajnoczi
                "lineto$1_nop" "${str##disable }"
529 1e2cf2bc Stefan Hajnoczi
            fi
530 1e2cf2bc Stefan Hajnoczi
        else
531 1e2cf2bc Stefan Hajnoczi
            "$process_line" "$str"
532 1e2cf2bc Stefan Hajnoczi
        fi
533 94a420b1 Stefan Hajnoczi
    done
534 94a420b1 Stefan Hajnoczi
535 94a420b1 Stefan Hajnoczi
    echo
536 94a420b1 Stefan Hajnoczi
    "$end"
537 94a420b1 Stefan Hajnoczi
}
538 94a420b1 Stefan Hajnoczi
539 94a420b1 Stefan Hajnoczi
tracetoh()
540 94a420b1 Stefan Hajnoczi
{
541 94a420b1 Stefan Hajnoczi
    cat <<EOF
542 94a420b1 Stefan Hajnoczi
#ifndef TRACE_H
543 94a420b1 Stefan Hajnoczi
#define TRACE_H
544 94a420b1 Stefan Hajnoczi
545 94a420b1 Stefan Hajnoczi
/* This file is autogenerated by tracetool, do not edit. */
546 94a420b1 Stefan Hajnoczi
547 94a420b1 Stefan Hajnoczi
#include "qemu-common.h"
548 94a420b1 Stefan Hajnoczi
EOF
549 94a420b1 Stefan Hajnoczi
    convert h
550 94a420b1 Stefan Hajnoczi
    echo "#endif /* TRACE_H */"
551 94a420b1 Stefan Hajnoczi
}
552 94a420b1 Stefan Hajnoczi
553 94a420b1 Stefan Hajnoczi
tracetoc()
554 94a420b1 Stefan Hajnoczi
{
555 94a420b1 Stefan Hajnoczi
    echo "/* This file is autogenerated by tracetool, do not edit. */"
556 94a420b1 Stefan Hajnoczi
    convert c
557 94a420b1 Stefan Hajnoczi
}
558 94a420b1 Stefan Hajnoczi
559 b3d08c02 Daniel P. Berrange
tracetod()
560 b3d08c02 Daniel P. Berrange
{
561 b3d08c02 Daniel P. Berrange
    if [ $backend != "dtrace" ]; then
562 b3d08c02 Daniel P. Berrange
       echo "DTrace probe generator not applicable to $backend backend"
563 b3d08c02 Daniel P. Berrange
       exit 1
564 b3d08c02 Daniel P. Berrange
    fi
565 b3d08c02 Daniel P. Berrange
    echo "/* This file is autogenerated by tracetool, do not edit. */"
566 b3d08c02 Daniel P. Berrange
    convert d
567 b3d08c02 Daniel P. Berrange
}
568 b3d08c02 Daniel P. Berrange
569 c276b17d Daniel P. Berrange
tracetostap()
570 c276b17d Daniel P. Berrange
{
571 c276b17d Daniel P. Berrange
    if [ $backend != "dtrace" ]; then
572 c276b17d Daniel P. Berrange
       echo "SystemTAP tapset generator not applicable to $backend backend"
573 c276b17d Daniel P. Berrange
       exit 1
574 c276b17d Daniel P. Berrange
    fi
575 c276b17d Daniel P. Berrange
    if [ -z "$binary" ]; then
576 c276b17d Daniel P. Berrange
       echo "--binary is required for SystemTAP tapset generator"
577 c276b17d Daniel P. Berrange
       exit 1
578 c276b17d Daniel P. Berrange
    fi
579 e323c93e Jes Sorensen
    if [ -z "$probeprefix" -a -z "$targettype" ]; then
580 c276b17d Daniel P. Berrange
       echo "--target-type is required for SystemTAP tapset generator"
581 c276b17d Daniel P. Berrange
       exit 1
582 c276b17d Daniel P. Berrange
    fi
583 e323c93e Jes Sorensen
    if [ -z "$probeprefix" -a -z "$targetarch" ]; then
584 c276b17d Daniel P. Berrange
       echo "--target-arch is required for SystemTAP tapset generator"
585 c276b17d Daniel P. Berrange
       exit 1
586 c276b17d Daniel P. Berrange
    fi
587 e323c93e Jes Sorensen
    if [ -z "$probeprefix" ]; then
588 e323c93e Jes Sorensen
	probeprefix="qemu.$targettype.$targetarch";
589 e323c93e Jes Sorensen
    fi
590 c276b17d Daniel P. Berrange
    echo "/* This file is autogenerated by tracetool, do not edit. */"
591 c276b17d Daniel P. Berrange
    convert stap
592 c276b17d Daniel P. Berrange
}
593 c276b17d Daniel P. Berrange
594 c276b17d Daniel P. Berrange
595 c276b17d Daniel P. Berrange
backend=
596 c276b17d Daniel P. Berrange
output=
597 c276b17d Daniel P. Berrange
binary=
598 c276b17d Daniel P. Berrange
targettype=
599 c276b17d Daniel P. Berrange
targetarch=
600 e323c93e Jes Sorensen
probeprefix=
601 c276b17d Daniel P. Berrange
602 c276b17d Daniel P. Berrange
603 c276b17d Daniel P. Berrange
until [ -z "$1" ]
604 c276b17d Daniel P. Berrange
do
605 c276b17d Daniel P. Berrange
  case "$1" in
606 320fba2a Fabien Chouteau
    "--nop" | "--simple" | "--stderr" | "--ust" | "--dtrace") backend="${1#--}" ;;
607 c276b17d Daniel P. Berrange
608 c276b17d Daniel P. Berrange
    "--binary") shift ; binary="$1" ;;
609 c276b17d Daniel P. Berrange
    "--target-arch") shift ; targetarch="$1" ;;
610 c276b17d Daniel P. Berrange
    "--target-type") shift ; targettype="$1" ;;
611 e323c93e Jes Sorensen
    "--probe-prefix") shift ; probeprefix="$1" ;;
612 c276b17d Daniel P. Berrange
613 c276b17d Daniel P. Berrange
    "-h" | "-c" | "-d") output="${1#-}" ;;
614 c276b17d Daniel P. Berrange
    "--stap") output="${1#--}" ;;
615 c276b17d Daniel P. Berrange
616 c276b17d Daniel P. Berrange
    "--check-backend") exit 0 ;; # used by ./configure to test for backend
617 c276b17d Daniel P. Berrange
618 320fba2a Fabien Chouteau
    "--list-backends") # used by ./configure to list available backends
619 320fba2a Fabien Chouteau
          echo "nop simple stderr ust dtrace"
620 320fba2a Fabien Chouteau
          exit 0
621 320fba2a Fabien Chouteau
          ;;
622 320fba2a Fabien Chouteau
623 c276b17d Daniel P. Berrange
    *)
624 c276b17d Daniel P. Berrange
      usage;;
625 c276b17d Daniel P. Berrange
  esac
626 c276b17d Daniel P. Berrange
  shift
627 c276b17d Daniel P. Berrange
done
628 c276b17d Daniel P. Berrange
629 c276b17d Daniel P. Berrange
if [ "$backend" = "" -o "$output" = "" ]; then
630 c276b17d Daniel P. Berrange
  usage
631 c276b17d Daniel P. Berrange
fi
632 c276b17d Daniel P. Berrange
633 c276b17d Daniel P. Berrange
gen="traceto$output"
634 c276b17d Daniel P. Berrange
"$gen"
635 94a420b1 Stefan Hajnoczi
636 94a420b1 Stefan Hajnoczi
exit 0