[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