xref: /freebsd/contrib/llvm-project/llvm/include/llvm/ExecutionEngine/Orc/RedirectionManager.h (revision 700637cbb5e582861067a11aaca4d053546871d2)
1 //===- RedirectionManager.h - Redirection manager interface -----*- 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 // Redirection manager interface that redirects a call to symbol to another.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_EXECUTIONENGINE_ORC_REDIRECTIONMANAGER_H
14 #define LLVM_EXECUTIONENGINE_ORC_REDIRECTIONMANAGER_H
15 
16 #include "llvm/ExecutionEngine/Orc/Core.h"
17 #include "llvm/Support/Compiler.h"
18 
19 namespace llvm {
20 namespace orc {
21 
22 /// Base class for performing redirection of call to symbol to another symbol in
23 /// runtime.
24 class LLVM_ABI RedirectionManager {
25 public:
26   virtual ~RedirectionManager() = default;
27 
28   /// Change the redirection destination of given symbols to new destination
29   /// symbols.
30   virtual Error redirect(JITDylib &JD, const SymbolMap &NewDests) = 0;
31 
32   /// Change the redirection destination of given symbol to new destination
33   /// symbol.
redirect(JITDylib & JD,SymbolStringPtr Symbol,ExecutorSymbolDef NewDest)34   Error redirect(JITDylib &JD, SymbolStringPtr Symbol,
35                  ExecutorSymbolDef NewDest) {
36     return redirect(JD, {{std::move(Symbol), NewDest}});
37   }
38 
39 private:
40   virtual void anchor();
41 };
42 
43 /// Base class for managing redirectable symbols in which a call
44 /// gets redirected to another symbol in runtime.
45 class RedirectableSymbolManager : public RedirectionManager {
46 public:
47   /// Create redirectable symbols with given symbol names and initial
48   /// desitnation symbol addresses.
49   LLVM_ABI Error createRedirectableSymbols(ResourceTrackerSP RT,
50                                            SymbolMap InitialDests);
51 
52   /// Create a single redirectable symbol with given symbol name and initial
53   /// desitnation symbol address.
createRedirectableSymbol(ResourceTrackerSP RT,SymbolStringPtr Symbol,ExecutorSymbolDef InitialDest)54   Error createRedirectableSymbol(ResourceTrackerSP RT, SymbolStringPtr Symbol,
55                                  ExecutorSymbolDef InitialDest) {
56     return createRedirectableSymbols(RT, {{std::move(Symbol), InitialDest}});
57   }
58 
59   /// Emit redirectable symbol
60   virtual void
61   emitRedirectableSymbols(std::unique_ptr<MaterializationResponsibility> MR,
62                           SymbolMap InitialDests) = 0;
63 };
64 
65 /// RedirectableMaterializationUnit materializes redirectable symbol
66 /// by invoking RedirectableSymbolManager::emitRedirectableSymbols
67 class RedirectableMaterializationUnit : public MaterializationUnit {
68 public:
RedirectableMaterializationUnit(RedirectableSymbolManager & RM,SymbolMap InitialDests)69   RedirectableMaterializationUnit(RedirectableSymbolManager &RM,
70                                   SymbolMap InitialDests)
71       : MaterializationUnit(convertToFlags(InitialDests)), RM(RM),
72         InitialDests(std::move(InitialDests)) {}
73 
getName()74   StringRef getName() const override {
75     return "RedirectableSymbolMaterializationUnit";
76   }
77 
materialize(std::unique_ptr<MaterializationResponsibility> R)78   void materialize(std::unique_ptr<MaterializationResponsibility> R) override {
79     RM.emitRedirectableSymbols(std::move(R), std::move(InitialDests));
80   }
81 
discard(const JITDylib & JD,const SymbolStringPtr & Name)82   void discard(const JITDylib &JD, const SymbolStringPtr &Name) override {
83     InitialDests.erase(Name);
84   }
85 
86 private:
87   static MaterializationUnit::Interface
convertToFlags(const SymbolMap & InitialDests)88   convertToFlags(const SymbolMap &InitialDests) {
89     SymbolFlagsMap Flags;
90     for (auto [K, V] : InitialDests)
91       Flags[K] = V.getFlags();
92     return MaterializationUnit::Interface(Flags, {});
93   }
94 
95   RedirectableSymbolManager &RM;
96   SymbolMap InitialDests;
97 };
98 
99 } // namespace orc
100 } // namespace llvm
101 
102 #endif
103