summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-09-27 20:36:10 +0000
committerLang Hames <lhames@gmail.com>2018-09-27 20:36:10 +0000
commit01bb2baaa1c97b951b477e871cbde9572fadc056 (patch)
tree78cc4f1addd17da5224dbff5486ed37fe44940ca
parentcf0949aa9f75eb6af9d93510e5b0325fb45d9c6e (diff)
downloadbcm5719-llvm-01bb2baaa1c97b951b477e871cbde9572fadc056.tar.gz
bcm5719-llvm-01bb2baaa1c97b951b477e871cbde9572fadc056.zip
[ORC] Make LocalIndirectStubsManager's operations thread-safe.
Locks stub management operations and switches to atomic update for stub pointers. llvm-svn: 343262
-rw-r--r--llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h13
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
index 77c15658f30..22d33324966 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/IndirectionUtils.h
@@ -295,6 +295,7 @@ class LocalIndirectStubsManager : public IndirectStubsManager {
public:
Error createStub(StringRef StubName, JITTargetAddress StubAddr,
JITSymbolFlags StubFlags) override {
+ std::lock_guard<std::mutex> Lock(StubsMutex);
if (auto Err = reserveStubs(1))
return Err;
@@ -304,6 +305,7 @@ public:
}
Error createStubs(const StubInitsMap &StubInits) override {
+ std::lock_guard<std::mutex> Lock(StubsMutex);
if (auto Err = reserveStubs(StubInits.size()))
return Err;
@@ -315,6 +317,7 @@ public:
}
JITEvaluatedSymbol findStub(StringRef Name, bool ExportedStubsOnly) override {
+ std::lock_guard<std::mutex> Lock(StubsMutex);
auto I = StubIndexes.find(Name);
if (I == StubIndexes.end())
return nullptr;
@@ -330,6 +333,7 @@ public:
}
JITEvaluatedSymbol findPointer(StringRef Name) override {
+ std::lock_guard<std::mutex> Lock(StubsMutex);
auto I = StubIndexes.find(Name);
if (I == StubIndexes.end())
return nullptr;
@@ -342,11 +346,15 @@ public:
}
Error updatePointer(StringRef Name, JITTargetAddress NewAddr) override {
+ using AtomicIntPtr = std::atomic<uintptr_t>;
+
+ std::lock_guard<std::mutex> Lock(StubsMutex);
auto I = StubIndexes.find(Name);
assert(I != StubIndexes.end() && "No stub pointer for symbol");
auto Key = I->second.first;
- *IndirectStubsInfos[Key.first].getPtr(Key.second) =
- reinterpret_cast<void *>(static_cast<uintptr_t>(NewAddr));
+ AtomicIntPtr *AtomicStubPtr = reinterpret_cast<AtomicIntPtr *>(
+ IndirectStubsInfos[Key.first].getPtr(Key.second));
+ *AtomicStubPtr = static_cast<uintptr_t>(NewAddr);
return Error::success();
}
@@ -376,6 +384,7 @@ private:
StubIndexes[StubName] = std::make_pair(Key, StubFlags);
}
+ std::mutex StubsMutex;
std::vector<typename TargetT::IndirectStubsInfo> IndirectStubsInfos;
using StubKey = std::pair<uint16_t, uint16_t>;
std::vector<StubKey> FreeStubs;
OpenPOWER on IntegriCloud