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