[PATCH] D63432: [ELF] Allow placing SHF_MERGE sections with different alignments into the same MergeSyntheticSection
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 08:08:03 PDT 2019
MaskRay created this revision.
MaskRay added reviewers: nickdesaulniers, peter.smith, ruiu.
Herald added subscribers: llvm-commits, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.
This should fix PR42289: the Linux kernel has a use case that input
files have .rodata.cst32 with different alignments. The expectation (and
what ld.bfd and gold do) is that in the -r link, one single
.rodata.cst32 is created, but we currently create two.
Delete the alignment comparison to allow this.
Repository:
rLLD LLVM Linker
https://reviews.llvm.org/D63432
Files:
ELF/SyntheticSections.cpp
test/ELF/merge-align2.s
Index: test/ELF/merge-align2.s
===================================================================
--- /dev/null
+++ test/ELF/merge-align2.s
@@ -0,0 +1,25 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t1.o
+# RUN: llvm-readelf -S %t1.o | FileCheck --check-prefix=SEC %s
+# RUN: llvm-readelf -x .cst8 %t1.o | FileCheck %s
+
+## Check that if we have two SHF_MERGE sections with the same name, flags and
+## entsize, but different alignments, we create one single synthetic section,
+## with the larger input alignment as the output alignment.
+
+# SEC: Name Type {{.*}} Size ES Flg Lk Inf Al
+# SEC: .cst8 PROGBITS {{.*}} 000018 08 AM 0 0 8
+
+# CHECK: 0x00000000 02000000 00000000 01000000 00000000
+# CHECK-NEXT: 0x00000010 03000000 00000000
+
+.section .cst8,"aM", at progbits,8,unique,0
+.align 4
+.quad 1
+.quad 2
+
+.section .cst8,"aM", at progbits,8,unique,1
+.align 8
+.quad 1
+.quad 3
Index: ELF/SyntheticSections.cpp
===================================================================
--- ELF/SyntheticSections.cpp
+++ ELF/SyntheticSections.cpp
@@ -2919,6 +2919,7 @@
void MergeSyntheticSection::addSection(MergeInputSection *MS) {
MS->Parent = this;
Sections.push_back(MS);
+ Alignment = std::max(Alignment, MS->Alignment);
}
MergeTailSection::MergeTailSection(StringRef Name, uint32_t Type,
@@ -3063,7 +3064,7 @@
// Using Entsize in here also allows us to propagate it to the synthetic
// section.
return Sec->Name == OutsecName && Sec->Flags == MS->Flags &&
- Sec->Entsize == MS->Entsize && Sec->Alignment == MS->Alignment;
+ Sec->Entsize == MS->Entsize;
});
if (I == MergeSections.end()) {
MergeSyntheticSection *Syn =
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63432.205076.patch
Type: text/x-patch
Size: 1773 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190617/59469216/attachment.bin>
More information about the llvm-commits
mailing list