mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
9599f4edb3
Introduce an extension to support passing linker options to the linker. These would be ignored by older linkers, but newer linkers which support this feature would be able to process the linker. Emit a special discarded section `.linker-option`. The content of this section is a pair of strings (key, value). The key is a type identifier for the parameter. This allows for an argument free parameter that will be processed by the linker with the value being the parameter. As an example, `lib` identifies a library to be linked against, traditionally the `-l` argument for Unix-based linkers with the parameter being the library name. Thanks to James Henderson, Cary Coutant, Rafael Espinolda, Sean Silva for the valuable discussion on the design of this feature. llvm-svn: 323783
296 lines
7.8 KiB
ArmAsm
296 lines
7.8 KiB
ArmAsm
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s | FileCheck %s
|
|
// RUN: llvm-mc -filetype=asm -triple x86_64-pc-linux-gnu %s -o - | FileCheck %s --check-prefix=ASM
|
|
|
|
// Test that these names are accepted.
|
|
|
|
.section .note.GNU-stack,"",@progbits
|
|
.section .note.GNU-stack2,"",%progbits
|
|
.section .note.GNU-,"",@progbits
|
|
.section -.note.GNU,"","progbits"
|
|
.section src/stack.c,"",@progbits
|
|
.section ~!@$%^&*()_-+={[}]|\\:<>,"",@progbits
|
|
|
|
// CHECK: Name: .note.GNU-stack
|
|
// CHECK: Name: .note.GNU-stack2
|
|
// CHECK: Name: .note.GNU-
|
|
// CHECK: Name: -.note.GNU
|
|
// CHECK: Name: src/stack.c
|
|
// CHECK: Name: ~!@$%^&*()_-+={[}]|\\:<>
|
|
|
|
// Test that the defaults are used
|
|
|
|
.section .init
|
|
.section .fini
|
|
.section .rodata
|
|
.section zed, ""
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .init
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_EXECINSTR
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Section {
|
|
// CHECK-NEXT: Index:
|
|
// CHECK-NEXT: Name: .fini
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_EXECINSTR
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Section {
|
|
// CHECK-NEXT: Index:
|
|
// CHECK-NEXT: Name: .rodata
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
// CHECK-NEXT: Section {
|
|
// CHECK-NEXT: Index:
|
|
// CHECK-NEXT: Name: zed
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
|
|
.section .note.test,"",@note
|
|
// CHECK: Section {
|
|
// CHECK: Name: .note.test
|
|
// CHECK-NEXT: Type: SHT_NOTE
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
|
|
// Test that we can parse these
|
|
foo:
|
|
bar:
|
|
.section .text.foo,"axG",@progbits,foo,comdat
|
|
.section .text.bar,"axMG",@progbits,42,bar,comdat
|
|
|
|
// Test that the default values are not used
|
|
|
|
.section .eh_frame,"a",@unwind
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .eh_frame
|
|
// CHECK-NEXT: Type: SHT_X86_64_UNWIND
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
|
|
.section .excluded,"e",@progbits
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .excluded
|
|
// CHECK-NEXT: Type: SHT_PROGBITS (0x1)
|
|
// CHECK-NEXT: Flags [ (0x80000000)
|
|
// CHECK-NEXT: SHF_EXCLUDE (0x80000000)
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address: 0x0
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size: 0
|
|
// CHECK-NEXT: Link: 0
|
|
// CHECK-NEXT: Info: 0
|
|
// CHECK-NEXT: AddressAlignment: 1
|
|
// CHECK-NEXT: EntrySize: 0
|
|
// CHECK-NEXT: }
|
|
|
|
// Test that we handle the strings like gas
|
|
.section bar-"foo"
|
|
.section "fooo"
|
|
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: bar-"foo"
|
|
// CHECK: Section {
|
|
// CHECK: Name: fooo
|
|
|
|
// Test SHF_LINK_ORDER
|
|
|
|
.section .shf_metadata_target1, "a"
|
|
.quad 0
|
|
.section .shf_metadata_target2, "a", @progbits, unique, 1
|
|
.Lshf_metadata_target2_1:
|
|
.quad 0
|
|
.section .shf_metadata_target2, "a", @progbits, unique, 2
|
|
.Lshf_metadata_target2_2:
|
|
.quad 0
|
|
|
|
.section .shf_metadata1,"ao",@progbits,.Lshf_metadata_target2_1
|
|
.section .shf_metadata2,"ao",@progbits,.Lshf_metadata_target2_2
|
|
.section .shf_metadata3,"ao",@progbits,.shf_metadata_target1
|
|
// ASM: .section .shf_metadata1,"ao",@progbits,.Lshf_metadata_target2_1
|
|
// ASM: .section .shf_metadata2,"ao",@progbits,.Lshf_metadata_target2_2
|
|
// ASM: .section .shf_metadata3,"ao",@progbits,.shf_metadata_target1
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Index: 22
|
|
// CHECK-NEXT: Name: .shf_metadata_target1
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Index: 23
|
|
// CHECK-NEXT: Name: .shf_metadata_target2
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Index: 24
|
|
// CHECK-NEXT: Name: .shf_metadata_target2
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .shf_metadata1
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_LINK_ORDER
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address:
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size:
|
|
// CHECK-NEXT: Link: 23
|
|
// CHECK-NEXT: Info: 0
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .shf_metadata2
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_LINK_ORDER
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address:
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size:
|
|
// CHECK-NEXT: Link: 24
|
|
// CHECK-NEXT: Info: 0
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .shf_metadata3
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_LINK_ORDER
|
|
// CHECK-NEXT: ]
|
|
// CHECK-NEXT: Address:
|
|
// CHECK-NEXT: Offset:
|
|
// CHECK-NEXT: Size:
|
|
// CHECK-NEXT: Link: 22
|
|
// CHECK-NEXT: Info: 0
|
|
|
|
.section .text.foo
|
|
// CHECK: Section {
|
|
// CHECK: Name: .text.foo
|
|
// CHECK-NEXT: Type: SHT_PROGBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_EXECINSTR
|
|
// CHECK-NEXT: ]
|
|
|
|
.section .bss
|
|
// CHECK: Section {
|
|
// CHECK: Name: .bss
|
|
// CHECK-NEXT: Type: SHT_NOBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_WRITE
|
|
// CHECK-NEXT: ]
|
|
|
|
.section .bss.foo
|
|
// CHECK: Section {
|
|
// CHECK: Name: .bss.foo
|
|
// CHECK-NEXT: Type: SHT_NOBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_WRITE
|
|
// CHECK-NEXT: ]
|
|
|
|
.section .tbss
|
|
// CHECK: Section {
|
|
// CHECK: Name: .tbss
|
|
// CHECK-NEXT: Type: SHT_NOBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_TLS
|
|
// CHECK-NEXT: SHF_WRITE
|
|
// CHECK-NEXT: ]
|
|
|
|
.section .tbss.foo
|
|
// CHECK: Section {
|
|
// CHECK: Name: .tbss.foo
|
|
// CHECK-NEXT: Type: SHT_NOBITS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_ALLOC
|
|
// CHECK-NEXT: SHF_TLS
|
|
// CHECK-NEXT: SHF_WRITE
|
|
// CHECK-NEXT: ]
|
|
|
|
// Test SHT_LLVM_ODRTAB
|
|
|
|
.section .odrtab,"e",@llvm_odrtab
|
|
// ASM: .section .odrtab,"e",@llvm_odrtab
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .odrtab
|
|
// CHECK-NEXT: Type: SHT_LLVM_ODRTAB
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_EXCLUDE
|
|
// CHECK-NEXT: ]
|
|
|
|
// Test SHT_LLVM_LINKER_OPTIONS
|
|
|
|
.section ".linker-options","e",@llvm_linker_options
|
|
// ASM: .section ".linker-options","e",@llvm_linker_options
|
|
|
|
// CHECK: Section {
|
|
// CHECK: Name: .linker-options
|
|
// CHECK-NEXT: Type: SHT_LLVM_LINKER_OPTIONS
|
|
// CHECK-NEXT: Flags [
|
|
// CHECK-NEXT: SHF_EXCLUDE
|
|
// CHECK-NEXT: ]
|
|
// CHECK: }
|
|
|