1# -*- coding: utf-8 -*- 2 3""" 4Generate .stp file (DTrace with SystemTAP only). 5""" 6 7__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 8__copyright__ = "Copyright 2012-2014, Lluís Vilanova <vilanova@ac.upc.edu>" 9__license__ = "GPL version 2 or (at your option) any later version" 10 11__maintainer__ = "Stefan Hajnoczi" 12__email__ = "stefanha@linux.vnet.ibm.com" 13 14 15from tracetool import out 16from tracetool.backend.dtrace import binary, probeprefix 17 18 19# Technically 'self' is not used by systemtap yet, but 20# they recommended we keep it in the reserved list anyway 21RESERVED_WORDS = ( 22 'break', 'catch', 'continue', 'delete', 'else', 'for', 23 'foreach', 'function', 'global', 'if', 'in', 'limit', 24 'long', 'next', 'probe', 'return', 'self', 'string', 25 'try', 'while' 26 ) 27 28 29def stap_escape(identifier): 30 # Append underscore to reserved keywords 31 if identifier in RESERVED_WORDS: 32 return identifier + '_' 33 return identifier 34 35 36def generate(events, backend, group): 37 events = [e for e in events 38 if "disable" not in e.properties] 39 40 out('/* This file is autogenerated by tracetool, do not edit. */', 41 '') 42 43 for e in events: 44 # Define prototype for probe arguments 45 out('probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s")', 46 '{', 47 probeprefix=probeprefix(), 48 name=e.name, 49 binary=binary()) 50 51 i = 1 52 if len(e.args) > 0: 53 for name in e.args.names(): 54 name = stap_escape(name) 55 out(' %s = $arg%d;' % (name, i)) 56 i += 1 57 58 out('}') 59 60 out() 61