[lld] [lld][ELF] Coalesce uniqued .sbss and .sdata sections (PR #104485)
Sam Elliott via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 15 12:28:52 PDT 2024
https://github.com/lenary created https://github.com/llvm/llvm-project/pull/104485
RISC-V GCC with `-fdata-sections` will emit `.sbss.<name>` and `.sdata.<name>` sections for small data items. We intend to add the same behaviour to Clang/LLVM in #87040.
This change ensures that any section starting `.sbss` is put in an output section called `.sbss`, and the same for `.sdata`, so that the RISC-V specific code for allocating an output order for `.sbss` and `.sdata` sections can apply.
I did not add a `.sdata.rel.ro` prefix to the list as clang/llvm does not seem to create these at all. Whether it should be or not is a different matter.
---
@topperc I think this is the only change needed, because with this change the code in Writer.cpp will only have to deal with output sections named `.sbss` or `.sdata`, rather than also sections prefixed with those.
>From 9a4b18a3dfca787daef141ca51498cc3b2b04562 Mon Sep 17 00:00:00 2001
From: Sam Elliott <quic_aelliott at quicinc.com>
Date: Thu, 15 Aug 2024 12:11:20 -0700
Subject: [PATCH] [lld][ELF] Coalesce uniqued .sbss and .sdata sections
RISC-V GCC with `-fdata-sections` will emit `.sbss.<name>` and
`.sdata.<name>` sections for small data items. We intend to add the same
behaviour to Clang/LLVM in #87040.
This change ensures that any section starting `.sbss` is put in an
output section called `.sbss`, and the same for `.sdata`, so that the
RISC-V specific code for allocating an output order for `.sbss` and
`.sdata` sections can apply.
I did not add a `.sdata.rel.ro` prefix to the list as clang/llvm does
not seem to create these at all. Whether it should be or not is a
different matter.
---
lld/ELF/LinkerScript.cpp | 3 ++-
lld/test/ELF/riscv-section-layout.s | 2 ++
lld/test/ELF/section-name.s | 9 ++++++++-
3 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 0c4ba1abb4778c..5335a747d19417 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -109,7 +109,8 @@ static StringRef getOutputSectionName(const InputSectionBase *s) {
for (StringRef v :
{".data.rel.ro", ".data", ".rodata", ".bss.rel.ro", ".bss", ".ldata",
".lrodata", ".lbss", ".gcc_except_table", ".init_array", ".fini_array",
- ".tbss", ".tdata", ".ARM.exidx", ".ARM.extab", ".ctors", ".dtors"})
+ ".tbss", ".tdata", ".ARM.exidx", ".ARM.extab", ".ctors", ".dtors",
+ ".sbss", ".sdata"})
if (isSectionPrefix(v, s->name))
return v;
diff --git a/lld/test/ELF/riscv-section-layout.s b/lld/test/ELF/riscv-section-layout.s
index 10e0febf7c4260..ef71370addd7ec 100644
--- a/lld/test/ELF/riscv-section-layout.s
+++ b/lld/test/ELF/riscv-section-layout.s
@@ -57,5 +57,7 @@
.section .tbss,"awT", at nobits; .space 1
.ifdef SDATA
.section .sdata,"aw", at progbits; .space 1
+.section .sdata.suffix,"aw", at progbits; .space 1
.section .sbss,"aw", at nobits; .space 1
+.section .sbss.suffix,"aw", at nobits; .space 1
.endif
diff --git a/lld/test/ELF/section-name.s b/lld/test/ELF/section-name.s
index 819cd9c14d9500..8df30e609b2b80 100644
--- a/lld/test/ELF/section-name.s
+++ b/lld/test/ELF/section-name.s
@@ -41,6 +41,11 @@ _start:
.byte 0
.section .tdata.foo,"aGwT", at progbits,foo,comdat
.byte 0
+.section .sdata.foo,"aw"
+.byte 0
+.section .sbss.foo,"aw", at nobits
+.byte 0
+
// CHECK: .rodata 00000002
// CHECK-NEXT: .gcc_except_table 00000001
@@ -52,8 +57,10 @@ _start:
// CHECK-NEXT: .data 00000002
// CHECK-NEXT: .foo.a 00000001
// CHECK-NEXT: .foo 00000001
+// CHECK-NEXT: .sdata 00000001
// CHECK-NEXT: .bss 00000002
+// CHECK-NEXT: .sbss 00000001
// CHECK-NEXT: .comment 00000008
// CHECK-NEXT: .symtab 00000030
-// CHECK-NEXT: .shstrtab 00000084
+// CHECK-NEXT: .shstrtab 00000091
// CHECK-NEXT: .strtab 00000008
More information about the llvm-commits
mailing list