summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2016-08-05 18:26:56 +0000
committerLang Hames <lhames@gmail.com>2016-08-05 18:26:56 +0000
commit2a04a99ce677cf8fbc8b9fc0c36693e44f147c5d (patch)
treea1f7970cc8fa87c4720a885fdcbb5115b8967c4d
parentfd063e796f4e1b9b9c8fcc2cf26f5d82b662d581 (diff)
downloadbcm5719-llvm-2a04a99ce677cf8fbc8b9fc0c36693e44f147c5d.tar.gz
bcm5719-llvm-2a04a99ce677cf8fbc8b9fc0c36693e44f147c5d.zip
[ORC] Change LogicalDylib::LogicalModuleHandle from an iterator to an index.
This prevents handles from being invalidated (through iterator invalidation) when new modules are added. No test-case yet: This bug was uncovered during work on an upcoming patch for weak symbol support and the testcase for that feature will implicitly test for correct behavior here. llvm-svn: 277847
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/LogicalDylib.h39
1 files changed, 20 insertions, 19 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/LogicalDylib.h b/llvm/include/llvm/ExecutionEngine/Orc/LogicalDylib.h
index af10b357235..7939b80386c 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/LogicalDylib.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/LogicalDylib.h
@@ -46,7 +46,7 @@ private:
public:
typedef typename BaseLayerHandleList::iterator BaseLayerHandleIterator;
- typedef typename LogicalModuleList::iterator LogicalModuleHandle;
+ typedef typename LogicalModuleList::size_type LogicalModuleHandle;
LogicalDylib(BaseLayerT &BaseLayer) : BaseLayer(BaseLayer) {}
@@ -65,34 +65,35 @@ public:
LogicalModuleHandle createLogicalModule() {
LogicalModules.push_back(LogicalModule());
- return std::prev(LogicalModules.end());
+ return LogicalModules.size() - 1;
}
void addToLogicalModule(LogicalModuleHandle LMH,
BaseLayerModuleSetHandleT BaseLayerHandle) {
- LMH->BaseLayerHandles.push_back(BaseLayerHandle);
+ LogicalModules[LMH].BaseLayerHandles.push_back(BaseLayerHandle);
}
LogicalModuleResources& getLogicalModuleResources(LogicalModuleHandle LMH) {
- return LMH->Resources;
+ return LogicalModules[LMH].Resources;
}
BaseLayerHandleIterator moduleHandlesBegin(LogicalModuleHandle LMH) {
- return LMH->BaseLayerHandles.begin();
+ return LogicalModules[LMH].BaseLayerHandles.begin();
}
BaseLayerHandleIterator moduleHandlesEnd(LogicalModuleHandle LMH) {
- return LMH->BaseLayerHandles.end();
+ return LogicalModules[LMH].BaseLayerHandles.end();
}
JITSymbol findSymbolInLogicalModule(LogicalModuleHandle LMH,
const std::string &Name,
bool ExportedSymbolsOnly) {
- if (auto StubSym = LMH->Resources.findSymbol(Name, ExportedSymbolsOnly))
+ if (auto StubSym =
+ LogicalModules[LMH].Resources.findSymbol(Name, ExportedSymbolsOnly))
return StubSym;
- for (auto BLH : LMH->BaseLayerHandles)
+ for (auto BLH : LogicalModules[LMH].BaseLayerHandles)
if (auto Symbol = BaseLayer.findSymbolIn(BLH, Name, ExportedSymbolsOnly))
return Symbol;
return nullptr;
@@ -103,10 +104,10 @@ public:
if (auto Symbol = findSymbolInLogicalModule(LMH, Name, false))
return Symbol;
- for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
- LMI != LME; ++LMI) {
- if (LMI != LMH)
- if (auto Symbol = findSymbolInLogicalModule(LMI, Name, false))
+ for (typename LogicalModuleList::size_type I = 0, E = LogicalModules.size();
+ I != E; ++I) {
+ if (I != LMH)
+ if (auto Symbol = findSymbolInLogicalModule(I, Name, false))
return Symbol;
}
@@ -114,9 +115,9 @@ public:
}
JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
- for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
- LMI != LME; ++LMI)
- if (auto Sym = findSymbolInLogicalModule(LMI, Name, ExportedSymbolsOnly))
+ for (typename LogicalModuleList::size_type I = 0, E = LogicalModules.size();
+ I != E; ++I)
+ if (auto Sym = findSymbolInLogicalModule(I, Name, ExportedSymbolsOnly))
return Sym;
return nullptr;
}
@@ -126,10 +127,10 @@ public:
LogicalModuleResources*
getLogicalModuleResourcesForSymbol(const std::string &Name,
bool ExportedSymbolsOnly) {
- for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
- LMI != LME; ++LMI)
- if (auto Sym = LMI->Resources.findSymbol(Name, ExportedSymbolsOnly))
- return &LMI->Resources;
+ for (typename LogicalModuleList::size_type I = 0, E = LogicalModules.size();
+ I != E; ++I)
+ if (auto Sym = LogicalModules[I].Resources.findSymbol(Name, ExportedSymbolsOnly))
+ return &LogicalModules[I]->Resources;
return nullptr;
}
OpenPOWER on IntegriCloud