diff options
| author | Fangrui Song <maskray@google.com> | 2019-09-24 11:48:31 +0000 |
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2019-09-24 11:48:31 +0000 |
| commit | e47bbd28f8e9dfea4e019e27e9d371c144c3302e (patch) | |
| tree | 799459668b1b23aa9f3691564487958ff364ac0c /lld/test/ELF/linkerscript | |
| parent | 06cdcb5f68b923c7e6e632edd91f49e4f9dd653e (diff) | |
| download | bcm5719-llvm-e47bbd28f8e9dfea4e019e27e9d371c144c3302e.tar.gz bcm5719-llvm-e47bbd28f8e9dfea4e019e27e9d371c144c3302e.zip | |
[ELF] Make MergeInputSection merging aware of output sections
Fixes PR38748
mergeSections() calls getOutputSectionName() to get output section
names. Two MergeInputSections may be merged even if they are made
different by SECTIONS commands.
This patch moves mergeSections() after processSectionCommands() and
addOrphanSections() to fix the issue. The new pass is renamed to
OutputSection::finalizeInputSections().
processSectionCommands() and addorphanSections() are changed to add
sections to InputSectionDescription::sectionBases.
finalizeInputSections() merges MergeInputSections and migrates
`sectionBases` to `sections`.
For the -r case, we drop an optimization that tries keeping sh_entsize
non-zero. This is for the simplicity of addOrphanSections(). The
updated merge-entsize2.s reflects the change.
Reviewed By: grimar
Differential Revision: https://reviews.llvm.org/D67504
llvm-svn: 372734
Diffstat (limited to 'lld/test/ELF/linkerscript')
| -rw-r--r-- | lld/test/ELF/linkerscript/merge-output-sections.s | 35 | ||||
| -rw-r--r-- | lld/test/ELF/linkerscript/merge-sections.s | 4 |
2 files changed, 37 insertions, 2 deletions
diff --git a/lld/test/ELF/linkerscript/merge-output-sections.s b/lld/test/ELF/linkerscript/merge-output-sections.s new file mode 100644 index 00000000000..b15596f84cf --- /dev/null +++ b/lld/test/ELF/linkerscript/merge-output-sections.s @@ -0,0 +1,35 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o + +## SHF_MERGE sections within the same output section can be freely merged. +# RUN: echo 'SECTIONS { .rodata : { *(.rodata.*) }}' > %t.script +# RUN: ld.lld %t.o -T %t.script -o %t +# RUN: llvm-readelf -x .rodata %t | FileCheck --check-prefix=SAME %s --implicit-check-not=section + +# SAME: section '.rodata': +# SAME-NEXT: 0x00000000 01000200 0300 + +## SHF_MERGE sections with different output sections cannot be merged. +# RUN: echo 'SECTIONS { \ +# RUN: .rodata.foo : { *(.rodata.foo) } \ +# RUN: .rodata.bar : { *(.rodata.bar) } \ +# RUN: }' > %t2.script +# RUN: ld.lld %t.o -T %t2.script -o %t2 +# RUN: llvm-readelf -x .rodata.foo -x .rodata.bar %t2 | FileCheck --check-prefix=DIFF %s --implicit-check-not=section + +# DIFF: section '.rodata.foo': +# DIFF-NEXT: 0x00000000 01000200 0300 +# DIFF: section '.rodata.bar': +# DIFF-NEXT: 0x00000006 0100 + +.section .rodata.foo,"aM",@progbits,2,unique,0 +.short 1 +.short 2 +.section .rodata.foo,"aM",@progbits,2,unique,1 +.short 1 +.short 3 + +.section .rodata.bar,"aM",@progbits,2,unique,0 +.short 1 +.section .rodata.bar,"aM",@progbits,2,unique,1 +.short 1 diff --git a/lld/test/ELF/linkerscript/merge-sections.s b/lld/test/ELF/linkerscript/merge-sections.s index b9ebfe79714..ea53ba3e420 100644 --- a/lld/test/ELF/linkerscript/merge-sections.s +++ b/lld/test/ELF/linkerscript/merge-sections.s @@ -17,7 +17,7 @@ # CHECK-NEXT: ] # CHECK-NEXT: Address: 0x[[ADDR1:.*]] # CHECK-NEXT: Offset: 0x[[ADDR1]] -# CHECK-NEXT: Size: 14 +# CHECK-NEXT: Size: 8 # CHECK-NEXT: Link: 0 # CHECK-NEXT: Info: 0 # CHECK-NEXT: AddressAlignment: 2 @@ -28,7 +28,7 @@ # CHECK-NEXT: Value: 0x[[ADDR1]] # CHECK: Name: end -# CHECK-NEXT: Value: 0x236 +# CHECK-NEXT: Value: 0x230 # Check that we don't crash with --gc-sections # RUN: ld.lld --gc-sections -o %t2 --script %t.script %t -shared |

