sync
[sdk/emulator/qemu.git] / scripts / tracetool / backend / dtrace.py
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-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 def stap(events):
77     for e in events:
78         # Define prototype for probe arguments
79         out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")',
80             '{',
81             probeprefix = _probeprefix(),
82             name = e.name,
83             binary = _binary(),
84             )
85
86         i = 1
87         if len(e.args) > 0:
88             for name in e.args.names():
89                 # Append underscore to reserved keywords
90                 if name in ('limit', 'in', 'next', 'self'):
91                     name += '_'
92                 out('  %s = $arg%d;' % (name, i))
93                 i += 1
94
95         out('}')
96
97     out()