xref: /freebsd/contrib/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/JITLinkRedirectableSymbolManager.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
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