Author: Fangrui Song Date: 2022-04-05T22:38:20-07:00 New Revision: 353068233f21bd8b904da854072e85114c566562
URL: https://github.com/llvm/llvm-project/commit/353068233f21bd8b904da854072e85114c566562 DIFF: https://github.com/llvm/llvm-project/commit/353068233f21bd8b904da854072e85114c566562.diff LOG: [ELF] Fix llvm_unreachable failure when COMMON is placed in SHT_PROGBITS output section Fix a regression in aa27bab5a1a17e9c4168a741a6298ecaa92c1ecb: COMMON in an SHT_PROGBITS output section caused llvm_unreachable failure. (cherry picked from commit 1db59dc8e28819b1960dae8e7fe6d79ad4b03340) Added: Modified: lld/ELF/SyntheticSections.h lld/test/ELF/linkerscript/common.s Removed: ################################################################################ diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h index e609b3d7982a5..3161785988f64 100644 --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -187,9 +187,7 @@ class BuildIdSection : public SyntheticSection { class BssSection final : public SyntheticSection { public: BssSection(StringRef name, uint64_t size, uint32_t alignment); - void writeTo(uint8_t *) override { - llvm_unreachable("unexpected writeTo() call for SHT_NOBITS section"); - } + void writeTo(uint8_t *) override {} bool isNeeded() const override { return size != 0; } size_t getSize() const override { return size; } diff --git a/lld/test/ELF/linkerscript/common.s b/lld/test/ELF/linkerscript/common.s index 04b667f659128..69376011656f3 100644 --- a/lld/test/ELF/linkerscript/common.s +++ b/lld/test/ELF/linkerscript/common.s @@ -1,47 +1,44 @@ # REQUIRES: x86 -# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t -# RUN: echo "SECTIONS { . = SIZEOF_HEADERS; .common : { *(COMMON) } }" > %t.script -# RUN: ld.lld -o %t1 --script %t.script %t -# RUN: llvm-readobj -S --symbols %t1 | FileCheck %s - -# CHECK: Section { -# CHECK: Index: -# CHECK: Name: .common -# CHECK-NEXT: Type: SHT_NOBITS -# CHECK-NEXT: Flags [ -# CHECK-NEXT: SHF_ALLOC -# CHECK-NEXT: SHF_WRITE -# CHECK-NEXT: ] -# CHECK-NEXT: Address: 0x200 -# CHECK-NEXT: Offset: 0x -# CHECK-NEXT: Size: 384 -# CHECK-NEXT: Link: 0 -# CHECK-NEXT: Info: 0 -# CHECK-NEXT: AddressAlignment: 256 -# CHECK-NEXT: EntrySize: 0 -# CHECK-NEXT: } -# CHECK: Symbol { -# CHECK: Name: q1 -# CHECK-NEXT: Value: 0x200 -# CHECK-NEXT: Size: 128 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: Object -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .common -# CHECK-NEXT: } -# CHECK-NEXT: Symbol { -# CHECK-NEXT: Name: q2 -# CHECK-NEXT: Value: 0x300 -# CHECK-NEXT: Size: 128 -# CHECK-NEXT: Binding: Global -# CHECK-NEXT: Type: Object -# CHECK-NEXT: Other: 0 -# CHECK-NEXT: Section: .common -# CHECK-NEXT: } +## Test that COMMON matches common symbols. +# RUN: rm -rf %t && split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %t/a.s -o %t/a.o +# RUN: ld.lld -T %t/1.t %t/a.o -o %t/a1 +# RUN: llvm-readelf -S -s %t/a1 | FileCheck %s --check-prefix=CHECK1 +# RUN: ld.lld -T %t/2.t %t/a.o -o %t/a2 +# RUN: llvm-readelf -S -s %t/a2 | FileCheck %s --check-prefix=CHECK2 + +# CHECK1: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# CHECK1-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0 +# CHECK1-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000005 00 AX 0 0 4 +# CHECK1-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000001 00 WA 0 0 1 +# CHECK1-NEXT: [ 3] .common NOBITS [[#%x,]] [[#%x,]] 000180 00 WA 0 0 256 +# CHECK1: Value Size Type Bind Vis Ndx Name +# CHECK1-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q1 +# CHECK1-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q2 + +# CHECK2: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# CHECK2-NEXT: [ 0] NULL [[#%x,]] [[#%x,]] 000000 00 0 0 0 +# CHECK2-NEXT: [ 1] .text PROGBITS [[#%x,]] [[#%x,]] 000005 00 AX 0 0 4 +# CHECK2-NEXT: [ 2] .data PROGBITS [[#%x,]] [[#%x,]] 000180 00 WA 0 0 256 +# CHECK2: Value Size Type Bind Vis Ndx Name +# CHECK2-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q1 +# CHECK2-DAG: [[#%x,]] 128 OBJECT GLOBAL DEFAULT [[#]] q2 + +#--- a.s .globl _start _start: jmp _start +.section .data,"aw",@progbits +.byte 0 + .comm q1,128,8 .comm q2,128,256 + +#--- 1.t +SECTIONS { . = SIZEOF_HEADERS; .common : { *(COMMON) } } + +#--- 2.t +## COMMON can be placed in a SHT_PROGBITS section. +SECTIONS { . = SIZEOF_HEADERS; .data : { *(.data) *(COMMON) } } _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
