Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] Fix llvm_unreachable failure when COMMON is placed in SHT_PROGB…
…ITS output section Fix a regression in aa27bab: COMMON in an SHT_PROGBITS output section caused llvm_unreachable failure.
- Loading branch information
Showing
2 changed files
with
37 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) } } |