tcg_helper_c.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. """
  3. Generate trace/generated-helpers.c.
  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 Arguments, out
  11. from tracetool.transform import *
  12. import tracetool.vcpu
  13. def vcpu_transform_args(args, mode):
  14. assert len(args) == 1
  15. # NOTE: this name must be kept in sync with the one in "tcg_h"
  16. args = Arguments([(args.types()[0], "__tcg_" + args.names()[0])])
  17. if mode == "code":
  18. return Arguments([
  19. # Does cast from helper requirements to tracing types
  20. ("CPUState *", "env_cpu(%s)" % args.names()[0]),
  21. ])
  22. else:
  23. args = Arguments([
  24. # NOTE: Current helper code uses TCGv_env (CPUArchState*)
  25. ("CPUArchState *", args.names()[0]),
  26. ])
  27. if mode == "header":
  28. return args
  29. elif mode == "wrapper":
  30. return args.transform(HOST_2_TCG)
  31. else:
  32. assert False
  33. def generate(events, backend, group):
  34. if group == "root":
  35. header = "trace/trace-root.h"
  36. else:
  37. header = "trace.h"
  38. events = [e for e in events
  39. if "disable" not in e.properties]
  40. out('/* This file is autogenerated by tracetool, do not edit. */',
  41. '',
  42. '#include "qemu/osdep.h"',
  43. '#include "cpu.h"',
  44. '#include "exec/helper-proto.h"',
  45. '#include "%s"' % header,
  46. '',
  47. )
  48. for e in events:
  49. if "tcg-exec" not in e.properties:
  50. continue
  51. e_args_api = tracetool.vcpu.transform_args(
  52. "tcg_helper_c", e.original, "header").transform(
  53. HOST_2_TCG_COMPAT, TCG_2_TCG_HELPER_DEF)
  54. e_args_call = tracetool.vcpu.transform_args(
  55. "tcg_helper_c", e, "code")
  56. out('void %(name_tcg)s(%(args_api)s)',
  57. '{',
  58. # NOTE: the check was already performed at TCG-generation time
  59. ' %(name)s(%(args_call)s);',
  60. '}',
  61. name_tcg="helper_%s_proxy" % e.api(),
  62. name=e.api(e.QEMU_TRACE_NOCHECK),
  63. args_api=e_args_api,
  64. args_call=", ".join(e_args_call.casted()),
  65. )