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