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-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/ExecutionEngine/Orc/EHFrameRegistrationPlugin.h"
10
11#include "llvm/ExecutionEngine/JITLink/EHFrameSupport.h"
12#include "llvm/ExecutionEngine/Orc/LookupAndApply.h"
13#include "llvm/ExecutionEngine/Orc/Shared/MachOObjectFormat.h"
14#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
15
16#define DEBUG_TYPE "orc"
17
18using namespace llvm::jitlink;
19
20namespace llvm::orc {
21
22Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
23EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {
24 // Lookup addresseses of the registration/deregistration functions in the
25 // bootstrap map.
26 ExecutorAddr RegisterEHFrameSectionAllocAction;
27 ExecutorAddr DeregisterEHFrameSectionAllocAction;
28 if (auto Err = lookupAndApply(
29 JD&: ES.getBootstrapJITDylib(),
30 PrepareFns: {recordAddr(Name: rt::RegisterEHFrameSectionAllocActionName,
31 A: &RegisterEHFrameSectionAllocAction),
32 recordAddr(Name: rt::DeregisterEHFrameSectionAllocActionName,
33 A: &DeregisterEHFrameSectionAllocAction)}))
34 return std::move(Err);
35
36 return std::make_unique<EHFrameRegistrationPlugin>(
37 args&: RegisterEHFrameSectionAllocAction, args&: DeregisterEHFrameSectionAllocAction);
38}
39
40void EHFrameRegistrationPlugin::modifyPassConfig(
41 MaterializationResponsibility &MR, LinkGraph &LG,
42 PassConfiguration &PassConfig) {
43 if (LG.getTargetTriple().isOSBinFormatMachO())
44 PassConfig.PrePrunePasses.insert(
45 position: PassConfig.PrePrunePasses.begin(), x: [](LinkGraph &G) {
46 if (auto *CUSec = G.findSectionByName(Name: MachOCompactUnwindSectionName))
47 G.removeSection(Sec&: *CUSec);
48 return Error::success();
49 });
50
51 PassConfig.PostFixupPasses.push_back(x: [this](LinkGraph &G) -> Error {
52 if (auto *EHFrame = getEHFrameSection(G)) {
53 using namespace shared;
54 auto R = SectionRange(*EHFrame).getRange();
55 G.allocActions().push_back(
56 x: {.Finalize: cantFail(
57 ValOrErr: WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
58 FnAddr: RegisterEHFrame, Args: R)),
59 .Dealloc: cantFail(
60 ValOrErr: WrapperFunctionCall::Create<SPSArgList<SPSExecutorAddrRange>>(
61 FnAddr: DeregisterEHFrame, Args: R))});
62 }
63 return Error::success();
64 });
65}
66
67} // namespace llvm::orc
68