Skip to content

Commit ffe2dda

Browse files
committed
[ORC][JITLink] Retain Weak flags in JITDylib interfaces, propagate to LinkGraph.
Previously we stripped Weak flags from JITDylib symbol table entries once they were resolved (there was no particularly good reason for this). Now we want to retain them and query them when setting the Linkage on external symbols in LinkGraphs during symbol resolution (this was the motivation for 75404e9). Making weak linkage of external definitions discoverable in the LinkGraph will in turn allow future plugins to implement correct handling for them (by recording locations that depend on exported weak definitions and pointing all of these at one chosen definition at runtime).
1 parent 57f6fd0 commit ffe2dda

File tree

9 files changed

+51
-60
lines changed

9 files changed

+51
-60
lines changed

llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -413,19 +413,6 @@ class Symbol {
413413
setCallable(IsCallable);
414414
}
415415

416-
static Symbol &constructCommon(BumpPtrAllocator &Allocator, Block &Base,
417-
StringRef Name, orc::ExecutorAddrDiff Size,
418-
Scope S, bool IsLive) {
419-
assert(!Name.empty() && "Common symbol name cannot be empty");
420-
assert(Base.isDefined() &&
421-
"Cannot create common symbol from undefined block");
422-
assert(static_cast<Block &>(Base).getSize() == Size &&
423-
"Common symbol size should match underlying block size");
424-
auto *Sym = Allocator.Allocate<Symbol>();
425-
new (Sym) Symbol(Base, 0, Name, Size, Linkage::Weak, S, IsLive, false);
426-
return *Sym;
427-
}
428-
429416
static Symbol &constructExternal(BumpPtrAllocator &Allocator,
430417
Addressable &Base, StringRef Name,
431418
orc::ExecutorAddrDiff Size, Linkage L,
@@ -1127,22 +1114,6 @@ class LinkGraph {
11271114
return Sym;
11281115
}
11291116

1130-
/// Convenience method for adding a weak zero-fill symbol.
1131-
Symbol &addCommonSymbol(StringRef Name, Scope S, Section &Section,
1132-
orc::ExecutorAddr Address, orc::ExecutorAddrDiff Size,
1133-
uint64_t Alignment, bool IsLive) {
1134-
assert(llvm::count_if(defined_symbols(),
1135-
[&](const Symbol *Sym) {
1136-
return Sym->getName() == Name;
1137-
}) == 0 &&
1138-
"Duplicate defined symbol");
1139-
auto &Sym = Symbol::constructCommon(
1140-
Allocator, createBlock(Section, Size, Address, Alignment, 0), Name,
1141-
Size, S, IsLive);
1142-
Section.addSymbol(Sym);
1143-
return Sym;
1144-
}
1145-
11461117
/// Add an anonymous symbol.
11471118
Symbol &addAnonymousSymbol(Block &Content, orc::ExecutorAddrDiff Offset,
11481119
orc::ExecutorAddrDiff Size, bool IsCallable,

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,11 @@ Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol(
454454
object::COFFSymbolRef Symbol, const object::coff_section *Section) {
455455
if (Symbol.isCommon()) {
456456
// FIXME: correct alignment
457-
return &G->addCommonSymbol(SymbolName, Scope::Default, getCommonSection(),
458-
orc::ExecutorAddr(), Symbol.getValue(),
459-
Symbol.getValue(), false);
457+
return &G->addDefinedSymbol(
458+
G->createZeroFillBlock(getCommonSection(), Symbol.getValue(),
459+
orc::ExecutorAddr(), Symbol.getValue(), 0),
460+
0, SymbolName, Symbol.getValue(), Linkage::Strong, Scope::Default,
461+
false, false);
460462
}
461463
if (Symbol.isAbsolute())
462464
return &G->addAbsoluteSymbol(SymbolName,

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -402,9 +402,10 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
402402

403403
// Handle common symbols specially.
404404
if (Sym.isCommon()) {
405-
Symbol &GSym = G->addCommonSymbol(*Name, Scope::Default,
406-
getCommonSection(), orc::ExecutorAddr(),
407-
Sym.st_size, Sym.getValue(), false);
405+
Symbol &GSym = G->addDefinedSymbol(
406+
G->createZeroFillBlock(getCommonSection(), Sym.st_size,
407+
orc::ExecutorAddr(), Sym.getValue(), 0),
408+
0, *Name, Sym.st_size, Linkage::Strong, Scope::Default, false, false);
408409
setGraphSymbol(SymIndex, GSym);
409410
continue;
410411
}

llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,19 +217,29 @@ void JITLinkerBase::applyLookupResult(AsyncLookupResult Result) {
217217
assert(!Sym->getAddress() && "Symbol already resolved");
218218
assert(!Sym->isDefined() && "Symbol being resolved is already defined");
219219
auto ResultI = Result.find(Sym->getName());
220-
if (ResultI != Result.end())
220+
if (ResultI != Result.end()) {
221221
Sym->getAddressable().setAddress(
222222
orc::ExecutorAddr(ResultI->second.getAddress()));
223-
else
223+
Sym->setLinkage(ResultI->second.getFlags().isWeak() ? Linkage::Weak
224+
: Linkage::Strong);
225+
} else
224226
assert(Sym->isWeaklyReferenced() &&
225227
"Failed to resolve non-weak reference");
226228
}
227229

228230
LLVM_DEBUG({
229231
dbgs() << "Externals after applying lookup result:\n";
230-
for (auto *Sym : G->external_symbols())
232+
for (auto *Sym : G->external_symbols()) {
231233
dbgs() << " " << Sym->getName() << ": "
232-
<< formatv("{0:x16}", Sym->getAddress().getValue()) << "\n";
234+
<< formatv("{0:x16}", Sym->getAddress().getValue());
235+
switch (Sym->getLinkage()) {
236+
case Linkage::Strong:
237+
break;
238+
case Linkage::Weak:
239+
dbgs() << " (weak)";
240+
}
241+
dbgs() << "\n";
242+
}
233243
});
234244
}
235245

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -350,11 +350,13 @@ Error MachOLinkGraphBuilder::graphifyRegularSymbols() {
350350
if (!NSym.Name)
351351
return make_error<JITLinkError>("Anonymous common symbol at index " +
352352
Twine(KV.first));
353-
NSym.GraphSymbol = &G->addCommonSymbol(
354-
*NSym.Name, NSym.S, getCommonSection(), orc::ExecutorAddr(),
355-
orc::ExecutorAddrDiff(NSym.Value),
356-
1ull << MachO::GET_COMM_ALIGN(NSym.Desc),
357-
NSym.Desc & MachO::N_NO_DEAD_STRIP);
353+
NSym.GraphSymbol = &G->addDefinedSymbol(
354+
G->createZeroFillBlock(getCommonSection(),
355+
orc::ExecutorAddrDiff(NSym.Value),
356+
orc::ExecutorAddr(),
357+
1ull << MachO::GET_COMM_ALIGN(NSym.Desc), 0),
358+
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Strong,
359+
NSym.S, false, NSym.Desc & MachO::N_NO_DEAD_STRIP);
358360
} else {
359361
if (!NSym.Name)
360362
return make_error<JITLinkError>("Anonymous external symbol at "

llvm/lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -970,10 +970,9 @@ Error JITDylib::resolve(MaterializationResponsibility &MR,
970970
SymbolsInErrorState.insert(KV.first);
971971
else {
972972
auto Flags = KV.second.getFlags();
973-
Flags &= ~(JITSymbolFlags::Weak | JITSymbolFlags::Common);
973+
Flags &= ~JITSymbolFlags::Common;
974974
assert(Flags ==
975-
(SymI->second.getFlags() &
976-
~(JITSymbolFlags::Weak | JITSymbolFlags::Common)) &&
975+
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
977976
"Resolved flags should match the declared flags");
978977

979978
Worklist.push_back(
@@ -2909,13 +2908,13 @@ Error ExecutionSession::OL_notifyResolved(MaterializationResponsibility &MR,
29092908
});
29102909
#ifndef NDEBUG
29112910
for (auto &KV : Symbols) {
2912-
auto WeakFlags = JITSymbolFlags::Weak | JITSymbolFlags::Common;
29132911
auto I = MR.SymbolFlags.find(KV.first);
29142912
assert(I != MR.SymbolFlags.end() &&
29152913
"Resolving symbol outside this responsibility set");
29162914
assert(!I->second.hasMaterializationSideEffectsOnly() &&
29172915
"Can't resolve materialization-side-effects-only symbol");
2918-
assert((KV.second.getFlags() & ~WeakFlags) == (I->second & ~WeakFlags) &&
2916+
assert((KV.second.getFlags() & ~JITSymbolFlags::Common) ==
2917+
(I->second & ~JITSymbolFlags::Common) &&
29192918
"Resolving symbol with incorrect flags");
29202919
}
29212920
#endif

llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ class ObjectLinkingLayerJITLinkContext final : public JITLinkContext {
218218
Flags |= JITSymbolFlags::Callable;
219219
if (Sym->getScope() == Scope::Default)
220220
Flags |= JITSymbolFlags::Exported;
221+
if (Sym->getLinkage() == Linkage::Weak)
222+
Flags |= JITSymbolFlags::Weak;
221223

222224
InternedResult[InternedName] =
223225
JITEvaluatedSymbol(Sym->getAddress().getValue(), Flags);

llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -270,17 +270,21 @@ Error RTDyldObjectLinkingLayer::onObjLoad(
270270

271271
auto InternedName = getExecutionSession().intern(KV.first);
272272
auto Flags = KV.second.getFlags();
273-
274-
// Override object flags and claim responsibility for symbols if
275-
// requested.
276-
if (OverrideObjectFlags || AutoClaimObjectSymbols) {
277-
auto I = R.getSymbols().find(InternedName);
278-
279-
if (OverrideObjectFlags && I != R.getSymbols().end())
273+
auto I = R.getSymbols().find(InternedName);
274+
if (I != R.getSymbols().end()) {
275+
// Override object flags and claim responsibility for symbols if
276+
// requested.
277+
if (OverrideObjectFlags)
280278
Flags = I->second;
281-
else if (AutoClaimObjectSymbols && I == R.getSymbols().end())
282-
ExtraSymbolsToClaim[InternedName] = Flags;
283-
}
279+
else {
280+
// RuntimeDyld/MCJIT's weak tracking isn't compatible with ORC's. Even
281+
// if we're not overriding flags in general we should set the weak flag
282+
// according to the MaterializationResponsibility object symbol table.
283+
if (I->second.isWeak())
284+
Flags |= JITSymbolFlags::Weak;
285+
}
286+
} else if (AutoClaimObjectSymbols)
287+
ExtraSymbolsToClaim[InternedName] = Flags;
284288

285289
Symbols[InternedName] = JITEvaluatedSymbol(KV.second.getAddress(), Flags);
286290
}

llvm/test/ExecutionEngine/JITLink/X86/COFF_common_symbol.s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#
77
# CHECK: Creating graph symbols...
88
# CHECK: 7: Creating defined graph symbol for COFF symbol "var" in (common) (index: 0)
9-
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: weak, scope: default, dead - var
9+
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: strong, scope: default, dead - var
1010

1111
.text
1212

0 commit comments

Comments
 (0)