From patchwork Tue Mar 13 20:03:21 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Llu=C3=ADs_Vilanova?= X-Patchwork-Id: 146489 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 32D03B6EEE for ; Wed, 14 Mar 2012 07:58:27 +1100 (EST) Received: from localhost ([::1]:33411 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S7Xx2-0003wI-G0 for incoming@patchwork.ozlabs.org; Tue, 13 Mar 2012 16:04:08 -0400 Received: from eggs.gnu.org ([208.118.235.92]:34309) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S7XwV-0002v3-M1 for qemu-devel@nongnu.org; Tue, 13 Mar 2012 16:03:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1S7XwO-000802-JU for qemu-devel@nongnu.org; Tue, 13 Mar 2012 16:03:35 -0400 Received: from roura.ac.upc.es ([147.83.33.10]:38914) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1S7XwO-0007zZ-99 for qemu-devel@nongnu.org; Tue, 13 Mar 2012 16:03:28 -0400 Received: from gw.ac.upc.edu (gw.ac.upc.es [147.83.30.3]) by roura.ac.upc.es (8.13.8/8.13.8) with ESMTP id q2DK3Npf023406; Tue, 13 Mar 2012 21:03:23 +0100 Received: from localhost (unknown [84.88.53.92]) by gw.ac.upc.edu (Postfix) with ESMTP id CFED82D0018; Tue, 13 Mar 2012 21:03:22 +0100 (CET) From: =?utf-8?b?TGx1w61z?= Vilanova To: qemu-devel@nongnu.org Date: Tue, 13 Mar 2012 21:03:21 +0100 Message-Id: <20120313200321.24179.96627.stgit@ginnungagap.bsc.es> X-Mailer: git-send-email 1.7.9.1 In-Reply-To: <20120313200235.24179.63987.stgit@ginnungagap.bsc.es> References: <20120313200235.24179.63987.stgit@ginnungagap.bsc.es> User-Agent: StGit/0.16 MIME-Version: 1.0 X-MIME-Autoconverted: from 8bit to quoted-printable by roura.ac.upc.es id q2DK3Npf023406 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 147.83.33.10 Cc: stefanha@gmail.com, harsh@linux.vnet.ibm.com, aneesh.kumar@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH 08/12] trace: [tracetool] Rewrite event argument parsing X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Adds an 'Arguments' class to describe event arguments. Signed-off-by: LluĂ­s Vilanova Signed-off-by: Harsh Prateek Bora --- scripts/tracetool.py | 113 ++++++++++++++++++++++++-------------------------- 1 files changed, 54 insertions(+), 59 deletions(-) diff --git a/scripts/tracetool.py b/scripts/tracetool.py index d7c04b4..f017053 100755 --- a/scripts/tracetool.py +++ b/scripts/tracetool.py @@ -39,30 +39,6 @@ Options: ''' sys.exit(1) -def get_argnames(args): - nfields = 0 - str = [] - for field in args.split(): - nfields = nfields + 1 - # Drop pointer star - type, ptr, tail = field.partition('*') - if type != field: - field = tail - - name, sep, tail = field.partition(',') - - if name == field: - continue - str.append(name) - str.append(", ") - - if nfields > 1: - str.append(name) - return ''.join(str) - else: - return '' - - def trace_h_begin(): print '''#ifndef TRACE_H #define TRACE_H @@ -102,11 +78,11 @@ def simple_h(events): print for num, event in enumerate(events): - if event.argc: - argstr = event.argnames.split() - arg_prefix = '(uint64_t)(uintptr_t)' + if len(event.args): + argstr = event.args.names() + arg_prefix = ', (uint64_t)(uintptr_t)' cast_args = arg_prefix + arg_prefix.join(argstr) - simple_args = (str(num) + ', ' + cast_args) + simple_args = (str(num) + cast_args) else: simple_args = str(num) @@ -116,7 +92,7 @@ def simple_h(events): }''' % { 'name': event.name, 'args': event.args, - 'argc': event.argc, + 'argc': len(event.args), 'trace_args': simple_args } print @@ -124,13 +100,6 @@ def simple_h(events): print 'extern TraceEvent trace_list[NR_TRACE_EVENTS];' -def is_string(arg): - strtype = ('const char*', 'char*', 'const char *', 'char *') - if arg.lstrip().startswith(strtype): - return True - else: - return False - def simple_c(events): print '#include "trace.h"' print @@ -150,11 +119,9 @@ def stderr_h(events): extern TraceEvent trace_list[];''' for num, event in enumerate(events): - argnames = event.argnames - if event.argc > 0: - argnames = ', ' + event.argnames - else: - argnames = '' + argnames = ", ".join(event.args.names()) + if len(event.args) > 0: + argnames = ", " + argnames print ''' static inline void trace_%(name)s(%(args)s) { @@ -191,13 +158,13 @@ def ust_h(events): #undef wmb''' for event in events: - if event.argc > 0: + if len(event.args) > 0: print ''' DECLARE_TRACE(ust_%(name)s, TP_PROTO(%(args)s), TP_ARGS(%(argnames)s)); #define trace_%(name)s trace_ust_%(name)s''' % { 'name': event.name, 'args': event.args, - 'argnames': event.argnames + 'argnames': ", ".join(event.args.names()) } else: print ''' @@ -215,9 +182,9 @@ def ust_c(events): #undef wmb #include "trace.h"''' for event in events: - argnames = event.argnames - if event.argc > 0: - argnames = ', ' + event.argnames + argnames = ", ".join(event.args.names()) + if len(event.args) > 0: + argnames = ', ' + argnames print ''' DEFINE_TRACE(ust_%(name)s); @@ -265,7 +232,7 @@ def dtrace_h(events): 'name': event.name, 'args': event.args, 'uppername': event.name.upper(), - 'argnames': event.argnames, + 'argnames': ", ".join(event.args.names()), } def dtrace_c(events): @@ -304,12 +271,12 @@ probe %(probeprefix)s.%(name)s = process("%(binary)s").mark("%(name)s") 'binary': binary } i = 1 - if event.argc > 0: - for arg in event.argnames.split(','): + if len(event.args) > 0: + for name in event.args.names(): # 'limit' is a reserved keyword - if arg == 'limit': - arg = '_limit' - print ' %s = $arg%d;' % (arg.lstrip(), i) + if name == 'limit': + name = '_limit' + print ' %s = $arg%d;' % (name.lstrip(), i) i += 1 print '}' print @@ -383,6 +350,39 @@ trace_gen = { }, } +# Event arguments +class Arguments: + def __init__ (self, arg_str): + self._args = [] + for arg in arg_str.split(","): + arg = arg.strip() + parts = arg.split() + head, sep, tail = parts[-1].rpartition("*") + parts = parts[:-1] + if tail == "void": + assert len(parts) == 0 and sep == "" + continue + arg_type = " ".join(parts + [ " ".join([head, sep]).strip() ]).strip() + self._args.append((arg_type, tail)) + + def __iter__(self): + return iter(self._args) + + def __len__(self): + return len(self._args) + + def __str__(self): + if len(self._args) == 0: + return "void" + else: + return ", ".join([ " ".join([t, n]) for t,n in self._args ]) + + def names(self): + return [ name for _, name in self._args ] + + def types(self): + return [ type_ for type_, _ in self._args ] + # A trace event cre = re.compile("((?P.*)\s+)?(?P[^(\s]+)\((?P[^)]*)\)\s*(?P\".*)?") @@ -393,16 +393,11 @@ class Event(object): m = cre.match(line) assert m is not None groups = m.groupdict('') - self.args = groups["args"] - self.arglist = self.args.split(',') self.name = groups["name"] - if len(self.arglist) == 1 and self.arglist[0] == "void": - self.argc = 0 - else: - self.argc = len(self.arglist) - self.argnames = get_argnames(self.args) self.fmt = groups["fmt"] self.properties = groups["props"].split() + self.args = Arguments(groups["args"]) + unknown_props = set(self.properties) - VALID_PROPS if len(unknown_props) > 0: raise ValueError("Unknown properties: %s" % ", ".join(unknown_props))