simple.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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, 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 c(events):
  20. out('#include "trace.h"',
  21. '#include "trace/simple.h"',
  22. '',
  23. 'TraceEvent trace_list[] = {')
  24. for e in events:
  25. out('{.tp_name = "%(name)s", .state=0},',
  26. name = e.name,
  27. )
  28. out('};',
  29. '')
  30. for num, event in enumerate(events):
  31. out('void trace_%(name)s(%(args)s)',
  32. '{',
  33. ' TraceBufferRecord rec;',
  34. name = event.name,
  35. args = event.args,
  36. )
  37. sizes = []
  38. for type_, name in event.args:
  39. if is_string(type_):
  40. out(' size_t arg%(name)s_len = %(name)s ? MIN(strlen(%(name)s), MAX_TRACE_STRLEN) : 0;',
  41. name = name,
  42. )
  43. strsizeinfo = "4 + arg%s_len" % name
  44. sizes.append(strsizeinfo)
  45. else:
  46. sizes.append("8")
  47. sizestr = " + ".join(sizes)
  48. if len(event.args) == 0:
  49. sizestr = '0'
  50. out('',
  51. ' if (!trace_list[%(event_id)s].state) {',
  52. ' return;',
  53. ' }',
  54. '',
  55. ' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {',
  56. ' return; /* Trace Buffer Full, Event Dropped ! */',
  57. ' }',
  58. event_id = num,
  59. size_str = sizestr,
  60. )
  61. if len(event.args) > 0:
  62. for type_, name in event.args:
  63. # string
  64. if is_string(type_):
  65. out(' trace_record_write_str(&rec, %(name)s, arg%(name)s_len);',
  66. name = name,
  67. )
  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. )
  73. # primitive data type
  74. else:
  75. out(' trace_record_write_u64(&rec, (uint64_t)%(name)s);',
  76. name = name,
  77. )
  78. out(' trace_record_finish(&rec);',
  79. '}',
  80. '')
  81. def h(events):
  82. out('#include "trace/simple.h"',
  83. '')
  84. for event in events:
  85. out('void trace_%(name)s(%(args)s);',
  86. name = event.name,
  87. args = event.args,
  88. )
  89. out('')
  90. out('#define NR_TRACE_EVENTS %d' % len(events))
  91. out('extern TraceEvent trace_list[NR_TRACE_EVENTS];')