summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-10-15 22:27:02 +0000
committerLang Hames <lhames@gmail.com>2018-10-15 22:27:02 +0000
commit6e66b2a6a397028c0e48dff978c2e2b313c9f42d (patch)
treedc6ba70eea525dc67806a630ceed273c274008c5 /llvm/lib
parentfbca8d5495f27268c18f8c7d0d318730d77ed34c (diff)
downloadbcm5719-llvm-6e66b2a6a397028c0e48dff978c2e2b313c9f42d.tar.gz
bcm5719-llvm-6e66b2a6a397028c0e48dff978c2e2b313c9f42d.zip
[ORC] Switch to DenseMap/DenseSet for ORC symbol map/set types.
llvm-svn: 344565
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/Core.cpp53
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp14
2 files changed, 38 insertions, 29 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index 3fa28a5af6f..d477ca523d8 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -134,6 +134,8 @@ struct PrintSymbolMapElemsMatchingCLOpts {
namespace llvm {
namespace orc {
+ SymbolStringPool::PoolMapEntry SymbolStringPtr::Tombstone(0);
+
char FailedToMaterialize::ID = 0;
char SymbolsNotFound::ID = 0;
char SymbolsCouldNotBeRemoved::ID = 0;
@@ -575,20 +577,22 @@ void ReExportsMaterializationUnit::materialize(
SymbolNameSet QuerySymbols;
SymbolAliasMap QueryAliases;
- for (auto I = RequestedAliases.begin(), E = RequestedAliases.end();
- I != E;) {
- auto Tmp = I++;
-
+ // Collect as many aliases as we can without including a chain.
+ for (auto &KV : RequestedAliases) {
// Chain detected. Skip this symbol for this round.
- if (&SrcJD == &TgtJD && (QueryAliases.count(Tmp->second.Aliasee) ||
- RequestedAliases.count(Tmp->second.Aliasee)))
+ if (&SrcJD == &TgtJD && (QueryAliases.count(KV.second.Aliasee) ||
+ RequestedAliases.count(KV.second.Aliasee)))
continue;
- ResponsibilitySymbols.insert(Tmp->first);
- QuerySymbols.insert(Tmp->second.Aliasee);
- QueryAliases[Tmp->first] = std::move(Tmp->second);
- RequestedAliases.erase(Tmp);
+ ResponsibilitySymbols.insert(KV.first);
+ QuerySymbols.insert(KV.second.Aliasee);
+ QueryAliases[KV.first] = std::move(KV.second);
}
+
+ // Remove the aliases collected this round from the RequestedAliases map.
+ for (auto &KV : QueryAliases)
+ RequestedAliases.erase(KV.first);
+
assert(!QuerySymbols.empty() && "Alias cycle detected!");
auto QueryInfo = std::make_shared<OnResolveInfo>(
@@ -1172,10 +1176,9 @@ void JITDylib::lodgeQueryImpl(
std::shared_ptr<AsynchronousSymbolQuery> &Q, SymbolNameSet &Unresolved,
JITDylib *MatchNonExportedInJD, bool MatchNonExported,
std::vector<std::unique_ptr<MaterializationUnit>> &MUs) {
- for (auto I = Unresolved.begin(), E = Unresolved.end(); I != E;) {
- auto TmpI = I++;
- auto Name = *TmpI;
+ std::vector<SymbolStringPtr> ToRemove;
+ for (auto Name : Unresolved) {
// Search for the name in Symbols. Skip it if not found.
auto SymI = Symbols.find(Name);
if (SymI == Symbols.end())
@@ -1188,9 +1191,9 @@ void JITDylib::lodgeQueryImpl(
if (!MatchNonExported && MatchNonExportedInJD != this)
continue;
- // If we matched against Name in JD, remove it frome the Unresolved set and
- // add it to the added set.
- Unresolved.erase(TmpI);
+ // If we matched against Name in JD, mark it to be removed from the Unresolved
+ // set.
+ ToRemove.push_back(Name);
// If the symbol has an address then resolve it.
if (SymI->second.getAddress() != 0)
@@ -1235,6 +1238,10 @@ void JITDylib::lodgeQueryImpl(
MI.PendingQueries.push_back(Q);
Q->addQueryDependence(*this, Name);
}
+
+ // Remove any symbols that we found.
+ for (auto &Name : ToRemove)
+ Unresolved.erase(Name);
}
SymbolNameSet JITDylib::legacyLookup(std::shared_ptr<AsynchronousSymbolQuery> Q,
@@ -1294,19 +1301,17 @@ JITDylib::lookupImpl(std::shared_ptr<AsynchronousSymbolQuery> &Q,
std::vector<std::unique_ptr<MaterializationUnit>> &MUs,
SymbolNameSet &Unresolved) {
LookupImplActionFlags ActionFlags = None;
+ std::vector<SymbolStringPtr> ToRemove;
- for (auto I = Unresolved.begin(), E = Unresolved.end(); I != E;) {
- auto TmpI = I++;
- auto Name = *TmpI;
+ for (auto Name : Unresolved) {
// Search for the name in Symbols. Skip it if not found.
auto SymI = Symbols.find(Name);
if (SymI == Symbols.end())
continue;
- // If we found Name, remove it frome the Unresolved set and add it
- // to the dependencies set.
- Unresolved.erase(TmpI);
+ // If we found Name, mark it to be removed from the Unresolved set.
+ ToRemove.push_back(Name);
// If the symbol has an address then resolve it.
if (SymI->second.getAddress() != 0) {
@@ -1357,6 +1362,10 @@ JITDylib::lookupImpl(std::shared_ptr<AsynchronousSymbolQuery> &Q,
Q->addQueryDependence(*this, Name);
}
+ // Remove any marked symbols from the Unresolved set.
+ for (auto &Name : ToRemove)
+ Unresolved.erase(Name);
+
return ActionFlags;
}
diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
index 667237373ca..4c8f725df54 100644
--- a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp
@@ -167,13 +167,13 @@ int LocalCXXRuntimeOverridesBase::CXAAtExitOverride(DestructorPtr Destructor,
Error LocalCXXRuntimeOverrides2::enable(JITDylib &JD,
MangleAndInterner &Mangle) {
- SymbolMap RuntimeInterposes(
- {{Mangle("__dso_handle"),
- JITEvaluatedSymbol(toTargetAddress(&DSOHandleOverride),
- JITSymbolFlags::Exported)},
- {Mangle("__cxa_atexit"),
- JITEvaluatedSymbol(toTargetAddress(&CXAAtExitOverride),
- JITSymbolFlags::Exported)}});
+ SymbolMap RuntimeInterposes;
+ RuntimeInterposes[Mangle("__dso_handle")] =
+ JITEvaluatedSymbol(toTargetAddress(&DSOHandleOverride),
+ JITSymbolFlags::Exported);
+ RuntimeInterposes[Mangle("__cxa_atexit")] =
+ JITEvaluatedSymbol(toTargetAddress(&CXAAtExitOverride),
+ JITSymbolFlags::Exported);
return JD.define(absoluteSymbols(std::move(RuntimeInterposes)));
}
OpenPOWER on IntegriCloud