xref: /freebsd/contrib/llvm-project/llvm/lib/ExecutionEngine/Orc/EPCEHFrameRegistrar.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1fe6060f1SDimitry Andric //===------ EPCEHFrameRegistrar.cpp - EPC-based eh-frame registration -----===//
2fe6060f1SDimitry Andric //
3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe6060f1SDimitry Andric //
7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8fe6060f1SDimitry Andric 
9fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
10fe6060f1SDimitry Andric 
11fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/Core.h"
12*5f757f3fSDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
13fe6060f1SDimitry Andric 
14fe6060f1SDimitry Andric using namespace llvm::orc::shared;
15fe6060f1SDimitry Andric 
16fe6060f1SDimitry Andric namespace llvm {
17fe6060f1SDimitry Andric namespace orc {
18fe6060f1SDimitry Andric 
19*5f757f3fSDimitry Andric Expected<std::unique_ptr<EPCEHFrameRegistrar>>
20*5f757f3fSDimitry Andric EPCEHFrameRegistrar::Create(ExecutionSession &ES) {
21fe6060f1SDimitry Andric 
22*5f757f3fSDimitry Andric   // Lookup addresseses of the registration/deregistration functions in the
23*5f757f3fSDimitry Andric   // bootstrap map.
24*5f757f3fSDimitry Andric   ExecutorAddr RegisterEHFrameSectionWrapper;
25*5f757f3fSDimitry Andric   ExecutorAddr DeregisterEHFrameSectionWrapper;
26*5f757f3fSDimitry Andric   if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
27*5f757f3fSDimitry Andric           {{RegisterEHFrameSectionWrapper,
28*5f757f3fSDimitry Andric             rt::RegisterEHFrameSectionWrapperName},
29*5f757f3fSDimitry Andric            {DeregisterEHFrameSectionWrapper,
30*5f757f3fSDimitry Andric             rt::DeregisterEHFrameSectionWrapperName}}))
31*5f757f3fSDimitry Andric     return std::move(Err);
32bdd1243dSDimitry Andric 
33*5f757f3fSDimitry Andric   return std::make_unique<EPCEHFrameRegistrar>(
34*5f757f3fSDimitry Andric       ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
35fe6060f1SDimitry Andric }
36fe6060f1SDimitry Andric 
3704eeddc0SDimitry Andric Error EPCEHFrameRegistrar::registerEHFrames(ExecutorAddrRange EHFrameSection) {
3804eeddc0SDimitry Andric   return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
39*5f757f3fSDimitry Andric       RegisterEHFrameSectionWrapper, EHFrameSection);
40fe6060f1SDimitry Andric }
41fe6060f1SDimitry Andric 
42fe6060f1SDimitry Andric Error EPCEHFrameRegistrar::deregisterEHFrames(
4304eeddc0SDimitry Andric     ExecutorAddrRange EHFrameSection) {
4404eeddc0SDimitry Andric   return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
45*5f757f3fSDimitry Andric       DeregisterEHFrameSectionWrapper, EHFrameSection);
46fe6060f1SDimitry Andric }
47fe6060f1SDimitry Andric 
48fe6060f1SDimitry Andric } // end namespace orc
49fe6060f1SDimitry Andric } // end namespace llvm
50