From: Florian K. <fk...@so...> - 2025-06-30 08:28:39
|
https://sourceware.org/cgit/valgrind/commit/?id=56d870ba62c775ac5a97f95fc6efb49610cdf96e commit 56d870ba62c775ac5a97f95fc6efb49610cdf96e Author: Florian Krohm <fl...@ei...> Date: Mon Jun 30 08:27:18 2025 +0000 s390x: Add script s390-runone to help debugging small code snippets Diff: --- auxprogs/s390-runone | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/auxprogs/s390-runone b/auxprogs/s390-runone new file mode 100755 index 0000000000..2079a5e460 --- /dev/null +++ b/auxprogs/s390-runone @@ -0,0 +1,85 @@ +#!/bin/sh +# +#----------------------------------------------------------------------- +# Compile a small C program containing a sequence of assembler +# instructions into an executable that does not need a dynamic linker. +# Very handy for debugging new insns or small snippets without going +# through the multi-pass process of figuring out which SB contains the +# code we're interested in. +# +# Here is a template: +# +# int main(void) +# { +# //FIXME: insert test code here: +# asm volatile ("lghi %r1,1"); // __NR_exit +# asm volatile ("lghi %r2,0"); // return code = 0 +# asm volatile ("svc 0"); +# return 0; // shuts up GCC +# } +# +# When running the executable created by this script under valgrind +# there will be only a single super block! Which is exactly what we want +# for debugging. +# +# objdump -d: +# +# 00000000010000b0 <_start>: +# 10000b0: b3 c1 00 0b ldgr %f0,%r11 +# 10000b4: b9 04 00 bf lgr %r11,%r15 +# 10000b8: a7 19 00 01 lghi %r1,1 <--- +# 10000bc: a7 29 00 09 lghi %r2,9 <--- +# 10000c0: 0a 00 svc 0 <--- +# 10000c2: a7 18 00 00 lhi %r1,0 +# 10000c6: b9 14 00 11 lgfr %r1,%r1 +# 10000ca: b9 04 00 21 lgr %r2,%r1 +# 10000ce: b3 cd 00 b0 lgdr %r11,%f0 +# 10000d2: 07 fe br %r14 +# 10000d4: 07 07 nopr %r7 +# 10000d6: 07 07 nopr %r7 +# +# There are only 2 extra insns ahead of our asm code sequence. +# Everything after the svc insn is not reachable. +#----------------------------------------------------------------------- +# + +if [ "x$1" = "x" ]; then + echo "Usage: s390-runone C-file" 1>&2 + echo " or: s390-runone -t" 1>&2 + exit 1 +fi + +if [ "x$1" = "x-t" ]; then + echo 'int main(void)' + echo '{' + echo ' //FIXME: insert test code here:' + echo ' asm volatile ("lghi %r1,1"); // __NR_exit' + echo ' asm volatile ("lghi %r2,0"); // return code = 0' + echo ' asm volatile ("svc 0");' + echo ' return 0; // shuts up GCC' + echo '}' + exit 0 +fi + +file="$1" +base=`basename "$file" .c` +asm="$base.s" +exe="$base" + +if [ "$base" = "$file" ]; then + echo "$file is not a C file" 1>&2 + exit 1 +fi + +# Compile the testprogram to assembler +gcc -S -fno-ident -march=arch14 $file +mv "$asm" "$asm.orig" # save the result + +# Rename main with _start, remove cfi stuff and comment lines +sed 's/main/_start/g' "$asm.orig" | grep -v \.cfi_ | grep -v ^# > "$asm" + +# Link to executable +gcc -static -Wl,--build-id=none -nodefaultlibs -nostartfiles "$asm" -o "$exe" + +echo "$exe created" +exit 0 |