2021-09-16 03:49:56 +08:00
|
|
|
## 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
|
2022-02-16 10:28:18 +08:00
|
|
|
# POSTCHECK: {{.*}} t ___gxx_personality_v0
|
2021-09-16 03:49:56 +08:00
|
|
|
|
|
|
|
# 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
|
[lld-macho] Associate compact unwind entries with function symbols
Compact unwind entries (CUEs) contain pointers to their respective
function symbols. However, during the link process, it's far more useful
to have pointers from the function symbol to the CUE than vice versa.
This diff adds that pointer in the form of `Defined::compactUnwind`.
In particular, when doing dead-stripping, we want to mark CUEs live when
their function symbol is live; and when doing ICF, we want to dedup
sections iff the symbols in that section have identical CUEs. In both
cases, we want to be able to locate the symbols within a given section,
as well as locate the CUEs belonging to those symbols. So this diff also
adds `InputSection::symbols`.
The ultimate goal of this refactor is to have ICF support dedup'ing
functions with unwind info, but that will be handled in subsequent
diffs. This diff focuses on simplifying `-dead_strip` --
`findFunctionsWithUnwindInfo` is no longer necessary, and
`Defined::isLive()` is now a lot simpler. Moreover, UnwindInfoSection no
longer has to check for dead CUEs -- we simply avoid adding them in the
first place.
Additionally, we now support stripping of dead LSDAs, which follows
quite naturally since `markLive()` can now reach them via the CUEs.
Reviewed By: #lld-macho, gkm
Differential Revision: https://reviews.llvm.org/D109944
2021-10-27 04:04:04 +08:00
|
|
|
# RUN: llvm-objdump --macho --unwind-info --syms --indirect-symbols --bind %t/c.out | FileCheck %s --check-prefixes=BC,C,CHECK -D#%x,OFF=0
|
2021-09-16 03:49:56 +08:00
|
|
|
|
|
|
|
# A: Indirect symbols for (__DATA_CONST,__got)
|
|
|
|
# A-NEXT: address index name
|
[lld-macho] Associate compact unwind entries with function symbols
Compact unwind entries (CUEs) contain pointers to their respective
function symbols. However, during the link process, it's far more useful
to have pointers from the function symbol to the CUE than vice versa.
This diff adds that pointer in the form of `Defined::compactUnwind`.
In particular, when doing dead-stripping, we want to mark CUEs live when
their function symbol is live; and when doing ICF, we want to dedup
sections iff the symbols in that section have identical CUEs. In both
cases, we want to be able to locate the symbols within a given section,
as well as locate the CUEs belonging to those symbols. So this diff also
adds `InputSection::symbols`.
The ultimate goal of this refactor is to have ICF support dedup'ing
functions with unwind info, but that will be handled in subsequent
diffs. This diff focuses on simplifying `-dead_strip` --
`findFunctionsWithUnwindInfo` is no longer necessary, and
`Defined::isLive()` is now a lot simpler. Moreover, UnwindInfoSection no
longer has to check for dead CUEs -- we simply avoid adding them in the
first place.
Additionally, we now support stripping of dead LSDAs, which follows
quite naturally since `markLive()` can now reach them via the CUEs.
Reviewed By: #lld-macho, gkm
Differential Revision: https://reviews.llvm.org/D109944
2021-10-27 04:04:04 +08:00
|
|
|
# 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
|
2021-09-16 03:49:56 +08:00
|
|
|
|
|
|
|
# BC: Indirect symbols for (__DATA_CONST,__got)
|
|
|
|
# BC-NEXT: address index name
|
[lld-macho] Associate compact unwind entries with function symbols
Compact unwind entries (CUEs) contain pointers to their respective
function symbols. However, during the link process, it's far more useful
to have pointers from the function symbol to the CUE than vice versa.
This diff adds that pointer in the form of `Defined::compactUnwind`.
In particular, when doing dead-stripping, we want to mark CUEs live when
their function symbol is live; and when doing ICF, we want to dedup
sections iff the symbols in that section have identical CUEs. In both
cases, we want to be able to locate the symbols within a given section,
as well as locate the CUEs belonging to those symbols. So this diff also
adds `InputSection::symbols`.
The ultimate goal of this refactor is to have ICF support dedup'ing
functions with unwind info, but that will be handled in subsequent
diffs. This diff focuses on simplifying `-dead_strip` --
`findFunctionsWithUnwindInfo` is no longer necessary, and
`Defined::isLive()` is now a lot simpler. Moreover, UnwindInfoSection no
longer has to check for dead CUEs -- we simply avoid adding them in the
first place.
Additionally, we now support stripping of dead LSDAs, which follows
quite naturally since `markLive()` can now reach them via the CUEs.
Reviewed By: #lld-macho, gkm
Differential Revision: https://reviews.llvm.org/D109944
2021-10-27 04:04:04 +08:00
|
|
|
# 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
|
2021-09-16 03:49:56 +08:00
|
|
|
|
|
|
|
# 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
|
2022-02-16 10:28:18 +08:00
|
|
|
.no_dead_strip ___gxx_personality_v0
|
|
|
|
___gxx_personality_v0:
|
2021-09-16 03:49:56 +08:00
|
|
|
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
|
2022-02-16 10:28:18 +08:00
|
|
|
|
2021-09-16 03:49:56 +08:00
|
|
|
## 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
|
2022-02-16 10:28:18 +08:00
|
|
|
version: 39913472
|
2021-09-16 03:49:56 +08:00
|
|
|
- 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
|
|
|
|
- ''
|
|
|
|
...
|