| # -*- coding: utf-8 -*- | |
| """ | |
| Generate .stp file (DTrace with SystemTAP only). | |
| """ | |
| __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" | |
| __copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" | |
| __license__ = "GPL version 2 or (at your option) any later version" | |
| __maintainer__ = "Stefan Hajnoczi" | |
| __email__ = "stefanha@redhat.com" | |
| from tracetool import out | |
| from tracetool.backend.dtrace import binary, probeprefix | |
| # Technically 'self' is not used by systemtap yet, but | |
| # they recommended we keep it in the reserved list anyway | |
| RESERVED_WORDS = ( | |
| 'break', 'catch', 'continue', 'delete', 'else', 'for', | |
| 'foreach', 'function', 'global', 'if', 'in', 'limit', | |
| 'long', 'next', 'probe', 'return', 'self', 'string', | |
| 'try', 'while' | |
| ) | |
| def stap_escape(identifier): | |
| # Append underscore to reserved keywords | |
| if identifier in RESERVED_WORDS: | |
| return identifier + '_' | |
| return identifier | |
| def generate(events, backend, group): | |
| events = [e for e in events | |
| if "disable" not in e.properties] | |
| out('/* This file is autogenerated by tracetool, do not edit. */', | |
| '') | |
| for e in events: | |
| # Define prototype for probe arguments | |
| out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")', | |
| '{', | |
| probeprefix=probeprefix(), | |
| name=e.name, | |
| binary=binary()) | |
| i = 1 | |
| if len(e.args) > 0: | |
| for name in e.args.names(): | |
| name = stap_escape(name) | |
| out(' %s = $arg%d;' % (name, i)) | |
| i += 1 | |
| out('}') | |
| out() |