Skip to content

Commit b64afad

Browse files
committed
[JITLink][MachO] Treat linker private symbols as hidden rather than private.
Linker-private symbols should be resolvable across object file boundaries.
1 parent f75e04b commit b64afad

File tree

4 files changed

+47
-11
lines changed

4 files changed

+47
-11
lines changed

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ Linkage MachOLinkGraphBuilder::getLinkage(uint16_t Desc) {
6464
}
6565

6666
Scope MachOLinkGraphBuilder::getScope(StringRef Name, uint8_t Type) {
67-
if (Name.startswith("l"))
68-
return Scope::Local;
69-
if (Type & MachO::N_PEXT)
67+
if (Name.startswith("l") || (Type & MachO::N_PEXT))
7068
return Scope::Hidden;
7169
if (Type & MachO::N_EXT)
7270
return Scope::Default;

llvm/lib/ExecutionEngine/Orc/Mangling.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,25 @@ getObjectSymbolInfo(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
8989
if (!Obj)
9090
return Obj.takeError();
9191

92+
bool IsMachO = isa<object::MachOObjectFile>(Obj->get());
93+
9294
SymbolFlagsMap SymbolFlags;
9395
for (auto &Sym : (*Obj)->symbols()) {
9496
// Skip symbols not defined in this object file.
9597
if (Sym.getFlags() & object::BasicSymbolRef::SF_Undefined)
9698
continue;
9799

98-
// Skip symbols that are not global.
99-
if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Global))
100+
// Get the symbol name.
101+
auto Name = Sym.getName();
102+
if (!Name)
103+
return Name.takeError();
104+
105+
bool IsLinkerPrivate = IsMachO && Name->startswith("l");
106+
107+
// Skip symbols that are not global. Treat linker private symbols as global
108+
// hidden.
109+
if (!(Sym.getFlags() & object::BasicSymbolRef::SF_Global) &&
110+
!IsLinkerPrivate)
100111
continue;
101112

102113
// Skip symbols that have type SF_File.
@@ -106,9 +117,6 @@ getObjectSymbolInfo(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
106117
} else
107118
return SymType.takeError();
108119

109-
auto Name = Sym.getName();
110-
if (!Name)
111-
return Name.takeError();
112120
auto InternedName = ES.intern(*Name);
113121
auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
114122
if (!SymFlags)
@@ -118,9 +126,10 @@ getObjectSymbolInfo(ExecutionSession &ES, MemoryBufferRef ObjBuffer) {
118126

119127
SymbolStringPtr InitSymbol;
120128

121-
if (auto *MachOObj = dyn_cast<object::MachOObjectFile>(Obj->get())) {
122-
for (auto &Sec : MachOObj->sections()) {
123-
auto SecType = MachOObj->getSectionType(Sec);
129+
if (IsMachO) {
130+
auto &MachOObj = cast<object::MachOObjectFile>(*Obj->get());
131+
for (auto &Sec : MachOObj.sections()) {
132+
auto SecType = MachOObj.getSectionType(Sec);
124133
if ((SecType & MachO::SECTION_TYPE) == MachO::S_MOD_INIT_FUNC_POINTERS) {
125134
std::string InitSymString;
126135
raw_string_ostream(InitSymString)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Supplies a linker private definition, "l_foo".
2+
3+
.section __TEXT,__text,regular,pure_instructions
4+
.macosx_version_min 10, 14
5+
.p2align 4, 0x90
6+
l_foo:
7+
xorl %eax, %eax
8+
retq
9+
10+
.subsections_via_symbols
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# RUN: rm -rf %t && mkdir -p %t
2+
# RUN: llvm-mc -triple=x86_64-apple-macosx10.9 -filetype=obj \
3+
# RUN: -o %t/MachO_linker_private_def.o %S/Inputs/MachO_linker_private_def.s
4+
# RUN: llvm-mc -triple=x86_64-apple-macosx10.9 -filetype=obj \
5+
# RUN: -o %t/MachO_linker_private_symbols.o %s
6+
# RUN: llvm-jitlink -noexec %t/MachO_linker_private_def.o \
7+
# RUN: %t/MachO_linker_private_symbols.o
8+
#
9+
# Check that we can resolve linker-private symbol definitions across object
10+
# boundaries.
11+
12+
.section __TEXT,__text,regular,pure_instructions
13+
.macosx_version_min 10, 14
14+
.globl _main
15+
.p2align 4, 0x90
16+
_main:
17+
jmp l_foo
18+
19+
.subsections_via_symbols

0 commit comments

Comments
 (0)