[llvm] r334966 - [ORC] Keep weak flag on VSO symbol tables during materialization, but treat

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 18 11:01:42 PDT 2018


Author: lhames
Date: Mon Jun 18 11:01:41 2018
New Revision: 334966

URL: http://llvm.org/viewvc/llvm-project?rev=334966&view=rev
Log:
[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).

Modified:
    llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp

Modified: llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp?rev=334966&r1=334965&r2=334966&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp (original)
+++ llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp Mon Jun 18 11:01:41 2018
@@ -488,8 +488,6 @@ void VSO::resolve(const SymbolMap &Resol
     for (const auto &KV : Resolved) {
       auto &Name = KV.first;
       auto Sym = KV.second;
-      JITSymbolFlags ResolvedFlags = Sym.getFlags();
-      ResolvedFlags &= ~JITSymbolFlags::Weak;
 
       assert(!Sym.getFlags().isLazy() && !Sym.getFlags().isMaterializing() &&
              "Materializing flags should be managed internally");
@@ -502,11 +500,14 @@ void VSO::resolve(const SymbolMap &Resol
              "Symbol should be materializing");
       assert(I->second.getAddress() == 0 && "Symbol has already been resolved");
 
-      assert(ResolvedFlags ==
-                 JITSymbolFlags::stripTransientFlags(I->second.getFlags()) &&
+      assert((Sym.getFlags() & ~JITSymbolFlags::Weak) ==
+                 (JITSymbolFlags::stripTransientFlags(I->second.getFlags()) &
+                  ~JITSymbolFlags::Weak) &&
              "Resolved flags should match the declared flags");
 
       // Once resolved, symbols can never be weak.
+      JITSymbolFlags ResolvedFlags = Sym.getFlags();
+      ResolvedFlags &= ~JITSymbolFlags::Weak;
       ResolvedFlags |= JITSymbolFlags::Materializing;
       I->second = JITEvaluatedSymbol(Sym.getAddress(), ResolvedFlags);
 
@@ -780,7 +781,6 @@ VSO::lookupImpl(std::shared_ptr<Asynchro
       for (auto &KV : MU->getSymbols()) {
         auto SymK = Symbols.find(KV.first);
         auto Flags = SymK->second.getFlags();
-        Flags &= ~JITSymbolFlags::Weak;
         Flags &= ~JITSymbolFlags::Lazy;
         Flags |= JITSymbolFlags::Materializing;
         SymK->second.setFlags(Flags);
@@ -871,7 +871,8 @@ Error VSO::defineImpl(MaterializationUni
 
     if (!Added) {
       if (KV.second.isStrong()) {
-        if (EntryItr->second.getFlags().isStrong())
+        if (EntryItr->second.getFlags().isStrong() ||
+            (EntryItr->second.getFlags() & JITSymbolFlags::Materializing))
           Duplicates.insert(KV.first);
         else
           ExistingDefsOverridden.push_back(EntryItr);
@@ -905,8 +906,6 @@ Error VSO::defineImpl(MaterializationUni
            !ExistingDefItr->second.getFlags().isMaterializing() &&
            "Overridden existing def should be in the Lazy state");
 
-    ExistingDefItr->second.getFlags() &= ~JITSymbolFlags::Weak;
-
     auto UMII = UnmaterializedInfos.find(ExistingDefItr->first);
     assert(UMII != UnmaterializedInfos.end() &&
            "Overridden existing def should have an UnmaterializedInfo");




More information about the llvm-commits mailing list