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