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/Shared/MachOObjectFormat.h"
13 #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
14
15 #define DEBUG_TYPE "orc"
16
17 using namespace llvm::jitlink;
18
19 namespace llvm::orc {
20
21 Expected<std::unique_ptr<EHFrameRegistrationPlugin>>
Create(ExecutionSession & ES)22 EHFrameRegistrationPlugin::Create(ExecutionSession &ES) {
23 // Lookup addresseses of the registration/deregistration functions in the
24 // 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
modifyPassConfig(MaterializationResponsibility & MR,LinkGraph & LG,PassConfiguration & PassConfig)38 void 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::orc
66