xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EHFrameRegistrationPlugin.cpp (revision 770cf0a5f02dc8983a89c6568d741fbc25baa999)
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>>
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 
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