dtrace.py (1842B)
1 # -*- coding: utf-8 -*- 2 3 """ 4 DTrace/SystemTAP backend. 5 """ 6 7 __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>" 8 __copyright__ = "Copyright 2012-2017, 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@redhat.com" 13 14 15 from tracetool import out 16 17 18 PUBLIC = True 19 20 21 PROBEPREFIX = None 22 23 def probeprefix(): 24 if PROBEPREFIX is None: 25 raise ValueError("you must set PROBEPREFIX") 26 return PROBEPREFIX 27 28 29 BINARY = None 30 31 def binary(): 32 if BINARY is None: 33 raise ValueError("you must set BINARY") 34 return BINARY 35 36 37 def generate_h_begin(events, group): 38 if group == "root": 39 header = "trace-dtrace-root.h" 40 else: 41 header = "trace-dtrace-%s.h" % group 42 43 # Workaround for ust backend, which also includes <sys/sdt.h> and may 44 # require SDT_USE_VARIADIC to be defined. If dtrace includes <sys/sdt.h> 45 # first without defining SDT_USE_VARIADIC then ust breaks because the 46 # STAP_PROBEV() macro is not defined. 47 out('#ifndef SDT_USE_VARIADIC') 48 out('#define SDT_USE_VARIADIC 1') 49 out('#endif') 50 51 out('#include "%s"' % header, 52 '') 53 54 out('#undef SDT_USE_VARIADIC') 55 56 # SystemTap defines <provider>_<name>_ENABLED() but other DTrace 57 # implementations might not. 58 for e in events: 59 out('#ifndef QEMU_%(uppername)s_ENABLED', 60 '#define QEMU_%(uppername)s_ENABLED() true', 61 '#endif', 62 uppername=e.name.upper()) 63 64 def generate_h(event, group): 65 out(' QEMU_%(uppername)s(%(argnames)s);', 66 uppername=event.name.upper(), 67 argnames=", ".join(event.args.names())) 68 69 70 def generate_h_backend_dstate(event, group): 71 out(' QEMU_%(uppername)s_ENABLED() || \\', 72 uppername=event.name.upper())