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 |