dtrace.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # -*- coding: utf-8 -*-
  2. """
  3. DTrace/SystemTAP backend.
  4. """
  5. __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
  6. __copyright__ = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>"
  7. __license__ = "GPL version 2 or (at your option) any later version"
  8. __maintainer__ = "Stefan Hajnoczi"
  9. __email__ = "stefanha@redhat.com"
  10. from tracetool import out
  11. PUBLIC = True
  12. PROBEPREFIX = None
  13. def probeprefix():
  14. if PROBEPREFIX is None:
  15. raise ValueError("you must set PROBEPREFIX")
  16. return PROBEPREFIX
  17. BINARY = None
  18. def binary():
  19. if BINARY is None:
  20. raise ValueError("you must set BINARY")
  21. return BINARY
  22. def generate_h_begin(events, group):
  23. if group == "root":
  24. header = "trace-dtrace-root.h"
  25. else:
  26. header = "trace-dtrace.h"
  27. # Workaround for ust backend, which also includes <sys/sdt.h> and may
  28. # require SDT_USE_VARIADIC to be defined. If dtrace includes <sys/sdt.h>
  29. # first without defining SDT_USE_VARIADIC then ust breaks because the
  30. # STAP_PROBEV() macro is not defined.
  31. out('#define SDT_USE_VARIADIC 1')
  32. out('#include "%s"' % header,
  33. '')
  34. # SystemTap defines <provider>_<name>_ENABLED() but other DTrace
  35. # implementations might not.
  36. for e in events:
  37. out('#ifndef QEMU_%(uppername)s_ENABLED',
  38. '#define QEMU_%(uppername)s_ENABLED() true',
  39. '#endif',
  40. uppername=e.name.upper())
  41. def generate_h(event, group):
  42. out(' QEMU_%(uppername)s(%(argnames)s);',
  43. uppername=event.name.upper(),
  44. argnames=", ".join(event.args.names()))
  45. def generate_h_backend_dstate(event, group):
  46. out(' QEMU_%(uppername)s_ENABLED() || \\',
  47. uppername=event.name.upper())