Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:43:53

0001 //===- JITLinkRedirectableSymbolManager.h - JITLink redirection -*- C++ -*-===//
0002 //
0003 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0004 // See https://llvm.org/LICENSE.txt for license information.
0005 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0006 //
0007 //===----------------------------------------------------------------------===//
0008 //
0009 // Redirectable Symbol Manager implementation using JITLink
0010 //
0011 //===----------------------------------------------------------------------===//
0012 
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H
0014 #define LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H
0015 
0016 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h"
0017 #include "llvm/ExecutionEngine/Orc/RedirectionManager.h"
0018 #include "llvm/Support/StringSaver.h"
0019 
0020 #include <atomic>
0021 
0022 namespace llvm {
0023 namespace orc {
0024 
0025 class JITLinkRedirectableSymbolManager : public RedirectableSymbolManager {
0026 public:
0027   /// Create redirection manager that uses JITLink based implementaion.
0028   static Expected<std::unique_ptr<RedirectableSymbolManager>>
0029   Create(ObjectLinkingLayer &ObjLinkingLayer) {
0030     auto AnonymousPtrCreator(jitlink::getAnonymousPointerCreator(
0031         ObjLinkingLayer.getExecutionSession().getTargetTriple()));
0032     auto PtrJumpStubCreator(jitlink::getPointerJumpStubCreator(
0033         ObjLinkingLayer.getExecutionSession().getTargetTriple()));
0034     if (!AnonymousPtrCreator || !PtrJumpStubCreator)
0035       return make_error<StringError>("Architecture not supported",
0036                                      inconvertibleErrorCode());
0037     return std::unique_ptr<RedirectableSymbolManager>(
0038         new JITLinkRedirectableSymbolManager(
0039             ObjLinkingLayer, AnonymousPtrCreator, PtrJumpStubCreator));
0040   }
0041 
0042   JITLinkRedirectableSymbolManager(
0043       ObjectLinkingLayer &ObjLinkingLayer,
0044       jitlink::AnonymousPointerCreator &AnonymousPtrCreator,
0045       jitlink::PointerJumpStubCreator &PtrJumpStubCreator)
0046       : ObjLinkingLayer(ObjLinkingLayer),
0047         AnonymousPtrCreator(std::move(AnonymousPtrCreator)),
0048         PtrJumpStubCreator(std::move(PtrJumpStubCreator)) {}
0049 
0050   ObjectLinkingLayer &getObjectLinkingLayer() const { return ObjLinkingLayer; }
0051 
0052   void emitRedirectableSymbols(std::unique_ptr<MaterializationResponsibility> R,
0053                                SymbolMap InitialDests) override;
0054 
0055   Error redirect(JITDylib &JD, const SymbolMap &NewDests) override;
0056 
0057 private:
0058   ObjectLinkingLayer &ObjLinkingLayer;
0059   jitlink::AnonymousPointerCreator AnonymousPtrCreator;
0060   jitlink::PointerJumpStubCreator PtrJumpStubCreator;
0061   std::atomic_size_t StubGraphIdx{0};
0062 };
0063 
0064 } // namespace orc
0065 } // namespace llvm
0066 
0067 #endif // LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H