mirror of https://github.com/proxmox/mirror_qemu
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>master
parent
a7e30d84ce
commit
41ef7b00ab
|
@ -136,6 +136,8 @@ class Event(object):
|
||||||
Properties of the event.
|
Properties of the event.
|
||||||
args : Arguments
|
args : Arguments
|
||||||
The event arguments.
|
The event arguments.
|
||||||
|
arg_fmts : str
|
||||||
|
The format strings for each argument.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
_CRE = re.compile("((?P<props>.*)\s+)?"
|
_CRE = re.compile("((?P<props>.*)\s+)?"
|
||||||
|
@ -144,10 +146,11 @@ class Event(object):
|
||||||
"\s*"
|
"\s*"
|
||||||
"(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?"
|
"(?:(?:(?P<fmt_trans>\".+),)?\s*(?P<fmt>\".+))?"
|
||||||
"\s*")
|
"\s*")
|
||||||
|
_FMT = re.compile("(%\w+|%.*PRI\S+)")
|
||||||
|
|
||||||
_VALID_PROPS = set(["disable", "tcg", "tcg-trans", "tcg-exec"])
|
_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
|
Parameters
|
||||||
----------
|
----------
|
||||||
|
@ -159,13 +162,17 @@ class Event(object):
|
||||||
Event printing format (or formats).
|
Event printing format (or formats).
|
||||||
args : Arguments
|
args : Arguments
|
||||||
Event arguments.
|
Event arguments.
|
||||||
|
arg_fmts : list of str
|
||||||
|
Format strings for each argument.
|
||||||
orig : Event or None
|
orig : Event or None
|
||||||
Original Event before transformation.
|
Original Event before transformation.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.name = name
|
self.name = name
|
||||||
self.properties = props
|
self.properties = props
|
||||||
self.fmt = fmt
|
self.fmt = fmt
|
||||||
self.args = args
|
self.args = args
|
||||||
|
self.arg_fmts = arg_fmts
|
||||||
|
|
||||||
if orig is None:
|
if orig is None:
|
||||||
self.original = weakref.ref(self)
|
self.original = weakref.ref(self)
|
||||||
|
@ -203,6 +210,7 @@ class Event(object):
|
||||||
if len(fmt_trans) > 0:
|
if len(fmt_trans) > 0:
|
||||||
fmt = [fmt_trans, fmt]
|
fmt = [fmt_trans, fmt]
|
||||||
args = Arguments.build(groups["args"])
|
args = Arguments.build(groups["args"])
|
||||||
|
arg_fmts = Event._FMT.findall(fmt)
|
||||||
|
|
||||||
if "tcg-trans" in props:
|
if "tcg-trans" in props:
|
||||||
raise ValueError("Invalid property 'tcg-trans'")
|
raise ValueError("Invalid property 'tcg-trans'")
|
||||||
|
@ -213,7 +221,7 @@ class Event(object):
|
||||||
if "tcg" in props and isinstance(fmt, str):
|
if "tcg" in props and isinstance(fmt, str):
|
||||||
raise ValueError("Events with 'tcg' property must have two formats")
|
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):
|
def __repr__(self):
|
||||||
"""Evaluable string representation for this object."""
|
"""Evaluable string representation for this object."""
|
||||||
|
|
|
@ -63,13 +63,20 @@ def generate(events, backend):
|
||||||
name=e.name,
|
name=e.name,
|
||||||
args=", ".join(", ".join(i) for i in e.args))
|
args=", ".join(", ".join(i) for i in e.args))
|
||||||
|
|
||||||
for t, n in e.args:
|
types = e.args.types()
|
||||||
if ('int' in t) or ('long' in t) or ('unsigned' in t) or ('size_t' in t):
|
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 + ')')
|
out(' ctf_integer(' + t + ', ' + n + ', ' + n + ')')
|
||||||
elif ('double' in t) or ('float' in t):
|
elif ('double' in t) or ('float' in t):
|
||||||
out(' ctf_float(' + t + ', ' + n + ', ' + n + ')')
|
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):
|
elif ('void *' in t) or ('void*' in t):
|
||||||
out(' ctf_integer_hex(unsigned long, ' + n + ', ' + n + ')')
|
out(' ctf_integer_hex(unsigned long, ' + n + ', ' + n + ')')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue