diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp')
| -rw-r--r-- | llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp | 61 |
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 |
