Skip to content

Commit e7698a1

Browse files
committed
Re-apply "[ORC][JITLink] Treat common symbols as weak definitions." with fixes.
This reapplies 785d376, which was reverted in c49837f due 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.
1 parent dbe308c commit e7698a1

File tree

5 files changed

+27
-13
lines changed

5 files changed

+27
-13
lines changed

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol(
467467
return &G->addDefinedSymbol(
468468
G->createZeroFillBlock(getCommonSection(), Symbol.getValue(),
469469
orc::ExecutorAddr(), Symbol.getValue(), 0),
470-
0, SymbolName, Symbol.getValue(), Linkage::Strong, Scope::Default,
470+
0, SymbolName, Symbol.getValue(), Linkage::Weak, Scope::Default,
471471
false, false);
472472
}
473473
if (Symbol.isAbsolute())

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ template <typename ELFT> Error ELFLinkGraphBuilder<ELFT>::graphifySymbols() {
472472
Symbol &GSym = G->addDefinedSymbol(
473473
G->createZeroFillBlock(getCommonSection(), Sym.st_size,
474474
orc::ExecutorAddr(), Sym.getValue(), 0),
475-
0, *Name, Sym.st_size, Linkage::Strong, Scope::Default, false, false);
475+
0, *Name, Sym.st_size, Linkage::Weak, Scope::Default, false, false);
476476
setGraphSymbol(SymIndex, GSym);
477477
continue;
478478
}

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ Error MachOLinkGraphBuilder::graphifyRegularSymbols() {
366366
orc::ExecutorAddrDiff(NSym.Value),
367367
orc::ExecutorAddr(),
368368
1ull << MachO::GET_COMM_ALIGN(NSym.Desc), 0),
369-
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Strong,
369+
0, *NSym.Name, orc::ExecutorAddrDiff(NSym.Value), Linkage::Weak,
370370
NSym.S, false, NSym.Desc & MachO::N_NO_DEAD_STRIP);
371371
} else {
372372
if (!NSym.Name)

llvm/lib/ExecutionEngine/Orc/Core.cpp

+23-9
Original file line numberDiff line numberDiff line change
@@ -932,13 +932,20 @@ Error JITDylib::resolve(MaterializationResponsibility &MR,
932932
if (SymI->second.getFlags().hasError())
933933
SymbolsInErrorState.insert(KV.first);
934934
else {
935-
auto Flags = KV.second.getFlags();
936-
Flags &= ~JITSymbolFlags::Common;
937-
assert(Flags ==
938-
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
939-
"Resolved flags should match the declared flags");
935+
if (SymI->second.getFlags() & JITSymbolFlags::Common) {
936+
auto WeakOrCommon = JITSymbolFlags::Weak | JITSymbolFlags::Common;
937+
assert((KV.second.getFlags() & WeakOrCommon) &&
938+
"Common symbols must be resolved as common or weak");
939+
assert((KV.second.getFlags() & ~WeakOrCommon) ==
940+
(SymI->second.getFlags() & ~JITSymbolFlags::Common) &&
941+
"Resolving symbol with incorrect flags");
940942

941-
Worklist.push_back({SymI, {KV.second.getAddress(), Flags}});
943+
} else
944+
assert(KV.second.getFlags() == SymI->second.getFlags() &&
945+
"Resolved flags should match the declared flags");
946+
947+
Worklist.push_back(
948+
{SymI, {KV.second.getAddress(), SymI->second.getFlags()}});
942949
}
943950
}
944951

@@ -2899,9 +2906,16 @@ Error ExecutionSession::OL_notifyResolved(MaterializationResponsibility &MR,
28992906
"Resolving symbol outside this responsibility set");
29002907
assert(!I->second.hasMaterializationSideEffectsOnly() &&
29012908
"Can't resolve materialization-side-effects-only symbol");
2902-
assert((KV.second.getFlags() & ~JITSymbolFlags::Common) ==
2903-
(I->second & ~JITSymbolFlags::Common) &&
2904-
"Resolving symbol with incorrect flags");
2909+
if (I->second & JITSymbolFlags::Common) {
2910+
auto WeakOrCommon = JITSymbolFlags::Weak | JITSymbolFlags::Common;
2911+
assert((KV.second.getFlags() & WeakOrCommon) &&
2912+
"Common symbols must be resolved as common or weak");
2913+
assert((KV.second.getFlags() & ~WeakOrCommon) ==
2914+
(I->second & ~JITSymbolFlags::Common) &&
2915+
"Resolving symbol with incorrect flags");
2916+
} else
2917+
assert(KV.second.getFlags() == I->second &&
2918+
"Resolving symbol with incorrect flags");
29052919
}
29062920
#endif
29072921

llvm/test/ExecutionEngine/JITLink/x86-64/COFF_common_symbol.s

+1-1
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: strong, scope: default, dead - var
9+
# CHECK-NEXT: 0x0 (block + 0x00000000): size: 0x00000004, linkage: weak, scope: default, dead - var
1010

1111
.text
1212

0 commit comments

Comments
 (0)