Path: blob/main/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp
213799 views
//===--------- EHFrameRegistrationPlugin.cpp - Register eh-frames ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h"910#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"11#include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"12#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"1314#define DEBUG_TYPE "orc"1516using namespace llvm::jitlink;1718namespace llvm::orc {1920Expected<std::unique_ptr<EHFrameRegistrationPlugin>>21EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {22// Lookup addresseses of the registration/deregistration functions in the23// bootstrap map.24ExecutorAddr RegisterEHFrameSectionAllocAction;25ExecutorAddr DeregisterEHFrameSectionAllocAction;26if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(27{{RegisterEHFrameSectionAllocAction,28rt::RegisterEHFrameSectionAllocActionName},29{DeregisterEHFrameSectionAllocAction,30rt::DeregisterEHFrameSectionAllocActionName}}))31return std::move(Err);3233return std::make_unique<EHFrameRegistrationPlugin>(34RegisterEHFrameSectionAllocAction, DeregisterEHFrameSectionAllocAction);35}3637void EHFrameRegistrationPlugin::modifyPassConfig(38MaterializationResponsibility &MR, LinkGraph &LG,39PassConfiguration &PassConfig) {40if (LG.getTargetTriple().isOSBinFormatMachO())41PassConfig.PrePrunePasses.insert(42PassConfig.PrePrunePasses.begin(), [](LinkGraph &G) {43if (auto *CUSec = G.findSectionByName(MachOCompactUnwindSectionName))44G.removeSection(*CUSec);45return Error::success();46});4748PassConfig.PostFixupPasses.push_back([this](LinkGraph &G) -> Error {49if (auto *EHFrame = getEHFrameSection(G)) {50using namespace shared;51auto R = SectionRange(*EHFrame).getRange();52G.allocActions().push_back(53{cantFail(54WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(55RegisterEHFrame, R)),56cantFail(57WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(58DeregisterEHFrame, R))});59}60return Error::success();61});62}6364} // namespace llvm::orc656667