Files

74 lines
2.8 KiB
Bash
Executable File

#!/bin/sh
# Reproduce the bit-address spike. Throwaway: build artefacts are not
# interesting beyond the numbers in REPORT.md / REPORT-23.md.
set -eu
ROOT=$(cd "$(dirname "$0")/.." && pwd)
cd "$ROOT/spike"
CC=${CLANG:-clang-19}
CXX=${CXX:-clang++-19}
OPT=${OPT:-opt-19}
LLVMCONFIG=${LLVMCONFIG:-llvm-config-19}
TMS_BITADDR=${TMS_BITADDR:-}
if [ -n "$TMS_BITADDR" ]; then
SCALE="$TMS_BITADDR --scale"
else
echo "== build bitscale"
$CXX -std=c++17 $($LLVMCONFIG --cxxflags) bitscale.cpp \
$($LLVMCONFIG --ldflags --libs core irreader support --system-libs) \
-o bitscale
SCALE=./bitscale
fi
COMMON="-target i386-unknown-none -ffreestanding -nostdinc -fno-builtin -fno-discard-value-names"
echo "== Xlib client"
$CC $COMMON -fpack-struct=1 -O2 -S -emit-llvm xclient.c -o xclient.packed.O2.ll
$SCALE xclient.packed.O2.ll xclient.packed.O2.bits.ll
$OPT -passes=verify -disable-output xclient.packed.O2.bits.ll
$OPT -passes='default<O2>' -S xclient.packed.O2.bits.ll -o /tmp/xclient.bits.O2.ll
printf 'GEPs after scaling+O2: '
grep -c getelementptr /tmp/xclient.bits.O2.ll || true
printf 'memcpy count: '
grep -c 'llvm.memcpy' /tmp/xclient.bits.O2.ll || true
echo "== early scaling is required for pointer arithmetic (i386 historical view)"
$CC $COMMON -Xclang -disable-O0-optnone -O0 -S -emit-llvm ptrdiff.c -o ptrdiff.O0.ll
$SCALE ptrdiff.O0.ll ptrdiff.O0.bits.ll
$OPT -passes='default<O2>' -S ptrdiff.O0.bits.ll -o /tmp/ptrdiff.bits.O2.ll
grep -A2 'define.*@int_diff(' /tmp/ptrdiff.bits.O2.ll
grep -A2 'define.*@int_diff4' /tmp/ptrdiff.bits.O2.ll
echo "-- i386 pointer difference is still in bit units:"
grep -A6 'define.*@ptr_diff' /tmp/ptrdiff.bits.O2.ll
echo "== TMS target pointer difference (23.1.5, patched clang)"
TMS_CLANG=${TMS_CLANG:-$CC}
TMS_OPT=${TMS_OPT:-$OPT}
export TMS_CLANG TMS_OPT
"$ROOT/scripts/tms-clang" -O2 -o /tmp/tms-m0.ll "$ROOT/scripts/tests/m0/ptrdiff.c"
grep -A2 'define.*@int_diff(' /tmp/tms-m0.ll
grep -A2 'define.*@int_diff4' /tmp/tms-m0.ll
echo "-- TMS pointer difference is divided back to bytes:"
grep -A6 'define.*@pd_char' /tmp/tms-m0.ll
grep -A6 'define.*@pd_int' /tmp/tms-m0.ll
echo "== constant GEP, byval, varargs, VLA"
$CC $COMMON -O2 -S -emit-llvm stress.c -o stress.O2.ll 2>/dev/null
$SCALE stress.O2.ll stress.O2.bits.ll
$OPT -passes=verify -disable-output stress.O2.bits.ll
echo "== TI struct layout"
$CC $COMMON -O2 -S -emit-llvm layout.c -o layout.O2.ll
$CC $COMMON -fpack-struct=1 -O2 -S -emit-llvm layout.c -o layout.packed.O2.ll
echo "-- default:"
grep -A2 'define.*@size_S' layout.O2.ll | tail -1
grep -A2 'define.*@off_i' layout.O2.ll | tail -1
grep -A2 'define.*@stride' layout.O2.ll | tail -1
echo "-- packed:"
grep -A2 'define.*@size_S' layout.packed.O2.ll | tail -1
grep -A2 'define.*@off_i' layout.packed.O2.ll | tail -1
grep -A2 'define.*@stride' layout.packed.O2.ll | tail -1
echo "done"