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 LogicalModuleResources Resources;
32 BaseLayerHandleList BaseLayerHandles;
34 typedef std::vector<LogicalModule> LogicalModuleList;
38 typedef typename BaseLayerHandleList::iterator BaseLayerHandleIterator;
39 typedef typename LogicalModuleList::iterator LogicalModuleHandle;
41 LogicalDylib(BaseLayerT &BaseLayer) : BaseLayer(BaseLayer) {}
44 for (auto &LM : LogicalModules)
45 for (auto BLH : LM.BaseLayerHandles)
46 BaseLayer.removeModuleSet(BLH);
49 LogicalModuleHandle createLogicalModule() {
50 LogicalModules.push_back(LogicalModule());
51 return std::prev(LogicalModules.end());
54 void addToLogicalModule(LogicalModuleHandle LMH,
55 BaseLayerModuleSetHandleT BaseLayerHandle) {
56 LMH->BaseLayerHandles.push_back(BaseLayerHandle);
59 LogicalModuleResources& getLogicalModuleResources(LogicalModuleHandle LMH) {
60 return LMH->Resources;
63 BaseLayerHandleIterator moduleHandlesBegin(LogicalModuleHandle LMH) {
64 return LMH->BaseLayerHandles.begin();
67 BaseLayerHandleIterator moduleHandlesEnd(LogicalModuleHandle LMH) {
68 return LMH->BaseLayerHandles.end();
71 JITSymbol findSymbolInLogicalModule(LogicalModuleHandle LMH,
72 const std::string &Name) {
73 for (auto BLH : LMH->BaseLayerHandles)
74 if (auto Symbol = BaseLayer.findSymbolIn(BLH, Name, false))
79 JITSymbol findSymbolInternally(LogicalModuleHandle LMH,
80 const std::string &Name) {
81 if (auto Symbol = findSymbolInLogicalModule(LMH, Name))
84 for (auto LMI = LogicalModules.begin(), LME = LogicalModules.end();
87 if (auto Symbol = findSymbolInLogicalModule(LMI, Name))
94 JITSymbol findSymbol(const std::string &Name, bool ExportedSymbolsOnly) {
95 for (auto &LM : LogicalModules)
96 for (auto BLH : LM.BaseLayerHandles)
98 BaseLayer.findSymbolIn(BLH, Name, ExportedSymbolsOnly))
103 LogicalDylibResources& getDylibResources() { return DylibResources; }
106 BaseLayerT BaseLayer;
107 LogicalModuleList LogicalModules;
108 LogicalDylibResources DylibResources;
112 } // End namespace orc.
113 } // End namespace llvm.
115 #endif // LLVM_EXECUTIONENGINE_ORC_LOGICALDYLIB_H