2 # -*- coding: utf-8 -*-
5 Generate .stp file that outputs simpletrace binary traces (DTrace with SystemTAP only).
8 __author__
= "Stefan Hajnoczi <redhat.com>"
9 __copyright__
= "Copyright (C) 2014, Red Hat, Inc."
10 __license__
= "GPL version 2 or (at your option) any later version"
12 __maintainer__
= "Stefan Hajnoczi"
13 __email__
= "stefanha@redhat.com"
16 from tracetool
import out
17 from tracetool
.backend
.dtrace
import binary
, probeprefix
18 from tracetool
.backend
.simple
import is_string
19 from tracetool
.format
.stap
import stap_escape
21 def global_var_name(name
):
22 return probeprefix().replace(".", "_") + "_" + name
24 def generate(events
, backend
, group
):
25 out('/* This file is autogenerated by tracetool, do not edit. */',
28 for event_id
, e
in enumerate(events
):
29 if 'disable' in e
.properties
:
32 out('probe %(probeprefix)s.simpletrace.%(name)s = %(probeprefix)s.%(name)s ?',
34 probeprefix
=probeprefix(),
37 # Calculate record size
38 sizes
= ['24'] # sizeof(TraceRecord)
39 for type_
, name
in e
.args
:
40 name
= stap_escape(name
)
43 ' arg%(name)s_str = %(name)s ? user_string_n(%(name)s, 512) : "<null>"',
45 ' arg%(name)s_len = strlen(arg%(name)s_str)',
47 sizes
.append('4 + arg%s_len' % name
)
50 sizestr
= ' + '.join(sizes
)
52 # Generate format string and value pairs for record header and arguments
53 fields
= [('8b', str(event_id
)),
54 ('8b', 'gettimeofday_ns()'),
57 for type_
, name
in e
.args
:
58 name
= stap_escape(name
)
60 fields
.extend([('4b', 'arg%s_len' % name
),
61 ('.*s', 'arg%s_len, arg%s_str' % (name
, name
))])
63 fields
.append(('8b', name
))
65 # Emit the entire record in a single SystemTap printf()
66 fmt_str
= '%'.join(fmt
for fmt
, _
in fields
)
67 arg_str
= ', '.join(arg
for _
, arg
in fields
)
68 out(' printf("%%8b%%%(fmt_str)s", 1, %(arg_str)s)',
69 fmt_str
=fmt_str
, arg_str
=arg_str
)