1 //===- JITLinkRedirectableSymbolManager.h - JITLink redirection -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Redirectable Symbol Manager implementation using JITLink 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H 14 #define LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H 15 16 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 17 #include "llvm/ExecutionEngine/Orc/RedirectionManager.h" 18 #include "llvm/Support/Compiler.h" 19 #include "llvm/Support/StringSaver.h" 20 21 #include <atomic> 22 23 namespace llvm { 24 namespace orc { 25 26 class LLVM_ABI JITLinkRedirectableSymbolManager 27 : public RedirectableSymbolManager { 28 public: 29 /// Create redirection manager that uses JITLink based implementaion. 30 static Expected<std::unique_ptr<RedirectableSymbolManager>> Create(ObjectLinkingLayer & ObjLinkingLayer)31 Create(ObjectLinkingLayer &ObjLinkingLayer) { 32 auto AnonymousPtrCreator(jitlink::getAnonymousPointerCreator( 33 ObjLinkingLayer.getExecutionSession().getTargetTriple())); 34 auto PtrJumpStubCreator(jitlink::getPointerJumpStubCreator( 35 ObjLinkingLayer.getExecutionSession().getTargetTriple())); 36 if (!AnonymousPtrCreator || !PtrJumpStubCreator) 37 return make_error<StringError>("Architecture not supported", 38 inconvertibleErrorCode()); 39 return std::unique_ptr<RedirectableSymbolManager>( 40 new JITLinkRedirectableSymbolManager( 41 ObjLinkingLayer, AnonymousPtrCreator, PtrJumpStubCreator)); 42 } 43 JITLinkRedirectableSymbolManager(ObjectLinkingLayer & ObjLinkingLayer,jitlink::AnonymousPointerCreator & AnonymousPtrCreator,jitlink::PointerJumpStubCreator & PtrJumpStubCreator)44 JITLinkRedirectableSymbolManager( 45 ObjectLinkingLayer &ObjLinkingLayer, 46 jitlink::AnonymousPointerCreator &AnonymousPtrCreator, 47 jitlink::PointerJumpStubCreator &PtrJumpStubCreator) 48 : ObjLinkingLayer(ObjLinkingLayer), 49 AnonymousPtrCreator(std::move(AnonymousPtrCreator)), 50 PtrJumpStubCreator(std::move(PtrJumpStubCreator)) {} 51 getObjectLinkingLayer()52 ObjectLinkingLayer &getObjectLinkingLayer() const { return ObjLinkingLayer; } 53 54 void emitRedirectableSymbols(std::unique_ptr<MaterializationResponsibility> R, 55 SymbolMap InitialDests) override; 56 57 Error redirect(JITDylib &JD, const SymbolMap &NewDests) override; 58 59 private: 60 ObjectLinkingLayer &ObjLinkingLayer; 61 jitlink::AnonymousPointerCreator AnonymousPtrCreator; 62 jitlink::PointerJumpStubCreator PtrJumpStubCreator; 63 std::atomic_size_t StubGraphIdx{0}; 64 }; 65 66 } // namespace orc 67 } // namespace llvm 68 69 #endif // LLVM_EXECUTIONENGINE_ORC_JITLINKREDIRECABLESYMBOLMANAGER_H 70