* 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>
82 lines
2.2 KiB
Python
82 lines
2.2 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
|
LTTng User Space Tracing backend.
|
|
"""
|
|
|
|
__author__ = "Lluís Vilanova <vilanova@ac.upc.edu>"
|
|
__copyright__ = "Copyright 2012, Lluís Vilanova <vilanova@ac.upc.edu>"
|
|
__license__ = "GPL version 2 or (at your option) any later version"
|
|
|
|
__maintainer__ = "Stefan Hajnoczi"
|
|
__email__ = "stefanha@linux.vnet.ibm.com"
|
|
|
|
|
|
from tracetool import out
|
|
|
|
|
|
PUBLIC = True
|
|
|
|
def c(events):
|
|
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('static inline void trace_%(name)s(%(args)s)',
|
|
'{',
|
|
' tracepoint(qemu, %(name)s%(tp_args)s);',
|
|
'}',
|
|
'',
|
|
name = e.name,
|
|
args = e.args,
|
|
tp_args = argnames,
|
|
)
|
|
|
|
def ust_events_c(events):
|
|
pass
|
|
|
|
def ust_events_h(events):
|
|
for e in events:
|
|
if len(e.args) > 0:
|
|
out('TRACEPOINT_EVENT(',
|
|
' qemu,',
|
|
' %(name)s,',
|
|
' TP_ARGS(%(args)s),',
|
|
' TP_FIELDS(',
|
|
name = e.name,
|
|
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('TRACEPOINT_EVENT(',
|
|
' qemu,',
|
|
' %(name)s,',
|
|
' TP_ARGS(void),',
|
|
' TP_FIELDS()',
|
|
')',
|
|
'',
|
|
name = e.name,
|
|
) |