Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit dcd570f

Browse files
committed
[ORC] Keep weak flag on VSO symbol tables during materialization, but treat
materializing weak symbols as strong. This removes some elaborate flag tweaking and plays nicer with RuntimeDyld, which relies of weak/common flags to determine whether it should emit a given weak definition. (Switching to strong up-front makes it appear as if there is already an overriding definition, which would require an extra back-channel to override). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334966 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent db53e01 commit dcd570f

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

lib/ExecutionEngine/Orc/Core.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -488,8 +488,6 @@ void VSO::resolve(const SymbolMap &Resolved) {
488488
for (const auto &KV : Resolved) {
489489
auto &Name = KV.first;
490490
auto Sym = KV.second;
491-
JITSymbolFlags ResolvedFlags = Sym.getFlags();
492-
ResolvedFlags &= ~JITSymbolFlags::Weak;
493491

494492
assert(!Sym.getFlags().isLazy() && !Sym.getFlags().isMaterializing() &&
495493
"Materializing flags should be managed internally");
@@ -502,11 +500,14 @@ void VSO::resolve(const SymbolMap &Resolved) {
502500
"Symbol should be materializing");
503501
assert(I->second.getAddress() == 0 && "Symbol has already been resolved");
504502

505-
assert(ResolvedFlags ==
506-
JITSymbolFlags::stripTransientFlags(I->second.getFlags()) &&
503+
assert((Sym.getFlags() & ~JITSymbolFlags::Weak) ==
504+
(JITSymbolFlags::stripTransientFlags(I->second.getFlags()) &
505+
~JITSymbolFlags::Weak) &&
507506
"Resolved flags should match the declared flags");
508507

509508
// Once resolved, symbols can never be weak.
509+
JITSymbolFlags ResolvedFlags = Sym.getFlags();
510+
ResolvedFlags &= ~JITSymbolFlags::Weak;
510511
ResolvedFlags |= JITSymbolFlags::Materializing;
511512
I->second = JITEvaluatedSymbol(Sym.getAddress(), ResolvedFlags);
512513

@@ -780,7 +781,6 @@ VSO::lookupImpl(std::shared_ptr<AsynchronousSymbolQuery> &Q,
780781
for (auto &KV : MU->getSymbols()) {
781782
auto SymK = Symbols.find(KV.first);
782783
auto Flags = SymK->second.getFlags();
783-
Flags &= ~JITSymbolFlags::Weak;
784784
Flags &= ~JITSymbolFlags::Lazy;
785785
Flags |= JITSymbolFlags::Materializing;
786786
SymK->second.setFlags(Flags);
@@ -871,7 +871,8 @@ Error VSO::defineImpl(MaterializationUnit &MU) {
871871

872872
if (!Added) {
873873
if (KV.second.isStrong()) {
874-
if (EntryItr->second.getFlags().isStrong())
874+
if (EntryItr->second.getFlags().isStrong() ||
875+
(EntryItr->second.getFlags() & JITSymbolFlags::Materializing))
875876
Duplicates.insert(KV.first);
876877
else
877878
ExistingDefsOverridden.push_back(EntryItr);
@@ -905,8 +906,6 @@ Error VSO::defineImpl(MaterializationUnit &MU) {
905906
!ExistingDefItr->second.getFlags().isMaterializing() &&
906907
"Overridden existing def should be in the Lazy state");
907908

908-
ExistingDefItr->second.getFlags() &= ~JITSymbolFlags::Weak;
909-
910909
auto UMII = UnmaterializedInfos.find(ExistingDefItr->first);
911910
assert(UMII != UnmaterializedInfos.end() &&
912911
"Overridden existing def should have an UnmaterializedInfo");

0 commit comments

Comments
 (0)