forked from OSchip/llvm-project
[ELF] Allow placing SHF_MERGE sections with different alignments into the same MergeSyntheticSection
This should fix PR42289: the Linux kernel has a use case that input files have .rodata.cst32 sections with different alignments. The expectation (and what ld.bfd and gold do) is that in the -r link, there is only one .rodata.cst32 (SHF_MERGE sections with different alignments can be combined), but lld currently creates one for each different alignment. The current merging strategy: 1) Group SHF_MERGE sections by (name, sh_flags, sh_entsize and sh_addralign). String merging is performed among a group, even if -O0 is specified. 2) Create one output section for each group. This is a special case in addInputSec(). This patch changes 1) to: 1) Group SHF_MERGE sections by (name, sh_flags, sh_entsize). String merging is performed among a group, even if -O0 is specified. We will thus create just one .rodata.cst32 . This also improves merging efficiency when sections with the same name but different alignments are combined. Reviewed By: ruiu Differential Revision: https://reviews.llvm.org/D63432 llvm-svn: 365015
This commit is contained in:
parent
830b20344b
commit
347692e2de
|
@ -2919,6 +2919,7 @@ template <class ELFT> bool VersionNeedSection<ELFT>::isNeeded() const {
|
|||
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 @@ 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 == MS->Alignment;
|
||||
Sec->Entsize == MS->Entsize;
|
||||
});
|
||||
if (I == MergeSections.end()) {
|
||||
MergeSyntheticSection *Syn =
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
# 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",@progbits,8,unique,0
|
||||
.align 4
|
||||
.quad 1
|
||||
.quad 1
|
||||
|
||||
.section .cst8,"aM",@progbits,8,unique,1
|
||||
.align 4
|
||||
.quad 1
|
||||
.quad 2
|
||||
|
||||
.section .cst8,"aM",@progbits,8,unique,2
|
||||
.align 8
|
||||
.quad 1
|
||||
.quad 3
|
|
@ -0,0 +1,49 @@
|
|||
# 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",@progbits,4,unique,0
|
||||
.align 2
|
||||
.long 1
|
||||
.long 0
|
||||
.long 2
|
||||
|
||||
.section .cst,"aM",@progbits,4,unique,1
|
||||
.align 4
|
||||
.long 1
|
||||
.long 0
|
||||
.long 2
|
||||
|
||||
.section .cst,"aM",@progbits,8,unique,2
|
||||
.align 8
|
||||
.quad 1
|
||||
.quad 3
|
|
@ -1,48 +0,0 @@
|
|||
# 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",@progbits,8,unique,0
|
||||
.quad 0x41
|
||||
.section .foo, "aM",@progbits,8,unique,1
|
||||
.quad 0x42
|
||||
.section .foo, "aM",@progbits,4,unique,2
|
||||
.long 0x41
|
||||
.long 0x42
|
Loading…
Reference in New Issue