| //===--------- EHFrameRegistrationPlugin.cpp - Register eh-frames ---------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h" | |
| #include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h" | |
| #include "llvm/ExecutionEngine/Orc/LookupAndApply.h" | |
| #include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h" | |
| #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h" | |
| #define DEBUG_TYPE "orc" | |
| using namespace llvm::jitlink; | |
| namespace llvm::orc { | |
| Expected<std::unique_ptr<EHFrameRegistrationPlugin>> | |
| EHFrameRegistrationPlugin::Create(ExecutionSession &ES) { | |
| // Lookup addresseses of the registration/deregistration functions in the | |
| // bootstrap map. | |
| ExecutorAddr RegisterEHFrameSectionAllocAction; | |
| ExecutorAddr DeregisterEHFrameSectionAllocAction; | |
| if (auto Err = lookupAndApply( | |
| ES.getBootstrapJITDylib(), | |
| {recordAddr(rt::RegisterEHFrameSectionAllocActionName, | |
| &RegisterEHFrameSectionAllocAction), | |
| recordAddr(rt::DeregisterEHFrameSectionAllocActionName, | |
| &DeregisterEHFrameSectionAllocAction)})) | |
| return std::move(Err); | |
| return std::make_unique<EHFrameRegistrationPlugin>( | |
| RegisterEHFrameSectionAllocAction, DeregisterEHFrameSectionAllocAction); | |
| } | |
| void EHFrameRegistrationPlugin::modifyPassConfig( | |
| MaterializationResponsibility &MR, LinkGraph &LG, | |
| PassConfiguration &PassConfig) { | |
| if (LG.getTargetTriple().isOSBinFormatMachO()) | |
| PassConfig.PrePrunePasses.insert( | |
| PassConfig.PrePrunePasses.begin(), [](LinkGraph &G) { | |
| if (auto *CUSec = G.findSectionByName(MachOCompactUnwindSectionName)) | |
| G.removeSection(*CUSec); | |
| return Error::success(); | |
| }); | |
| PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error { | |
| if (auto *EHFrame = getEHFrameSection(G)) { | |
| using namespace shared; | |
| auto R = SectionRange(*EHFrame).getRange(); | |
| G.allocActions().push_back( | |
| {cantFail( | |
| WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>( | |
| RegisterEHFrame, R)), | |
| cantFail( | |
| WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>( | |
| DeregisterEHFrame, R))}); | |
| } | |
| return Error::success(); | |
| }); | |
| } | |
| } // namespace llvm::orc |