Re-apply "[ORC][JITLink] Treat common symbols as weak definitions." with fixes.
This reapplies785d376d12, which was reverted inc49837f5f6due to bot failures. The fix was to relax some asserts to allow common symbols to be resolved with either common or weak flags, rather than requiring one or the other.
This commit is contained in:
@@ -467,7 +467,7 @@ Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol(
|
||||
return &G->addDefinedSymbol(
|
||||
G->createZeroFillBlock(getCommonSection(), Symbol.getValue(),
|
||||
orc::ExecutorAddr(), Symbol.getValue(), 0),
|
||||
0, SymbolName, Symbol.getValue(), Linkage::Strong, Scope::Default,
|
||||
0, SymbolName, Symbol.getValue(), Linkage::Weak, Scope::Default,
|
||||
false, false);
|
||||
}
|
||||
if (Symbol.isAbsolute())
|
||||
|
||||
@@ -472,7 +472,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
|
||||
Symbol &GSym = G->addDefinedSymbol(
|
||||
G->createZeroFillBlock(getCommonSection(), Sym.st_size,
|
||||
orc::ExecutorAddr(), Sym.getValue(), 0),
|
||||
0, *Name, Sym.st_size, Linkage::Strong, Scope::Default, false, false);
|
||||
0, *Name, Sym.st_size, Linkage::Weak, Scope::Default, false, false);
|
||||
setGraphSymbol(SymIndex, GSym);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -366,7 +366,7 @@ Error MachOLinkGraphBuilder::graphifyRegularSymbols() {
|
||||
orc::ExecutorAddrDiff(NSym.Value),
|
||||
orc::ExecutorAddr(),
|
||||
1ull << MachO::GET_COMM_ALIGN(NSym.Desc), 0),
|
||||
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Strong,
|
||||
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Weak,
|
||||
NSym.S, false, NSym.Desc & MachO::N_NO_DEAD_STRIP);
|
||||
} else {
|
||||
if (!NSym.Name)
|
||||
|
||||
@@ -932,13 +932,20 @@ Error JITDylib::resolve(MaterializationResponsibility &MR,
|
||||
if (SymI->second.getFlags().hasError())
|
||||
SymbolsInErrorState.insert(KV.first);
|
||||
else {
|
||||
auto Flags = KV.second.getFlags();
|
||||
Flags &= ~JITSymbolFlags::Common;
|
||||
assert(Flags ==
|
||||
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
|
||||
"Resolved flags should match the declared flags");
|
||||
if (SymI->second.getFlags() & JITSymbolFlags::Common) {
|
||||
auto WeakOrCommon = JITSymbolFlags::Weak | JITSymbolFlags::Common;
|
||||
assert((KV.second.getFlags() & WeakOrCommon) &&
|
||||
"Common symbols must be resolved as common or weak");
|
||||
assert((KV.second.getFlags() & ~WeakOrCommon) ==
|
||||
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
|
||||
"Resolving symbol with incorrect flags");
|
||||
|
||||
Worklist.push_back({SymI, {KV.second.getAddress(), Flags}});
|
||||
} else
|
||||
assert(KV.second.getFlags() == SymI->second.getFlags() &&
|
||||
"Resolved flags should match the declared flags");
|
||||
|
||||
Worklist.push_back(
|
||||
{SymI, {KV.second.getAddress(), SymI->second.getFlags()}});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2899,9 +2906,16 @@ Error ExecutionSession::OL_notifyResolved(MaterializationResponsibility &MR,
|
||||
"Resolving symbol outside this responsibility set");
|
||||
assert(!I->second.hasMaterializationSideEffectsOnly() &&
|
||||
"Can't resolve materialization-side-effects-only symbol");
|
||||
assert((KV.second.getFlags() & ~JITSymbolFlags::Common) ==
|
||||
(I->second & ~JITSymbolFlags::Common) &&
|
||||
"Resolving symbol with incorrect flags");
|
||||
if (I->second & JITSymbolFlags::Common) {
|
||||
auto WeakOrCommon = JITSymbolFlags::Weak | JITSymbolFlags::Common;
|
||||
assert((KV.second.getFlags() & WeakOrCommon) &&
|
||||
"Common symbols must be resolved as common or weak");
|
||||
assert((KV.second.getFlags() & ~WeakOrCommon) ==
|
||||
(I->second & ~JITSymbolFlags::Common) &&
|
||||
"Resolving symbol with incorrect flags");
|
||||
} else
|
||||
assert(KV.second.getFlags() == I->second &&
|
||||
"Resolving symbol with incorrect flags");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#
|
||||
# CHECK: Creating graph symbols...
|
||||
# CHECK: 7: Creating defined graph symbol for COFF symbol "var" in (common) (index: 0)
|
||||
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: strong, scope: default, dead - var
|
||||
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: weak, scope: default, dead - var
|
||||
|
||||
.text
|
||||
|
||||
|
||||
Reference in New Issue
Block a user