forked from qemu/qemu
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
trace: Add trace-events file for declaring trace events
This patch introduces the trace-events file where trace events can be declared like so: qemu_malloc(size_t size) "size %zu" qemu_free(void *ptr) "ptr %p" These trace event declarations are processed by a new tool called tracetool to generate code for the trace events. Trace event declarations are independent of the backend tracing system (LTTng User Space Tracing, ftrace markers, DTrace). The default "nop" backend generates empty trace event functions. Therefore trace events are disabled by default. The trace-events file serves two purposes: 1. Adding trace events is easy. It is not necessary to understand the details of a backend tracing system. The trace-events file is a single location where trace events can be declared without code duplication. 2. QEMU is not tightly coupled to one particular backend tracing system. In order to support tracing across QEMU host platforms and to anticipate new backend tracing systems that are currently maturing, it is important to be flexible and not tied to one system. This commit includes fixes from Prerna Saxena <[email protected]> and Blue Swirl <[email protected]>. Signed-off-by: Stefan Hajnoczi <[email protected]>
- Loading branch information
Stefan Hajnoczi
authored and
Anthony Liguori
committed
Sep 9, 2010
1 parent
ef9d48d
commit 94a420b
Showing
7 changed files
with
238 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
# Trace events for debugging and performance instrumentation | ||
# | ||
# This file is processed by the tracetool script during the build. | ||
# | ||
# To add a new trace event: | ||
# | ||
# 1. Choose a name for the trace event. Declare its arguments and format | ||
# string. | ||
# | ||
# 2. Call the trace event from code using trace_##name, e.g. multiwrite_cb() -> | ||
# trace_multiwrite_cb(). The source file must #include "trace.h". | ||
# | ||
# Format of a trace event: | ||
# | ||
# <name>(<type1> <arg1>[, <type2> <arg2>] ...) "<format-string>" | ||
# | ||
# Example: qemu_malloc(size_t size) "size %zu" | ||
# | ||
# 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. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
#!/bin/sh | ||
# | ||
# Code generator for trace events | ||
# | ||
# Copyright IBM, Corp. 2010 | ||
# | ||
# This work is licensed under the terms of the GNU GPL, version 2. See | ||
# the COPYING file in the top-level directory. | ||
|
||
# Disable pathname expansion, makes processing text with '*' characters simpler | ||
set -f | ||
|
||
usage() | ||
{ | ||
cat >&2 <<EOF | ||
usage: $0 --nop [-h | -c] | ||
Generate tracing code for a file on stdin. | ||
Backends: | ||
--nop Tracing disabled | ||
Output formats: | ||
-h Generate .h file | ||
-c Generate .c file | ||
EOF | ||
exit 1 | ||
} | ||
|
||
# Get the name of a trace event | ||
get_name() | ||
{ | ||
echo ${1%%\(*} | ||
} | ||
|
||
# Get the argument list of a trace event, including types and names | ||
get_args() | ||
{ | ||
local args | ||
args=${1#*\(} | ||
args=${args%)*} | ||
echo "$args" | ||
} | ||
|
||
# Get the argument name list of a trace event | ||
get_argnames() | ||
{ | ||
local nfields field name | ||
nfields=0 | ||
for field in $(get_args "$1"); do | ||
nfields=$((nfields + 1)) | ||
|
||
# Drop pointer star | ||
field=${field#\*} | ||
|
||
# Only argument names have commas at the end | ||
name=${field%,} | ||
test "$field" = "$name" && continue | ||
|
||
printf "%s" "$name, " | ||
done | ||
|
||
# Last argument name | ||
if [ "$nfields" -gt 1 ] | ||
then | ||
printf "%s" "$name" | ||
fi | ||
} | ||
|
||
# Get the format string for a trace event | ||
get_fmt() | ||
{ | ||
local fmt | ||
fmt=${1#*\"} | ||
fmt=${fmt%\"*} | ||
echo "$fmt" | ||
} | ||
|
||
linetoh_begin_nop() | ||
{ | ||
return | ||
} | ||
|
||
linetoh_nop() | ||
{ | ||
local name args | ||
name=$(get_name "$1") | ||
args=$(get_args "$1") | ||
|
||
# Define an empty function for the trace event | ||
cat <<EOF | ||
static inline void trace_$name($args) | ||
{ | ||
} | ||
EOF | ||
} | ||
|
||
linetoh_end_nop() | ||
{ | ||
return | ||
} | ||
|
||
linetoc_begin_nop() | ||
{ | ||
return | ||
} | ||
|
||
linetoc_nop() | ||
{ | ||
# No need for function definitions in nop backend | ||
return | ||
} | ||
|
||
linetoc_end_nop() | ||
{ | ||
return | ||
} | ||
|
||
# Process stdin by calling begin, line, and end functions for the backend | ||
convert() | ||
{ | ||
local begin process_line end | ||
begin="lineto$1_begin_$backend" | ||
process_line="lineto$1_$backend" | ||
end="lineto$1_end_$backend" | ||
|
||
"$begin" | ||
|
||
while read -r str; do | ||
# Skip comments and empty lines | ||
str=${str%%#*} | ||
test -z "$str" && continue | ||
|
||
echo | ||
"$process_line" "$str" | ||
done | ||
|
||
echo | ||
"$end" | ||
} | ||
|
||
tracetoh() | ||
{ | ||
cat <<EOF | ||
#ifndef TRACE_H | ||
#define TRACE_H | ||
/* This file is autogenerated by tracetool, do not edit. */ | ||
#include "qemu-common.h" | ||
EOF | ||
convert h | ||
echo "#endif /* TRACE_H */" | ||
} | ||
|
||
tracetoc() | ||
{ | ||
echo "/* This file is autogenerated by tracetool, do not edit. */" | ||
convert c | ||
} | ||
|
||
# Choose backend | ||
case "$1" in | ||
"--nop") 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 | ||
|
||
exit 0 |