1 //===--- LogicalDylib.h - Simulates dylib-style symbol lookup ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Simulates symbol resolution inside a dylib.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_EXECUTIONENGINE_ORC_LOGICALDYLIB_H
15 #define LLVM_EXECUTIONENGINE_ORC_LOGICALDYLIB_H
20 template <typename BaseLayerT,
21 typename LogicalModuleResources,
22 typename LogicalDylibResources>
25 typedef typename BaseLayerT::ModuleSetHandleT BaseLayerModuleSetHandleT;
28 typedef std::vector<BaseLayerModuleSetHandleT> BaseLayerHandleList;
30 struct LogicalModule {
31 // Make this move-only to ensure they don't get duplicated across moves of
32 // LogicalDylib or anything like that.
33 LogicalModule(LogicalModule &&RHS)
34 : Resources(std::move(RHS.Resources)),
35 BaseLayerHandles(std::move(RHS.BaseLayerHandles)) {}
36 LogicalModule() = default;
37 LogicalModuleResources Resources;
38 BaseLayerHandleList BaseLayerHandles;
40 typedef std::vector<LogicalModule> LogicalModuleList;
44 typedef typename BaseLayerHandleList::iterator BaseLayerHandleIterator;
45 typedef typename LogicalModuleList::iterator LogicalModuleHandle;
47 LogicalDylib(BaseLayerT &BaseLayer) : BaseLayer(BaseLayer) {}
50 for (auto &LM : LogicalModules)
51 for (auto BLH : LM.BaseLayerHandles)
52 BaseLayer.removeModuleSet(BLH);
55 // If possible, remove this and ~LogicalDylib once the work in the dtor is
56 // moved to members (eg: self-unregistering base layer handles).
57 LogicalDylib(LogicalDylib &&RHS) = default;
59 LogicalModuleHandle createLogicalModule() {
60 LogicalModules.push_back(LogicalModule());
61 return std::prev(LogicalModules.end());
64 void addToLogicalModule(LogicalModuleHandle LMH,
65 BaseLayerModuleSetHandleT BaseLayerHandle) {
66 LMH->BaseLayerHandles.push_back(BaseLayerHandle);
69 LogicalModuleResources& getLogicalModuleResources(LogicalModuleHandle LMH) {
70 return LMH->Resources;
73 BaseLayerHandleIterator moduleHandlesBegin(LogicalModuleHandle LMH) {
74 return LMH->BaseLayerHandles.begin();
77 BaseLayerHandleIterator moduleHandlesEnd(LogicalModuleHandle LMH) {
78 return LMH->BaseLayerHandles.end();
81 JITSymbol findSymbolInLogicalModule(LogicalModuleHandle LMH,
82 const std::string &Name) {
83 for (auto BLH : LMH->BaseLayerHandles)
84 if (auto Symbol = BaseLayer.findSymbolIn(BLH, Name, false))
89 JITSymbol findSymbolInternally(LogicalModuleHandle LMH,
90 const std::string &Name) {
91 if (auto Symbol = findSymbolInLogicalModule(LMH, Name))
94 for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
97 if (auto Symbol = findSymbolInLogicalModule(LMI, Name))
104 JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
105 for (auto &LM : LogicalModules)
106 for (auto BLH : LM.BaseLayerHandles)
108 BaseLayer.findSymbolIn(BLH, Name, ExportedSymbolsOnly))
113 LogicalDylibResources& getDylibResources() { return DylibResources; }
116 BaseLayerT BaseLayer;
117 LogicalModuleList LogicalModules;
118 LogicalDylibResources DylibResources;
122 } // End namespace orc.
123 } // End namespace llvm.
125 #endif // LLVM_EXECUTIONENGINE_ORC_LOGICALDYLIB_H