[lld] r365048 - Revert D63432 "[ELF] Allow placing SHF_MERGE sections with different alignments into the same MergeSyntheticSection"

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 3 08:26:54 PDT 2019


Author: maskray
Date: Wed Jul  3 08:26:54 2019
New Revision: 365048

URL: http://llvm.org/viewvc/llvm-project?rev=365048&view=rev
Log:
Revert D63432 "[ELF] Allow placing SHF_MERGE sections with different alignments into the same MergeSyntheticSection"

This reverts r365015.

David Zarzycki reported this change broke stage2 and stage3 tests.  The
root cause is still not very clear, but I guess some SHF_MERGE sections
with the same name have different alignments. They were not merged
before but were merged after r365015.

Something that assumes address uniqueness of such mergeable data caused
the bug.

Added:
    lld/trunk/test/ELF/merge-reloc-O0.s
Removed:
    lld/trunk/test/ELF/merge-align2.s
    lld/trunk/test/ELF/merge-entsize2.s
Modified:
    lld/trunk/ELF/SyntheticSections.cpp

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=365048&r1=365047&r2=365048&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Wed Jul  3 08:26:54 2019
@@ -2919,7 +2919,6 @@ template <class ELFT> bool VersionNeedSe
 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,
@@ -3064,7 +3063,7 @@ void elf::mergeSections() {
       // 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->Entsize == MS->Entsize && Sec->Alignment == MS->Alignment;
     });
     if (I == MergeSections.end()) {
       MergeSyntheticSection *Syn =

Removed: lld/trunk/test/ELF/merge-align2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-align2.s?rev=365047&view=auto
==============================================================================
--- lld/trunk/test/ELF/merge-align2.s (original)
+++ lld/trunk/test/ELF/merge-align2.s (removed)
@@ -1,35 +0,0 @@
-# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
-
-# RUN: ld.lld %t.o -o %t
-# RUN: llvm-readelf -S %t | FileCheck --check-prefix=SEC %s
-# RUN: llvm-readelf -x .cst8 %t | FileCheck %s
-
-# RUN: ld.lld -O0 -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 SHF_MERGE sections with the same name, flags and
-## entsize, but different alignments, we combine them with the maximum 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:      0x{{[0-9a-f]+}} 02000000 00000000 01000000 00000000
-# CHECK-NEXT: 0x{{[0-9a-f]+}} 03000000 00000000
-
-.section .cst8,"aM", at progbits,8,unique,0
-.align 4
-.quad 1
-.quad 1
-
-.section .cst8,"aM", at progbits,8,unique,1
-.align 4
-.quad 1
-.quad 2
-
-.section .cst8,"aM", at progbits,8,unique,2
-.align 8
-.quad 1
-.quad 3

Removed: lld/trunk/test/ELF/merge-entsize2.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-entsize2.s?rev=365047&view=auto
==============================================================================
--- lld/trunk/test/ELF/merge-entsize2.s (original)
+++ lld/trunk/test/ELF/merge-entsize2.s (removed)
@@ -1,49 +0,0 @@
-# REQUIRES: x86
-# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
-
-# RUN: ld.lld %t.o -o %t
-# RUN: llvm-readelf -S %t | FileCheck --check-prefix=SEC %s
-# RUN: llvm-readelf -x .cst %t | FileCheck --check-prefix=HEX %s
-
-# RUN: ld.lld -O0 -r %t.o -o %t1.o
-# RUN: llvm-readelf -S %t1.o | FileCheck --check-prefix=SEC-R %s
-# RUN: llvm-readelf -x .cst %t1.o | FileCheck --check-prefix=HEX-R %s
-
-## Check that SHF_MERGE sections with the same name, sh_flags and sh_entsize
-## are grouped together and can be merged within the group.
-
-## .cst 0 and .cst 1 are merged (sh_entsize=4). The result and .cst 2 and
-## combined (sh_entsize=8). The output sh_entsize is 0.
-# SEC:   Name  Type     {{.*}} Size   ES Flg Lk Inf Al
-# SEC:   .cst  PROGBITS {{.*}} 000020 00  AM  0   0  8
-
-## .cst 0 and .cst 1 are merged, but emitted as a separate output section.
-# SEC-R: .cst  PROGBITS {{.*}} 00000c 04  AM  0   0  4
-# SEC-R: .cst  PROGBITS {{.*}} 000010 08  AM  0   0  8
-
-# HEX:      Hex dump of section '.cst':
-# HEX-NEXT: 0x{{[0-9a-f]+}} 01000000 00000000 02000000 00000000
-# HEX-NEXT: 0x{{[0-9a-f]+}} 01000000 00000000 03000000 00000000
-
-# HEX-R:      Hex dump of section '.cst':
-# HEX-R-NEXT: 0x00000000 01000000 00000000 02000000
-# HEX-R-EMPTY:
-# HEX-R-NEXT: Hex dump of section '.cst':
-# HEX-R-NEXT: 0x00000000 01000000 00000000 03000000 00000000
-
-.section .cst,"aM", at progbits,4,unique,0
-.align 2
-.long 1
-.long 0
-.long 2
-
-.section .cst,"aM", at progbits,4,unique,1
-.align 4
-.long 1
-.long 0
-.long 2
-
-.section .cst,"aM", at progbits,8,unique,2
-.align 8
-.quad 1
-.quad 3

Added: lld/trunk/test/ELF/merge-reloc-O0.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-reloc-O0.s?rev=365048&view=auto
==============================================================================
--- lld/trunk/test/ELF/merge-reloc-O0.s (added)
+++ lld/trunk/test/ELF/merge-reloc-O0.s Wed Jul  3 08:26:54 2019
@@ -0,0 +1,48 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: ld.lld %t.o -r -o %t2.o -O0
+# RUN: llvm-readobj -S --section-data %t2.o | FileCheck %s
+
+# We combine just the sections with the same name and sh_entsize.
+
+# CHECK:      Name: .foo
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_MERGE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 16
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info:
+# CHECK-NEXT: AddressAlignment: 1
+# CHECK-NEXT: EntrySize: 8
+# CHECK-NEXT: SectionData (
+# CHECK-NEXT:   0000: 41000000 00000000 42000000 00000000
+# CHECK-NEXT: )
+
+# CHECK:      Name: .foo
+# CHECK-NEXT: Type: SHT_PROGBITS
+# CHECK-NEXT: Flags [
+# CHECK-NEXT:   SHF_ALLOC
+# CHECK-NEXT:   SHF_MERGE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info:
+# CHECK-NEXT: AddressAlignment: 1
+# CHECK-NEXT: EntrySize: 4
+# CHECK-NEXT: SectionData (
+# CHECK-NEXT:   0000: 41000000 42000000
+# CHECK-NEXT: )
+
+        .section .foo, "aM", at progbits,8,unique,0
+        .quad 0x41
+        .section .foo, "aM", at progbits,8,unique,1
+        .quad 0x42
+        .section .foo, "aM", at progbits,4,unique,2
+        .long 0x41
+        .long 0x42




More information about the llvm-commits mailing list