OSDN Git Service

[ORC] In MaterializationResponsibility, only maintain the Materializing flag on
authorLang Hames <lhames@gmail.com>
Sun, 17 Jun 2018 16:59:52 +0000 (16:59 +0000)
committerLang Hames <lhames@gmail.com>
Sun, 17 Jun 2018 16:59:52 +0000 (16:59 +0000)
symbols in debug mode.

The MaterializationResponsibility class hijacks the Materializing flag to track
symbols that have not yet been resolved in order to guard against redundant
resolution. Since this is an API contract check and only enforced in debug mode
there is no reason to maintain the flag state in release mode.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334909 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Orc/Core.cpp

index 894e210..96baf62 100644 (file)
@@ -228,8 +228,10 @@ MaterializationResponsibility::MaterializationResponsibility(
     : V(V), SymbolFlags(std::move(SymbolFlags)) {
   assert(!this->SymbolFlags.empty() && "Materializing nothing?");
 
+#ifndef NDEBUG
   for (auto &KV : this->SymbolFlags)
     KV.second |= JITSymbolFlags::Materializing;
+#endif
 }
 
 MaterializationResponsibility::~MaterializationResponsibility() {
@@ -242,15 +244,21 @@ SymbolNameSet MaterializationResponsibility::getRequestedSymbols() {
 }
 
 void MaterializationResponsibility::resolve(const SymbolMap &Symbols) {
+#ifndef NDEBUG
   for (auto &KV : Symbols) {
     auto I = SymbolFlags.find(KV.first);
     assert(I != SymbolFlags.end() &&
            "Resolving symbol outside this responsibility set");
     assert(I->second.isMaterializing() && "Duplicate resolution");
     I->second &= ~JITSymbolFlags::Materializing;
-    assert(KV.second.getFlags() == I->second &&
-           "Resolving symbol with incorrect flags");
+    if (I->second.isWeak())
+      assert(I->second == (KV.second.getFlags() | JITSymbolFlags::Weak) &&
+             "Resolving symbol with incorrect flags");
+    else
+      assert(I->second == KV.second.getFlags() &&
+             "Resolving symbol with incorrect flags");
   }
+#endif
 
   V.resolve(Symbols);
 }
@@ -274,7 +282,9 @@ Error MaterializationResponsibility::defineMaterializing(
   // symbol error.
   for (auto &KV : NewSymbolFlags) {
     auto I = SymbolFlags.insert(KV).first;
+#ifndef NDEBUG
     I->second |= JITSymbolFlags::Materializing;
+#endif
   }
 
   return V.defineMaterializing(NewSymbolFlags);