Files
fail/tools/import-trace/import-symbols.sh
Robin Thunig 18b3203257 enlarge varchar of name to bigger value in the symbol table
Some benchmarks need this space for the function name, because of name mangling.
2021-03-24 20:05:11 +01:00

93 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
# TODO: make this part of import-trace
set -e
# handle command line arguments
if [ ! $# -eq 4 ]; then
echo "usage: $0 DATABASE VARIANT BENCHMARK ELF" >&2
exit 1
fi
DATABASE=$1
VARIANT=$2
BENCHMARK=$3
ELF=$4
TABLE=symbol
MYSQL="mysql -B --quick $DATABASE"
# check if ELF exists
if [ ! -e $ELF ]; then
echo "$ELF not found" >&2
exit 1
fi
echo "importing $VARIANT/$BENCHMARK symbols from $ELF ..."
# get FAIL*'s variant_id
ID=$(echo "SELECT id FROM variant WHERE variant='$VARIANT' AND benchmark='$BENCHMARK'" | $MYSQL -N)
if [ -z $ID ]; then
echo "no such variant/benchmark!" >&2
exit 1
fi
# generate huge SQL statement and execute
$MYSQL <<EOT
CREATE TABLE IF NOT EXISTS $TABLE (
variant_id INT NOT NULL,
address INT UNSIGNED NOT NULL,
size INT UNSIGNED NOT NULL,
name VARCHAR(2000) NOT NULL,
PRIMARY KEY (variant_id, address)
) ENGINE=MyISAM;
EOT
(
# clean symbol table
echo "DELETE FROM $TABLE WHERE variant_id = $ID;"
LAST_ADDR=
LAST_SYMBOL=
LAST_INSERTED_ADDR=
# The "dummy" entry at the end makes sure the last real symbol from the
# nm output makes it into the database.
(nm -n -S -C $ELF; echo ffffffff a dummy) \
| egrep '^[0-9a-fA-F]' | while read line
do
ADDR=$(echo "$line"|awk '{print $1}')
SIZE=$(echo "$line"|awk '{print $2}')
if echo $SIZE | egrep -q '^[0-9a-fA-F]{8}'; then
SYMBOL=$(echo "$line"|awk '{for (i=1; i<=NF-3; i++) $i = $(i+3); NF-=3; print}')
else
SIZE=unknown
SYMBOL=$(echo "$line"|awk '{for (i=1; i<=NF-2; i++) $i = $(i+2); NF-=2; print}')
fi
if [ $LAST_ADDR ]; then
# only create INSERT-line, if $ADDR is new to us
if [ $LAST_ADDR != "$LAST_INSERTED_ADDR" ]; then
echo "INSERT INTO $TABLE (variant_id, address, size, name) VALUES "
echo "($ID, cast(0x$LAST_ADDR AS UNSIGNED), CAST(0x$ADDR AS UNSIGNED)-CAST(0x$LAST_ADDR AS UNSIGNED), '$LAST_SYMBOL');"
LAST_INSERTED_ADDR=$LAST_ADDR
fi
fi
if [ $SIZE != unknown ]; then
if [ $ADDR != "$LAST_INSERTED_ADDR" ]; then
echo "INSERT INTO $TABLE (variant_id, address, size, name) VALUES "
echo "($ID, cast(0x$ADDR AS UNSIGNED), CAST(0x$SIZE AS UNSIGNED), '$SYMBOL');"
LAST_ADDR=
LAST_SYMBOL=
LAST_INSERTED_ADDR=$ADDR
fi
else
LAST_ADDR=$ADDR
LAST_SYMBOL=$SYMBOL
fi
done
) | $MYSQL
echo "ANALYZE TABLE $TABLE;" | $MYSQL