46 std::unique_ptr<MemoryBuffer> OrcRuntimeArchiveBuffer,
48 const char *VCRuntimePath =
nullptr,
49 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
54 bool StaticVCRuntime =
false,
const char *VCRuntimePath =
nullptr,
55 std::optional<SymbolAliasMap> RuntimeAliases = std::nullopt);
76 standardRuntimeUtilityAliases();
81 using COFFJITDylibDepInfo = std::vector<ExecutorAddr>;
82 using COFFJITDylibDepInfoMap =
83 std::vector<std::pair<ExecutorAddr, COFFJITDylibDepInfo>>;
84 using COFFObjectSectionsMap =
86 using PushInitializersSendResultFn =
98 void modifyPassConfig(MaterializationResponsibility &MR,
104 Error notifyFailed(MaterializationResponsibility &MR)
override {
108 Error notifyRemovingResources(JITDylib &JD, ResourceKey K)
override {
109 return Error::success();
112 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,
113 ResourceKey SrcKey)
override {}
116 Error associateJITDylibHeaderSymbol(jitlink::LinkGraph &
G,
117 MaterializationResponsibility &MR,
120 Error preserveInitializerSections(jitlink::LinkGraph &
G,
121 MaterializationResponsibility &MR);
122 Error registerObjectPlatformSections(jitlink::LinkGraph &
G, JITDylib &JD);
123 Error registerObjectPlatformSectionsInBootstrap(jitlink::LinkGraph &
G,
126 std::mutex PluginMutex;
130 struct JDBootstrapState {
131 JITDylib *JD =
nullptr;
133 ExecutorAddr HeaderAddr;
134 std::list<COFFObjectSectionsMap> ObjectSectionsMaps;
135 SmallVector<std::pair<std::string, ExecutorAddr>> Initializers;
138 static bool supportedTarget(
const Triple &TT);
141 ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,
142 std::unique_ptr<StaticLibraryDefinitionGenerator> OrcRuntimeGenerator,
143 std::set<std::string> DylibsToPreload,
144 std::unique_ptr<MemoryBuffer> OrcRuntimeArchiveBuffer,
145 std::unique_ptr<object::Archive> OrcRuntimeArchive,
146 LoadDynamicLibrary LoadDynLibrary,
bool StaticVCRuntime,
147 const char *VCRuntimePath, Error &Err);
150 Error associateRuntimeSupportFunctions(JITDylib &PlatformJD);
153 Error bootstrapCOFFRuntime(JITDylib &PlatformJD);
156 Error runSymbolIfExists(JITDylib &PlatformJD, StringRef SymbolName);
159 Error runBootstrapInitializers(JDBootstrapState &BState);
160 Error runBootstrapSubsectionInitializers(JDBootstrapState &BState,
161 StringRef Start, StringRef End);
164 Expected<JITDylibDepMap> buildJDDepMap(JITDylib &JD);
166 Expected<MemoryBufferRef> getPerJDObjectFile();
171 void pushInitializersLoop(PushInitializersSendResultFn SendResult,
172 JITDylibSP JD, JITDylibDepMap &JDDepMap);
174 void rt_pushInitializers(PushInitializersSendResultFn SendResult,
175 ExecutorAddr JDHeaderAddr);
177 void rt_lookupSymbol(SendSymbolAddressFn SendResult, ExecutorAddr Handle,
178 StringRef SymbolName);
180 ExecutionSession &ES;
181 ObjectLinkingLayer &ObjLinkingLayer;
183 LoadDynamicLibrary LoadDynLibrary;
184 std::unique_ptr<COFFVCRuntimeBootstrapper> VCRuntimeBootstrap;
185 std::unique_ptr<MemoryBuffer> OrcRuntimeArchiveBuffer;
186 std::unique_ptr<object::Archive> OrcRuntimeArchive;
187 bool StaticVCRuntime;
189 SymbolStringPtr COFFHeaderStartSymbol;
192 std::map<JITDylib *, JDBootstrapState> JDBootstrapStates;
193 std::atomic<bool> Bootstrapping;
195 ExecutorAddr orc_rt_coff_platform_bootstrap;
196 ExecutorAddr orc_rt_coff_platform_shutdown;
197 ExecutorAddr orc_rt_coff_register_object_sections;
198 ExecutorAddr orc_rt_coff_deregister_object_sections;
199 ExecutorAddr orc_rt_coff_register_jitdylib;
200 ExecutorAddr orc_rt_coff_deregister_jitdylib;
202 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;
203 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;
205 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;
207 std::mutex PlatformMutex;