49 lines
1.7 KiB
C++
49 lines
1.7 KiB
C++
//===------ EPCEHFrameRegistrar.cpp - EPC-based eh-frame registration -----===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/ExecutionEngine/Orc/EPCEHFrameRegistrar.h"
|
|
|
|
#include "llvm/ExecutionEngine/Orc/Core.h"
|
|
#include "llvm/ExecutionEngine/Orc/Shared/OrcRTBridge.h"
|
|
|
|
using namespace llvm::orc::shared;
|
|
|
|
namespace llvm {
|
|
namespace orc {
|
|
|
|
Expected<std::unique_ptr<EPCEHFrameRegistrar>>
|
|
EPCEHFrameRegistrar::Create(ExecutionSession &ES) {
|
|
|
|
// Lookup addresseses of the registration/deregistration functions in the
|
|
// bootstrap map.
|
|
ExecutorAddr RegisterEHFrameSectionWrapper;
|
|
ExecutorAddr DeregisterEHFrameSectionWrapper;
|
|
if (auto Err = ES.getExecutorProcessControl().getBootstrapSymbols(
|
|
{{RegisterEHFrameSectionWrapper,
|
|
rt::RegisterEHFrameSectionWrapperName},
|
|
{DeregisterEHFrameSectionWrapper,
|
|
rt::DeregisterEHFrameSectionWrapperName}}))
|
|
return std::move(Err);
|
|
|
|
return std::make_unique<EPCEHFrameRegistrar>(
|
|
ES, RegisterEHFrameSectionWrapper, DeregisterEHFrameSectionWrapper);
|
|
}
|
|
|
|
Error EPCEHFrameRegistrar::registerEHFrames(ExecutorAddrRange EHFrameSection) {
|
|
return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
|
|
RegisterEHFrameSectionWrapper, EHFrameSection);
|
|
}
|
|
|
|
Error EPCEHFrameRegistrar::deregisterEHFrames(
|
|
ExecutorAddrRange EHFrameSection) {
|
|
return ES.callSPSWrapper<void(SPSExecutorAddrRange)>(
|
|
DeregisterEHFrameSectionWrapper, EHFrameSection);
|
|
}
|
|
|
|
} // end namespace orc
|
|
} // end namespace llvm
|