From patchwork Mon Sep 30 15:05:00 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Mohamad Gebai X-Patchwork-Id: 279273 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 24B062C00B1 for ; Tue, 1 Oct 2013 07:28:14 +1000 (EST) Received: from localhost ([::1]:51666 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VQl0m-0004D2-7q for incoming@patchwork.ozlabs.org; Mon, 30 Sep 2013 17:28:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46361) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VQf2F-0005Cj-DL for qemu-devel@nongnu.org; Mon, 30 Sep 2013 11:05:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VQf27-0003yH-O1 for qemu-devel@nongnu.org; Mon, 30 Sep 2013 11:05:19 -0400 Received: from mail-ie0-x234.google.com ([2607:f8b0:4001:c03::234]:40218) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VQf27-0003xn-HA for qemu-devel@nongnu.org; Mon, 30 Sep 2013 11:05:11 -0400 Received: by mail-ie0-f180.google.com with SMTP id u16so10351705iet.39 for ; Mon, 30 Sep 2013 08:05:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=RFTaWpy5Y4rr/hcGI9ynP8w3p8x0fyo31dhnKwhKOgE=; b=VNkyhTS+f9oNXcsQR8cSOG4EmxbDqWWAc+k6BelLZ1Mnv30eCJiDObF50Rn735Pzx6 agxAqtROZMdSyWDMyzSwy8poaKMPzXUwN2swYyeWLx3ASkXJYSSEm7Y0WIAYX3Kjsw2o Jgc4XNqgPhK5G/hj+1J80Yka1khxXy+zm+YiM4GCpr5SMjycWnuKsW8Mmscdwrze4g+L QgMSvWHqHVYgyoSM1OJsILa7SIBhiUgKq8V9ugp7Q/rx+CQd1zE3C0D/y3VYOJul6b1X x8+4XxaxUswx9r9ptDxIvMxB9F/qa0N2W+biuNOpuweVOvaYlBPLaT2wEPuQKOXE+H5D PRCw== X-Received: by 10.42.201.1 with SMTP id ey1mr730053icb.69.1380553510719; Mon, 30 Sep 2013 08:05:10 -0700 (PDT) Received: from mogeb-Inspiron-7520.polymtl.ca (Sansfil-Public-Lassonde-221-222.polymtl.ca. [132.207.221.222]) by mx.google.com with ESMTPSA id cl4sm985349igc.1.1969.12.31.16.00.00 (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 30 Sep 2013 08:05:10 -0700 (PDT) From: Mohamad Gebai To: qemu-devel@nongnu.org Date: Mon, 30 Sep 2013 11:05:00 -0400 Message-Id: <1380553501-20670-3-git-send-email-mohamad.gebai@polymtl.ca> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1380553501-20670-1-git-send-email-mohamad.gebai@polymtl.ca> References: <1380553501-20670-1-git-send-email-mohamad.gebai@polymtl.ca> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2607:f8b0:4001:c03::234 X-Mailman-Approved-At: Mon, 30 Sep 2013 17:26:12 -0400 Cc: Mohamad Gebai Subject: [Qemu-devel] =?utf-8?q?=5BRFC_PATCH_2/3=5D_Modified_the_tracetool?= =?utf-8?q?_framework_for_LTTng_2=2Ex=2E?= 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 * 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 --- scripts/tracetool/backend/events.py | 44 ++++++++++++++++ scripts/tracetool/backend/ust.py | 82 ++++++------------------------ scripts/tracetool/format/ust_events_c.py | 30 +++++++++++ scripts/tracetool/format/ust_events_h.py | 39 ++++++++++++++ 4 files changed, 129 insertions(+), 66 deletions(-) create mode 100644 scripts/tracetool/format/ust_events_c.py create mode 100644 scripts/tracetool/format/ust_events_h.py diff --git a/scripts/tracetool/backend/events.py b/scripts/tracetool/backend/events.py index 5afce3e..49b7c65 100644 --- a/scripts/tracetool/backend/events.py +++ b/scripts/tracetool/backend/events.py @@ -6,6 +6,8 @@ Generic event description. This is a dummy backend to establish appropriate frontend/backend compatibility checks. + +Generates tracepoint definitions for LTTng userspace tracing when using ust as a backend. """ __author__ = "Lluís Vilanova " @@ -16,8 +18,50 @@ __maintainer__ = "Stefan Hajnoczi" __email__ = "stefanha@linux.vnet.ibm.com" +from tracetool import out + def events_h(events): pass def events_c(events): pass + +def ust_events_c(events): + pass + +def ust_events_h(events): + for e in events: + if len(e.args) > 0: + out('TRACEPOINT_EVENT(', + ' ust,', + ' %(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(', + ' ust,', + ' %(name)s,', + ' TP_ARGS(void),', + ' TP_FIELDS()', + ')', + '', + name = e.name, + ) diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py index ea36995..8695c74 100644 --- a/scripts/tracetool/backend/ust.py +++ b/scripts/tracetool/backend/ust.py @@ -18,76 +18,26 @@ from tracetool import out PUBLIC = True - def c(events): - out('#include ', - '#undef mutex_lock', - '#undef mutex_unlock', - '#undef inline', - '#undef wmb', - '#include "trace.h"') + pass + +def h(events): + out('#include ', + '#include "trace/generated-ust-provider.h"', + '') for e in events: argnames = ", ".join(e.args.names()) if len(e.args) > 0: - argnames = ', ' + argnames - - out('DEFINE_TRACE(ust_%(name)s);', - '', - 'static void ust_%(name)s_probe(%(args)s)', - '{', - ' trace_mark(ust, %(name)s, %(fmt)s%(argnames)s);', - '}', - name = e.name, - args = e.args, - fmt = e.fmt, - argnames = argnames, - ) - - else: - out('DEFINE_TRACE(ust_%(name)s);', - '', - 'static void ust_%(name)s_probe(%(args)s)', - '{', - ' trace_mark(ust, %(name)s, UST_MARKER_NOARGS);', - '}', - name = e.name, - args = e.args, - ) - - # register probes - out('', - 'static void __attribute__((constructor)) trace_init(void)', - '{') - - for e in events: - out(' register_trace_ust_%(name)s(ust_%(name)s_probe);', + argnames = ", " + argnames + + out('static inline void trace_%(name)s(%(args)s)', + '{', + ' tracepoint(ust, %(name)s, %(tp_args)s);' + '', + '}', + '', name = e.name, + args = e.args, + tp_args = ", ".join(e.args.names()), ) - - out('}') - - -def h(events): - out('#include ', - '#undef mutex_lock', - '#undef mutex_unlock', - '#undef inline', - '#undef wmb') - - for e in events: - if len(e.args) > 0: - out('DECLARE_TRACE(ust_%(name)s, TP_PROTO(%(args)s), TP_ARGS(%(argnames)s));', - '#define trace_%(name)s trace_ust_%(name)s', - name = e.name, - args = e.args, - argnames = ", ".join(e.args.names()), - ) - - else: - out('_DECLARE_TRACEPOINT_NOARGS(ust_%(name)s);', - '#define trace_%(name)s trace_ust_%(name)s', - name = e.name, - ) - - out() diff --git a/scripts/tracetool/format/ust_events_c.py b/scripts/tracetool/format/ust_events_c.py new file mode 100644 index 0000000..71328f3 --- /dev/null +++ b/scripts/tracetool/format/ust_events_c.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Generate .c for LTTng ust event description. +""" + +__author__ = "Lluís Vilanova " +__copyright__ = "Copyright 2012, Lluís Vilanova " +__license__ = "GPL version 2 or (at your option) any later version" + +__maintainer__ = "Stefan Hajnoczi" +__email__ = "stefanha@linux.vnet.ibm.com" + + +from tracetool import out + + +def begin(events): + out('/* This file is autogenerated by tracetool, do not edit. */', + '', + '#define TRACEPOINT_DEFINE', + '#define TRACEPOINT_CREATE_PROBES', + '', + '/* If gcc version 4.7 or older is used, LTTng ust gives a warning when compiling with', + ' -Wredundant-decls.', + ' */', + '#pragma GCC diagnostic ignored "-Wredundant-decls"', + '', + '#include "generated-ust-provider.h"') diff --git a/scripts/tracetool/format/ust_events_h.py b/scripts/tracetool/format/ust_events_h.py new file mode 100644 index 0000000..269576d --- /dev/null +++ b/scripts/tracetool/format/ust_events_h.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" +Generate .h for LTTng ust event description. +""" + +__author__ = "Lluís Vilanova " +__copyright__ = "Copyright 2012, Lluís Vilanova " +__license__ = "GPL version 2 or (at your option) any later version" + +__maintainer__ = "Stefan Hajnoczi" +__email__ = "stefanha@linux.vnet.ibm.com" + + +from tracetool import out + + +def begin(events): + out('/* This file is autogenerated by tracetool, do not edit. */', + '', + '#undef TRACEPOINT_PROVIDER', + '#define TRACEPOINT_PROVIDER ust', + '', + '#undef TRACEPOINT_INCLUDE_FILE', + '#define TRACEPOINT_INCLUDE_FILE ./generated-ust-provider.h', + '', + '#if !defined (TRACE__GENERATED_UST_H) || defined(TRACEPOINT_HEADER_MULTI_READ)', + '#define TRACE__GENERATED_UST_H', + '', + '#include "qemu-common.h"', + '#include ', + '') + +def end(events): + out('#endif /* TRACE__GENERATED_UST_H */', + '', + '/* This part must be outside ifdef protection */', + '#include ')