simple.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Simple built-in backend.
  5. """
  6. __author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
  7. __copyright__ = "Copyright 2012-2014, 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. PUBLIC = True
  13. def is_string(arg):
  14. strtype = ('const char*', 'char*', 'const char *', 'char *')
  15. if arg.lstrip().startswith(strtype):
  16. return True
  17. else:
  18. return False
  19. def generate_h_begin(events):
  20. for event in events:
  21. out('void _simple_%(api)s(%(args)s);',
  22. api=event.api(),
  23. args=event.args)
  24. out('')
  25. def generate_h(event):
  26. out(' _simple_%(api)s(%(args)s);',
  27. api=event.api(),
  28. args=", ".join(event.args.names()))
  29. def generate_c_begin(events):
  30. out('#include "trace.h"',
  31. '#include "trace/control.h"',
  32. '#include "trace/simple.h"',
  33. '')
  34. def generate_c(event):
  35. out('void _simple_%(api)s(%(args)s)',
  36. '{',
  37. ' TraceBufferRecord rec;',
  38. api=event.api(),
  39. args=event.args)
  40. sizes = []
  41. for type_, name in event.args:
  42. if is_string(type_):
  43. out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
  44. name=name)
  45. strsizeinfo = "4 + arg%s_len" % name
  46. sizes.append(strsizeinfo)
  47. else:
  48. sizes.append("8")
  49. sizestr = " + ".join(sizes)
  50. if len(event.args) == 0:
  51. sizestr = '0'
  52. out('',
  53. ' if (!trace_event_get_state(%(event_id)s)) {',
  54. ' return;',
  55. ' }',
  56. '',
  57. ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {',
  58. ' return; /* Trace Buffer Full, Event Dropped ! */',
  59. ' }',
  60. event_id='TRACE_' + event.name.upper(),
  61. size_str=sizestr)
  62. if len(event.args) > 0:
  63. for type_, name in event.args:
  64. # string
  65. if is_string(type_):
  66. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  67. name=name)
  68. # pointer var (not string)
  69. elif type_.endswith('*'):
  70. out(' trace_record_write_u64(&rec, (uintptr_t)(uint64_t *)%(name)s);',
  71. name=name)
  72. # primitive data type
  73. else:
  74. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  75. name=name)
  76. out(' trace_record_finish(&rec);',
  77. '}',
  78. '')