[lld] r356428 - [ELF] Allow sh_entsize to be unrelated to sh_addralign and not a power of 2

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 18 16:49:18 PDT 2019


Author: maskray
Date: Mon Mar 18 16:49:18 2019
New Revision: 356428

URL: http://llvm.org/viewvc/llvm-project?rev=356428&view=rev
Log:
[ELF] Allow sh_entsize to be unrelated to sh_addralign and not a power of 2

Summary:
This implements Rui Ueyama's idea in PR39044.
I've checked that ld.bfd and gold do not have the power-of-2 requirement
and do not require sh_entsize to be a multiple of sh_align.

Now on the updated test merge-entsize.s, all the 3 linkers happily
create .rodata that is not 3-byte aligned.

This has a use case in Linux arch/x86/crypto/sha512-avx2-asm.S
It uses sh_entsize of 640, which is not a power of 2.
See https://github.com/ClangBuiltLinux/linux/issues/417

Reviewers: ruiu, espindola

Reviewed By: ruiu

Subscribers: nickdesaulniers, E5ten, emaste, arichardson, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D59478

Modified:
    lld/trunk/ELF/SyntheticSections.cpp
    lld/trunk/test/ELF/icf-merged-sections.s
    lld/trunk/test/ELF/merge-entsize.s
    lld/trunk/test/ELF/merge-gc-piece.s
    lld/trunk/test/ELF/merge-reloc-O0.s
    lld/trunk/test/ELF/merge-sym.s

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Mon Mar 18 16:49:18 2019
@@ -3016,7 +3016,6 @@ void elf::mergeSections() {
     }
 
     StringRef OutsecName = getOutputSectionName(MS);
-    uint32_t Alignment = std::max<uint32_t>(MS->Alignment, MS->Entsize);
 
     auto I = llvm::find_if(MergeSections, [=](MergeSyntheticSection *Sec) {
       // While we could create a single synthetic section for two different
@@ -3028,11 +3027,11 @@ 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->Alignment == Alignment;
+             Sec->Entsize == MS->Entsize && Sec->Alignment == MS->Alignment;
     });
     if (I == MergeSections.end()) {
       MergeSyntheticSection *Syn =
-          createMergeSynthetic(OutsecName, MS->Type, MS->Flags, Alignment);
+          createMergeSynthetic(OutsecName, MS->Type, MS->Flags, MS->Alignment);
       MergeSections.push_back(Syn);
       I = std::prev(MergeSections.end());
       S = Syn;

Modified: lld/trunk/test/ELF/icf-merged-sections.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/icf-merged-sections.s?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/test/ELF/icf-merged-sections.s (original)
+++ lld/trunk/test/ELF/icf-merged-sections.s Mon Mar 18 16:49:18 2019
@@ -19,7 +19,7 @@
 # CHECK-NEXT: Size: 16
 # CHECK-NEXT: Link:
 # CHECK-NEXT: Info:
-# CHECK-NEXT: AddressAlignment: 8
+# CHECK-NEXT: AddressAlignment: 1
 # CHECK-NEXT: EntrySize: 0
 # CHECK-NEXT: SectionData (
 # CHECK-NEXT:   0000: 67452301 10325476 67452301 10325476

Modified: lld/trunk/test/ELF/merge-entsize.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-entsize.s?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/test/ELF/merge-entsize.s (original)
+++ lld/trunk/test/ELF/merge-entsize.s Mon Mar 18 16:49:18 2019
@@ -4,10 +4,15 @@
 // RUN: llvm-readobj -s %t | FileCheck %s
 
         .section  .rodata.1,"aM", at progbits,1
+        .p2align 2
         .byte 0x42
 
-        .section  .rodata.2,"aM", at progbits,2
+// sh_addralign = 4 while sh_entsize = 3.
+// sh_entsize is not necessarily a power of 2 and it can be unrelated to sh_addralign.
+        .section  .rodata.2,"aM", at progbits,3
+        .p2align 2
         .short 0x42
+        .byte 0
 
 // Since the output section has both .rodata.1 and .rodata.2, it
 // contains elements of different sizes and we use an entsize of 0.
@@ -23,5 +28,5 @@
 // CHECK-NEXT: Size:
 // CHECK-NEXT: Link:
 // CHECK-NEXT: Info:
-// CHECK-NEXT: AddressAlignment:
+// CHECK-NEXT: AddressAlignment: 4
 // CHECK-NEXT: EntrySize: 0

Modified: lld/trunk/test/ELF/merge-gc-piece.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-gc-piece.s?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/test/ELF/merge-gc-piece.s (original)
+++ lld/trunk/test/ELF/merge-gc-piece.s Mon Mar 18 16:49:18 2019
@@ -10,7 +10,7 @@
 # CHECK-NEXT:   SHF_ALLOC
 # CHECK-NEXT:   SHF_MERGE
 # CHECK-NEXT: ]
-# CHECK-NEXT: Address: 0x200
+# CHECK-NEXT: Address: 0x1FD
 
 # CHECK:      Name: .bar
 # CHECK-NEXT: Type: SHT_PROGBITS
@@ -24,7 +24,7 @@
 # CHECK-NEXT: AddressAlignment:
 # CHECK-NEXT: EntrySize:
 # CHECK-NEXT: SectionData (
-# CHECK-NEXT:   0000: 01020000 00000000 02020000 00000000
+# CHECK-NEXT:   0000: FE010000 00000000 FF010000 00000000
 # CHECK-NEXT: )
 
         .section .foo,"aM", at progbits,8

Modified: lld/trunk/test/ELF/merge-reloc-O0.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-reloc-O0.s?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/test/ELF/merge-reloc-O0.s (original)
+++ lld/trunk/test/ELF/merge-reloc-O0.s Mon Mar 18 16:49:18 2019
@@ -16,7 +16,7 @@
 # CHECK-NEXT: Size: 16
 # CHECK-NEXT: Link:
 # CHECK-NEXT: Info:
-# CHECK-NEXT: AddressAlignment: 8
+# CHECK-NEXT: AddressAlignment: 1
 # CHECK-NEXT: EntrySize: 8
 # CHECK-NEXT: SectionData (
 # CHECK-NEXT:   0000: 41000000 00000000 42000000 00000000
@@ -33,7 +33,7 @@
 # CHECK-NEXT: Size: 8
 # CHECK-NEXT: Link:
 # CHECK-NEXT: Info:
-# CHECK-NEXT: AddressAlignment: 4
+# CHECK-NEXT: AddressAlignment: 1
 # CHECK-NEXT: EntrySize: 4
 # CHECK-NEXT: SectionData (
 # CHECK-NEXT:   0000: 41000000 42000000

Modified: lld/trunk/test/ELF/merge-sym.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/merge-sym.s?rev=356428&r1=356427&r2=356428&view=diff
==============================================================================
--- lld/trunk/test/ELF/merge-sym.s (original)
+++ lld/trunk/test/ELF/merge-sym.s Mon Mar 18 16:49:18 2019
@@ -15,7 +15,7 @@ foo:
 // CHECK-NEXT:   SHF_ALLOC
 // CHECK-NEXT:   SHF_MERGE
 // CHECK-NEXT: ]
-// CHECK-NEXT: Address: 0x210
+// CHECK-NEXT: Address: 0x20D
 
 // CHECK:      Name: foo
-// CHECK-NEXT: Value: 0x212
+// CHECK-NEXT: Value: 0x20F




More information about the llvm-commits mailing list