--- /dev/null
+The tests in sframe.exp use binary data files:
+ - test-v2-ET_EXEC.sframe.bz2
+ - test-v2-ET_REL.sframe.bz2
+These files are generated using a as/ld supporting SFrame V2 sections (Binutils
+<= 2.45). The purpose of those tests is to make sure readelf/objdump support
+works for SFrame V2.
+
+The binary files are generated using the following steps.
+
+$ cat sort.s
+ .machinemode zarch
+ .machine "z900"
+.text
+ .align 8
+ .globl swapit
+ .type swapit, @function
+swapit:
+ .cfi_startproc
+ stmg %r11,%r15,88(%r15)
+ .cfi_offset 11, -72
+ .cfi_offset 12, -64
+ .cfi_offset 13, -56
+ .cfi_offset 14, -48
+ .cfi_offset 15, -40
+ aghi %r15,-176
+ .cfi_def_cfa_offset 336
+ lgr %r11,%r15
+ .cfi_def_cfa_register 11
+ stg %r2,168(%r11)
+ stg %r3,160(%r11)
+ lg %r1,160(%r11)
+ l %r2,0(%r1)
+ lg %r1,168(%r11)
+ st %r2,0(%r1)
+ nopr %r0
+ lmg %r11,%r15,264(%r11)
+ .cfi_restore 15
+ .cfi_restore 14
+ .cfi_restore 13
+ .cfi_restore 12
+ .cfi_restore 11
+ .cfi_def_cfa 15, 160
+ br %r14
+ .cfi_endproc
+ .size swapit, .-swapit
+
+ .align 8
+ .globl fake_sort
+ .type fake_sort, @function
+fake_sort:
+ .cfi_startproc
+ stmg %r11,%r15,88(%r15)
+ .cfi_offset 11, -72
+ .cfi_offset 12, -64
+ .cfi_offset 13, -56
+ .cfi_offset 14, -48
+ .cfi_offset 15, -40
+ aghi %r15,-176
+ .cfi_def_cfa_offset 336
+ lgr %r11,%r15
+ .cfi_def_cfa_register 11
+ stg %r2,168(%r11)
+ lgr %r1,%r3
+ st %r1,164(%r11)
+ l %r1,164(%r11)
+ ltr %r1,%r1
+ jle .L5
+ lgf %r1,164(%r11)
+ sllg %r1,%r1,2
+ aghi %r1,-4
+ ag %r1,168(%r11)
+ lgr %r3,%r1
+ lg %r2,168(%r11)
+ brasl %r14,swapit@PLT
+.L5:
+ nopr %r0
+ lg %r4,288(%r11)
+ lmg %r11,%r15,264(%r11)
+ .cfi_restore 15
+ .cfi_restore 14
+ .cfi_restore 13
+ .cfi_restore 12
+ .cfi_restore 11
+ .cfi_def_cfa 15, 160
+ br %r4
+ .cfi_endproc
+ .size fake_sort, .-fake_sort
+
+ .align 8
+ .globl sort_array
+ .type sort_array, @function
+sort_array:
+ .cfi_startproc
+ stmg %r11,%r15,88(%r15)
+ .cfi_offset 11, -72
+ .cfi_offset 12, -64
+ .cfi_offset 13, -56
+ .cfi_offset 14, -48
+ .cfi_offset 15, -40
+ aghi %r15,-672
+ .cfi_def_cfa_offset 832
+ lgr %r11,%r15
+ .cfi_def_cfa_register 11
+ lgr %r1,%r11
+ aghi %r1,160
+ lghi %r3,128
+ lgr %r2,%r1
+ brasl %r14,fake_sort@PLT
+ nopr %r0
+ lg %r4,784(%r11)
+ lmg %r11,%r15,760(%r11)
+ .cfi_restore 15
+ .cfi_restore 14
+ .cfi_restore 13
+ .cfi_restore 12
+ .cfi_restore 11
+ .cfi_def_cfa 15, 160
+ br %r4
+ .cfi_endproc
+ .size sort_array, .-sort_array
+
+ .section .rodata
+ .align 2
+.LC0:
+ .string "done"
+
+ .text
+ .align 8
+ .globl main
+ .type main, @function
+main:
+ .cfi_startproc
+ stmg %r11,%r15,88(%r15)
+ .cfi_offset 11, -72
+ .cfi_offset 12, -64
+ .cfi_offset 13, -56
+ .cfi_offset 14, -48
+ .cfi_offset 15, -40
+ aghi %r15,-160
+ .cfi_def_cfa_offset 320
+ lgr %r11,%r15
+ .cfi_def_cfa_register 11
+ brasl %r14,sort_array@PLT
+ larl %r2,.LC0
+ brasl %r14,printf@PLT
+ lhi %r1,0
+ lgfr %r1,%r1
+ lgr %r2,%r1
+ lg %r4,272(%r11)
+ lmg %r11,%r15,248(%r11)
+ .cfi_restore 15
+ .cfi_restore 14
+ .cfi_restore 13
+ .cfi_restore 12
+ .cfi_restore 11
+ .cfi_def_cfa 15, 160
+ br %r4
+ .cfi_endproc
+ .size main, .-main
+
+ .globl _start
+ .type _start, @function
+_start:
+ brasl %r14,_start
+ .size _start, .-_start
+
+$ as --gsframe -o sort.o sort.s
+$ ld -lc sort.o -o sort
+
+$ cp sort test-v2-ET_EXEC.sframe
+$ chmod -x test-v2-ET_EXEC.sframe
+$ bzip2 test-v2-ET_EXEC.sframe
+
+$ cp sort.o test-v2-ET_REL.sframe
+$ bzip2 test-v2-ET_REL.sframe
--- /dev/null
+# Expect script for s390 object tests for SFrame.
+# Copyright (C) 2026 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if {![istarget "s390x-*-linux*"] || [is_remote host]} {
+ return
+}
+
+set tempfile tmpdir/sframe-testbin
+
+set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.sframe.bz2]]
+foreach t $test_list {
+ # We need to strip the ".bz2", but can leave the dirname.
+ set test $subdir/[file tail $t]
+ set testname [file rootname $test]
+ verbose $testname
+
+ # We will check against the expected output in file named ${dumpfile}.dump
+ set dumpfile [file rootname $t]
+
+ if {[catch "system \"bzip2 -dc $t > $tempfile\""] != 0} {
+ untested "bzip2 -dc ($tempfile)"
+ continue
+ }
+
+ # Check readelf output of SFrame V2 sections.
+ set got [remote_exec host "$READELF --sframe $tempfile" "" "/dev/null" "${tempfile}.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "readelf SFrame V2 ($testname)"
+ continue
+ }
+
+ if { [regexp_diff "${tempfile}.out" "${dumpfile}.dump"] } then {
+ fail "readelf SFrame V2 ($testname)"
+ }
+ pass "readelf SFrame V2 ($testname)"
+
+ # Check objdump output of SFrame V2 sections as well.
+ set got [remote_exec host "$OBJDUMP --sframe $tempfile" "" "/dev/null" "${tempfile}.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "objdump SFrame V2 ($testname)"
+ continue
+ }
+
+ if { [regexp_diff "${tempfile}.out" "${dumpfile}.dump"] } then {
+ fail "objdump SFrame V2 ($testname)"
+ }
+ pass "objdump SFrame V2 ($testname)"
+}
--- /dev/null
+#...
+Contents of the SFrame section .sframe:
+ Header :
+
+ Version: SFRAME_VERSION_2
+ Flags: SFRAME_F_FDE_SORTED,
+ SFRAME_F_FDE_FUNC_START_PCREL
+ Num FDEs: 6
+ Num FREs: 22
+
+ Function Index :
+
+ func idx \[0\]: pc = 0x10002b0, size = 32 bytes
+ STARTPC +CFA +FP +RA +
+ 00000000010002b0 +sp\+160 +u +u +
+
+ func idx \[1\]: pc = 0x10002d0, size = 32 bytes
+ STARTPC\[m\] +CFA +FP +RA +
+ 0000000000000000 +sp\+160 +u +u +
+
+ func idx \[2\]: pc = 0x10002f0, size = 56 bytes
+ STARTPC +CFA +FP +RA +
+ 00000000010002f0 +sp\+160 +u +u +
+ 00000000010002f6 +sp\+160 +c-72 +c-48 +
+ 00000000010002fa +sp\+336 +c-72 +c-48 +
+ 00000000010002fe +fp\+336 +c-72 +c-48 +
+ 0000000001000326 +sp\+160 +u +u +
+
+ func idx \[3\]: pc = 0x1000328, size = 92 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000001000328 +sp\+160 +u +u +
+ 000000000100032e +sp\+160 +c-72 +c-48 +
+ 0000000001000332 +sp\+336 +c-72 +c-48 +
+ 0000000001000336 +fp\+336 +c-72 +c-48 +
+ 0000000001000382 +sp\+160 +u +u +
+
+ func idx \[4\]: pc = 0x1000388, size = 52 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000001000388 +sp\+160 +u +u +
+ 000000000100038e +sp\+160 +c-72 +c-48 +
+ 0000000001000392 +sp\+832 +c-72 +c-48 +
+ 0000000001000396 +fp\+832 +c-72 +c-48 +
+ 00000000010003ba +sp\+160 +u +u +
+
+ func idx \[5\]: pc = 0x10003c0, size = 58 bytes
+ STARTPC +CFA +FP +RA +
+ 00000000010003c0 +sp\+160 +u +u +
+ 00000000010003c6 +sp\+160 +c-72 +c-48 +
+ 00000000010003ca +sp\+320 +c-72 +c-48 +
+ 00000000010003ce +fp\+320 +c-72 +c-48 +
+ 00000000010003f8 +sp\+160 +u +u +
--- /dev/null
+#...
+Contents of the SFrame section .sframe:
+ Header :
+
+ Version: SFRAME_VERSION_2
+ Flags: SFRAME_F_FDE_FUNC_START_PCREL
+ Num FDEs: 4
+ Num FREs: 20
+
+ Function Index :
+
+ func idx \[0\]: pc = 0x0, size = 56 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000000 +sp\+160 +u +u +
+ 0000000000000006 +sp\+160 +c-72 +c-48 +
+ 000000000000000a +sp\+336 +c-72 +c-48 +
+ 000000000000000e +fp\+336 +c-72 +c-48 +
+ 0000000000000036 +sp\+160 +u +u +
+
+ func idx \[1\]: pc = 0x38, size = 92 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000038 +sp\+160 +u +u +
+ 000000000000003e +sp\+160 +c-72 +c-48 +
+ 0000000000000042 +sp\+336 +c-72 +c-48 +
+ 0000000000000046 +fp\+336 +c-72 +c-48 +
+ 0000000000000092 +sp\+160 +u +u +
+
+ func idx \[2\]: pc = 0x98, size = 52 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000098 +sp\+160 +u +u +
+ 000000000000009e +sp\+160 +c-72 +c-48 +
+ 00000000000000a2 +sp\+832 +c-72 +c-48 +
+ 00000000000000a6 +fp\+832 +c-72 +c-48 +
+ 00000000000000ca +sp\+160 +u +u +
+
+ func idx \[3\]: pc = 0xd0, size = 58 bytes
+ STARTPC +CFA +FP +RA +
+ 00000000000000d0 +sp\+160 +u +u +
+ 00000000000000d6 +sp\+160 +c-72 +c-48 +
+ 00000000000000da +sp\+320 +c-72 +c-48 +
+ 00000000000000de +fp\+320 +c-72 +c-48 +
+ 0000000000000108 +sp\+160 +u +u +
--- /dev/null
+The tests in sframe.exp use binary data files:
+ - test-v2-ET_EXEC.sframe.bz2
+ - test-v2-ET_REL.sframe.bz2
+These files are generated using a as/ld supporting SFrame V2 sections (Binutils
+<= 2.45). The purpose of those tests is to make sure readelf/objdump support
+works for SFrame V2.
+
+The binary files are generated using the following steps.
+
+$ cat sort.s
+ .text
+ .p2align 4
+ .globl swapit
+ .type swapit, @function
+swapit:
+ .cfi_startproc
+ movl (%rsi), %eax
+ .cfi_def_cfa_register 6
+ .cfi_offset 6, 16
+ movl %eax, (%rdi)
+ .cfi_def_cfa_register 7
+ ret
+ .cfi_endproc
+ .size swapit, .-swapit
+
+ .p2align 4
+ .globl fake_sort
+ .type fake_sort, @function
+fake_sort:
+ .cfi_startproc
+ testl %esi, %esi
+ jg .L5
+ ret
+ .p2align 4,,10
+ .p2align 3
+.L5:
+ movslq %esi, %rsi
+ leaq -4(%rdi,%rsi,4), %rsi
+ jmp swapit
+ .cfi_endproc
+ .size fake_sort, .-fake_sort
+
+ .text
+ .p2align 4
+ .globl sort_array
+ .type sort_array, @function
+sort_array:
+ .cfi_startproc
+ subq $520, %rsp
+ .cfi_def_cfa_offset 528
+ movl $128, %esi
+ movq %rsp, %rdi
+ call fake_sort
+ addq $520, %rsp
+ .cfi_def_cfa_offset 8
+ ret
+ .cfi_endproc
+ .size sort_array, .-sort_array
+
+ .section .rodata.str1.1,"aMS",@progbits,1
+.LC0:
+ .string "done"
+
+ .section .text.startup,"ax",@progbits
+ .p2align 4
+ .globl main
+ .type main, @function
+main:
+ .cfi_startproc
+ subq $8, %rsp
+ .cfi_def_cfa_offset 16
+ call sort_array
+ movl $.LC0, %edi
+ xorl %eax, %eax
+ call printf
+ xorl %eax, %eax
+ addq $8, %rsp
+ .cfi_def_cfa_offset 8
+ ret
+ .cfi_endproc
+
+ .globl _start
+ .type _start,@function
+_start:
+ call main
+ .size main, .-main
+
+$ as --gsframe -o sort.o sort.s
+$ ld -lc sort.o -o sort
+
+$ cp sort test-v2-ET_EXEC.sframe
+$ chmod -x test-v2-ET_EXEC.sframe
+$ bzip2 test-v2-ET_EXEC.sframe
+
+$ cp sort.o test-v2-ET_REL.sframe
+$ bzip2 test-v2-ET_REL.sframe
--- /dev/null
+# Expect script for x86-64 object tests for SFrame.
+# Copyright (C) 2026 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+if {![istarget "x86_64-*-linux*"] || [is_remote host]} {
+ return
+}
+
+set tempfile tmpdir/sframe-testbin
+
+set test_list [lsort [glob -nocomplain $srcdir/$subdir/*.sframe.bz2]]
+foreach t $test_list {
+ # We need to strip the ".bz2", but can leave the dirname.
+ set test $subdir/[file tail $t]
+ set testname [file rootname $test]
+ verbose $testname
+
+ # We will check against the expected output in file named ${dumpfile}.dump
+ set dumpfile [file rootname $t]
+
+ if {[catch "system \"bzip2 -dc $t > $tempfile\""] != 0} {
+ untested "bzip2 -dc ($tempfile)"
+ continue
+ }
+
+ # Check readelf output of SFrame V2 sections.
+ set got [remote_exec host "$READELF --sframe $tempfile" "" "/dev/null" "${tempfile}.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "readelf SFrame V2 ($testname)"
+ continue
+ }
+
+ if { [regexp_diff "${tempfile}.out" "${dumpfile}.dump"] } then {
+ fail "readelf SFrame V2 ($testname)"
+ }
+ pass "readelf SFrame V2 ($testname)"
+
+ # Check objdump output of SFrame V2 sections as well.
+ set got [remote_exec host "$OBJDUMP --sframe $tempfile" "" "/dev/null" "${tempfile}.out"]
+ if { [lindex $got 0] != 0 || ![string match "" [lindex $got 1]] } then {
+ fail "objdump SFrame V2 ($testname)"
+ continue
+ }
+
+ if { [regexp_diff "${tempfile}.out" "${dumpfile}.dump"] } then {
+ fail "objdump SFrame V2 ($testname)"
+ }
+ pass "objdump SFrame V2 ($testname)"
+}
--- /dev/null
+#...
+Contents of the SFrame section .sframe:
+ Header :
+
+ Version: SFRAME_VERSION_2
+ Flags: SFRAME_F_FDE_SORTED,
+ SFRAME_F_FDE_FUNC_START_PCREL
+ CFA fixed RA offset: -8
+ Num FDEs: 6
+ Num FREs: 14
+
+ Function Index :
+
+ func idx \[0\]: pc = 0x401000, size = 16 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000401000 +sp\+16 +u +f +
+ 0000000000401006 +sp\+24 +u +f +
+
+ func idx \[1\]: pc = 0x401010, size = 16 bytes
+ STARTPC\[m\] +CFA +FP +RA +
+ 0000000000000000 +sp\+8 +u +f +
+ 000000000000000b +sp\+16 +u +f +
+
+ func idx \[2\]: pc = 0x401020, size = 28 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000401020 +sp\+8 +u +f +
+ 0000000000401024 +sp\+16 +u +f +
+ 000000000040103b +sp\+8 +u +f +
+
+ func idx \[3\]: pc = 0x401050, size = 5 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000401050 +sp\+8 +u +f +
+ 0000000000401052 +fp\+8 +c\+16 +f +
+ 0000000000401054 +sp\+8 +c\+16 +f +
+
+ func idx \[4\]: pc = 0x401060, size = 18 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000401060 +sp\+8 +u +f +
+
+ func idx \[5\]: pc = 0x401080, size = 28 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000401080 +sp\+8 +u +f +
+ 0000000000401087 +sp\+528 +u +f +
+ 000000000040109b +sp\+8 +u +f +
+
--- /dev/null
+#...
+Contents of the SFrame section .sframe:
+ Header :
+
+ Version: SFRAME_VERSION_2
+ Flags: SFRAME_F_FDE_FUNC_START_PCREL
+ CFA fixed RA offset: -8
+ Num FDEs: 4
+ Num FREs: 10
+
+ Function Index :
+
+ func idx \[0\]: pc = 0x0, size = 5 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000000 +sp\+8 +u +f +
+ 0000000000000002 +fp\+8 +c\+16 +f +
+ 0000000000000004 +sp\+8 +c\+16 +f +
+
+ func idx \[1\]: pc = 0x10, size = 18 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000010 +sp\+8 +u +f +
+
+ func idx \[2\]: pc = 0x30, size = 28 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000030 +sp\+8 +u +f +
+ 0000000000000037 +sp\+528 +u +f +
+ 000000000000004b +sp\+8 +u +f +
+
+ func idx \[3\]: pc = 0x0, size = 28 bytes
+ STARTPC +CFA +FP +RA +
+ 0000000000000000 +sp\+8 +u +f +
+ 0000000000000004 +sp\+16 +u +f +
+ 000000000000001b +sp\+8 +u +f +