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 |