2
0

dtrace.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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-%s.h" % group
  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('#ifndef SDT_USE_VARIADIC')
  32. out('#define SDT_USE_VARIADIC 1')
  33. out('#endif')
  34. out('#include "%s"' % header,
  35. '')
  36. out('#undef SDT_USE_VARIADIC')
  37. # SystemTap defines <provider>_<name>_ENABLED() but other DTrace
  38. # implementations might not.
  39. for e in events:
  40. out('#ifndef QEMU_%(uppername)s_ENABLED',
  41. '#define QEMU_%(uppername)s_ENABLED() true',
  42. '#endif',
  43. uppername=e.name.upper())
  44. def generate_h(event, group):
  45. out(' QEMU_%(uppername)s(%(argnames)s);',
  46. uppername=event.name.upper(),
  47. argnames=", ".join(event.args.names()))
  48. def generate_h_backend_dstate(event, group):
  49. out(' QEMU_%(uppername)s_ENABLED() || \\',
  50. uppername=event.name.upper())