[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