<div dir="ltr"><div dir="ltr">That warning seems unhelpful. Looks like there's already a bug filed for it: <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414">https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414</a></div><div dir="ltr"><br></div><div>What's our policy on building warning clean on GCC? If we need to build warning clean there I can work around this by declaring that field as a uint8_t instead and casting.</div><div><br></div><div>-- Lang.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, May 29, 2019 at 3:42 PM Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="ltr">I'm getting this warning when compiled with gcc 5.5<div><br></div><div>include/llvm/ExecutionEngine/Orc/Core.h:690:25: error: â€˜llvm::orc::JITDylib::SymbolTableEntry::State’ is too small to hold all values of â€˜enum class llvm::orc::JITDylib::SymbolState’ [-Werror]<br>  Â  Â SymbolState State : 6;<br></div><div><br></div><div>I think gcc uses the declared type of the enum class for this check. So it wants 8 bits here to match the uint8_t.</div><div><br clear="all"><div><div dir="ltr" class="gmail-m_5869530437138709034gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, May 28, 2019 at 4:32 PM Lang Hames via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Author: lhames<br>
Date: Tue May 28 16:35:44 2019<br>
New Revision: 361899<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=361899&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=361899&view=rev</a><br>
Log:<br>
[ORC] Track JIT symbol states more explicitly.<br>
<br>
Prior to this patch, JITDylibs inferred symbol states (whether a symbol was<br>
newly added, materializing, resolved, or ready to run) via a combination of (1)<br>
bits in the JITSymbolFlags member, and (2) the state of some internal JITDylib<br>
data structures. This patch explicitly tracks symbol states by adding a new<br>
SymbolState member to the symbol table entries, and removing the 'Lazy' and<br>
'Materializing' bits from JITSymbolFlags. This is a first step towards adding<br>
additional states representing initialization phases (e.g. eh-frame registration,<br>
registration with the language runtime, and static initialization).<br>
<br>
Modified:<br>
  Â  llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h<br>
  Â  llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h<br>
  Â  llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp<br>
  Â  llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h?rev=361899&r1=361898&r2=361899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h?rev=361899&r1=361898&r2=361899&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/JITSymbol.h Tue May 28 16:35:44 2019<br>
@@ -65,15 +65,9 @@ public:<br>
  Â  Â Absolute = 1U << 3,<br>
  Â  Â Exported = 1U << 4,<br>
  Â  Â Callable = 1U << 5,<br>
-  Â  Lazy = 1U << 6,<br>
-  Â  Materializing = 1U << 7,<br>
-  Â  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Materializing)<br>
+  Â  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Callable)<br>
  Â };<br>
<br>
-  static JITSymbolFlags stripTransientFlags(JITSymbolFlags Orig) {<br>
-  Â  return static_cast<FlagNames>(Orig.Flags & ~Lazy & ~Materializing);<br>
-  }<br>
-<br>
  Â /// Default-construct a JITSymbolFlags instance.<br>
  Â JITSymbolFlags() = default;<br>
<br>
@@ -110,19 +104,6 @@ public:<br>
  Â  Â return (Flags & HasError) == HasError;<br>
  Â }<br>
<br>
-  /// Returns true if this is a lazy symbol.<br>
-  ///  Â  Â  Â  This flag is used internally by the JIT APIs to track<br>
-  ///  Â  Â  Â  materialization states.<br>
-  bool isLazy() const { return Flags & Lazy; }<br>
-<br>
-  /// Returns true if this symbol is in the process of being<br>
-  ///  Â  Â  Â  materialized.<br>
-  bool isMaterializing() const { return Flags & Materializing; }<br>
-<br>
-  /// Returns true if this symbol is fully materialized.<br>
-  ///  Â  Â  Â  (i.e. neither lazy, nor materializing).<br>
-  bool isMaterialized() const { return !(Flags & (Lazy | Materializing)); }<br>
-<br>
  Â /// Returns true if the Weak flag is set.<br>
  Â bool isWeak() const {<br>
  Â  Â return (Flags & Weak) == Weak;<br>
<br>
Modified: llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h?rev=361899&r1=361898&r2=361899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h?rev=361899&r1=361898&r2=361899&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h (original)<br>
+++ llvm/trunk/include/llvm/ExecutionEngine/Orc/Core.h Tue May 28 16:35:44 2019<br>
@@ -641,6 +641,59 @@ private:<br>
  Â  Â LLVM_MARK_AS_BITMASK_ENUM(NotifyFullyReady)<br>
  Â };<br>
<br>
+  enum class SymbolState : uint8_t {<br>
+  Â  Invalid,  Â  Â  Â // No symbol should be in this state.<br>
+  Â  NeverSearched, // Added to the symbol table, never queried.<br>
+  Â  Materializing, // Queried, materialization begun.<br>
+  Â  Resolved,  Â  Â  // Assigned address, still materializing.<br>
+  Â  Ready = 0x3f  Â // Ready and safe for clients to access.<br>
+  };<br>
+<br>
+  class SymbolTableEntry {<br>
+  public:<br>
+  Â  SymbolTableEntry() = default;<br>
+  Â  SymbolTableEntry(JITSymbolFlags Flags)<br>
+  Â  Â  Â  : Flags(Flags), State(SymbolState::NeverSearched),<br>
+  Â  Â  Â  Â  MaterializerAttached(false), PendingRemoval(false) {}<br>
+<br>
+  Â  JITTargetAddress getAddress() const { return Addr; }<br>
+  Â  JITSymbolFlags getFlags() const { return Flags; }<br>
+  Â  SymbolState getState() const { return State; }<br>
+<br>
+  Â  bool isInMaterializationPhase() const {<br>
+  Â  Â  return State == SymbolState::Materializing ||<br>
+  Â  Â  Â  Â  Â  Â State == SymbolState::Resolved;<br>
+  Â  }<br>
+<br>
+  Â  bool hasMaterializerAttached() const { return MaterializerAttached; }<br>
+  Â  bool isPendingRemoval() const { return PendingRemoval; }<br>
+<br>
+  Â  void setAddress(JITTargetAddress Addr) { this->Addr = Addr; }<br>
+  Â  void setFlags(JITSymbolFlags Flags) { this->Flags = Flags; }<br>
+  Â  void setState(SymbolState State) { this->State = State; }<br>
+<br>
+  Â  void setMaterializerAttached(bool MaterializerAttached) {<br>
+  Â  Â  this->MaterializerAttached = MaterializerAttached;<br>
+  Â  }<br>
+<br>
+  Â  void setPendingRemoval(bool PendingRemoval) {<br>
+  Â  Â  this->PendingRemoval = PendingRemoval;<br>
+  Â  }<br>
+<br>
+  Â  JITEvaluatedSymbol getSymbol() const {<br>
+  Â  Â  return JITEvaluatedSymbol(Addr, Flags);<br>
+  Â  }<br>
+<br>
+  private:<br>
+  Â  JITTargetAddress Addr = 0;<br>
+  Â  JITSymbolFlags Flags;<br>
+  Â  SymbolState State : 6;<br>
+  Â  bool MaterializerAttached : 1;<br>
+  Â  bool PendingRemoval : 1;<br>
+  };<br>
+<br>
+  using SymbolTable = DenseMap<SymbolStringPtr, SymbolTableEntry>;<br>
+<br>
  Â JITDylib(ExecutionSession &ES, std::string Name);<br>
<br>
  Â Error defineImpl(MaterializationUnit &MU);<br>
@@ -685,7 +738,7 @@ private:<br>
<br>
  Â ExecutionSession &ES;<br>
  Â std::string JITDylibName;<br>
-  SymbolMap Symbols;<br>
+  SymbolTable Symbols;<br>
  Â UnmaterializedInfosMap UnmaterializedInfos;<br>
  Â MaterializingInfosMap MaterializingInfos;<br>
  Â GeneratorFunction DefGenerator;<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp?rev=361899&r1=361898&r2=361899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp?rev=361899&r1=361898&r2=361899&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/Core.cpp Tue May 28 16:35:44 2019<br>
@@ -371,11 +371,6 @@ MaterializationResponsibility::Materiali<br>
  Â  Â JITDylib &JD, SymbolFlagsMap SymbolFlags, VModuleKey K)<br>
  Â  Â : JD(JD), SymbolFlags(std::move(SymbolFlags)), K(std::move(K)) {<br>
  Â assert(!this->SymbolFlags.empty() && "Materializing nothing?");<br>
-<br>
-#ifndef NDEBUG<br>
-  for (auto &KV : this->SymbolFlags)<br>
-  Â  KV.second |= JITSymbolFlags::Materializing;<br>
-#endif<br>
 }<br>
<br>
 MaterializationResponsibility::~MaterializationResponsibility() {<br>
@@ -395,8 +390,6 @@ void MaterializationResponsibility::reso<br>
  Â  Â auto I = SymbolFlags.find(KV.first);<br>
  Â  Â assert(I != SymbolFlags.end() &&<br>
  Â  Â  Â  Â  Â  "Resolving symbol outside this responsibility set");<br>
-  Â  assert(I->second.isMaterializing() && "Duplicate resolution");<br>
-  Â  I->second &= ~JITSymbolFlags::Materializing;<br>
  Â  Â if (I->second.isWeak())<br>
  Â  Â  Â assert(I->second == (KV.second.getFlags() | JITSymbolFlags::Weak) &&<br>
  Â  Â  Â  Â  Â  Â  "Resolving symbol with incorrect flags");<br>
@@ -415,12 +408,6 @@ void MaterializationResponsibility::emit<br>
  Â  Â dbgs() << "In " << JD.getName() << " emitting " << SymbolFlags << "\n";<br>
  Â });<br>
<br>
-#ifndef NDEBUG<br>
-  for (auto &KV : SymbolFlags)<br>
-  Â  assert(!KV.second.isMaterializing() &&<br>
-  Â  Â  Â  Â  Â "Failed to resolve symbol before emission");<br>
-#endif // NDEBUG<br>
-<br>
  Â JD.emit(SymbolFlags);<br>
  Â SymbolFlags.clear();<br>
 }<br>
@@ -431,13 +418,8 @@ Error MaterializationResponsibility::def<br>
  Â // It's ok if we hit a duplicate here: In that case the new version will be<br>
  Â // discarded, and the JITDylib::defineMaterializing method will return a<br>
  Â // duplicate symbol error.<br>
-  for (auto &KV : NewSymbolFlags) {<br>
-  Â  auto I = SymbolFlags.insert(KV).first;<br>
-  Â  (void)I;<br>
-#ifndef NDEBUG<br>
-  Â  I->second |= JITSymbolFlags::Materializing;<br>
-#endif<br>
-  }<br>
+  for (auto &KV : NewSymbolFlags)<br>
+  Â  SymbolFlags.insert(KV);<br>
<br>
  Â return JD.defineMaterializing(NewSymbolFlags);<br>
 }<br>
@@ -744,21 +726,19 @@ ReexportsGenerator::operator()(JITDylib<br>
<br>
 Error JITDylib::defineMaterializing(const SymbolFlagsMap &SymbolFlags) {<br>
  Â return ES.runSessionLocked([&]() -> Error {<br>
-  Â  std::vector<SymbolMap::iterator> AddedSyms;<br>
+  Â  std::vector<SymbolTable::iterator> AddedSyms;<br>
<br>
  Â  Â for (auto &KV : SymbolFlags) {<br>
-  Â  Â  SymbolMap::iterator EntryItr;<br>
+  Â  Â  SymbolTable::iterator EntryItr;<br>
  Â  Â  Â bool Added;<br>
<br>
-  Â  Â  auto NewFlags = KV.second;<br>
-  Â  Â  NewFlags |= JITSymbolFlags::Materializing;<br>
-<br>
-  Â  Â  std::tie(EntryItr, Added) = Symbols.insert(<br>
-  Â  Â  Â  Â  std::make_pair(KV.first, JITEvaluatedSymbol(0, NewFlags)));<br>
+  Â  Â  std::tie(EntryItr, Added) =<br>
+  Â  Â  Â  Â  Symbols.insert(std::make_pair(KV.first, SymbolTableEntry(KV.second)));<br>
<br>
-  Â  Â  if (Added)<br>
+  Â  Â  if (Added) {<br>
  Â  Â  Â  Â AddedSyms.push_back(EntryItr);<br>
-  Â  Â  else {<br>
+  Â  Â  Â  EntryItr->second.setState(SymbolState::Materializing);<br>
+  Â  Â  } else {<br>
  Â  Â  Â  Â // Remove any symbols already added.<br>
  Â  Â  Â  Â for (auto &SI : AddedSyms)<br>
  Â  Â  Â  Â  Â Symbols.erase(SI);<br>
@@ -782,9 +762,10 @@ void JITDylib::replace(std::unique_ptr<M<br>
  Â  Â  Â  Â for (auto &KV : MU->getSymbols()) {<br>
  Â  Â  Â  Â  Â auto SymI = Symbols.find(KV.first);<br>
  Â  Â  Â  Â  Â assert(SymI != Symbols.end() && "Replacing unknown symbol");<br>
-  Â  Â  Â  Â  assert(!SymI->second.getFlags().isLazy() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â SymI->second.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â "Can not replace symbol that is not materializing");<br>
+  Â  Â  Â  Â  assert(SymI->second.isInMaterializationPhase() &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Can not call replace on a symbol that is not materializing");<br>
+  Â  Â  Â  Â  assert(!SymI->second.hasMaterializerAttached() &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Symbol should not have materializer attached already");<br>
  Â  Â  Â  Â  Â assert(UnmaterializedInfos.count(KV.first) == 0 &&<br>
  Â  Â  Â  Â  Â  Â  Â  Â  "Symbol being replaced should have no UnmaterializedInfo");<br>
  Â  Â  Â  Â }<br>
@@ -803,16 +784,15 @@ void JITDylib::replace(std::unique_ptr<M<br>
  Â  Â  Â  Â // Otherwise, make MU responsible for all the symbols.<br>
  Â  Â  Â  Â auto UMI = std::make_shared<UnmaterializedInfo>(std::move(MU));<br>
  Â  Â  Â  Â for (auto &KV : UMI->MU->getSymbols()) {<br>
-  Â  Â  Â  Â  assert(!KV.second.isLazy() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â "Lazy flag should be managed internally.");<br>
-  Â  Â  Â  Â  assert(!KV.second.isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â "Materializing flags should be managed internally.");<br>
-<br>
  Â  Â  Â  Â  Â auto SymI = Symbols.find(KV.first);<br>
-  Â  Â  Â  Â  JITSymbolFlags ReplaceFlags = KV.second;<br>
-  Â  Â  Â  Â  ReplaceFlags |= JITSymbolFlags::Lazy;<br>
-  Â  Â  Â  Â  SymI->second = JITEvaluatedSymbol(SymI->second.getAddress(),<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  std::move(ReplaceFlags));<br>
+  Â  Â  Â  Â  assert(SymI->second.getState() == SymbolState::Materializing &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Can not replace a symbol that is not materializing");<br>
+  Â  Â  Â  Â  assert(!SymI->second.hasMaterializerAttached() &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Can not replace a symbol that has a materializer attached");<br>
+  Â  Â  Â  Â  assert(UnmaterializedInfos.count(KV.first) == 0 &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Unexpected materializer entry in map");<br>
+  Â  Â  Â  Â  SymI->second.setAddress(SymI->second.getAddress());<br>
+  Â  Â  Â  Â  SymI->second.setMaterializerAttached(true);<br>
  Â  Â  Â  Â  Â UnmaterializedInfos[KV.first] = UMI;<br>
  Â  Â  Â  Â }<br>
<br>
@@ -830,9 +810,9 @@ JITDylib::getRequestedSymbols(const Symb<br>
<br>
  Â  Â for (auto &KV : SymbolFlags) {<br>
  Â  Â  Â assert(Symbols.count(KV.first) && "JITDylib does not cover this symbol?");<br>
-  Â  Â  assert(Symbols.find(KV.first)->second.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â "getRequestedSymbols can only be called for materializing "<br>
-  Â  Â  Â  Â  Â  Â "symbols");<br>
+  Â  Â  assert(Symbols.find(KV.first)->second.isInMaterializationPhase() &&<br>
+  Â  Â  Â  Â  Â  Â "getRequestedSymbols can only be called for symbols that have "<br>
+  Â  Â  Â  Â  Â  Â "started materializing");<br>
  Â  Â  Â auto I = MaterializingInfos.find(KV.first);<br>
  Â  Â  Â if (I == MaterializingInfos.end())<br>
  Â  Â  Â  Â continue;<br>
@@ -848,9 +828,8 @@ JITDylib::getRequestedSymbols(const Symb<br>
 void JITDylib::addDependencies(const SymbolStringPtr &Name,<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  const SymbolDependenceMap &Dependencies) {<br>
  Â assert(Symbols.count(Name) && "Name not in symbol table");<br>
-  assert((Symbols[Name].getFlags().isLazy() ||<br>
-  Â  Â  Â  Â  Symbols[Name].getFlags().isMaterializing()) &&<br>
-  Â  Â  Â  Â "Symbol is not lazy or materializing");<br>
+  assert(Symbols[Name].isInMaterializationPhase() &&<br>
+  Â  Â  Â  Â "Can not add dependencies for a symbol that is not materializing");<br>
<br>
  Â auto &MI = MaterializingInfos[Name];<br>
  Â assert(!MI.IsEmitted && "Can not add dependencies to an emitted symbol");<br>
@@ -865,9 +844,8 @@ void JITDylib::addDependencies(const Sym<br>
  Â  Â  Â // Assert that this symbol exists and has not been emitted already.<br>
  Â  Â  Â auto SymI = OtherJITDylib.Symbols.find(OtherSymbol);<br>
  Â  Â  Â assert(SymI != OtherJITDylib.Symbols.end() &&<br>
-  Â  Â  Â  Â  Â  Â (SymI->second.getFlags().isLazy() ||<br>
-  Â  Â  Â  Â  Â  Â  SymI->second.getFlags().isMaterializing()) &&<br>
-  Â  Â  Â  Â  Â  Â "Dependency on emitted symbol");<br>
+  Â  Â  Â  Â  Â  Â (SymI->second.getState() != SymbolState::Ready &&<br>
+  Â  Â  Â  Â  Â  Â  "Dependency on emitted symbol"));<br>
 #endif<br>
<br>
  Â  Â  Â auto &OtherMI = OtherJITDylib.MaterializingInfos[OtherSymbol];<br>
@@ -892,27 +870,25 @@ void JITDylib::resolve(const SymbolMap &<br>
  Â  Â  Â auto &Name = KV.first;<br>
  Â  Â  Â auto Sym = KV.second;<br>
<br>
-  Â  Â  assert(!Sym.getFlags().isLazy() && !Sym.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â "Materializing flags should be managed internally");<br>
-<br>
  Â  Â  Â auto I = Symbols.find(Name);<br>
<br>
  Â  Â  Â assert(I != Symbols.end() && "Symbol not found");<br>
-  Â  Â  assert(!I->second.getFlags().isLazy() &&<br>
-  Â  Â  Â  Â  Â  Â I->second.getFlags().isMaterializing() &&<br>
+  Â  Â  assert(!I->second.hasMaterializerAttached() &&<br>
+  Â  Â  Â  Â  Â  Â "Resolving symbol with materializer attached?");<br>
+  Â  Â  assert(I->second.getState() == SymbolState::Materializing &&<br>
  Â  Â  Â  Â  Â  Â  "Symbol should be materializing");<br>
  Â  Â  Â assert(I->second.getAddress() == 0 && "Symbol has already been resolved");<br>
<br>
  Â  Â  Â assert((Sym.getFlags() & ~JITSymbolFlags::Weak) ==<br>
-  Â  Â  Â  Â  Â  Â  Â  Â (JITSymbolFlags::stripTransientFlags(I->second.getFlags()) &<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  ~JITSymbolFlags::Weak) &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â (I->second.getFlags() & ~JITSymbolFlags::Weak) &&<br>
  Â  Â  Â  Â  Â  Â  "Resolved flags should match the declared flags");<br>
<br>
  Â  Â  Â // Once resolved, symbols can never be weak.<br>
  Â  Â  Â JITSymbolFlags ResolvedFlags = Sym.getFlags();<br>
  Â  Â  Â ResolvedFlags &= ~JITSymbolFlags::Weak;<br>
-  Â  Â  ResolvedFlags |= JITSymbolFlags::Materializing;<br>
-  Â  Â  I->second = JITEvaluatedSymbol(Sym.getAddress(), ResolvedFlags);<br>
+  Â  Â  I->second.setAddress(Sym.getAddress());<br>
+  Â  Â  I->second.setFlags(ResolvedFlags);<br>
+  Â  Â  I->second.setState(SymbolState::Resolved);<br>
<br>
  Â  Â  Â auto &MI = MaterializingInfos[Name];<br>
  Â  Â  Â for (auto &Q : MI.PendingQueries) {<br>
@@ -986,9 +962,7 @@ void JITDylib::emit(const SymbolFlagsMap<br>
  Â  Â  Â  Â  Â  Â // and update its materializing state.<br>
  Â  Â  Â  Â  Â  Â assert(DependantJD.Symbols.count(DependantName) &&<br>
  Â  Â  Â  Â  Â  Â  Â  Â  Â  "Dependant has no entry in the Symbols table");<br>
-  Â  Â  Â  Â  Â  auto &DependantSym = DependantJD.Symbols[DependantName];<br>
-  Â  Â  Â  Â  Â  DependantSym.setFlags(DependantSym.getFlags() &<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ~JITSymbolFlags::Materializing);<br>
+  Â  Â  Â  Â  Â  DependantJD.Symbols[DependantName].setState(SymbolState::Ready);<br>
  Â  Â  Â  Â  Â  Â DependantJD.MaterializingInfos.erase(DependantMII);<br>
  Â  Â  Â  Â  Â }<br>
  Â  Â  Â  Â }<br>
@@ -1005,8 +979,7 @@ void JITDylib::emit(const SymbolFlagsMap<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â  Â assert(Symbols.count(Name) &&<br>
  Â  Â  Â  Â  Â  Â  Â  "Symbol has no entry in the Symbols table");<br>
-  Â  Â  Â  auto &Sym = Symbols[Name];<br>
-  Â  Â  Â  Sym.setFlags(Sym.getFlags() & ~JITSymbolFlags::Materializing);<br>
+  Â  Â  Â  Symbols[Name].setState(SymbolState::Ready);<br>
  Â  Â  Â  Â MaterializingInfos.erase(MII);<br>
  Â  Â  Â }<br>
  Â  Â }<br>
@@ -1124,7 +1097,7 @@ void JITDylib::removeFromSearchOrder(JIT<br>
 Error JITDylib::remove(const SymbolNameSet &Names) {<br>
  Â return ES.runSessionLocked([&]() -> Error {<br>
  Â  Â using SymbolMaterializerItrPair =<br>
-  Â  Â  Â  std::pair<SymbolMap::iterator, UnmaterializedInfosMap::iterator>;<br>
+  Â  Â  Â  std::pair<SymbolTable::iterator, UnmaterializedInfosMap::iterator>;<br>
  Â  Â std::vector<SymbolMaterializerItrPair> SymbolsToRemove;<br>
  Â  Â SymbolNameSet Missing;<br>
  Â  Â SymbolNameSet Materializing;<br>
@@ -1139,13 +1112,14 @@ Error JITDylib::remove(const SymbolNameS<br>
  Â  Â  Â }<br>
<br>
  Â  Â  Â // Note symbol materializing.<br>
-  Â  Â  if (I->second.getFlags().isMaterializing()) {<br>
+  Â  Â  if (I->second.isInMaterializationPhase()) {<br>
  Â  Â  Â  Â Materializing.insert(Name);<br>
  Â  Â  Â  Â continue;<br>
  Â  Â  Â }<br>
<br>
-  Â  Â  auto UMII = I->second.getFlags().isLazy() ? UnmaterializedInfos.find(Name)<br>
-  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  : UnmaterializedInfos.end();<br>
+  Â  Â  auto UMII = I->second.hasMaterializerAttached()<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ? UnmaterializedInfos.find(Name)<br>
+  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  : UnmaterializedInfos.end();<br>
  Â  Â  Â SymbolsToRemove.push_back(std::make_pair(I, UMII));<br>
  Â  Â }<br>
<br>
@@ -1205,14 +1179,11 @@ Expected<SymbolNameSet> JITDylib::lookup<br>
<br>
  Â for (auto &Name : Names) {<br>
  Â  Â auto I = Symbols.find(Name);<br>
-<br>
-  Â  if (I == Symbols.end()) {<br>
+  Â  if (I != Symbols.end()) {<br>
+  Â  Â  assert(!Flags.count(Name) && "Symbol already present in Flags map");<br>
+  Â  Â  Flags[Name] = I->second.getFlags();<br>
+  Â  } else<br>
  Â  Â  Â Unresolved.insert(Name);<br>
-  Â  Â  continue;<br>
-  Â  }<br>
-<br>
-  Â  assert(!Flags.count(Name) && "Symbol already present in Flags map");<br>
-  Â  Flags[Name] = JITSymbolFlags::stripTransientFlags(I->second.getFlags());<br>
  Â }<br>
<br>
  Â return Unresolved;<br>
@@ -1247,6 +1218,7 @@ void JITDylib::lodgeQueryImpl(<br>
<br>
  Â std::vector<SymbolStringPtr> ToRemove;<br>
  Â for (auto Name : Unresolved) {<br>
+<br>
  Â  Â // Search for the name in Symbols. Skip it if not found.<br>
  Â  Â auto SymI = Symbols.find(Name);<br>
  Â  Â if (SymI == Symbols.end())<br>
@@ -1260,16 +1232,17 @@ void JITDylib::lodgeQueryImpl(<br>
  Â  Â // set.<br>
  Â  Â ToRemove.push_back(Name);<br>
<br>
-  Â  // If the symbol has an address then resolve it.<br>
-  Â  if (SymI->second.getAddress() != 0)<br>
-  Â  Â  Q->resolve(Name, SymI->second);<br>
-<br>
-  Â  // If the symbol is lazy, get the MaterialiaztionUnit for it.<br>
-  Â  if (SymI->second.getFlags().isLazy()) {<br>
+  Â  if (SymI->second.getState() >= SymbolState::Resolved) {<br>
+  Â  Â  assert(!SymI->second.hasMaterializerAttached() &&<br>
+  Â  Â  Â  Â  Â  Â "Resolved symbols should not have materializers attached");<br>
+  Â  Â  Q->resolve(Name, SymI->second.getSymbol());<br>
+  Â  Â  if (SymI->second.getState() == SymbolState::Ready) {<br>
+  Â  Â  Â  Q->notifySymbolReady();<br>
+  Â  Â  Â  continue;<br>
+  Â  Â  }<br>
+  Â  } else if (SymI->second.hasMaterializerAttached()) {<br>
  Â  Â  Â assert(SymI->second.getAddress() == 0 &&<br>
-  Â  Â  Â  Â  Â  Â "Lazy symbol should not have a resolved address");<br>
-  Â  Â  assert(!SymI->second.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â "Materializing and lazy should not both be set");<br>
+  Â  Â  Â  Â  Â  Â "Symbol not resolved but already has address?");<br>
  Â  Â  Â auto UMII = UnmaterializedInfos.find(Name);<br>
  Â  Â  Â assert(UMII != UnmaterializedInfos.end() &&<br>
  Â  Â  Â  Â  Â  Â  "Lazy symbol should have UnmaterializedInfo");<br>
@@ -1280,24 +1253,17 @@ void JITDylib::lodgeQueryImpl(<br>
  Â  Â  Â // materializing state.<br>
  Â  Â  Â for (auto &KV : MU->getSymbols()) {<br>
  Â  Â  Â  Â auto SymK = Symbols.find(KV.first);<br>
-  Â  Â  Â  auto Flags = SymK->second.getFlags();<br>
-  Â  Â  Â  Flags &= ~JITSymbolFlags::Lazy;<br>
-  Â  Â  Â  Flags |= JITSymbolFlags::Materializing;<br>
-  Â  Â  Â  SymK->second.setFlags(Flags);<br>
+  Â  Â  Â  SymK->second.setMaterializerAttached(false);<br>
+  Â  Â  Â  SymK->second.setState(SymbolState::Materializing);<br>
  Â  Â  Â  Â UnmaterializedInfos.erase(KV.first);<br>
  Â  Â  Â }<br>
<br>
  Â  Â  Â // Add MU to the list of MaterializationUnits to be materialized.<br>
  Â  Â  Â MUs.push_back(std::move(MU));<br>
-  Â  } else if (!SymI->second.getFlags().isMaterializing()) {<br>
-  Â  Â  // The symbol is neither lazy nor materializing, so it must be<br>
-  Â  Â  // ready. Notify the query and continue.<br>
-  Â  Â  Q->notifySymbolReady();<br>
-  Â  Â  continue;<br>
  Â  Â }<br>
<br>
  Â  Â // Add the query to the PendingQueries list.<br>
-  Â  assert(SymI->second.getFlags().isMaterializing() &&<br>
+  Â  assert(SymI->second.isInMaterializationPhase() &&<br>
  Â  Â  Â  Â  Â  "By this line the symbol should be materializing");<br>
  Â  Â auto &MI = MaterializingInfos[Name];<br>
  Â  Â MI.PendingQueries.push_back(Q);<br>
@@ -1387,17 +1353,15 @@ JITDylib::lookupImpl(std::shared_ptr<Asy<br>
<br>
  Â  Â // If the symbol has an address then resolve it.<br>
  Â  Â if (SymI->second.getAddress() != 0) {<br>
-  Â  Â  Q->resolve(Name, SymI->second);<br>
+  Â  Â  Q->resolve(Name, SymI->second.getSymbol());<br>
  Â  Â  Â if (Q->isFullyResolved())<br>
  Â  Â  Â  Â ActionFlags |= NotifyFullyResolved;<br>
  Â  Â }<br>
<br>
  Â  Â // If the symbol is lazy, get the MaterialiaztionUnit for it.<br>
-  Â  if (SymI->second.getFlags().isLazy()) {<br>
+  Â  if (SymI->second.hasMaterializerAttached()) {<br>
  Â  Â  Â assert(SymI->second.getAddress() == 0 &&<br>
  Â  Â  Â  Â  Â  Â  "Lazy symbol should not have a resolved address");<br>
-  Â  Â  assert(!SymI->second.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â "Materializing and lazy should not both be set");<br>
  Â  Â  Â auto UMII = UnmaterializedInfos.find(Name);<br>
  Â  Â  Â assert(UMII != UnmaterializedInfos.end() &&<br>
  Â  Â  Â  Â  Â  Â  "Lazy symbol should have UnmaterializedInfo");<br>
@@ -1408,18 +1372,15 @@ JITDylib::lookupImpl(std::shared_ptr<Asy<br>
  Â  Â  Â // materializing state.<br>
  Â  Â  Â for (auto &KV : MU->getSymbols()) {<br>
  Â  Â  Â  Â auto SymK = Symbols.find(KV.first);<br>
-  Â  Â  Â  auto Flags = SymK->second.getFlags();<br>
-  Â  Â  Â  Flags &= ~JITSymbolFlags::Lazy;<br>
-  Â  Â  Â  Flags |= JITSymbolFlags::Materializing;<br>
-  Â  Â  Â  SymK->second.setFlags(Flags);<br>
+  Â  Â  Â  assert(SymK != Symbols.end() && "Missing symbol table entry");<br>
+  Â  Â  Â  SymK->second.setState(SymbolState::Materializing);<br>
+  Â  Â  Â  SymK->second.setMaterializerAttached(false);<br>
  Â  Â  Â  Â UnmaterializedInfos.erase(KV.first);<br>
  Â  Â  Â }<br>
<br>
  Â  Â  Â // Add MU to the list of MaterializationUnits to be materialized.<br>
  Â  Â  Â MUs.push_back(std::move(MU));<br>
-  Â  } else if (!SymI->second.getFlags().isMaterializing()) {<br>
-  Â  Â  // The symbol is neither lazy nor materializing, so it must be ready.<br>
-  Â  Â  // Notify the query and continue.<br>
+  Â  } else if (SymI->second.getState() == SymbolState::Ready) {<br>
  Â  Â  Â Q->notifySymbolReady();<br>
  Â  Â  Â if (Q->isFullyReady())<br>
  Â  Â  Â  Â ActionFlags |= NotifyFullyReady;<br>
@@ -1427,7 +1388,7 @@ JITDylib::lookupImpl(std::shared_ptr<Asy<br>
  Â  Â }<br>
<br>
  Â  Â // Add the query to the PendingQueries list.<br>
-  Â  assert(SymI->second.getFlags().isMaterializing() &&<br>
+  Â  assert(SymI->second.isInMaterializationPhase() &&<br>
  Â  Â  Â  Â  Â  "By this line the symbol should be materializing");<br>
  Â  Â auto &MI = MaterializingInfos[Name];<br>
  Â  Â MI.PendingQueries.push_back(Q);<br>
@@ -1455,21 +1416,36 @@ void JITDylib::dump(raw_ostream &OS) {<br>
  Â  Â for (auto &KV : Symbols) {<br>
  Â  Â  Â OS << "  Â  \"" << *KV.first << "\": ";<br>
  Â  Â  Â if (auto Addr = KV.second.getAddress())<br>
-  Â  Â  Â  OS << format("0x%016" PRIx64, Addr) << ", " << KV.second.getFlags();<br>
+  Â  Â  Â  OS << format("0x%016" PRIx64, Addr) << ", " << KV.second.getFlags()<br>
+  Â  Â  Â  Â  Â << " ";<br>
  Â  Â  Â else<br>
-  Â  Â  Â  OS << "<not resolved>";<br>
-  Â  Â  if (KV.second.getFlags().isLazy() ||<br>
-  Â  Â  Â  Â  KV.second.getFlags().isMaterializing()) {<br>
-  Â  Â  Â  OS << " (";<br>
-  Â  Â  Â  if (KV.second.getFlags().isLazy()) {<br>
-  Â  Â  Â  Â  auto I = UnmaterializedInfos.find(KV.first);<br>
-  Â  Â  Â  Â  assert(I != UnmaterializedInfos.end() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â "Lazy symbol should have UnmaterializedInfo");<br>
-  Â  Â  Â  Â  OS << " Lazy (MU=" << I->second->MU.get() << ")";<br>
-  Â  Â  Â  }<br>
-  Â  Â  Â  if (KV.second.getFlags().isMaterializing())<br>
-  Â  Â  Â  Â  OS << " Materializing";<br>
-  Â  Â  Â  OS << ", " << KV.second.getFlags() << " )\n";<br>
+  Â  Â  Â  OS << "<not resolved> ";<br>
+<br>
+  Â  Â  switch (KV.second.getState()) {<br>
+  Â  Â  case SymbolState::Invalid:<br>
+  Â  Â  Â  OS << "Invalid";<br>
+  Â  Â  Â  break;<br>
+  Â  Â  case SymbolState::NeverSearched:<br>
+  Â  Â  Â  OS << "Never-Searched";<br>
+  Â  Â  Â  break;<br>
+  Â  Â  case SymbolState::Materializing:<br>
+  Â  Â  Â  OS << "Materializing";<br>
+  Â  Â  Â  break;<br>
+  Â  Â  case SymbolState::Resolved:<br>
+  Â  Â  Â  OS << "Resolved";<br>
+  Â  Â  Â  break;<br>
+  Â  Â  case SymbolState::Ready:<br>
+  Â  Â  Â  OS << "Ready";<br>
+  Â  Â  Â  break;<br>
+  Â  Â  Â  // default: llvm_unreachable("Invalid state"); break;<br>
+  Â  Â  }<br>
+<br>
+  Â  Â  if (KV.second.hasMaterializerAttached()) {<br>
+  Â  Â  Â  OS << " (Materializer ";<br>
+  Â  Â  Â  auto I = UnmaterializedInfos.find(KV.first);<br>
+  Â  Â  Â  assert(I != UnmaterializedInfos.end() &&<br>
+  Â  Â  Â  Â  Â  Â  Â "Lazy symbol should have UnmaterializedInfo");<br>
+  Â  Â  Â  OS << I->second->MU.get() << ")\n";<br>
  Â  Â  Â } else<br>
  Â  Â  Â  Â OS << "\n";<br>
  Â  Â }<br>
@@ -1505,21 +1481,17 @@ Error JITDylib::defineImpl(Materializati<br>
  Â std::vector<SymbolStringPtr> MUDefsOverridden;<br>
<br>
  Â for (const auto &KV : MU.getSymbols()) {<br>
-  Â  assert(!KV.second.isLazy() && "Lazy flag should be managed internally.");<br>
-  Â  assert(!KV.second.isMaterializing() &&<br>
-  Â  Â  Â  Â  Â "Materializing flags should be managed internally.");<br>
-<br>
  Â  Â auto I = Symbols.find(KV.first);<br>
<br>
  Â  Â if (I != Symbols.end()) {<br>
  Â  Â  Â if (KV.second.isStrong()) {<br>
  Â  Â  Â  Â if (I->second.getFlags().isStrong() ||<br>
-  Â  Â  Â  Â  Â  I->second.getFlags().isMaterializing())<br>
+  Â  Â  Â  Â  Â  I->second.getState() > SymbolState::NeverSearched)<br>
  Â  Â  Â  Â  Â Duplicates.insert(KV.first);<br>
  Â  Â  Â  Â else {<br>
-  Â  Â  Â  Â  assert(I->second.getFlags().isLazy() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â !I->second.getFlags().isMaterializing() &&<br>
-  Â  Â  Â  Â  Â  Â  Â  Â "Overridden existing def should be in the Lazy state");<br>
+  Â  Â  Â  Â  assert(I->second.getState() == SymbolState::NeverSearched &&<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "Overridden existing def should be in the never-searched "<br>
+  Â  Â  Â  Â  Â  Â  Â  Â "state");<br>
  Â  Â  Â  Â  Â ExistingDefsOverridden.push_back(KV.first);<br>
  Â  Â  Â  Â }<br>
  Â  Â  Â } else<br>
@@ -1546,9 +1518,10 @@ Error JITDylib::defineImpl(Materializati<br>
<br>
  Â // Finally, add the defs from this MU.<br>
  Â for (auto &KV : MU.getSymbols()) {<br>
-  Â  auto NewFlags = KV.second;<br>
-  Â  NewFlags |= JITSymbolFlags::Lazy;<br>
-  Â  Symbols[KV.first] = JITEvaluatedSymbol(0, NewFlags);<br>
+  Â  auto &SymEntry = Symbols[KV.first];<br>
+  Â  SymEntry.setFlags(KV.second);<br>
+  Â  SymEntry.setState(SymbolState::NeverSearched);<br>
+  Â  SymEntry.setMaterializerAttached(true);<br>
  Â }<br>
<br>
  Â return Error::success();<br>
<br>
Modified: llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp?rev=361899&r1=361898&r2=361899&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp?rev=361899&r1=361898&r2=361899&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp (original)<br>
+++ llvm/trunk/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp Tue May 28 16:35:44 2019<br>
@@ -175,7 +175,7 @@ Error RTDyldObjectLinkingLayer::onObjLoa<br>
  Â  Â  Â auto I = R.getSymbols().find(InternedName);<br>
<br>
  Â  Â  Â if (OverrideObjectFlags && I != R.getSymbols().end())<br>
-  Â  Â  Â  Flags = JITSymbolFlags::stripTransientFlags(I->second);<br>
+  Â  Â  Â  Flags = I->second;<br>
  Â  Â  Â else if (AutoClaimObjectSymbols && I == R.getSymbols().end())<br>
  Â  Â  Â  Â ExtraSymbolsToClaim[InternedName] = Flags;<br>
  Â  Â }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
</blockquote></div>