1# -*- coding: utf-8 -*- 2 3""" 4trace/generated-ust-provider.h 5""" 6 7__author__ = "Mohamad Gebai <mohamad.gebai@polymtl.ca>" 8__copyright__ = "Copyright 2012, Mohamad Gebai <mohamad.gebai@polymtl.ca>" 9__license__ = "GPL version 2 or (at your option) any later version" 10 11__maintainer__ = "Stefan Hajnoczi" 12__email__ = "stefanha@redhat.com" 13 14 15from tracetool import out 16 17 18def generate(events, backend, group): 19 events = [e for e in events 20 if "disabled" not in e.properties] 21 22 if group == "all": 23 include = "trace-ust-all.h" 24 else: 25 include = "trace-ust.h" 26 27 out('/* This file is autogenerated by tracetool, do not edit. */', 28 '', 29 '#undef TRACEPOINT_PROVIDER', 30 '#define TRACEPOINT_PROVIDER qemu', 31 '', 32 '#undef TRACEPOINT_INCLUDE_FILE', 33 '#define TRACEPOINT_INCLUDE_FILE ./%s' % include, 34 '', 35 '#if !defined (TRACE_%s_GENERATED_UST_H) || \\' % group.upper(), 36 ' defined(TRACEPOINT_HEADER_MULTI_READ)', 37 '#define TRACE_%s_GENERATED_UST_H' % group.upper(), 38 '', 39 '#include <lttng/tracepoint.h>', 40 '', 41 '/*', 42 ' * LTTng ust 2.0 does not allow you to use TP_ARGS(void) for tracepoints', 43 ' * requiring no arguments. We define these macros introduced in more recent' 44 ' * versions of LTTng ust as a workaround', 45 ' */', 46 '#ifndef _TP_EXPROTO1', 47 '#define _TP_EXPROTO1(a) void', 48 '#endif', 49 '#ifndef _TP_EXDATA_PROTO1', 50 '#define _TP_EXDATA_PROTO1(a) void *__tp_data', 51 '#endif', 52 '#ifndef _TP_EXDATA_VAR1', 53 '#define _TP_EXDATA_VAR1(a) __tp_data', 54 '#endif', 55 '#ifndef _TP_EXVAR1', 56 '#define _TP_EXVAR1(a)', 57 '#endif', 58 '') 59 60 for e in events: 61 if len(e.args) > 0: 62 out('TRACEPOINT_EVENT(', 63 ' qemu,', 64 ' %(name)s,', 65 ' TP_ARGS(%(args)s),', 66 ' TP_FIELDS(', 67 name=e.name, 68 args=", ".join(", ".join(i) for i in e.args)) 69 70 types = e.args.types() 71 names = e.args.names() 72 fmts = e.formats() 73 for t,n,f in zip(types, names, fmts): 74 if ('char *' in t) or ('char*' in t): 75 out(' ctf_string(' + n + ', ' + n + ')') 76 elif ("%p" in f) or ("x" in f) or ("PRIx" in f): 77 out(' ctf_integer_hex('+ t + ', ' + n + ', ' + n + ')') 78 elif ("ptr" in t) or ("*" in t): 79 out(' ctf_integer_hex('+ t + ', ' + n + ', ' + n + ')') 80 elif ('int' in t) or ('long' in t) or ('unsigned' in t) \ 81 or ('size_t' in t) or ('bool' in t): 82 out(' ctf_integer(' + t + ', ' + n + ', ' + n + ')') 83 elif ('double' in t) or ('float' in t): 84 out(' ctf_float(' + t + ', ' + n + ', ' + n + ')') 85 elif ('void *' in t) or ('void*' in t): 86 out(' ctf_integer_hex(unsigned long, ' + n + ', ' + n + ')') 87 88 out(' )', 89 ')', 90 '') 91 92 else: 93 out('TRACEPOINT_EVENT(', 94 ' qemu,', 95 ' %(name)s,', 96 ' TP_ARGS(void),', 97 ' TP_FIELDS()', 98 ')', 99 '', 100 name=e.name) 101 102 out('#endif /* TRACE_%s_GENERATED_UST_H */' % group.upper(), 103 '', 104 '/* This part must be outside ifdef protection */', 105 '#include <lttng/tracepoint-event.h>') 106