378 lines
12 KiB
ArmAsm
378 lines
12 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 -emit-compact-unwind-non-canonical=true -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/user_2.s -o %t/user_2.o
|
||
|
# RUN: llvm-mc -emit-compact-unwind-non-canonical=true -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/user_3.s -o %t/user_3.o
|
||
|
|
||
|
## Test case for linking 3+ personaltiies (all globals) without crashing because all the non-canonical are DWARFs
|
||
|
# RUN: llvm-mc -emit-compact-unwind-non-canonical=false -filetype=obj -triple=x86_64-apple-darwin19.0.0 %t/user_4.s -o %t/user_4.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
|
||
|
|
||
|
## check that we can link with 3+ personalities without crashing because
|
||
|
## non-canonical personalities are dwarf.
|
||
|
## This has ___gxx_personality_v0(global), ___gxx_personality_v0(local), and _personality_{1,2,3,4}
|
||
|
## Only the ___gxx_personality_v0(global) should have compact-unwind. The rest should have DWARFs.
|
||
|
# RUN: %lld -lSystem -lc++ %t/user_4.o %t/combined.o -o %t/d.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
|
||
|
|
||
|
# RUN: llvm-objdump --macho --indirect-symbols --unwind-info --bind %t/d.out | FileCheck %s --check-prefixes=D -D#%x,OFF=0x100000000
|
||
|
|
||
|
# 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
|
||
|
|
||
|
|
||
|
# D: Indirect symbols for (__DATA_CONST,__got)
|
||
|
# D-NEXT: address index name
|
||
|
# D: 0x[[#%x,GXX_PERSONALITY_HI:]] [[#]] ___gxx_personality_v0
|
||
|
# D: 0x[[#%x,PERSONALITY_1:]] [[#]] _personality_1
|
||
|
# D: 0x[[#%x,PERSONALITY_2:]] [[#]] _personality_2
|
||
|
# D: 0x[[#%x,PERSONALITY_3:]] [[#]] _personality_3
|
||
|
# D: 0x[[#%x,PERSONALITY_4:]] [[#]] _personality_4
|
||
|
# D: 0x[[#%x,GXX_PERSONALITY_LO:]] [[#]] ___gxx_personality_v0
|
||
|
|
||
|
# D: Contents of __unwind_info section:
|
||
|
# D: Personality functions: (count = 1)
|
||
|
personality[1]: 0x{{0*}}[[#GXX_PERSONALITY_HI-OFF]]
|
||
|
|
||
|
# D: Bind table:
|
||
|
# D: segment section address type addend dylib symbol
|
||
|
# D: __DATA_CONST __got 0x[[#GXX_PERSONALITY_HI-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_4.s
|
||
|
.globl _main, _personality_1, _personality_2, _personality_3, _personality_4
|
||
|
|
||
|
.text
|
||
|
|
||
|
_baz1:
|
||
|
.cfi_startproc
|
||
|
.cfi_personality 155, _personality_1
|
||
|
.cfi_def_cfa_offset 16
|
||
|
retq
|
||
|
.cfi_endproc
|
||
|
|
||
|
_baz2:
|
||
|
.cfi_startproc
|
||
|
.cfi_personality 155, _personality_2
|
||
|
.cfi_def_cfa_offset 16
|
||
|
retq
|
||
|
.cfi_endproc
|
||
|
|
||
|
_baz3:
|
||
|
.cfi_startproc
|
||
|
.cfi_personality 155, _personality_3
|
||
|
.cfi_def_cfa_offset 16
|
||
|
retq
|
||
|
.cfi_endproc
|
||
|
|
||
|
|
||
|
_baz4:
|
||
|
.cfi_startproc
|
||
|
.cfi_personality 155, _personality_4
|
||
|
.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
|
||
|
_personality_3:
|
||
|
retq
|
||
|
_personality_4:
|
||
|
retq
|
||
|
|
||
|
#--- 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
|
||
|
- ''
|
||
|
...
|