summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp9
-rw-r--r--llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp28
2 files changed, 25 insertions, 12 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
index 17855f36574..25f0e9040ff 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
@@ -508,6 +508,15 @@ Error deregisterEHFrameSection(const void *EHFrameSectionAddr) {
#endif
}
+EHFrameRegistrar::~EHFrameRegistrar() {}
+
+InProcessEHFrameRegistrar &InProcessEHFrameRegistrar::getInstance() {
+ static InProcessEHFrameRegistrar Instance;
+ return Instance;
+}
+
+InProcessEHFrameRegistrar::InProcessEHFrameRegistrar() {}
+
AtomGraphPassFunction
createEHFrameRecorderPass(const Triple &TT,
StoreFrameAddressFunction StoreFrameAddress) {
diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
index 640d1d922c7..def0b300eca 100644
--- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp
@@ -409,7 +409,11 @@ Error ObjectLinkingLayer::removeAllModules() {
return Err;
}
-void LocalEHFrameRegistrationPlugin::modifyPassConfig(
+EHFrameRegistrationPlugin::EHFrameRegistrationPlugin(
+ jitlink::EHFrameRegistrar &Registrar)
+ : Registrar(Registrar) {}
+
+void EHFrameRegistrationPlugin::modifyPassConfig(
MaterializationResponsibility &MR, const Triple &TT,
PassConfiguration &PassConfig) {
assert(!InProcessLinks.count(&MR) && "Link for MR already being tracked?");
@@ -417,18 +421,18 @@ void LocalEHFrameRegistrationPlugin::modifyPassConfig(
PassConfig.PostFixupPasses.push_back(
createEHFrameRecorderPass(TT, [this, &MR](JITTargetAddress Addr) {
if (Addr)
- InProcessLinks[&MR] = jitTargetAddressToPointer<void *>(Addr);
+ InProcessLinks[&MR] = Addr;
}));
}
-Error LocalEHFrameRegistrationPlugin::notifyEmitted(
+Error EHFrameRegistrationPlugin::notifyEmitted(
MaterializationResponsibility &MR) {
auto EHFrameAddrItr = InProcessLinks.find(&MR);
if (EHFrameAddrItr == InProcessLinks.end())
return Error::success();
- const void *EHFrameAddr = EHFrameAddrItr->second;
+ auto EHFrameAddr = EHFrameAddrItr->second;
assert(EHFrameAddr && "eh-frame addr to register can not be null");
InProcessLinks.erase(EHFrameAddrItr);
@@ -437,25 +441,25 @@ Error LocalEHFrameRegistrationPlugin::notifyEmitted(
else
UntrackedEHFrameAddrs.push_back(EHFrameAddr);
- return registerEHFrameSection(EHFrameAddr);
+ return Registrar.registerEHFrames(EHFrameAddr);
}
-Error LocalEHFrameRegistrationPlugin::notifyRemovingModule(VModuleKey K) {
+Error EHFrameRegistrationPlugin::notifyRemovingModule(VModuleKey K) {
auto EHFrameAddrItr = TrackedEHFrameAddrs.find(K);
if (EHFrameAddrItr == TrackedEHFrameAddrs.end())
return Error::success();
- const void *EHFrameAddr = EHFrameAddrItr->second;
+ auto EHFrameAddr = EHFrameAddrItr->second;
assert(EHFrameAddr && "Tracked eh-frame addr must not be null");
TrackedEHFrameAddrs.erase(EHFrameAddrItr);
- return deregisterEHFrameSection(EHFrameAddr);
+ return Registrar.deregisterEHFrames(EHFrameAddr);
}
-Error LocalEHFrameRegistrationPlugin::notifyRemovingAllModules() {
+Error EHFrameRegistrationPlugin::notifyRemovingAllModules() {
- std::vector<const void *> EHFrameAddrs = std::move(UntrackedEHFrameAddrs);
+ std::vector<JITTargetAddress> EHFrameAddrs = std::move(UntrackedEHFrameAddrs);
EHFrameAddrs.reserve(EHFrameAddrs.size() + TrackedEHFrameAddrs.size());
for (auto &KV : TrackedEHFrameAddrs)
@@ -466,10 +470,10 @@ Error LocalEHFrameRegistrationPlugin::notifyRemovingAllModules() {
Error Err = Error::success();
while (!EHFrameAddrs.empty()) {
- const void *EHFrameAddr = EHFrameAddrs.back();
+ auto EHFrameAddr = EHFrameAddrs.back();
assert(EHFrameAddr && "Untracked eh-frame addr must not be null");
EHFrameAddrs.pop_back();
- Err = joinErrors(std::move(Err), deregisterEHFrameSection(EHFrameAddr));
+ Err = joinErrors(std::move(Err), Registrar.deregisterEHFrames(EHFrameAddr));
}
return Err;
OpenPOWER on IntegriCloud