| # -*- 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() |