Skip to content

Commit

Permalink
trace: add DTrace reserved words for .d files
Browse files Browse the repository at this point in the history
DTrace on Mac OS X fails due to trace events using 'self' as an argument
name:

  GEN   trace/generated-tracers-dtrace.h
dtrace: failed to compile script trace/generated-tracers-dtrace.dtrace: line 1330: syntax error, unexpected DT_KEY_SELF, expecting ) near "self"
make: *** [trace/generated-tracers-dtrace.h] Error 1

Filter argument names according to the list of DTrace .d file reserved
keywords.

Note that DTrace on Mac and Linux still do not work after this patch.
There are additional build issues remaining.

Reported-by: Henk Poley <[email protected]>
Tested-by: Henk Poley <[email protected]>
Cc: Lluís Vilanova <[email protected]>
Signed-off-by: Stefan Hajnoczi <[email protected]>
  • Loading branch information
stefanhaRH committed Mar 2, 2015
1 parent ba79576 commit 0b7e89b
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions scripts/tracetool/format/d.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,19 @@
from tracetool import out


# Reserved keywords from
# https://wikis.oracle.com/display/DTrace/Types,+Operators+and+Expressions
RESERVED_WORDS = (
'auto', 'goto', 'sizeof', 'break', 'if', 'static', 'case', 'import',
'string', 'char', 'inline', 'stringof', 'const', 'int', 'struct',
'continue', 'long', 'switch', 'counter', 'offsetof', 'this',
'default', 'probe', 'translator', 'do', 'provider', 'typedef',
'double', 'register', 'union', 'else', 'restrict', 'unsigned',
'enum', 'return', 'void', 'extern', 'self', 'volatile', 'float',
'short', 'while', 'for', 'signed', 'xlate',
)


def generate(events, backend):
events = [e for e in events
if "disable" not in e.properties]
Expand All @@ -25,18 +38,17 @@ def generate(events, backend):
'provider qemu {')

for e in events:
args = str(e.args)

# DTrace provider syntax expects foo() for empty
# params, not foo(void)
if args == 'void':
args = ''
args = []
for type_, name in e.args:
if name in RESERVED_WORDS:
name += '_'
args.append(type_ + ' ' + name)

# Define prototype for probe arguments
out('',
'probe %(name)s(%(args)s);',
name=e.name,
args=args)
args=','.join(args))

out('',
'};')

0 comments on commit 0b7e89b

Please sign in to comment.