[PATCH 1/3] sframe: Add tests for PR ld/32769
claudiu.zissulescu-ianculescu@oracle.com
claudiu.zissulescu-ianculescu@oracle.com
Mon Jan 12 10:53:27 GMT 2026
From: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Add a simple tests which tests if sframe section is removed or not
while performing garbage collection durring 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.
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-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 <indu.bhagat@oracle.com>
Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
---
ld/testsuite/ld-sframe/pr32769-2.d | 9 ++++
ld/testsuite/ld-sframe/pr32769-2.s | 19 +++++++
ld/testsuite/ld-sframe/pr32769-3.d | 10 ++++
ld/testsuite/ld-sframe/pr32769-3.s | 21 ++++++++
ld/testsuite/ld-sframe/pr32769.rd | 16 ++++++
ld/testsuite/ld-sframe/pr32769.s | 8 +++
ld/testsuite/ld-sframe/sframe.exp | 9 ++++
ld/testsuite/ld-x86-64/sframe-baz.s | 36 +++++++++++++
ld/testsuite/ld-x86-64/sframe-gc-sections-1.d | 50 +++++++++++++++++++
ld/testsuite/ld-x86-64/sframe-gc-sections-2.s | 35 +++++++++++++
.../ld-x86-64/sframe-gc-sections-2a.d | 29 +++++++++++
.../ld-x86-64/sframe-gc-sections-2b.d | 30 +++++++++++
.../ld-x86-64/sframe-gc-sections-2b.t | 11 ++++
ld/testsuite/ld-x86-64/x86-64.exp | 3 ++
14 files changed, 286 insertions(+)
create mode 100644 ld/testsuite/ld-sframe/pr32769-2.d
create mode 100644 ld/testsuite/ld-sframe/pr32769-2.s
create mode 100644 ld/testsuite/ld-sframe/pr32769-3.d
create mode 100644 ld/testsuite/ld-sframe/pr32769-3.s
create mode 100644 ld/testsuite/ld-sframe/pr32769.rd
create mode 100644 ld/testsuite/ld-sframe/pr32769.s
create mode 100644 ld/testsuite/ld-x86-64/sframe-baz.s
create mode 100644 ld/testsuite/ld-x86-64/sframe-gc-sections-1.d
create mode 100644 ld/testsuite/ld-x86-64/sframe-gc-sections-2.s
create mode 100644 ld/testsuite/ld-x86-64/sframe-gc-sections-2a.d
create mode 100644 ld/testsuite/ld-x86-64/sframe-gc-sections-2b.d
create mode 100644 ld/testsuite/ld-x86-64/sframe-gc-sections-2b.t
diff --git a/ld/testsuite/ld-sframe/pr32769-2.d b/ld/testsuite/ld-sframe/pr32769-2.d
new file mode 100644
index 00000000000..f0708f5c283
--- /dev/null
+++ b/ld/testsuite/ld-sframe/pr32769-2.d
@@ -0,0 +1,9 @@
+#as: --gsframe
+#source: pr32769-2.s
+#readelf: --sframe
+#ld: --gc-section -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-3.d b/ld/testsuite/ld-sframe/pr32769-3.d
new file mode 100644
index 00000000000..0c33f95fed8
--- /dev/null
+++ b/ld/testsuite/ld-sframe/pr32769-3.d
@@ -0,0 +1,10 @@
+#as: --gsframe
+#source: pr32769-3.s
+#readelf: --sframe
+#ld: --gc-section -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..e70a6e749ce
--- /dev/null
+++ b/ld/testsuite/ld-sframe/pr32769.rd
@@ -0,0 +1,16 @@
+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: 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]+ sp\+8 u f\s+
+#pass
\ No newline at end of file
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 ab386d7ca65..717ff660bb5 100644
--- a/ld/testsuite/ld-sframe/sframe.exp
+++ b/ld/testsuite/ld-sframe/sframe.exp
@@ -106,6 +106,15 @@ if { [check_compiler_available] } {
]
}
+set sframe_link_tests {
+ { "pr32769"
+ "--gc-section -e foo" "" "--gsframe" {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..b0142ac6b43
--- /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 6, -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..06a882c7fe1
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-1.d
@@ -0,0 +1,50 @@
+#as: --gsframe
+#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_2
+ 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..9b5e7d9dbd7
--- /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 6, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register 6
+ leave
+ .cfi_def_cfa 7, 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..9ca71adc8d2
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2a.d
@@ -0,0 +1,29 @@
+#as: --gsframe
+#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_2
+#...
+ 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..4e5c3583f94
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.d
@@ -0,0 +1,30 @@
+#as: --gsframe
+#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_2
+ 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..ae6b8cb46b9
--- /dev/null
+++ b/ld/testsuite/ld-x86-64/sframe-gc-sections-2b.t
@@ -0,0 +1,11 @@
+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 f80f718c15b..573369960e6 100644
--- a/ld/testsuite/ld-x86-64/x86-64.exp
+++ b/ld/testsuite/ld-x86-64/x86-64.exp
@@ -588,6 +588,9 @@ run_dump_test "tls-le-pic-3-x32"
if { ![skip_sframe_tests] } {
run_dump_test "sframe-simple-1"
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"
--
2.52.0
More information about the Binutils
mailing list