qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [RFC][PATCH v1 0/3] trace-instrument: let the user wrap/override code generated from trace-events
@ 2010-11-03 19:58 Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 1/3] trace: rewrite 'tracetool' to facilitate future extensions Lluís
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Lluís @ 2010-11-03 19:58 UTC (permalink / raw)
  To: qemu-devel

Adds a new optional keyword ("instrument") to the syntax in "trace-events". When
specified, this event property lets the user provide her own implementation for
that tracing event.

Still, in case the user only wants to wrap around the tracing event, tracetool's
original implementation is accessible through function 'trace_##name##_backend',
instead of the original 'trace_##name' (which now the user has to provide).

The user-provided tracing functions are expected to be in the static library
"libinstrument.a", identified by the "--with-instrument" configuration
parameter.

TODO:
 * Having the 'simple' backend generate code even when the "disable" property is
   present, complicates the flow in 'tracetool'.
   Is this behaviour really needed?

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---

Lluís Vilanova (3):
      trace: rewrite 'tracetool' to facilitate future extensions
      trace-instrument: let the user override events generated by 'tracetool'
      trace-instrument: handle config-time activation


 Makefile        |    4 -
 Makefile.target |   29 ++++-
 configure       |   30 +++++
 simpletrace.py  |    2 
 trace-events    |   23 +++-
 tracetool       |  336 +++++++++++++++++++++++++++++++++++--------------------
 6 files changed, 289 insertions(+), 135 deletions(-)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 1/3] trace: rewrite 'tracetool' to facilitate future extensions
  2010-11-03 19:58 [Qemu-devel] [RFC][PATCH v1 0/3] trace-instrument: let the user wrap/override code generated from trace-events Lluís
@ 2010-11-03 19:58 ` Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 2/3] trace-instrument: let the user override events generated by 'tracetool' Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 3/3] trace-instrument: handle config-time activation Lluís
  2 siblings, 0 replies; 4+ messages in thread
From: Lluís @ 2010-11-03 19:58 UTC (permalink / raw)
  To: qemu-devel

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
 Makefile  |    4 -
 tracetool |  315 +++++++++++++++++++++++++++++++++++++------------------------
 2 files changed, 194 insertions(+), 125 deletions(-)

diff --git a/Makefile b/Makefile
index 252c817..fec086b 100644
--- a/Makefile
+++ b/Makefile
@@ -108,12 +108,12 @@ bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
 
 trace.h: trace.h-timestamp
 trace.h-timestamp: $(SRC_PATH)/trace-events config-host.mak
-	$(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -h < $< > $@,"  GEN   trace.h")
+	$(call quiet-command,sh $(SRC_PATH)/tracetool --regular --$(TRACE_BACKEND) -h < $< > $@,"  GEN   trace.h")
 	@cmp -s $@ trace.h || cp $@ trace.h
 
 trace.c: trace.c-timestamp
 trace.c-timestamp: $(SRC_PATH)/trace-events config-host.mak
-	$(call quiet-command,sh $(SRC_PATH)/tracetool --$(TRACE_BACKEND) -c < $< > $@,"  GEN   trace.c")
+	$(call quiet-command,sh $(SRC_PATH)/tracetool --regular --$(TRACE_BACKEND) -c < $< > $@,"  GEN   trace.c")
 	@cmp -s $@ trace.c || cp $@ trace.c
 
 trace.o: trace.c $(GENERATED_HEADERS)
diff --git a/tracetool b/tracetool
index 7010858..4bd264f 100755
--- a/tracetool
+++ b/tracetool
@@ -10,28 +10,32 @@
 # Disable pathname expansion, makes processing text with '*' characters simpler
 set -f
 
-usage()
-{
-    cat >&2 <<EOF
-usage: $0 [--nop | --simple | --ust] [-h | -c]
-Generate tracing code for a file on stdin.
+################################################################################
+### Helper routines
 
-Backends:
-  --nop     Tracing disabled
-  --simple  Simple built-in backend
-  --ust     LTTng User Space Tracing backend
+# Get the name of a trace event
+get_event_name()
+{
+    local str i last
+    str=${1%%\(*}
+    str=${str##* }
+    echo "$str"
+}
 
-Output formats:
-  -h    Generate .h file
-  -c    Generate .c file
-EOF
-    exit 1
+# Get the name of the backend-specific function recording the trace event
+get_func_name()
+{
+    local name
+    name=$(get_event_name "$1")
+    echo "trace_${name}_backend"
 }
 
-# Get the name of a trace event
-get_name()
+# Get the name of the public function recording the trace event
+get_api_name()
 {
-    echo ${1%%\(*}
+    local event
+    event=trace_$(get_event_name "$1")
+    echo "$event"
 }
 
 # Get the argument list of a trace event, including types and names
@@ -79,6 +83,21 @@ get_argc()
     echo $argc
 }
 
+# See if an event property is set (returns "1" or "0")
+get_property()
+{
+    local i str prop
+    str=${1%%\(*}
+    prop="$2"
+    for i in $str; do
+        if [ "$i" = "$prop" ] ; then
+            echo "1"
+            return
+        fi
+    done
+    echo "0"
+}
+
 # Get the format string for a trace event
 get_fmt()
 {
@@ -88,70 +107,60 @@ get_fmt()
     echo "$fmt"
 }
 
-# Get the state of a trace event
-get_state()
-{
-    local str disable state
-    str=$(get_name "$1")
-    disable=${str##disable }
-    if [ "$disable" = "$str" ] ; then
-        state=1
-    else
-        state=0
-    fi
-    echo "$state"
-}
+################################################################################
+### Backend code
 
-linetoh_begin_nop()
+### nop -- H
+begin_h_nop()
 {
     return
 }
 
-linetoh_nop()
+line_h_nop()
 {
-    local name args
-    name=$(get_name "$1")
+    local func args
+    func=$(get_func_name "$1")
     args=$(get_args "$1")
 
     # Define an empty function for the trace event
     cat <<EOF
-static inline void trace_$name($args)
+static inline void $func($args)
 {
 }
 EOF
 }
 
-linetoh_end_nop()
+end_h_nop()
 {
     return
 }
 
-linetoc_begin_nop()
+### nop -- H
+begin_c_nop()
 {
     return
 }
 
-linetoc_nop()
+line_c_nop()
 {
-    # No need for function definitions in nop backend
     return
 }
 
-linetoc_end_nop()
+end_c_nop()
 {
     return
 }
 
-linetoh_begin_simple()
+### simple -- H
+begin_h_simple()
 {
     cat <<EOF
 #include "simpletrace.h"
 EOF
-
     simple_event_num=0
 }
 
-cast_args_to_uint64_t()
+get_trace_args_simple()
 {
     local arg
     for arg in $(get_argnames "$1"); do
@@ -159,25 +168,22 @@ cast_args_to_uint64_t()
     done
 }
 
-linetoh_simple()
+line_h_simple()
 {
-    local name args argc trace_args state
-    name=$(get_name "$1")
+    # XXX: why 'simple' backend does not expand into 'nop' when disabled?
+    local func args argc trace_args
+    func=$(get_func_name "$1")
     args=$(get_args "$1")
     argc=$(get_argc "$1")
-    state=$(get_state "$1")
-    if [ "$state" = "0" ]; then
-        name=${name##disable }
-    fi
-
+    
     trace_args="$simple_event_num"
     if [ "$argc" -gt 0 ]
     then
-        trace_args="$trace_args, $(cast_args_to_uint64_t "$1")"
+        trace_args="$trace_args, $(get_trace_args_simple "$1")"
     fi
 
     cat <<EOF
-static inline void trace_$name($args)
+static inline void $func($args)
 {
     trace$argc($trace_args);
 }
@@ -186,7 +192,7 @@ EOF
     simple_event_num=$((simple_event_num + 1))
 }
 
-linetoh_end_simple()
+end_h_simple()
 {
     cat <<EOF
 #define NR_TRACE_EVENTS $simple_event_num
@@ -194,7 +200,8 @@ extern TraceEvent trace_list[NR_TRACE_EVENTS];
 EOF
 }
 
-linetoc_begin_simple()
+### simple -- C
+begin_c_simple()
 {
     cat <<EOF
 #include "trace.h"
@@ -202,30 +209,36 @@ linetoc_begin_simple()
 TraceEvent trace_list[] = {
 EOF
     simple_event_num=0
-
 }
 
-linetoc_simple()
+line_c_simple()
 {
-    local name state
-    name=$(get_name "$1")
-    state=$(get_state "$1")
-    if [ "$state" = "0" ] ; then
-        name=${name##disable }
-    fi
+    # XXX: why 'simple' backend does not expand into 'nop' when disabled?
+    local name disable state
+    name=$(get_event_name "$1")
+    disable=$(get_property "$1" "disable")
+
+    case "$disable" in
+        "0") state="1" ;;
+        "1") state="0" ;;
+    esac
+
     cat <<EOF
 {.tp_name = "$name", .state=$state},
 EOF
+
     simple_event_num=$((simple_event_num + 1))
 }
 
-linetoc_end_simple()
+end_c_simple()
 {
     cat <<EOF
 };
 EOF
 }
 
+### ust -- H
+
 # Clean up after UST headers which pollute the namespace
 ust_clean_namespace() {
     cat <<EOF
@@ -236,31 +249,40 @@ ust_clean_namespace() {
 EOF
 }
 
-linetoh_begin_ust()
+begin_h_ust()
 {
     echo "#include <ust/tracepoint.h>"
     ust_clean_namespace
 }
 
-linetoh_ust()
+line_h_ust()
 {
-    local name args argnames
-    name=$(get_name "$1")
+    local disable
+    disable=$(get_property "$1" "disable")
+    if [ "$disable" = "1" ]; then
+        line_h_nop "$1"
+        return
+    fi
+
+    local name func args argnames
+    name=$(get_event_name "$1")
+    func=$(get_func_name "$1")
     args=$(get_args "$1")
     argnames=$(get_argnames "$1")
 
     cat <<EOF
 DECLARE_TRACE(ust_$name, TP_PROTO($args), TP_ARGS($argnames));
-#define trace_$name trace_ust_$name
+#define $func trace_ust_$name
 EOF
 }
 
-linetoh_end_ust()
+end_h_ust()
 {
     return
 }
 
-linetoc_begin_ust()
+### ust -- C
+begin_c_ust()
 {
     cat <<EOF
 #include <ust/marker.h>
@@ -269,17 +291,23 @@ $(ust_clean_namespace)
 EOF
 }
 
-linetoc_ust()
+line_c_ust()
 {
+    local disable
+    disable=$(get_property "$1" "disable")
+    if [ "$disable" = "1" ]; then
+        line_c_nop "$1"
+        return
+    fi
+
     local name args argnames fmt
-    name=$(get_name "$1")
+    name=$(get_event_name "$1")
     args=$(get_args "$1")
     argnames=$(get_argnames "$1")
     fmt=$(get_fmt "$1")
 
     cat <<EOF
 DEFINE_TRACE(ust_$name);
-
 static void ust_${name}_probe($args)
 {
     trace_mark(ust, $name, "$fmt", $argnames);
@@ -290,7 +318,7 @@ EOF
     names="$names $name"
 }
 
-linetoc_end_ust()
+end_c_ust()
 {
     cat <<EOF
 static void __attribute__((constructor)) trace_init(void)
@@ -306,72 +334,113 @@ EOF
     echo "}"
 }
 
-# Process stdin by calling begin, line, and end functions for the backend
+################################################################################
+### Frontend code
+
+### Regular -- H
+traceto_h_regular()
+{
+     cat <<EOF
+#ifndef TRACE_H
+#define TRACE_H
+
+/* This file is autogenerated by tracetool, do not edit. */
+
+#include "qemu-common.h"
+EOF
+    convert h $1 $2
+    echo "#endif /* TRACE_H */"
+}
+
+line_h_regular()
+{
+    local instrument
+
+    local api func
+    api=$(get_api_name "$1")
+    func=$(get_func_name "$1")
+    echo "#define $api $func"
+}
+
+### Regular -- C
+traceto_c_regular()
+{
+    echo "/* This file is autogenerated by tracetool, do not edit. */"
+    convert c $1 $2
+}
+
+line_c_regular()
+{
+    return
+}
+
+################################################################################
+### Generic code
+
+# Process stdin by calling the backend/frontend specfic routines
 convert()
 {
-    local begin process_line end str disable
-    begin="lineto$1_begin_$backend"
-    process_line="lineto$1_$backend"
-    end="lineto$1_end_$backend"
+    local str
 
-    "$begin"
+    begin_$1_$3
+    echo
 
     while read -r str; do
         # Skip comments and empty lines
         test -z "${str%%#*}" && continue
 
-        # Process the line.  The nop backend handles disabled lines.
-        disable=${str%%disable *}
-        echo
-        if test -z "$disable"; then
-            # Pass the disabled state as an arg to lineto$1_simple().
-            # For all other cases, call lineto$1_nop()
-            if [ $backend = "simple" ]; then
-                "$process_line" "$str"
-            else
-                "lineto$1_nop" "${str##disable }"
-            fi
-        else
-            "$process_line" "$str"
-        fi
+        "line_$1_$3" "$str"
+        "line_$1_$2" "$str"
     done
 
     echo
-    "$end"
+    end_$1_$3
 }
 
-tracetoh()
+################################################################################
+### Argument parsing
+
+frontend=nil
+backend=nil
+output=nil
+
+usage()
 {
-    cat <<EOF
-#ifndef TRACE_H
-#define TRACE_H
+    cat >&2 <<EOF
+usage: $0 <frontend> <backend> <output>
+Generate tracing code for a file on stdin.
 
-/* This file is autogenerated by tracetool, do not edit. */
+Frontends:
+  --regular     Regular frontend
 
-#include "qemu-common.h"
+Backends:
+  --nop         Tracing disabled
+  --simple      Simple built-in backend
+  --ust         LTTng User Space Tracing backend
+
+Output formats:
+  -h            Generate .h file
+  -c            Generate .c file
 EOF
-    convert h
-    echo "#endif /* TRACE_H */"
+    exit 1
 }
 
-tracetoc()
-{
-    echo "/* This file is autogenerated by tracetool, do not edit. */"
-    convert c
-}
-
-# Choose backend
-case "$1" in
-"--nop" | "--simple" | "--ust") backend="${1#--}" ;;
-*) usage ;;
-esac
-shift
-
-case "$1" in
-"-h") tracetoh ;;
-"-c") tracetoc ;;
-"--check-backend") exit 0 ;; # used by ./configure to test for backend
-*) usage ;;
-esac
+while [ $# -gt 0 ]; do
+    case $1 in
+        "--regular") frontend="${1#--}" ;;
+        "--nop"|"--simple"|"--ust") backend="${1#--}" ;;
+        "-h"|"-c") output="${1#-}" ;;
+        "--check-backend") check=1 ;; # used by ./configure to test for backend
+        *) usage ;;
+    esac
+    shift
+done
+
+if [ "$check" = "1" ]; then
+    [ "$backend" != "nil" ] || exit 1
+    exit 0
+fi
+
+traceto_${output}_$frontend $frontend $backend
 
 exit 0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 2/3] trace-instrument: let the user override events generated by 'tracetool'
  2010-11-03 19:58 [Qemu-devel] [RFC][PATCH v1 0/3] trace-instrument: let the user wrap/override code generated from trace-events Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 1/3] trace: rewrite 'tracetool' to facilitate future extensions Lluís
@ 2010-11-03 19:58 ` Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 3/3] trace-instrument: handle config-time activation Lluís
  2 siblings, 0 replies; 4+ messages in thread
From: Lluís @ 2010-11-03 19:58 UTC (permalink / raw)
  To: qemu-devel

Add a new event keyword ("instrument") that lets the user provide her own
implementation of tracing events.

Still, tracetool's original implementation is accessible through function
'_trace_##name' instead of 'trace_##name' (in case the user only wants to wrap
around the event).

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
 Makefile       |    4 ++--
 simpletrace.py |    2 +-
 trace-events   |   23 +++++++++++++++++------
 tracetool      |   23 ++++++++++++++++++++++-
 4 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index fec086b..1886317 100644
--- a/Makefile
+++ b/Makefile
@@ -108,12 +108,12 @@ bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
 
 trace.h: trace.h-timestamp
 trace.h-timestamp: $(SRC_PATH)/trace-events config-host.mak
-	$(call quiet-command,sh $(SRC_PATH)/tracetool --regular --$(TRACE_BACKEND) -h < $< > $@,"  GEN   trace.h")
+	$(call quiet-command,sh $(SRC_PATH)/tracetool $(TRACETOOL_EXTRA) --regular --$(TRACE_BACKEND) -h < $< > $@,"  GEN   trace.h")
 	@cmp -s $@ trace.h || cp $@ trace.h
 
 trace.c: trace.c-timestamp
 trace.c-timestamp: $(SRC_PATH)/trace-events config-host.mak
-	$(call quiet-command,sh $(SRC_PATH)/tracetool --regular --$(TRACE_BACKEND) -c < $< > $@,"  GEN   trace.c")
+	$(call quiet-command,sh $(SRC_PATH)/tracetool $(TRACETOOL_EXTRA) --regular --$(TRACE_BACKEND) -c < $< > $@,"  GEN   trace.c")
 	@cmp -s $@ trace.c || cp $@ trace.c
 
 trace.o: trace.c $(GENERATED_HEADERS)
diff --git a/simpletrace.py b/simpletrace.py
index c2cf168..0f3fab5 100755
--- a/simpletrace.py
+++ b/simpletrace.py
@@ -19,7 +19,7 @@ header_version  = 0
 
 trace_fmt = '=QQQQQQQQ'
 trace_len = struct.calcsize(trace_fmt)
-event_re  = re.compile(r'(disable\s+)?([a-zA-Z0-9_]+)\(([^)]*)\)\s+"([^"]*)"')
+event_re  = re.compile(r'\s*(disable\s+|instrument\s+)*([a-zA-Z0-9_]+)\(([^)]*)\)\s+"([^"]*)"')
 
 def err(msg):
     sys.stderr.write(msg + '\n')
diff --git a/trace-events b/trace-events
index 4300178..3b91a1c 100644
--- a/trace-events
+++ b/trace-events
@@ -12,21 +12,32 @@
 #
 # Format of a trace event:
 #
-# [disable] <name>(<type1> <arg1>[, <type2> <arg2>] ...) "<format-string>"
+# [<property> ...] <name>(<type1> <arg1>[, <type2> <arg2>] ...) "<format-string>"
 #
 # Example: qemu_malloc(size_t size) "size %zu"
 #
-# The "disable" keyword will build without the trace event.
-# In case of 'simple' trace backend, it will allow the trace event to be
-# compiled, but this would be turned off by default. It can be toggled on via
-# the monitor.
-#
 # The <name> must be a valid as a C function name.
 #
 # Types should be standard C types.  Use void * for pointers because the trace
 # system may not have the necessary headers included.
 #
 # The <format-string> should be a sprintf()-compatible format string.
+#
+# Properties:
+#
+# - disable
+#   Build QEMU without the trace event.
+#   In case of using the 'simple' trace backend, it will allow the trace event
+#   to be compiled, but this would be turned off by default. It can be toggled
+#   on via the monitor.
+#
+# - instrument
+#   Let the user provide code for the trace event.
+#   The "instrument" keyword will let the user provide her own 'trace_##name'
+#   implementation on "trace-instrument.h" and "libinstrument.a" (their location
+#   is identified by the '--with-instrument' configure option).
+#   The original backend-specific function is still available under the name
+#   'trace_##name##_backend'.
 
 # qemu-malloc.c
 disable qemu_malloc(size_t size, void *ptr) "size %zu ptr %p"
diff --git a/tracetool b/tracetool
index 4bd264f..facb385 100755
--- a/tracetool
+++ b/tracetool
@@ -349,12 +349,21 @@ traceto_h_regular()
 #include "qemu-common.h"
 EOF
     convert h $1 $2
+    if [ "$had_instrument" = "1" ]; then
+        echo '#include "trace-instrument.h"'
+    fi
     echo "#endif /* TRACE_H */"
 }
 
 line_h_regular()
 {
+    # XXX: should still provide instrumentation if event is disabled?
     local instrument
+    instrument=$(get_property "$1" "instrument")
+    if [ "$instrument" = "1" ]; then
+        had_instrument="1"
+        return
+    fi
 
     local api func
     api=$(get_api_name "$1")
@@ -404,12 +413,18 @@ frontend=nil
 backend=nil
 output=nil
 
+enable_instrument="0"
+had_instrument="0"
+
 usage()
 {
     cat >&2 <<EOF
-usage: $0 <frontend> <backend> <output>
+usage: $0 [<flag>] <frontend> <backend> <output>
 Generate tracing code for a file on stdin.
 
+Flags:
+  --instrument  Enable instrumentation
+
 Frontends:
   --regular     Regular frontend
 
@@ -427,6 +442,7 @@ EOF
 
 while [ $# -gt 0 ]; do
     case $1 in
+        "--instrument") enable_instrument="1" ;;
         "--regular") frontend="${1#--}" ;;
         "--nop"|"--simple"|"--ust") backend="${1#--}" ;;
         "-h"|"-c") output="${1#-}" ;;
@@ -443,4 +459,9 @@ fi
 
 traceto_${output}_$frontend $frontend $backend
 
+if [ "$had_instrument" = "1" -a "$enable_instrument" = "0" ]; then
+    echo "ERROR: You must configure QEMU using '--with-instrument' to use the 'instrument' property in \"trace-events\"" >/dev/stderr
+    exit 1
+fi
+
 exit 0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [Qemu-devel] [PATCH v1 3/3] trace-instrument: handle config-time activation
  2010-11-03 19:58 [Qemu-devel] [RFC][PATCH v1 0/3] trace-instrument: let the user wrap/override code generated from trace-events Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 1/3] trace: rewrite 'tracetool' to facilitate future extensions Lluís
  2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 2/3] trace-instrument: let the user override events generated by 'tracetool' Lluís
@ 2010-11-03 19:58 ` Lluís
  2 siblings, 0 replies; 4+ messages in thread
From: Lluís @ 2010-11-03 19:58 UTC (permalink / raw)
  To: qemu-devel

Add a '--with-instrument' configuration option pointing to user-provided
instrumentation callbacks.

Make is invoked on the user-provided directory, which must build a static
library that might contain extra code needed by the user-provided
instrumentation.

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
 Makefile.target |   29 ++++++++++++++++++++++++++---
 configure       |   30 ++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+), 3 deletions(-)

diff --git a/Makefile.target b/Makefile.target
index 9152723..90867e7 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -351,12 +351,35 @@ libbackdoor-clean:
 		VPATH=$(VPATH) SRC_PATH=$(SRC_PATH) V="$(V)" clean || true
 endif
 
+#########################################################
+# static instrumentation
+ifdef CONFIG_INSTRUMENT
+VPATH := $(VPATH):$(INSTRUMENT_PATH)
+
+LIBINSTRUMENT_LIB = libinstrument/libinstrument.a
+LIBINSTRUMENT_CLEAN = libinstrument-clean
+
+libinstrument/Makefile:
+	$(call quiet-command, mkdir -p libinstrument, "  CREAT $(TARGET_DIR)$@")
+	$(call quiet-command, rm -f libinstrument/Makefile)
+	$(call quiet-command, ln -s $(INSTRUMENT_PATH)/Makefile libinstrument/Makefile)
+
+libinstrument/libinstrument.a: libinstrument/Makefile force
+	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libinstrument	\
+		QEMU_CFLAGS="$(QEMU_CFLAGS) -I../target-$(TARGET_BASE_ARCH)"	\
+		TARGET_DIR=$(TARGET_DIR)libinstrument/ VPATH=$(VPATH)		\
+		SRC_PATH=$(SRC_PATH) V="$(V)" libinstrument.a)
+
+libinstrument-clean:
+	$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(LIBINSTRUMENT_DIR)			\
+		VPATH=$(VPATH) SRC_PATH=$(SRC_PATH) V="$(V)" clean || true
+endif
 
 
-$(QEMU_PROG)-prepare: $(GENERATED_HEADERS) $(LIBBACKDOOR_LIB) $(QEMU_PROG)
+$(QEMU_PROG)-prepare: $(GENERATED_HEADERS) $(LIBBACKDOOR_LIB) $(LIBINSTRUMENT_LIB) $(QEMU_PROG)
 
-$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(LIBBACKDOOR_LIB)
-	$(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)) $(LIBBACKDOOR_LIB)
+$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(LIBBACKDOOR_LIB) $(LIBINSTRUMENT_LIB)
+	$(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)) $(LIBBACKDOOR_LIB) $(LIBINSTRUMENT_LIB)
 
 
 gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/feature_to_c.sh
diff --git a/configure b/configure
index 991f0b8..2476512 100755
--- a/configure
+++ b/configure
@@ -332,6 +332,7 @@ trace_backend="nop"
 trace_file="trace"
 spice=""
 backdoor=""
+instrument=""
 
 # OS specific
 if check_define __linux__ ; then
@@ -752,6 +753,22 @@ for opt do
       backdoor=`readlink -f $backdoor`
   fi
   ;;
+  --with-instrument=*) instrument="$optarg"
+  if test ! -f "$instrument/Makefile"; then
+      echo
+      echo "Error: cannot make into '$instrument'"
+      echo "Please choose a directory where I can run 'make'"
+      echo
+      exit 1
+  elif test ! -f "$instrument/trace-instrument.h"; then
+      echo
+      echo "Error: directory '$instrument' does not contain a \"trace-instrument.h\" file"
+      echo
+      exit 1
+  else
+      instrument=`readlink -f $instrument`
+  fi
+  ;;
   *) echo "ERROR: unknown option $opt"; show_help="yes"
   ;;
   esac
@@ -943,6 +960,8 @@ echo "  --trace-file=NAME        Full PATH,NAME of file to store traces"
 echo "                           Default:trace-<pid>"
 echo "  --disable-spice          disable spice"
 echo "  --enable-spice           enable spice"
+echo "  --with-backdoor=PATH     enable backdoor communication and compile implementation in PATH"
+echo "  --with-instrument=PATH   enable static instrumentation and compile user code in PATH"
 echo ""
 echo "NOTE: The object files are built at the place where configure is launched"
 exit 1
@@ -2335,6 +2354,9 @@ echo "spice support     $spice"
 if test -n "$backdoor"; then
     echo "Backdoor comm.    $backdoor"
 fi
+if test -n "$instrument"; then
+    echo "Instrumentation   $instrument"
+fi
 
 if test $sdl_too_old = "yes"; then
 echo "-> Your SDL version is too old - please upgrade to have SDL support"
@@ -2600,6 +2622,14 @@ if test -n "$backdoor"; then
   rm -rf *-{bsd-usr,darwin-user,linux-user,softmmu}/libbackdoor/
 fi
 
+if test -n "$instrument"; then
+  echo "CONFIG_INSTRUMENT=y" >> $config_host_mak
+  echo "INSTRUMENT_PATH=$instrument" >> $config_host_mak
+  echo "TRACETOOL_EXTRA=--instrument" >> $config_host_mak
+  QEMU_CFLAGS="-I$instrument $QEMU_CFLAGS"
+  rm -rf *-{bsd-usr,darwin-user,linux-user,softmmu}/libinstrument/
+fi
+
 # XXX: suppress that
 if [ "$bsd" = "yes" ] ; then
   echo "CONFIG_BSD=y" >> $config_host_mak

^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-11-03 19:58 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-03 19:58 [Qemu-devel] [RFC][PATCH v1 0/3] trace-instrument: let the user wrap/override code generated from trace-events Lluís
2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 1/3] trace: rewrite 'tracetool' to facilitate future extensions Lluís
2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 2/3] trace-instrument: let the user override events generated by 'tracetool' Lluís
2010-11-03 19:58 ` [Qemu-devel] [PATCH v1 3/3] trace-instrument: handle config-time activation Lluís

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).