From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:52135) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rvoz2-0005Fl-6u for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Rvoyv-0001g9-Lv for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:43 -0500 Received: from gw.ac.upc.edu ([147.83.30.3]:55460) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Rvoyv-0001fv-5f for qemu-devel@nongnu.org; Fri, 10 Feb 2012 06:49:37 -0500 From: =?utf-8?b?TGx1w61z?= Vilanova Date: Fri, 10 Feb 2012 12:49:28 +0100 Message-ID: <20120210114928.5104.63648.stgit@ginnungagap.bsc.es> In-Reply-To: <20120210114849.5104.63589.stgit@ginnungagap.bsc.es> References: <20120210114849.5104.63589.stgit@ginnungagap.bsc.es> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v3 07/11] trace: [tracetool] Rewrite event argument parsing List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: stefanha@gmail.com, harsh@linux.vnet.ibm.com Signed-off-by: Llu=C3=ADs Vilanova --- scripts/tracetool.py | 192 ++++++++++++++++++++++++--------------------= ------ 1 files changed, 91 insertions(+), 101 deletions(-) diff --git a/scripts/tracetool.py b/scripts/tracetool.py index b185724..cd1c29d 100755 --- a/scripts/tracetool.py +++ b/scripts/tracetool.py @@ -38,49 +38,6 @@ Options: ''' sys.exit(1) =20 -def get_argnames(args): - nfields =3D 0 - str =3D [] - for field in args.split(): - nfields =3D nfields + 1 - # Drop pointer star - type, ptr, tail =3D field.partition('*') - if type !=3D field: - field =3D tail - - name, sep, tail =3D field.partition(',') - - if name =3D=3D field: - continue - str.append(name) - str.append(", ") - - if nfields > 1: - str.append(name) - return ''.join(str) - else: - return '' - -def calc_sizeofargs(args, argc): - strtype =3D ('const char*', 'char*', 'const char *', 'char *') - str =3D [] - newstr =3D "" - if argc > 0: - str =3D args.split(',') - for elem in str: - if elem.lstrip().startswith(strtype): #strings - type, sep, var =3D elem.rpartition('*') - newstr =3D newstr+"4 + strlen("+var.lstrip()+") + " - #elif '*' in elem: - # newstr =3D newstr + "4 + " # pointer vars - else: - #type, sep, var =3D elem.rpartition(' ') - #newstr =3D newstr+"sizeof("+type.lstrip()+") + " - newstr =3D newstr + '8 + ' - newstr =3D newstr + '0' # for last + - return newstr - - def trace_h_begin(): print '''#ifndef TRACE_H #define TRACE_H @@ -133,13 +90,6 @@ def simple_h(events): =20 return =20 -def is_string(arg): - strtype =3D ('const char*', 'char*', 'const char *', 'char *') - if arg.lstrip().startswith(strtype): - return True - else: - return False - def simple_c(events): rec_off =3D 0 print '#include "trace.h"' @@ -154,8 +104,16 @@ def simple_c(events): print print '};' print + for num, event in enumerate(events): - argc =3D event.argc + sizes =3D [] + for type_, name in event.args: + if type_is_string(type_): + sizes.append("4 + strlen(%s)" % name) + else: + sizes.append("8 + sizeof(%s)" % type_) + sizestr =3D " + ".join(sizes) + print '''void trace_%(name)s(%(args)s) { unsigned int tbuf_idx, rec_off __attribute__((unused)); @@ -166,52 +124,52 @@ def simple_c(events): if (!trace_list[%(event_id)s].state) { return; } + + tbuf_idx =3D trace_alloc_record(%(event_id)s, %(sizestr)s); + rec_off =3D (tbuf_idx + ST_V2_REC_HDR_LEN) %% TRACE_BUF_LEN; /* seek= record header */ ''' % { 'name': event.name, 'args': event.args, 'event_id': num, + 'sizestr' : sizestr, } - print ''' - tbuf_idx =3D trace_alloc_record(%(event_id)s, %(sizestr)s); - rec_off =3D (tbuf_idx + ST_V2_REC_HDR_LEN) %% TRACE_BUF_LEN; /* seek= record header */ -''' % {'event_id': num, 'sizestr': event.sizestr,} =20 - if argc > 0: - str =3D event.arglist - for elem in str: - if is_string(elem): # if string - type, sep, var =3D elem.rpartition('*') + if len(event.args) > 0: + for type_, name in event.args: + # string + if type_is_string(type_): print ''' - slen =3D strlen(%(var)s); + slen =3D strlen(%(name)s); write_to_buffer(rec_off, (uint8_t*)&slen, sizeof(slen)); rec_off +=3D sizeof(slen);''' % { - 'var': var.lstrip() + 'name': name } print ''' - write_to_buffer(rec_off, (uint8_t*)%(var)s, slen); + write_to_buffer(rec_off, (uint8_t*)%(name)s, slen); rec_off +=3D slen;''' % { - 'var': var.lstrip() + 'name': name } - elif '*' in elem: # pointer var (not string) - type, sep, var =3D elem.rpartition('*') + # pointer var (not string) + elif type_.endswith('*'): print ''' - pvar64 =3D (uint64_t)(uint64_t*)%(var)s; + pvar64 =3D (uint64_t)(uint64_t*)%(name)s; write_to_buffer(rec_off, (uint8_t*)&pvar64, sizeof(uint64_t)); rec_off +=3D sizeof(uint64_t);''' % { - 'var': var.lstrip() + 'name': name } - else: # primitive data type - type, sep, var =3D elem.rpartition(' ') + # primitive data type + else: print ''' - var64 =3D (uint64_t)%(var)s; + var64 =3D (uint64_t)%(name)s; write_to_buffer(rec_off, (uint8_t*)&var64, sizeof(uint64_t)); rec_off +=3D sizeof(uint64_t);''' % { - 'var': var.lstrip() + 'name': name } print ''' - trace_mark_record_complete(tbuf_idx);''' - print '}' - print + trace_mark_record_complete(tbuf_idx); +} + +''' =20 return =20 @@ -220,12 +178,11 @@ def stderr_h(events): #include "trace/stderr.h" =20 extern TraceEvent trace_list[];''' + for num, event in enumerate(events): - argnames =3D event.argnames - if event.argc > 0: - argnames =3D ', ' + event.argnames - else: - argnames =3D '' + argnames =3D ", ".join(event.args.names()) + if len(event.args) > 0: + argnames =3D ", "+argnames print ''' static inline void trace_%(name)s(%(args)s) { @@ -262,13 +219,13 @@ def ust_h(events): #undef wmb''' =20 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 ''' @@ -287,9 +244,9 @@ def ust_c(events): #undef wmb #include "trace.h"''' for event in events: - argnames =3D event.argnames - if event.argc > 0: - argnames =3D ', ' + event.argnames + argnames =3D ", ".join(event.args.names()) + if len(event.args) > 0: + argnames =3D ', ' + argnames print ''' DEFINE_TRACE(ust_%(name)s); =20 @@ -339,7 +296,7 @@ def dtrace_h(events): 'name': event.name, 'args': event.args, 'uppername': event.name.upper(), - 'argnames': event.argnames, + 'argnames': ", ".join(event.args.names()), } =20 def dtrace_c(events): @@ -379,12 +336,12 @@ probe %(probeprefix)s.%(name)s =3D process("%(binar= y)s").mark("%(name)s") 'binary': binary } i =3D 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 =3D=3D 'limit': - arg =3D '_limit' - print ' %s =3D $arg%d;' % (arg.lstrip(), i) + if name =3D=3D 'limit': + name =3D '_limit' + print ' %s =3D $arg%d;' % (name.lstrip(), i) i +=3D 1 print '}' print @@ -478,6 +435,47 @@ trace_gen =3D { }, } =20 +# Event arguments +def type_is_string(type_): + strtype =3D ('const char*', 'char*', 'const char *', 'char *') + return type_.startswith(strtype) + +class Arguments: + def __init__ (self, arg_str): + self._args =3D [] + for arg in arg_str.split(","): + arg =3D arg.strip() + parts =3D arg.split() + head, sep, tail =3D parts[-1].rpartition("*") + parts =3D parts[:-1] + if tail =3D=3D "void": + assert len(parts) =3D=3D 0 and sep =3D=3D "" + continue + arg_type =3D " ".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) =3D=3D 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 ] + + def size_str(self): + res =3D "" + return res + # A trace event import re cre =3D re.compile("((?P.*)\s+)?(?P[^(\s]+)\((?P[^)]*= )\)\s*(?P\".*)?") @@ -489,19 +487,11 @@ class Event(object): m =3D cre.match(line) assert m is not None groups =3D m.groupdict('') - self.args =3D groups["args"] - self.arglist =3D self.args.split(',') self.name =3D groups["name"] - if len(self.arglist) =3D=3D 1 and self.arglist[0] =3D=3D "void": - self.argc =3D 0 - else: - self.argc =3D len(self.arglist) - if self.name =3D=3D "slavio_misc_update_irq_raise": - sys.stderr.write("%s : %d" % (self.name, self.argc)) - self.argnames =3D get_argnames(self.args) - self.sizestr =3D calc_sizeofargs(self.args, self.argc) self.fmt =3D groups["fmt"] self.properties =3D groups["props"].split() + self.args =3D Arguments(groups["args"]) + unknown_props =3D set(self.properties) - VALID_PROPS if len(unknown_props) > 0: raise ValueError("Unknown properties: %s" % ", ".join(unknow= n_props))