From 3f0b575363213ba350dd35c53b3f47b0135c18f3 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 15 Nov 2017 17:31:27 +0000 Subject: [PATCH] Remove an unnecessary constraint. Our current implementation of SHF_MERGE can already handle over aligned elements. llvm-svn: 318310 --- lld/ELF/InputFiles.cpp | 11 +---------- lld/test/ELF/merge-align.s | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 lld/test/ELF/merge-align.s diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index e2717c206fbd..1a5a09c8cddf 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -319,16 +319,7 @@ template bool ObjFile::shouldMerge(const Elf_Shdr &Sec) { if (Flags & SHF_WRITE) fatal(toString(this) + ": writable SHF_MERGE section is not supported"); - // Don't try to merge if the alignment is larger than the sh_entsize and this - // is not SHF_STRINGS. - // - // Since this is not a SHF_STRINGS, we would need to pad after every entity. - // It would be equivalent for the producer of the .o to just set a larger - // sh_entsize. - if (Flags & SHF_STRINGS) - return true; - - return Sec.sh_addralign <= EntSize; + return true; } template diff --git a/lld/test/ELF/merge-align.s b/lld/test/ELF/merge-align.s new file mode 100644 index 000000000000..dea2fc2086e4 --- /dev/null +++ b/lld/test/ELF/merge-align.s @@ -0,0 +1,34 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +// RUN: ld.lld %t.o -o %t.so -shared +// RUN: llvm-readobj -s -section-data %t.so | FileCheck %s + + .section .rodata.foo,"aM",@progbits,1 + .align 16 + .byte 0x42 + + .section .rodata.bar,"aM",@progbits,1 + .align 16 + .byte 0x42 + + .section .rodata.zed,"aM",@progbits,1 + .align 16 + .byte 0x41 + +// CHECK: Name: .rodata ( +// 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: 17 +// CHECK-NEXT: Link: 0 +// CHECK-NEXT: Info: 0 +// CHECK-NEXT: AddressAlignment: 16 +// CHECK-NEXT: EntrySize: 1 +// CHECK-NEXT: SectionData ( +// CHECK-NEXT: 0000: 42000000 00000000 00000000 00000000 | +// CHECK-NEXT: 0010: 41 | +// CHECK-NEXT: )