176 lines
2.7 KiB
Plaintext
176 lines
2.7 KiB
Plaintext
|
#!/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
|