diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h b/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/EHFrameSupport.h @@ -85,6 +85,8 @@ /// Supports registration/deregistration of EH-frames in a target process. class EHFrameRegistrar { + virtual void anchor(); + public: virtual ~EHFrameRegistrar(); virtual Error registerEHFrames(orc::ExecutorAddrRange EHFrameSection) = 0; @@ -93,6 +95,8 @@ /// Registers / Deregisters EH-frames in the current process. class InProcessEHFrameRegistrar final : public EHFrameRegistrar { + void anchor() override; + public: Error registerEHFrames(orc::ExecutorAddrRange EHFrameSection) override; diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h @@ -1826,6 +1826,8 @@ private: const JITLinkDylib *JD = nullptr; + + virtual void anchor(); }; /// Marks all symbols in a graph live. This can be used as a default, diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h @@ -198,6 +198,9 @@ Allocs.push_back(std::move(Alloc)); return deallocate(std::move(Allocs)); } + +private: + virtual void anchor(); }; /// BasicLayout simplifies the implementation of JITLinkMemoryManagers. @@ -389,6 +392,8 @@ sys::MemoryBlock StandardSegments, std::vector DeallocActions); + void anchor() override; + uint64_t PageSize; std::mutex FinalizedAllocsMutex; RecyclingAllocator FinalizedAllocInfos; diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp --- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp @@ -649,6 +649,9 @@ return Error::success(); } +void EHFrameRegistrar::anchor() {} +void InProcessEHFrameRegistrar::anchor() {} + EHFrameRegistrar::~EHFrameRegistrar() = default; Error InProcessEHFrameRegistrar::registerEHFrames( diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp --- a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp @@ -349,6 +349,7 @@ } void JITLinkAsyncLookupContinuation::anchor() {} +void JITLinkContext::anchor() {} JITLinkContext::~JITLinkContext() = default; diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp @@ -18,6 +18,7 @@ namespace llvm { namespace jitlink { +void JITLinkMemoryManager::anchor() {} JITLinkMemoryManager::~JITLinkMemoryManager() = default; JITLinkMemoryManager::InFlightAlloc::~InFlightAlloc() = default; @@ -234,6 +235,8 @@ : G(std::move(G)), ContentBlocks(std::move(ContentBlocks)), Alloc(std::move(Alloc)) {} +void InProcessMemoryManager::anchor() {} + class InProcessMemoryManager::IPInFlightAlloc : public JITLinkMemoryManager::InFlightAlloc { public: