forked from OSchip/llvm-project
297 lines
9.4 KiB
ArmAsm
297 lines
9.4 KiB
ArmAsm
## Tests that lld-macho can handle the case where personality symbols with the same name
|
|
## are both from a dylib and locally defined in an object file.
|
|
|
|
# REQUIRES: x86
|
|
# RUN: rm -rf %t; split-file %s %t
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/user_2.s -o %t/user_2.o
|
|
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/user_3.s -o %t/user_3.o
|
|
# RUN: yaml2obj %t/combined.yaml > %t/combined.o
|
|
|
|
## Pre-condition: check that ___gxx_personality_v0 really is locally defined in combined.o before we proceed.
|
|
# RUN: llvm-nm %t/combined.o | grep '___gxx_personality_v0' | FileCheck %s --check-prefix=PRECHECK
|
|
# PRECHECK: {{.*}} t ___gxx_personality_v0
|
|
# PRECHECK-NOT: {{.*}} U ___gxx_personality_v0
|
|
# PRECHECK-NOT: {{.*}} T ___gxx_personality_v0
|
|
|
|
## check that we can link with 4 personalities without crashing:
|
|
## ___gxx_personality_v0 (libc++.tbd), ___gxx_personality_v0(local), _personality_1, and _personality_2
|
|
# RUN: %lld -lSystem -lc++ %t/user_2.o %t/combined.o -o %t/a.out
|
|
## ___gxx_personality_v0 (global), ___gxx_personality_v0(libc++.tbd), _personality_1, and _personality_2
|
|
# RUN: %lld -lSystem -lc++ %t/user_3.o %t/user_2.o -o %t/b.out
|
|
## ___gxx_personality_v0 (global), ___gxx_personality_v0(local), _personality_1, and _personality_2
|
|
# RUN: %lld -lSystem -dylib %t/user_3.o %t/combined.o %t/user_2.o -o %t/c.out
|
|
|
|
## Postlink checks.
|
|
# RUN: llvm-nm %t/a.out | FileCheck %s --check-prefix=POSTCHECK
|
|
# POSTCHECK: {{.*}} U ___gxx_personality_v0
|
|
# POSTCHECK: {{.*}} t ___gxx_personality_v0
|
|
|
|
# RUN: llvm-objdump --macho --unwind-info --syms --indirect-symbols --bind %t/a.out | FileCheck %s --check-prefixes=A,CHECK -D#%x,OFF=0x100000000
|
|
# RUN: llvm-objdump --macho --unwind-info --syms --indirect-symbols --bind %t/b.out | FileCheck %s --check-prefixes=BC,CHECK -D#%x,OFF=0x100000000
|
|
# RUN: llvm-objdump --macho --unwind-info --syms --indirect-symbols --bind %t/c.out | FileCheck %s --check-prefixes=BC,C,CHECK -D#%x,OFF=0
|
|
|
|
# A: Indirect symbols for (__DATA_CONST,__got)
|
|
# A-NEXT: address index name
|
|
# A: 0x[[#%x,GXX_PERSONALITY_LO:]] [[#]] ___gxx_personality_v0
|
|
# A: 0x[[#%x,GXX_PERSONALITY_HI:]] [[#]] ___gxx_personality_v0
|
|
# A: 0x[[#%x,PERSONALITY_1:]] LOCAL
|
|
# A: 0x[[#%x,PERSONALITY_2:]] LOCAL
|
|
|
|
# BC: Indirect symbols for (__DATA_CONST,__got)
|
|
# BC-NEXT: address index name
|
|
# C: 0x[[#%x,GXX_PERSONALITY_HI:]] LOCAL
|
|
# BC: 0x[[#%x,GXX_PERSONALITY_LO:]] LOCAL
|
|
# BC: 0x[[#%x,PERSONALITY_1:]] LOCAL
|
|
# BC: 0x[[#%x,PERSONALITY_2:]] LOCAL
|
|
|
|
# CHECK: Personality functions: (count = 3)
|
|
# CHECK-DAG: personality[{{[0-9]+}}]: 0x{{0*}}[[#GXX_PERSONALITY_LO-OFF]]
|
|
# CHECK-DAG: personality[{{[0-9]+}}]: 0x{{0*}}[[#PERSONALITY_1-OFF]]
|
|
# CHECK-DAG: personality[{{[0-9]+}}]: 0x{{0*}}[[#PERSONALITY_2-OFF]]
|
|
|
|
# A: Bind table
|
|
# A-NEXT: segment section address type addend dylib symbol
|
|
# A-NEXT: __DATA_CONST __got 0x[[#GXX_PERSONALITY_LO-0]] pointer 0 libc++abi ___gxx_personality_v0
|
|
|
|
## Error cases.
|
|
## Check that dylib symbols are picked (which means without libc++, we'd get an undefined symbol error.
|
|
# RUN: not %lld -lSystem %t/user_2.o %t/combined.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=ERRORCHECK
|
|
# ERRORCHECK: {{.*}} undefined symbol: ___gxx_personality_v0
|
|
|
|
#--- user_3.s
|
|
.globl _baz3
|
|
.private_extern ___gxx_personality_v0
|
|
|
|
.text
|
|
_baz3:
|
|
.cfi_startproc
|
|
.cfi_personality 155, ___gxx_personality_v0
|
|
.cfi_def_cfa_offset 16
|
|
retq
|
|
.cfi_endproc
|
|
|
|
.text
|
|
.no_dead_strip ___gxx_personality_v0
|
|
___gxx_personality_v0:
|
|
nop
|
|
|
|
.subsections_via_symbols
|
|
|
|
|
|
#--- user_2.s
|
|
.globl _main, _personality_1, _personality_2
|
|
|
|
.text
|
|
|
|
_bar:
|
|
.cfi_startproc
|
|
.cfi_personality 155, _personality_1
|
|
.cfi_def_cfa_offset 16
|
|
retq
|
|
.cfi_endproc
|
|
|
|
_baz:
|
|
.cfi_startproc
|
|
.cfi_personality 155, _personality_2
|
|
.cfi_def_cfa_offset 16
|
|
retq
|
|
.cfi_endproc
|
|
|
|
_main:
|
|
.cfi_startproc
|
|
.cfi_personality 155, ___gxx_personality_v0
|
|
.cfi_def_cfa_offset 16
|
|
retq
|
|
.cfi_endproc
|
|
|
|
_personality_1:
|
|
retq
|
|
_personality_2:
|
|
retq
|
|
|
|
## This yaml was created from the combined.o object file described in this comment:
|
|
## https://reviews.llvm.org/D107533#2935217
|
|
#--- combined.yaml
|
|
--- !mach-o
|
|
FileHeader:
|
|
magic: 0xFEEDFACF
|
|
cputype: 0x1000007
|
|
cpusubtype: 0x3
|
|
filetype: 0x1
|
|
ncmds: 4
|
|
sizeofcmds: 384
|
|
flags: 0x2000
|
|
reserved: 0x0
|
|
LoadCommands:
|
|
- cmd: LC_SEGMENT_64
|
|
cmdsize: 312
|
|
segname: ''
|
|
vmaddr: 0
|
|
vmsize: 152
|
|
fileoff: 448
|
|
filesize: 152
|
|
maxprot: 7
|
|
initprot: 7
|
|
nsects: 3
|
|
flags: 0
|
|
Sections:
|
|
- sectname: __text
|
|
segname: __TEXT
|
|
addr: 0x0
|
|
size: 5
|
|
offset: 0x1C0
|
|
align: 2
|
|
reloff: 0x0
|
|
nreloc: 0
|
|
flags: 0x80000400
|
|
reserved1: 0x0
|
|
reserved2: 0x0
|
|
reserved3: 0x0
|
|
content: 90909090C3
|
|
- sectname: __eh_frame
|
|
segname: __TEXT
|
|
addr: 0x8
|
|
size: 80
|
|
offset: 0x1C8
|
|
align: 3
|
|
reloff: 0x258
|
|
nreloc: 5
|
|
flags: 0x0
|
|
reserved1: 0x0
|
|
reserved2: 0x0
|
|
reserved3: 0x0
|
|
content: 1400000000000000017A520001781001100C0708900100001800000000000000017A505200017810069B04000000100C070890011800000004000000F8FFFFFFFFFFFFFF0100000000000000000E1000
|
|
relocations:
|
|
- address: 0x2A
|
|
symbolnum: 0
|
|
pcrel: true
|
|
length: 2
|
|
extern: true
|
|
type: 4
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x38
|
|
symbolnum: 2
|
|
pcrel: false
|
|
length: 2
|
|
extern: true
|
|
type: 5
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x38
|
|
symbolnum: 3
|
|
pcrel: false
|
|
length: 2
|
|
extern: true
|
|
type: 0
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x3C
|
|
symbolnum: 3
|
|
pcrel: false
|
|
length: 3
|
|
extern: true
|
|
type: 5
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x3C
|
|
symbolnum: 4
|
|
pcrel: false
|
|
length: 3
|
|
extern: true
|
|
type: 0
|
|
scattered: false
|
|
value: 0
|
|
- sectname: __compact_unwind
|
|
segname: __LD
|
|
addr: 0x58
|
|
size: 64
|
|
offset: 0x218
|
|
align: 3
|
|
reloff: 0x280
|
|
nreloc: 3
|
|
flags: 0x2000000
|
|
reserved1: 0x0
|
|
reserved2: 0x0
|
|
reserved3: 0x0
|
|
content: '00000000000000000100000000000202000000000000000000000000000000000000000000000000010000000000020200000000000000000000000000000000'
|
|
relocations:
|
|
- address: 0x0
|
|
symbolnum: 0
|
|
pcrel: false
|
|
length: 3
|
|
extern: true
|
|
type: 0
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x20
|
|
symbolnum: 4
|
|
pcrel: false
|
|
length: 3
|
|
extern: true
|
|
type: 0
|
|
scattered: false
|
|
value: 0
|
|
- address: 0x30
|
|
symbolnum: 0
|
|
pcrel: false
|
|
length: 3
|
|
extern: true
|
|
type: 0
|
|
scattered: false
|
|
value: 0
|
|
- cmd: LC_SYMTAB
|
|
cmdsize: 24
|
|
symoff: 664
|
|
nsyms: 5
|
|
stroff: 744
|
|
strsize: 48
|
|
- cmd: LC_BUILD_VERSION
|
|
cmdsize: 32
|
|
platform: 1
|
|
minos: 659200
|
|
sdk: 720896
|
|
ntools: 1
|
|
Tools:
|
|
- tool: 3
|
|
version: 39913472
|
|
- cmd: LC_DATA_IN_CODE
|
|
cmdsize: 16
|
|
dataoff: 664
|
|
datasize: 0
|
|
LinkEditData:
|
|
NameList:
|
|
- n_strx: 7
|
|
n_type: 0x1E
|
|
n_sect: 1
|
|
n_desc: 32
|
|
n_value: 0
|
|
- n_strx: 29
|
|
n_type: 0xE
|
|
n_sect: 2
|
|
n_desc: 0
|
|
n_value: 8
|
|
- n_strx: 29
|
|
n_type: 0xE
|
|
n_sect: 2
|
|
n_desc: 0
|
|
n_value: 32
|
|
- n_strx: 39
|
|
n_type: 0xE
|
|
n_sect: 2
|
|
n_desc: 0
|
|
n_value: 60
|
|
- n_strx: 2
|
|
n_type: 0xF
|
|
n_sect: 1
|
|
n_desc: 0
|
|
n_value: 4
|
|
StringTable:
|
|
- ' '
|
|
- _foo
|
|
- ___gxx_personality_v0
|
|
- EH_Frame1
|
|
- func.eh
|
|
- ''
|
|
...
|