summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohamad Gebai <mohamad.gebai@gmail.com>2014-01-29 22:47:55 -0500
committerStefan Hajnoczi <stefanha@redhat.com>2014-02-19 11:08:53 +0100
commit9530570fa5f86a52e31c92b26578a973b439d493 (patch)
treec51a0377695c0c2fef8d7186e0e1daa8c90d01a9
parentbf15f63cad5c909890be6656743979c7a46ab56d (diff)
downloadqemu-9530570fa5f86a52e31c92b26578a973b439d493.tar.gz
qemu-9530570fa5f86a52e31c92b26578a973b439d493.tar.bz2
qemu-9530570fa5f86a52e31c92b26578a973b439d493.zip
Modified the tracetool framework for LTTng 2.x
* A new format is required to generate definitions for ust tracepoints. Files ust_events_h.py and ust_events_c.py define common macros, while new function ust_events_h in events.py does the actual definition of each tracepoint. * ust.py generates the new interface for calling userspace tracepoints with LTTng 2.x, replacing trace_name(args) to tracepoint(name, args). * As explained in ust_events_c.py, -Wredundant-decls gives a warning when compiling with gcc 4.7 or older. This is specific to lttng-ust so for now use a pragma clause to avoid getting a warning. Signed-off-by: Mohamad Gebai <mohamad.gebai@polymtl.ca> Reviewed-by: Alex Bennée <alex@bennee.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--scripts/tracetool/backend/ust.py101
-rw-r--r--scripts/tracetool/format/ust_events_c.py30
-rw-r--r--scripts/tracetool/format/ust_events_h.py57
3 files changed, 132 insertions, 56 deletions
diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py
index ea36995092..41c1c75b7c 100644
--- a/scripts/tracetool/backend/ust.py
+++ b/scripts/tracetool/backend/ust.py
@@ -18,76 +18,65 @@ from tracetool import out
PUBLIC = True
-
def c(events):
- out('#include <ust/marker.h>',
- '#undef mutex_lock',
- '#undef mutex_unlock',
- '#undef inline',
- '#undef wmb',
- '#include "trace.h"')
+ pass
+
+def h(events):
+ out('#include <lttng/tracepoint.h>',
+ '#include "trace/generated-ust-provider.h"',
+ '')
for e in events:
argnames = ", ".join(e.args.names())
if len(e.args) > 0:
- argnames = ', ' + argnames
-
- out('DEFINE_TRACE(ust_%(name)s);',
- '',
- 'static void ust_%(name)s_probe(%(args)s)',
- '{',
- ' trace_mark(ust, %(name)s, %(fmt)s%(argnames)s);',
- '}',
- name = e.name,
- args = e.args,
- fmt = e.fmt,
- argnames = argnames,
- )
-
- else:
- out('DEFINE_TRACE(ust_%(name)s);',
- '',
- 'static void ust_%(name)s_probe(%(args)s)',
- '{',
- ' trace_mark(ust, %(name)s, UST_MARKER_NOARGS);',
- '}',
- name = e.name,
- args = e.args,
- )
-
- # register probes
- out('',
- 'static void __attribute__((constructor)) trace_init(void)',
- '{')
+ argnames = ", " + argnames
- for e in events:
- out(' register_trace_ust_%(name)s(ust_%(name)s_probe);',
+ out('static inline void trace_%(name)s(%(args)s)',
+ '{',
+ ' tracepoint(qemu, %(name)s%(tp_args)s);',
+ '}',
+ '',
name = e.name,
+ args = e.args,
+ tp_args = argnames,
)
- out('}')
-
-
-def h(events):
- out('#include <ust/tracepoint.h>',
- '#undef mutex_lock',
- '#undef mutex_unlock',
- '#undef inline',
- '#undef wmb')
+def ust_events_c(events):
+ pass
+def ust_events_h(events):
for e in events:
if len(e.args) > 0:
- out('DECLARE_TRACE(ust_%(name)s, TP_PROTO(%(args)s), TP_ARGS(%(argnames)s));',
- '#define trace_%(name)s trace_ust_%(name)s',
+ out('TRACEPOINT_EVENT(',
+ ' qemu,',
+ ' %(name)s,',
+ ' TP_ARGS(%(args)s),',
+ ' TP_FIELDS(',
name = e.name,
- args = e.args,
- argnames = ", ".join(e.args.names()),
+ args = ", ".join(", ".join(i) for i in e.args),
)
+ for t,n in e.args:
+ if ('int' in t) or ('long' in t) or ('unsigned' in t) or ('size_t' in t):
+ out(' ctf_integer(' + t + ', ' + n + ', ' + n + ')')
+ elif ('double' in t) or ('float' in t):
+ out(' ctf_float(' + t + ', ' + n + ', ' + n + ')')
+ elif ('char *' in t) or ('char*' in t):
+ out(' ctf_string(' + n + ', ' + n + ')')
+ elif ('void *' in t) or ('void*' in t):
+ out(' ctf_integer_hex(unsigned long, ' + n + ', ' + n + ')')
+
+ out(' )',
+ ')',
+ '')
+
else:
- out('_DECLARE_TRACEPOINT_NOARGS(ust_%(name)s);',
- '#define trace_%(name)s trace_ust_%(name)s',
+ out('TRACEPOINT_EVENT(',
+ ' qemu,',
+ ' %(name)s,',
+ ' TP_ARGS(void),',
+ ' TP_FIELDS()',
+ ')',
+ '',
name = e.name,
- )
-
- out()
+ ) \ No newline at end of file
diff --git a/scripts/tracetool/format/ust_events_c.py b/scripts/tracetool/format/ust_events_c.py
new file mode 100644
index 0000000000..116e713225
--- /dev/null
+++ b/scripts/tracetool/format/ust_events_c.py
@@ -0,0 +1,30 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Generate .c for LTTng ust event description.
+"""
+
+__author__ = "Mohamad Gebai <mohamad.gebai@polymtl.ca>"
+__copyright__ = "Copyright 2012, Mohamad Gebai <mohamad.gebai@polymtl.ca>"
+__license__ = "GPL version 2 or (at your option) any later version"
+
+__maintainer__ = "Stefan Hajnoczi"
+__email__ = "stefanha@redhat.com"
+
+
+from tracetool import out
+
+
+def begin(events):
+ out('/* This file is autogenerated by tracetool, do not edit. */',
+ '',
+ '#define TRACEPOINT_DEFINE',
+ '#define TRACEPOINT_CREATE_PROBES',
+ '',
+ '/* If gcc version 4.7 or older is used, LTTng ust gives a warning when compiling with',
+ ' -Wredundant-decls.',
+ ' */',
+ '#pragma GCC diagnostic ignored "-Wredundant-decls"',
+ '',
+ '#include "generated-ust-provider.h"')
diff --git a/scripts/tracetool/format/ust_events_h.py b/scripts/tracetool/format/ust_events_h.py
new file mode 100644
index 0000000000..f206eca6ec
--- /dev/null
+++ b/scripts/tracetool/format/ust_events_h.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+Generate .h for LTTng ust event description.
+"""
+
+__author__ = "Mohamad Gebai <mohamad.gebai@polymtl.ca>"
+__copyright__ = "Copyright 2012, Mohamad Gebai <mohamad.gebai@polymtl.ca>"
+__license__ = "GPL version 2 or (at your option) any later version"
+
+__maintainer__ = "Stefan Hajnoczi"
+__email__ = "stefanha@redhat.com"
+
+
+from tracetool import out
+
+
+def begin(events):
+ out('/* This file is autogenerated by tracetool, do not edit. */',
+ '',
+ '#undef TRACEPOINT_PROVIDER',
+ '#define TRACEPOINT_PROVIDER qemu',
+ '',
+ '#undef TRACEPOINT_INCLUDE_FILE',
+ '#define TRACEPOINT_INCLUDE_FILE ./generated-ust-provider.h',
+ '',
+ '#if !defined (TRACE__GENERATED_UST_H) || defined(TRACEPOINT_HEADER_MULTI_READ)',
+ '#define TRACE__GENERATED_UST_H',
+ '',
+ '#include "qemu-common.h"',
+ '#include <lttng/tracepoint.h>',
+ '',
+ '/*',
+ ' * LTTng ust 2.0 does not allow you to use TP_ARGS(void) for tracepoints',
+ ' * requiring no arguments. We define these macros introduced in more recent'
+ ' * versions of LTTng ust as a workaround',
+ ' */',
+ '#ifndef _TP_EXPROTO1',
+ '#define _TP_EXPROTO1(a) void',
+ '#endif',
+ '#ifndef _TP_EXDATA_PROTO1',
+ '#define _TP_EXDATA_PROTO1(a) void *__tp_data',
+ '#endif',
+ '#ifndef _TP_EXDATA_VAR1',
+ '#define _TP_EXDATA_VAR1(a) __tp_data',
+ '#endif',
+ '#ifndef _TP_EXVAR1',
+ '#define _TP_EXVAR1(a)',
+ '#endif',
+ '')
+
+def end(events):
+ out('#endif /* TRACE__GENERATED_UST_H */',
+ '',
+ '/* This part must be outside ifdef protection */',
+ '#include <lttng/tracepoint-event.h>')