tcg_helper_wrapper_h.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Generate trace/generated-helpers-wrappers.h.
  5. """
  6. __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
  7. __copyright__ = "Copyright 2012-2016, Lluís Vilanova <vilanova@ac.upc.edu>"
  8. __license__ = "GPL version 2 or (at your option) any later version"
  9. __maintainer__ = "Stefan Hajnoczi"
  10. __email__ = "stefanha@linux.vnet.ibm.com"
  11. from tracetool import out
  12. from tracetool.transform import *
  13. import tracetool.vcpu
  14. def generate(events, backend, group):
  15. events = [e for e in events
  16. if "disable" not in e.properties]
  17. out('/* This file is autogenerated by tracetool, do not edit. */',
  18. '',
  19. '#define tcg_temp_new_nop(v) (v)',
  20. '#define tcg_temp_free_nop(v)',
  21. '',
  22. )
  23. for e in events:
  24. if "tcg-exec" not in e.properties:
  25. continue
  26. # tracetool.generate always transforms types to host
  27. e_args = tracetool.vcpu.transform_args("tcg_helper_c", e.original, "wrapper")
  28. # mixed-type to TCG helper bridge
  29. args_tcg_compat = e_args.transform(HOST_2_TCG_COMPAT)
  30. code_new = [
  31. "%(tcg_type)s __%(name)s = %(tcg_func)s(%(name)s);" %
  32. {"tcg_type": transform_type(type_, HOST_2_TCG),
  33. "tcg_func": transform_type(type_, HOST_2_TCG_TMP_NEW),
  34. "name": name}
  35. for (type_, name) in args_tcg_compat
  36. ]
  37. code_free = [
  38. "%(tcg_func)s(__%(name)s);" %
  39. {"tcg_func": transform_type(type_, HOST_2_TCG_TMP_FREE),
  40. "name": name}
  41. for (type_, name) in args_tcg_compat
  42. ]
  43. gen_name = "gen_helper_" + e.api()
  44. out('static inline void %(name)s(%(args)s)',
  45. '{',
  46. ' %(code_new)s',
  47. ' %(proxy_name)s(%(tmp_names)s);',
  48. ' %(code_free)s',
  49. '}',
  50. name=gen_name,
  51. args=e_args,
  52. proxy_name=gen_name + "_proxy",
  53. code_new="\n ".join(code_new),
  54. code_free="\n ".join(code_free),
  55. tmp_names=", ".join(["__%s" % name for _, name in e_args]),
  56. )