Statistics
| Branch: | Revision:

root / tracetool @ 371c338e

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