From: Claudiu Zissulescu Date: Fri, 30 Jan 2026 07:40:20 +0000 (-0800) Subject: sframe: Add tests for PR ld/32769 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fmaster;p=thirdparty%2Fbinutils-gdb.git sframe: Add tests for PR ld/32769 Add simple tests that verify the behavior of garbage collection of SFrame sections during linking. x86_64-specific tests: - sframe-gc-sections-1.d checks that none of the functions get discarded with --gc-sections - sframe-gc-sections-2a.d checks the behavior of --gc-sections with two distinct .text.* sections (similar to -ffunction-sections compiler option) - sframe-gc-sections-2b.d checks the same behaviour as sframe-gc-sections-2a.d, but with a linker script that discards .eh_frame sections. This testcase is keep it ensured that the two section's GC behaviours are not unnecessarily inter-twined. All targets supporting sframe tests: - pr32769.rd simple linking test in presence of --gc-sections option. - pr32769-2.d checks the behavior of --gc-sections with two .text.* sections, one section is discarded - pr32769-2r.d Like the above, but using -r option when linking and checking for the relocations. - pr32769-3.d checks the behavior of --gc-sections with multiple sections, none is drop. ld/ PR ld/32769 * testsuite/ld-sframe/pr32769.rd: New file. * testsuite/ld-sframe/pr32769.s: Likewise. * testsuite/ld-sframe/pr32769-2.d: Likewise. * testsuite/ld-sframe/pr32769-2r.d: Likewise. * testsuite/ld-sframe/pr32769-2.s: Likewise. * testsuite/ld-sframe/pr32769-3.d: Likewise. * testsuite/ld-sframe/pr32769-3.s: Likewise. * testsuite/ld-sframe/sframe.exp: Add pr32769 test. * testsuite/ld-x86-64/sframe-baz.s: New file. * testsuite/ld-x86-64/sframe-gc-sections-1.d: Likewise. * testsuite/ld-x86-64/sframe-gc-sections-2.s: Likewise. * testsuite/ld-x86-64/sframe-gc-sections-2a.d: Likewise. * testsuite/ld-x86-64/sframe-gc-sections-2b.d: Likewise. * testsuite/ld-x86-64/sframe-gc-sections-2b.t: Likewise. * testsuite/ld-x86-64/x86-64.exp: Add new sframe gc tests. Co-authored-by: Indu Bhagat Signed-off-by: Claudiu Zissulescu --- diff --git a/ld/testsuite/ld-sframe/pr32769-2.d b/ld/testsuite/ld-sframe/pr32769-2.d new file mode 100644 index 00000000000..1ec585d43e2 --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769-2.d @@ -0,0 +1,9 @@ +#as: --gsframe-3 +#source: pr32769-2.s +#readelf: --sframe +#ld: --gc-sections -shared +#name: GC Multiple .text sections, remove unused + +#... +\s+Num FDEs: 1 +#... diff --git a/ld/testsuite/ld-sframe/pr32769-2.s b/ld/testsuite/ld-sframe/pr32769-2.s new file mode 100644 index 00000000000..df4eab0bc3a --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769-2.s @@ -0,0 +1,19 @@ + .section .text.foo + .globl foo + .type foo, @function +foo: + .cfi_startproc + .byte 0 + + .section .text.foo.cold +coldx: + .cfi_startproc + .cfi_def_cfa_offset 16 + .byte 0 + .cfi_endproc + + .section .text.foo + .byte 0 + .cfi_def_cfa_offset 16 + .cfi_endproc + .size foo, .-foo diff --git a/ld/testsuite/ld-sframe/pr32769-2r.d b/ld/testsuite/ld-sframe/pr32769-2r.d new file mode 100644 index 00000000000..7cab96b60f7 --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769-2r.d @@ -0,0 +1,9 @@ +#as: --gsframe-3 +#source: pr32769-2.s +#readelf: -j .rela.sframe +#ld: --gc-sections -r -e foo +#name: GC Multiple .text sections, check relas + +Relocation section '.rela.sframe' at offset 0x[0-9a-f]+ contains 1 entry: +\s+Offset\s+Info\s+Type\s+Sym.\s+Value\s+Sym.\s+Name\s\+\sAddend +[0-9a-f]+\s+[0-9a-f]+\s+R_[_\w\d]+\s+[0-9a-f]+\s\.text\.foo \+ 0 \ No newline at end of file diff --git a/ld/testsuite/ld-sframe/pr32769-3.d b/ld/testsuite/ld-sframe/pr32769-3.d new file mode 100644 index 00000000000..e7a2a4452fe --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769-3.d @@ -0,0 +1,10 @@ +#as: --gsframe-3 +#source: pr32769-3.s +#readelf: --sframe +#ld: --gc-sections -e foo +#name: GC Multiple .text sections, keep all + +#... +\s+Num FDEs: 2 +\s+Num FREs: 3 +#... diff --git a/ld/testsuite/ld-sframe/pr32769-3.s b/ld/testsuite/ld-sframe/pr32769-3.s new file mode 100644 index 00000000000..181eb1305b9 --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769-3.s @@ -0,0 +1,21 @@ + .section .text.foo + .globl foo + .type foo, @function +foo: + .cfi_startproc + .byte 0 + .long coldx + + .section .text.foo.cold + .type coldx, @function +coldx: + .cfi_startproc + .cfi_def_cfa_offset 16 + .byte 0 + .cfi_endproc + + .section .text.foo +1: .byte 0 + .cfi_def_cfa_offset 16 + .cfi_endproc + .size foo, .-foo diff --git a/ld/testsuite/ld-sframe/pr32769.rd b/ld/testsuite/ld-sframe/pr32769.rd new file mode 100644 index 00000000000..6a8cb2146f5 --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769.rd @@ -0,0 +1,14 @@ +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_3 +#... + Num FDEs: 1 + Num FREs: 1 + + Function Index : + + func idx \[0\]: pc = 0x[0-9a-f]+, size = 1 bytes + STARTPC\s+CFA\s+FP\s+RA\s+ + [0-9a-f]+\s+sp.* +#pass diff --git a/ld/testsuite/ld-sframe/pr32769.s b/ld/testsuite/ld-sframe/pr32769.s new file mode 100644 index 00000000000..0518fff68a6 --- /dev/null +++ b/ld/testsuite/ld-sframe/pr32769.s @@ -0,0 +1,8 @@ + .text + .globl foo + .type foo, @function +foo: + .cfi_startproc + .byte 0 + .cfi_endproc + .size foo, .-foo diff --git a/ld/testsuite/ld-sframe/sframe.exp b/ld/testsuite/ld-sframe/sframe.exp index ef946193c32..5af0aca12f9 100644 --- a/ld/testsuite/ld-sframe/sframe.exp +++ b/ld/testsuite/ld-sframe/sframe.exp @@ -170,6 +170,15 @@ if { [check_compiler_available] } { ] } +set sframe_link_tests { + { "pr32769" + "--gc-sections -e foo" "" "--gsframe-3" {pr32769.s} + {{readelf --sframe pr32769.rd}} + "pr32769.x" } +} + +run_ld_link_tests $sframe_link_tests + if {[info exists old_lc_all]} { set env(LC_ALL) $old_lc_all } else { diff --git a/ld/testsuite/ld-x86-64/sframe-baz.s b/ld/testsuite/ld-x86-64/sframe-baz.s new file mode 100644 index 00000000000..395b9cbb084 --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-baz.s @@ -0,0 +1,36 @@ + .text + .globl baz + .type baz, @function +baz: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset %rbp, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + call foo + popq %rbp + .cfi_def_cfa 7, 8 + ret + .cfi_endproc + .size baz, .-baz + + .global qux + .type qux, @function +qux: + .cfi_startproc + nop + ret + .cfi_endproc + .size qux, .-qux + + .global _start + .type _start,%function +_start: + .cfi_startproc + mov bar@GOTPCREL(%rip), %rax + mov foo@GOTPCREL(%rip), %rax + .cfi_endproc + .size _start, . - _start + + .section .note.GNU-stack,"",@progbits diff --git a/ld/testsuite/ld-x86-64/sframe-gc-sections-1.d b/ld/testsuite/ld-x86-64/sframe-gc-sections-1.d new file mode 100644 index 00000000000..b9f57c08d26 --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-1.d @@ -0,0 +1,50 @@ +#as: --gsframe-3 +#source: sframe-foo.s +#source: sframe-bar.s +#source: sframe-baz.s +#objdump: --sframe=.sframe +#ld: --gc-sections -e _start +#name: SFrame gc sections + +.*: +file format .* + +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_3 + Flags: SFRAME_F_FDE_SORTED, + SFRAME_F_FDE_FUNC_START_PCREL + CFA fixed RA offset: -8 + Num FDEs: 5 + Num FREs: 14 + + Function Index : + + func idx \[0\]: pc = 0x[0-9a-f]+, size = 53 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + [0-9a-f]+ +sp\+16 +c-16 +f + + [0-9a-f]+ +fp\+16 +c-16 +f + + [0-9a-f]+ +sp\+8 +c-16 +f + + + func idx \[1\]: pc = 0x[0-9a-f]+, size = 37 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + [0-9a-f]+ +sp\+16 +c-16 +f + + [0-9a-f]+ +fp\+16 +c-16 +f + + [0-9a-f]+ +sp\+8 +c-16 +f + + + func idx \[2\]: pc = 0x[0-9a-f]+, size = 11 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + [0-9a-f]+ +sp\+16 +c-16 +f + + [0-9a-f]+ +fp\+16 +c-16 +f + + [0-9a-f]+ +sp\+8 +c-16 +f + + + func idx \[3\]: pc = 0x[0-9a-f]+, size = 2 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + + func idx \[4\]: pc = 0x[0-9a-f]+, size = 14 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + diff --git a/ld/testsuite/ld-x86-64/sframe-gc-sections-2.s b/ld/testsuite/ld-x86-64/sframe-gc-sections-2.s new file mode 100644 index 00000000000..3b3c07c4fd2 --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2.s @@ -0,0 +1,35 @@ +# --gc-sections will clean up .text.bar, and there should be no +# SFrame stack trace information for it. + .section .text.start,"ax",@progbits + .globl start + .type start, @function +start: + .cfi_startproc + jmp foo + .cfi_endproc + .size start, .-start + + .section .text.foo,"ax",@progbits + .globl foo + .type foo, @function +foo: + .cfi_startproc + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset %rbp, -16 + movq %rsp, %rbp + .cfi_def_cfa_register %rbp + leave + .cfi_def_cfa %rsp, 8 + ret + .cfi_endproc + .size foo, .-foo + + .section .text.bar,"ax",@progbits + .globl bar + .type bar, @function +bar: + .cfi_startproc + ret + .cfi_endproc + .size bar, .-bar diff --git a/ld/testsuite/ld-x86-64/sframe-gc-sections-2a.d b/ld/testsuite/ld-x86-64/sframe-gc-sections-2a.d new file mode 100644 index 00000000000..42567e755b2 --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2a.d @@ -0,0 +1,29 @@ +#as: --gsframe-3 +#source: sframe-gc-sections-2.s +#objdump: --sframe=.sframe +#ld: -r --gc-sections +#name: SFrame gc sections II + +.*: +file format .* + +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_3 +#... + CFA fixed RA offset: -8 + Num FDEs: 2 + Num FREs: 5 + + Function Index : + + func idx \[0\]: pc = 0x[0-9a-f]+, size = 5 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + + func idx \[1\]: pc = 0x[0-9a-f]+, size = 6 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + [0-9a-f]+ +sp\+16 +c-16 +f + + [0-9a-f]+ +fp\+16 +c-16 +f + + [0-9a-f]+ +sp\+8 +c-16 +f + diff --git a/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.d b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.d new file mode 100644 index 00000000000..72c80e70d5b --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.d @@ -0,0 +1,30 @@ +#as: --gsframe-3 +#source: sframe-gc-sections-2.s +#objdump: --sframe=.sframe +#ld: -T sframe-gc-sections-2b.t --gc-sections -e start +#name: SFrame gc sections with discard EH_Frame + +.*: +file format .* + +Contents of the SFrame section .sframe: + Header : + + Version: SFRAME_VERSION_3 + Flags: SFRAME_F_FDE_SORTED, + SFRAME_F_FDE_FUNC_START_PCREL + CFA fixed RA offset: -8 + Num FDEs: 2 + Num FREs: 5 + + Function Index : + + func idx \[0\]: pc = 0x[0-9a-f]+, size = 5 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + + func idx \[1\]: pc = 0x[0-9a-f]+, size = 6 bytes + STARTPC +CFA +FP +RA + + [0-9a-f]+ +sp\+8 +u +f + + [0-9a-f]+ +sp\+16 +c-16 +f + + [0-9a-f]+ +fp\+16 +c-16 +f + + [0-9a-f]+ +sp\+8 +c-16 +f + diff --git a/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.t b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.t new file mode 100644 index 00000000000..83c4d507281 --- /dev/null +++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.t @@ -0,0 +1,16 @@ +# sframe-gc-sections-2b.d checks the same behaviour as +# sframe-gc-sections-2a.d, but with a linker script that discards +# .eh_frame sections. This testcase is keep it ensured that the two +# section's GC behaviours are not unnecessarily inter-twined. + +ENTRY(_start) +SECTIONS +{ + . = SIZEOF_HEADERS; + .text : { *(.text) } + .sframe : { KEEP (*(.sframe)) } + /* Sections to be discarded */ + /DISCARD/ : { + *(.eh_frame) + } +} diff --git a/ld/testsuite/ld-x86-64/x86-64.exp b/ld/testsuite/ld-x86-64/x86-64.exp index 5608c42a0db..07607810d15 100644 --- a/ld/testsuite/ld-x86-64/x86-64.exp +++ b/ld/testsuite/ld-x86-64/x86-64.exp @@ -593,6 +593,9 @@ if { ![skip_sframe_tests] } { # Test --no-ld-generated-unwind-info run_dump_test "sframe-command-line-2" run_dump_test "sframe-reloc-1" + run_dump_test "sframe-gc-sections-1" + run_dump_test "sframe-gc-sections-2a" + run_dump_test "sframe-gc-sections-2b" run_dump_test "sframe-plt-1" run_dump_test "sframe-ibt-plt-1" run_dump_test "sframe-pltgot-1"