trace: teach lttng backend to use format strings
This makes the UST backend pay attention to the format string arguments that are defined when defining payload data. With this you can now ensure integers are reported in hex mode if you want. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
a7e30d84ce
commit
41ef7b00ab
@ -136,6 +136,8 @@ class Event(object):
|
||||
Properties of the event.
|
||||
args : Arguments
|
||||
The event arguments.
|
||||
arg_fmts : str
|
||||
The format strings for each argument.
|
||||
"""
|
||||
|
||||
_CRE = re.compile("((?P<props>.*)\s+)?"
|
||||
@ -144,10 +146,11 @@ class Event(object):
|
||||
"\s*"
|
||||
"(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?"
|
||||
"\s*")
|
||||
_FMT = re.compile("(%\w+|%.*PRI\S+)")
|
||||
|
||||
_VALID_PROPS = set(["disable", "tcg", "tcg-trans", "tcg-exec"])
|
||||
|
||||
def __init__(self, name, props, fmt, args, orig=None):
|
||||
def __init__(self, name, props, fmt, args, arg_fmts, orig=None):
|
||||
"""
|
||||
Parameters
|
||||
----------
|
||||
@ -159,13 +162,17 @@ class Event(object):
|
||||
Event printing format (or formats).
|
||||
args : Arguments
|
||||
Event arguments.
|
||||
arg_fmts : list of str
|
||||
Format strings for each argument.
|
||||
orig : Event or None
|
||||
Original Event before transformation.
|
||||
|
||||
"""
|
||||
self.name = name
|
||||
self.properties = props
|
||||
self.fmt = fmt
|
||||
self.args = args
|
||||
self.arg_fmts = arg_fmts
|
||||
|
||||
if orig is None:
|
||||
self.original = weakref.ref(self)
|
||||
@ -203,6 +210,7 @@ class Event(object):
|
||||
if len(fmt_trans) > 0:
|
||||
fmt = [fmt_trans, fmt]
|
||||
args = Arguments.build(groups["args"])
|
||||
arg_fmts = Event._FMT.findall(fmt)
|
||||
|
||||
if "tcg-trans" in props:
|
||||
raise ValueError("Invalid property 'tcg-trans'")
|
||||
@ -213,7 +221,7 @@ class Event(object):
|
||||
if "tcg" in props and isinstance(fmt, str):
|
||||
raise ValueError("Events with 'tcg' property must have two formats")
|
||||
|
||||
return Event(name, props, fmt, args)
|
||||
return Event(name, props, fmt, args, arg_fmts)
|
||||
|
||||
def __repr__(self):
|
||||
"""Evaluable string representation for this object."""
|
||||
|
@ -63,13 +63,20 @@ def generate(events, backend):
|
||||
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):
|
||||
types = e.args.types()
|
||||
names = e.args.names()
|
||||
fmts = e.arg_fmts
|
||||
for t,n,f in zip(types, names, fmts):
|
||||
if ('char *' in t) or ('char*' in t):
|
||||
out(' ctf_string(' + n + ', ' + n + ')')
|
||||
elif ("%p" in f) or ("x" in f) or ("PRIx" in f):
|
||||
out(' ctf_integer_hex('+ t + ', ' + n + ', ' + n + ')')
|
||||
elif ("ptr" in t) or ("*" in t):
|
||||
out(' ctf_integer_hex('+ t + ', ' + n + ', ' + n + ')')
|
||||
elif ('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 + ')')
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user