Files
revng-revng/scripts/translate
T
Alessandro Di Federico cc02713f6d Abandon argparse in favor of LLVM's CommandLine
This commit dismisses the `argparse` library (the only non-runtime C
component of rev.ng) in favor of LLVM's CommandLine library, which
offers several benefits. Among others, now command line arguments can be
easily specified as a global variable, decentralizing their management
and avoiding the long list of arguments in the constructor of singleton
objects such as `CodeGenerator`.
2018-10-03 23:11:13 +02:00

177 lines
3.6 KiB
Bash
Executable File

#!/bin/bash
#
# This file is distributed under the MIT License. See LICENSE.md for details.
#
SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INPUT=""
OPTIMIZE=0
SKIP=0
ISOLATE=0
SUPPORT_CONFIG=normal
EXTRA_OPTIONS=""
BASE=""
set -e
set -o pipefail
while [[ $# > 0 ]]
do
key="$1"
case $key in
-O0)
OPTIMIZE="0"
shift
;;
-O1)
OPTIMIZE="1"
shift # past argument
;;
-O2)
OPTIMIZE="2"
shift # past argument
;;
-trace)
SUPPORT_CONFIG="trace"
shift # past argument
;;
-s)
SKIP="1"
shift # past argument
;;
-i)
ISOLATE="1"
shift # past argument
;;
--base)
shift # past argument
BASE="--base $1"
shift
;;
--)
shift
break
;;
*)
# unknown option
if [ -z "$INPUT" ]; then
INPUT="$key"
else
break;
fi
shift
;;
esac
done
# Output file name
LL="$INPUT"
LIBSCSV="$LL.ll.need.csv"
# Required programs
export PATH="$SCRIPT_PATH:$PATH"
CC="${CC:-cc}"
LINK="llvm-link"
LLC="llc"
OPT="opt"
REVAMB="revamb"
REVAMBDUMP="revamb-dump"
TOOPT="csv-to-ld-options"
# Read endianess and architecture bytes
ARCHID=$(python -c '
from binascii import hexlify
import sys
file = open(sys.argv[1], "rb")
file.seek(5)
result = hexlify(file.read(1))
file.seek(18)
result += hexlify(file.read(2))
file.close()
print(result.decode("utf-8"))' "$INPUT")
case "$ARCHID" in
012800)
ARCH=arm;
;;
020008)
ARCH=mips;
;;
013e00)
ARCH=x86_64;
;;
010300)
ARCH=i386;
;;
020016)
ARCH=s390x;
;;
*)
echo "Unknown architecture: $ARCHID"
exit 1
;;
esac
SUPPORT_NAME="support-$ARCH-$SUPPORT_CONFIG.ll"
SUPPORT_PATH="$SCRIPT_PATH/../share/revamb/$SUPPORT_NAME"
if [ '!' -e "$SUPPORT_PATH" ]; then
SUPPORT_PATH="$SCRIPT_PATH/$SUPPORT_NAME"
if [ '!' -e "$SUPPORT_PATH" ]; then
echo "Can't find $SUPPORT_NAME"
exit 1
fi
fi
if [ "$ISOLATE" -eq 1 ]; then
EXTRA_OPTIONS="$EXTRA_OPTIONS --functions-boundaries"
fi
if [ "$SKIP" -eq 0 ]; then
REVAMB_LOG="$LL.log"
CSV="$LL.ll.li.csv"
"$REVAMB" -g ll --debug-log jtcount --debug-log osrjts --use-debug-symbols $BASE $EXTRA_OPTIONS "$INPUT" "$LL.ll" "$@" |& tee "$REVAMB_LOG"
fi
if [ "$ISOLATE" -eq 1 ]; then
LL_ISOLATED="$LL.isolated"
"$REVAMBDUMP" -i "$LL_ISOLATED.ll" "$LL.ll"
LL="$LL_ISOLATED"
fi
LL_LINKED="$LL.linked"
"$LINK" "$LL.ll" "$SUPPORT_PATH" -o "$LL_LINKED.ll" -S
LL="$LL_LINKED"
OUTPUT="$INPUT.translated"
if [ "$OPTIMIZE" -eq 0 ]; then
"$LLC" -O0 -filetype=obj "$LL.ll" -o "$OBJ"
elif [ "$OPTIMIZE" -eq 1 ]; then
"$LLC" -O2 -filetype=obj "$LL.ll" -o "$OBJ" -regalloc=fast -disable-machine-licm
elif [ "$OPTIMIZE" -eq 2 ]; then
LL_OPT="$LL.opt"
"$OPT" -O2 -S "$LL.ll" -o "$LL_OPT.ll"
"$LLC" -O2 -filetype=obj "$LL_OPT.ll" -o "$OBJ" -regalloc=fast -disable-machine-licm
LL="$LL_OPT"
fi
if "$CC" -no-pie |& grep 'unrecognized command line option'; then
DISABLE_PIE="-fno-pie"
else
DISABLE_PIE="-fno-pie -no-pie"
fi
OBJ="$LL.o"
"$CC" \
"$OBJ" \
-lz -lm -lrt $("$TOOPT" "$CSV" "$LIBSCSV") -L ./ \
-o "$OUTPUT" \
$DISABLE_PIE
UNPATCHED_OUTPUT="$OUTPUT.tmp"
mv "$OUTPUT" "$UNPATCHED_OUTPUT"
merge-dynamic.py $BASE "$UNPATCHED_OUTPUT" "$INPUT" "$OUTPUT"
rm "$UNPATCHED_OUTPUT"