| # -*- coding: utf-8 -*- | 
 |  | 
 | """ | 
 | trace/generated-tracers.h | 
 | """ | 
 |  | 
 | __author__     = "Lluís Vilanova <vilanova@ac.upc.edu>" | 
 | __copyright__  = "Copyright 2012-2017, Lluís Vilanova <vilanova@ac.upc.edu>" | 
 | __license__    = "GPL version 2 or (at your option) any later version" | 
 |  | 
 | __maintainer__ = "Stefan Hajnoczi" | 
 | __email__      = "stefanha@redhat.com" | 
 |  | 
 |  | 
 | from tracetool import out | 
 |  | 
 |  | 
 | def generate(events, backend, group): | 
 |     header = "trace/control.h" | 
 |  | 
 |     out('/* This file is autogenerated by tracetool, do not edit. */', | 
 |         '', | 
 |         '#ifndef TRACE_%s_GENERATED_TRACERS_H' % group.upper(), | 
 |         '#define TRACE_%s_GENERATED_TRACERS_H' % group.upper(), | 
 |         '', | 
 |         '#include "%s"' % header, | 
 |         '') | 
 |  | 
 |     for e in events: | 
 |         out('extern TraceEvent %(event)s;', | 
 |             event = e.api(e.QEMU_EVENT)) | 
 |  | 
 |     for e in events: | 
 |         out('extern uint16_t %s;' % e.api(e.QEMU_DSTATE)) | 
 |  | 
 |     # static state | 
 |     for e in events: | 
 |         if 'disable' in e.properties: | 
 |             enabled = 0 | 
 |         else: | 
 |             enabled = 1 | 
 |         if "tcg-exec" in e.properties: | 
 |             # a single define for the two "sub-events" | 
 |             out('#define TRACE_%(name)s_ENABLED %(enabled)d', | 
 |                 name=e.original.name.upper(), | 
 |                 enabled=enabled) | 
 |         out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled)) | 
 |  | 
 |     backend.generate_begin(events, group) | 
 |  | 
 |     for e in events: | 
 |         # tracer-specific dstate | 
 |         out('', | 
 |             '#define %(api)s() ( \\', | 
 |             api=e.api(e.QEMU_BACKEND_DSTATE)) | 
 |  | 
 |         if "disable" not in e.properties: | 
 |             backend.generate_backend_dstate(e, group) | 
 |  | 
 |         out('    false)') | 
 |  | 
 |         # tracer without checks | 
 |         out('', | 
 |             'static inline void %(api)s(%(args)s)', | 
 |             '{', | 
 |             api=e.api(e.QEMU_TRACE_NOCHECK), | 
 |             args=e.args) | 
 |  | 
 |         if "disable" not in e.properties: | 
 |             backend.generate(e, group) | 
 |  | 
 |         out('}') | 
 |  | 
 |         cond = "true" | 
 |  | 
 |         out('', | 
 |             'static inline void %(api)s(%(args)s)', | 
 |             '{', | 
 |             '    if (%(cond)s) {', | 
 |             '        %(api_nocheck)s(%(names)s);', | 
 |             '    }', | 
 |             '}', | 
 |             api=e.api(), | 
 |             api_nocheck=e.api(e.QEMU_TRACE_NOCHECK), | 
 |             args=e.args, | 
 |             names=", ".join(e.args.names()), | 
 |             cond=cond) | 
 |  | 
 |     backend.generate_end(events, group) | 
 |  | 
 |     out('#endif /* TRACE_%s_GENERATED_TRACERS_H */' % group.upper()) |