summaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp61
1 files changed, 17 insertions, 44 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp b/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
index 56cd982cd5e1..f15315260ab0 100644
--- a/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp
@@ -9,67 +9,40 @@
#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
#include "llvm/ExecutionEngine/Orc/Core.h"
-#include "llvm/Support/BinaryStreamWriter.h"
+#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
using namespace llvm::orc::shared;
namespace llvm {
namespace orc {
-Expected<std::unique_ptr<EPCEHFrameRegistrar>> EPCEHFrameRegistrar::Create(
- ExecutionSession &ES,
- std::optional<ExecutorAddr> RegistrationFunctionsDylib) {
- // FIXME: Proper mangling here -- we really need to decouple linker mangling
- // from DataLayout.
+Expected<std::unique_ptr<EPCEHFrameRegistrar>>
+EPCEHFrameRegistrar::Create(ExecutionSession &ES) {
- // Find the addresses of the registration/deregistration functions in the
- // executor process.
- auto &EPC = ES.getExecutorProcessControl();
+ // Lookup addresseses of the registration/deregistration functions in the
+ // bootstrap map.
+ ExecutorAddr RegisterEHFrameSectionWrapper;
+ ExecutorAddr DeregisterEHFrameSectionWrapper;
+ if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
+ {{RegisterEHFrameSectionWrapper,
+ rt::RegisterEHFrameSectionWrapperName},
+ {DeregisterEHFrameSectionWrapper,
+ rt::DeregisterEHFrameSectionWrapperName}}))
+ return std::move(Err);
- if (!RegistrationFunctionsDylib) {
- if (auto D = EPC.loadDylib(nullptr))
- RegistrationFunctionsDylib = *D;
- else
- return D.takeError();
- }
-
- std::string RegisterWrapperName, DeregisterWrapperName;
- if (EPC.getTargetTriple().isOSBinFormatMachO()) {
- RegisterWrapperName += '_';
- DeregisterWrapperName += '_';
- }
- RegisterWrapperName += "llvm_orc_registerEHFrameSectionWrapper";
- DeregisterWrapperName += "llvm_orc_deregisterEHFrameSectionWrapper";
-
- SymbolLookupSet RegistrationSymbols;
- RegistrationSymbols.add(EPC.intern(RegisterWrapperName));
- RegistrationSymbols.add(EPC.intern(DeregisterWrapperName));
-
- auto Result =
- EPC.lookupSymbols({{*RegistrationFunctionsDylib, RegistrationSymbols}});
- if (!Result)
- return Result.takeError();
-
- assert(Result->size() == 1 && "Unexpected number of dylibs in result");
- assert((*Result)[0].size() == 2 &&
- "Unexpected number of addresses in result");
-
- auto RegisterEHFrameWrapperFnAddr = (*Result)[0][0];
- auto DeregisterEHFrameWrapperFnAddr = (*Result)[0][1];
-
- return std::make_unique<EPCEHFrameRegistrar>(ES, RegisterEHFrameWrapperFnAddr,
- DeregisterEHFrameWrapperFnAddr);
+ return std::make_unique<EPCEHFrameRegistrar>(
+ ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
}
Error EPCEHFrameRegistrar::registerEHFrames(ExecutorAddrRange EHFrameSection) {
return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
- RegisterEHFrameWrapperFnAddr, EHFrameSection);
+ RegisterEHFrameSectionWrapper, EHFrameSection);
}
Error EPCEHFrameRegistrar::deregisterEHFrames(
ExecutorAddrRange EHFrameSection) {
return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
- DeregisterEHFrameWrapperFnAddr, EHFrameSection);
+ DeregisterEHFrameSectionWrapper, EHFrameSection);
}
} // end namespace orc