66 lines · cpp
1//===--------- EHFrameRegistrationPlugin.cpp - Register eh-frames ---------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h"10 11#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"12#include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"13#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"14 15#define DEBUG_TYPE "orc"16 17using namespace llvm::jitlink;18 19namespace llvm::orc {20 21Expected<std::unique_ptr<EHFrameRegistrationPlugin>>22EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {23 // Lookup addresseses of the registration/deregistration functions in the24 // bootstrap map.25 ExecutorAddr RegisterEHFrameSectionAllocAction;26 ExecutorAddr DeregisterEHFrameSectionAllocAction;27 if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(28 {{RegisterEHFrameSectionAllocAction,29 rt::RegisterEHFrameSectionAllocActionName},30 {DeregisterEHFrameSectionAllocAction,31 rt::DeregisterEHFrameSectionAllocActionName}}))32 return std::move(Err);33 34 return std::make_unique<EHFrameRegistrationPlugin>(35 RegisterEHFrameSectionAllocAction, DeregisterEHFrameSectionAllocAction);36}37 38void EHFrameRegistrationPlugin::modifyPassConfig(39 MaterializationResponsibility &MR, LinkGraph &LG,40 PassConfiguration &PassConfig) {41 if (LG.getTargetTriple().isOSBinFormatMachO())42 PassConfig.PrePrunePasses.insert(43 PassConfig.PrePrunePasses.begin(), [](LinkGraph &G) {44 if (auto *CUSec = G.findSectionByName(MachOCompactUnwindSectionName))45 G.removeSection(*CUSec);46 return Error::success();47 });48 49 PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error {50 if (auto *EHFrame = getEHFrameSection(G)) {51 using namespace shared;52 auto R = SectionRange(*EHFrame).getRange();53 G.allocActions().push_back(54 {cantFail(55 WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(56 RegisterEHFrame, R)),57 cantFail(58 WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(59 DeregisterEHFrame, R))});60 }61 return Error::success();62 });63}64 65} // namespace llvm::orc66