mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-03-01 14:58:18 +00:00
[lld-macho] Don't replace local personality symbol with LazySymbol
Follup-up to D107533, where we replaced local syms with non-local. It doesn't make sense to replace local symbol with lazy. Differential Revision: https://reviews.llvm.org/D110040
This commit is contained in:
parent
1a76a3a7e4
commit
944071eca2
@ -796,16 +796,18 @@ FunctionStartsSection::FunctionStartsSection()
|
||||
void FunctionStartsSection::finalizeContents() {
|
||||
raw_svector_ostream os{contents};
|
||||
std::vector<uint64_t> addrs;
|
||||
for (const Symbol *sym : symtab->getSymbols()) {
|
||||
if (const auto *defined = dyn_cast<Defined>(sym)) {
|
||||
if (!defined->isec || !isCodeSection(defined->isec) || !defined->isLive())
|
||||
continue;
|
||||
if (const auto *concatIsec = dyn_cast<ConcatInputSection>(defined->isec))
|
||||
if (concatIsec->shouldOmitFromOutput())
|
||||
continue;
|
||||
// TODO: Add support for thumbs, in that case
|
||||
// the lowest bit of nextAddr needs to be set to 1.
|
||||
addrs.push_back(defined->getVA());
|
||||
for (const InputFile *file : inputFiles) {
|
||||
if (auto *objFile = dyn_cast<ObjFile>(file)) {
|
||||
for (const Symbol *sym : objFile->symbols) {
|
||||
if (const auto *defined = dyn_cast_or_null<Defined>(sym)) {
|
||||
if (!defined->isec || !isCodeSection(defined->isec) ||
|
||||
!defined->isLive())
|
||||
continue;
|
||||
// TODO: Add support for thumbs, in that case
|
||||
// the lowest bit of nextAddr needs to be set to 1.
|
||||
addrs.push_back(defined->getVA());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
llvm::sort(addrs);
|
||||
|
@ -225,8 +225,9 @@ void UnwindInfoSectionImpl<Ptr>::prepareRelocations(ConcatInputSection *isec) {
|
||||
//
|
||||
// (See discussions/alternatives already considered on D107533)
|
||||
if (!defined->isExternal())
|
||||
if (const Symbol *sym = symtab->find(defined->getName()))
|
||||
r.referent = s = const_cast<Symbol *>(sym);
|
||||
if (Symbol *sym = symtab->find(defined->getName()))
|
||||
if (sym->kind() != Symbol::LazyKind)
|
||||
r.referent = s = sym;
|
||||
}
|
||||
if (auto *undefined = dyn_cast<Undefined>(s)) {
|
||||
treatUndefinedSymbol(*undefined);
|
||||
|
223
lld/test/MachO/objc-uses-custom-personality.s
Normal file
223
lld/test/MachO/objc-uses-custom-personality.s
Normal file
@ -0,0 +1,223 @@
|
||||
## Tests that lld correctly resolves the custom personality referenced by objc code in an archive.
|
||||
|
||||
# REQUIRES: x86
|
||||
# RUN: rm -rf %t; split-file %s %t
|
||||
# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-iossimulator %t/defined.s -o %t/defined.o
|
||||
# RUN: yaml2obj %t/combined.yaml > %t/combined.o
|
||||
# RUN: llvm-ar r %t/pack.a %t/defined.o %t/combined.o
|
||||
# RUN: %lld -dylib -arch x86_64 -platform_version ios-simulator 12.0.0 15.0 -ObjC %t/pack.a -o %t/a.dylib
|
||||
# RUN: llvm-objdump --macho --syms %t/a.dylib | FileCheck %s
|
||||
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK: {{.*}} l F __TEXT,__text _my_personality
|
||||
|
||||
|
||||
#--- defined.s
|
||||
.private_extern _my_personality
|
||||
|
||||
.text
|
||||
.no_dead_strip _my_personality
|
||||
_my_personality:
|
||||
.cfi_startproc
|
||||
.cfi_def_cfa_offset 16
|
||||
.cfi_endproc
|
||||
nop
|
||||
.subsections_via_symbols
|
||||
|
||||
## combined.yaml is produced from combined.o below:
|
||||
## lvm-mc -filetype=obj -triple=x86_64-apple-iossimulator %t/objc.s -o %t/objc.o
|
||||
## ld -r -o combined.o defined.o objc.o
|
||||
## // objc.s:
|
||||
## .section __TEXT,__text
|
||||
## .global _OBJC_CLASS_$_MyTest
|
||||
## .no_dead_strip _OBJC_CLASS_$_MyTest
|
||||
## _OBJC_CLASS_$_MyTest:
|
||||
## .cfi_startproc
|
||||
## .cfi_personality 155, _my_personality
|
||||
## .cfi_def_cfa_offset 16
|
||||
## ret
|
||||
## .cfi_endproc
|
||||
##
|
||||
## ret
|
||||
## .subsections_via_symbols
|
||||
|
||||
#--- combined.yaml
|
||||
--- !mach-o
|
||||
FileHeader:
|
||||
magic: 0xFEEDFACF
|
||||
cputype: 0x1000007
|
||||
cpusubtype: 0x3
|
||||
filetype: 0x1
|
||||
ncmds: 3
|
||||
sizeofcmds: 352
|
||||
flags: 0x2000
|
||||
reserved: 0x0
|
||||
LoadCommands:
|
||||
- cmd: LC_SEGMENT_64
|
||||
cmdsize: 312
|
||||
segname: ''
|
||||
vmaddr: 0
|
||||
vmsize: 152
|
||||
fileoff: 416
|
||||
filesize: 152
|
||||
maxprot: 7
|
||||
initprot: 7
|
||||
nsects: 3
|
||||
flags: 0
|
||||
Sections:
|
||||
- sectname: __text
|
||||
segname: __TEXT
|
||||
addr: 0x0
|
||||
size: 3
|
||||
offset: 0x1A0
|
||||
align: 0
|
||||
reloff: 0x0
|
||||
nreloc: 0
|
||||
flags: 0x80000400
|
||||
reserved1: 0x0
|
||||
reserved2: 0x0
|
||||
reserved3: 0x0
|
||||
content: 90C3C3
|
||||
- sectname: __eh_frame
|
||||
segname: __TEXT
|
||||
addr: 0x8
|
||||
size: 80
|
||||
offset: 0x1A8
|
||||
align: 3
|
||||
reloff: 0x238
|
||||
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: 0x1F8
|
||||
align: 3
|
||||
reloff: 0x260
|
||||
nreloc: 3
|
||||
flags: 0x2000000
|
||||
reserved1: 0x0
|
||||
reserved2: 0x0
|
||||
reserved3: 0x0
|
||||
content: '00000000000000000100000000000202000000000000000000000000000000000000000000000000020000000000020200000000000000000000000000000000'
|
||||
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: 632
|
||||
nsyms: 5
|
||||
stroff: 712
|
||||
strsize: 64
|
||||
- cmd: LC_DATA_IN_CODE
|
||||
cmdsize: 16
|
||||
dataoff: 632
|
||||
datasize: 0
|
||||
LinkEditData:
|
||||
NameList:
|
||||
- n_strx: 23
|
||||
n_type: 0x1E
|
||||
n_sect: 1
|
||||
n_desc: 32
|
||||
n_value: 0
|
||||
- n_strx: 39
|
||||
n_type: 0xE
|
||||
n_sect: 2
|
||||
n_desc: 0
|
||||
n_value: 8
|
||||
- n_strx: 39
|
||||
n_type: 0xE
|
||||
n_sect: 2
|
||||
n_desc: 0
|
||||
n_value: 32
|
||||
- n_strx: 49
|
||||
n_type: 0xE
|
||||
n_sect: 2
|
||||
n_desc: 0
|
||||
n_value: 60
|
||||
- n_strx: 2
|
||||
n_type: 0xF
|
||||
n_sect: 1
|
||||
n_desc: 32
|
||||
n_value: 1
|
||||
StringTable:
|
||||
- ' '
|
||||
- '_OBJC_CLASS_$_MyTest'
|
||||
- _my_personality
|
||||
- EH_Frame1
|
||||
- func.eh
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
- ''
|
||||
...
|
Loading…
x
Reference in New Issue
Block a user