root / scripts / tracetool / backend / dtrace.py @ eac236ea
History | View | Annotate | Download (2.4 kB)
1 |
#!/usr/bin/env python
|
---|---|
2 |
# -*- coding: utf-8 -*-
|
3 |
|
4 |
"""
|
5 |
DTrace/SystemTAP backend.
|
6 |
"""
|
7 |
|
8 |
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
9 |
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
|
10 |
__license__ = "GPL version 2 or (at your option) any later version"
|
11 |
|
12 |
__maintainer__ = "Stefan Hajnoczi"
|
13 |
__email__ = "stefanha@linux.vnet.ibm.com"
|
14 |
|
15 |
|
16 |
from tracetool import out |
17 |
|
18 |
|
19 |
PROBEPREFIX = None
|
20 |
|
21 |
def _probeprefix(): |
22 |
if PROBEPREFIX is None: |
23 |
raise ValueError("you must set PROBEPREFIX") |
24 |
return PROBEPREFIX
|
25 |
|
26 |
|
27 |
BINARY = None
|
28 |
|
29 |
def _binary(): |
30 |
if BINARY is None: |
31 |
raise ValueError("you must set BINARY") |
32 |
return BINARY
|
33 |
|
34 |
|
35 |
def c(events): |
36 |
pass
|
37 |
|
38 |
|
39 |
def h(events): |
40 |
out('#include "trace/generated-tracers-dtrace.h"',
|
41 |
'')
|
42 |
|
43 |
for e in events: |
44 |
out('static inline void trace_%(name)s(%(args)s) {',
|
45 |
' QEMU_%(uppername)s(%(argnames)s);',
|
46 |
'}',
|
47 |
name = e.name, |
48 |
args = e.args, |
49 |
uppername = e.name.upper(), |
50 |
argnames = ", ".join(e.args.names()),
|
51 |
) |
52 |
|
53 |
|
54 |
def d(events): |
55 |
out('provider qemu {')
|
56 |
|
57 |
for e in events: |
58 |
args = str(e.args)
|
59 |
|
60 |
# DTrace provider syntax expects foo() for empty
|
61 |
# params, not foo(void)
|
62 |
if args == 'void': |
63 |
args = ''
|
64 |
|
65 |
# Define prototype for probe arguments
|
66 |
out('',
|
67 |
'probe %(name)s(%(args)s);',
|
68 |
name = e.name, |
69 |
args = args, |
70 |
) |
71 |
|
72 |
out('',
|
73 |
'};')
|
74 |
|
75 |
|
76 |
# Technically 'self' is not used by systemtap yet, but
|
77 |
# they recommended we keep it in the reserved list anyway
|
78 |
RESERVED_WORDS = ( |
79 |
'break', 'catch', 'continue', 'delete', 'else', 'for', |
80 |
'foreach', 'function', 'global', 'if', 'in', 'limit', |
81 |
'long', 'next', 'probe', 'return', 'self', 'string', |
82 |
'try', 'while' |
83 |
) |
84 |
|
85 |
def stap(events): |
86 |
for e in events: |
87 |
# Define prototype for probe arguments
|
88 |
out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
|
89 |
'{',
|
90 |
probeprefix = _probeprefix(), |
91 |
name = e.name, |
92 |
binary = _binary(), |
93 |
) |
94 |
|
95 |
i = 1
|
96 |
if len(e.args) > 0: |
97 |
for name in e.args.names(): |
98 |
# Append underscore to reserved keywords
|
99 |
if name in RESERVED_WORDS: |
100 |
name += '_'
|
101 |
out(' %s = $arg%d;' % (name, i))
|
102 |
i += 1
|
103 |
|
104 |
out('}')
|
105 |
|
106 |
out() |