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