brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · b34c343 Raw
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