]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390x: Add script s390-runone to help debugging small code snippets
authorFlorian Krohm <flo2030@eich-krohm.de>
Mon, 30 Jun 2025 08:27:18 +0000 (08:27 +0000)
committerFlorian Krohm <flo2030@eich-krohm.de>
Mon, 30 Jun 2025 08:27:18 +0000 (08:27 +0000)
auxprogs/s390-runone [new file with mode: 0755]

diff --git a/auxprogs/s390-runone b/auxprogs/s390-runone
new file mode 100755 (executable)
index 0000000..2079a5e
--- /dev/null
@@ -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