LLVM: include/llvm/ExecutionEngine/Orc/MachOPlatform.h Source File (original) (raw)

32public:

33

38

39

41 std::vector<std::pair<ExecutorAddr, MachOJITDylibDepInfo>>;

42

43

50

51

52

54

61

68

79

80

81

83

84

86

87 std::vectorstd::string RPaths;

88

90

93 };

94

95

96

100

101

102 static inline std::unique_ptr

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

145 std::unique_ptr OrcRuntime,

147 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,

148 std::optional RuntimeAliases = std::nullopt);

149

150

153 const char *OrcRuntimePath, HeaderOptions PlatformJDOpts = {},

154 MachOHeaderMUBuilder BuildMachOHeaderMU = buildSimpleMachOHeaderMU,

155 std::optional RuntimeAliases = std::nullopt);

156

159

163

165

166

167

168 Error setupJITDylib(JITDylib &JD, HeaderOptions Opts);

169

174

175

176

177

179

180

182

183

185 standardRuntimeUtilityAliases();

186

187

188

190 standardLazyCompilationAliases();

191

192private:

194 std::tuple<ExecutorAddr, ExecutorAddr, MachOExecutorSymbolFlags>>;

195

196

197 struct BootstrapInfo {

198 std::condition_variable CV;

199 size_t ActiveGraphs = 0;

202 SymbolTableVector SymTab;

203 };

204

205

206

207

208 class LLVM_ABI MachOPlatformPlugin : public ObjectLinkingLayer::Plugin {

209 public:

210 MachOPlatformPlugin(MachOPlatform &MP) : MP(MP) {}

211

212 void modifyPassConfig(MaterializationResponsibility &MR,

213 jitlink::LinkGraph &G,

214 jitlink::PassConfiguration &Config) override;

215

216

217

218 Error notifyFailed(MaterializationResponsibility &MR) override {

219 return Error::success();

220 }

221

222 Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override {

223 return Error::success();

224 }

225

226 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey,

227 ResourceKey SrcKey) override {}

228

229 private:

230 struct UnwindSections {

231 SmallVector CodeRanges;

232 ExecutorAddrRange DwarfSection;

233 ExecutorAddrRange CompactUnwindSection;

234 };

235

236 struct ObjCImageInfo {

238 uint32_t Flags = 0;

239

240

241 bool Finalized = false;

242 };

243

244 struct SymbolTablePair {

245 jitlink::Symbol *OriginalSym = nullptr;

246 jitlink::Symbol *NameSym = nullptr;

247 };

248 using JITSymTabVector = SmallVector;

249

250 Error bootstrapPipelineRecordRuntimeFunctions(jitlink::LinkGraph &G);

251 Error bootstrapPipelineEnd(jitlink::LinkGraph &G);

252

253 Error associateJITDylibHeaderSymbol(jitlink::LinkGraph &G,

254 MaterializationResponsibility &MR);

255

256 Error preserveImportantSections(jitlink::LinkGraph &G,

257 MaterializationResponsibility &MR);

258

259 Error processObjCImageInfo(jitlink::LinkGraph &G,

260 MaterializationResponsibility &MR);

261 Error mergeImageInfoFlags(jitlink::LinkGraph &G,

262 MaterializationResponsibility &MR,

263 ObjCImageInfo &Info, uint32_t NewFlags);

264

265 Error fixTLVSectionsAndEdges(jitlink::LinkGraph &G, JITDylib &JD);

266

267 std::optional findUnwindSectionInfo(jitlink::LinkGraph &G);

268 Error registerObjectPlatformSections(jitlink::LinkGraph &G, JITDylib &JD,

269 ExecutorAddr HeaderAddr,

270 bool InBootstrapPhase);

271

272 Error createObjCRuntimeObject(jitlink::LinkGraph &G);

273 Error populateObjCRuntimeObject(jitlink::LinkGraph &G,

274 MaterializationResponsibility &MR);

275

276 Error prepareSymbolTableRegistration(jitlink::LinkGraph &G,

277 JITSymTabVector &JITSymTabInfo);

278 Error addSymbolTableRegistration(jitlink::LinkGraph &G,

279 MaterializationResponsibility &MR,

280 JITSymTabVector &JITSymTabInfo,

281 bool InBootstrapPhase);

282

283 std::mutex PluginMutex;

284 MachOPlatform &MP;

285

286

287

288 DenseMap<JITDylib *, ObjCImageInfo> ObjCImageInfos;

289 };

290

291 using GetJITDylibHeaderSendResultFn =

292 unique_function<void(Expected)>;

293 using GetJITDylibNameSendResultFn =

294 unique_function<void(Expected)>;

295 using PushInitializersSendResultFn =

296 unique_function<void(Expected)>;

297 using SendSymbolAddressFn = unique_function<void(Expected)>;

298 using PushSymbolsInSendResultFn = unique_function<void(Error)>;

299

300 static bool supportedTarget(const Triple &TT);

301

302 static jitlink::Edge::Kind getPointerEdgeKind(jitlink::LinkGraph &G);

303

304 static MachOExecutorSymbolFlags flagsForSymbol(jitlink::Symbol &Sym);

305

306 MachOPlatform(ObjectLinkingLayer &ObjLinkingLayer, JITDylib &PlatformJD,

307 std::unique_ptr OrcRuntimeGenerator,

308 HeaderOptions PlatformJDOpts,

309 MachOHeaderMUBuilder BuildMachOHeaderMU, Error &Err);

310

311

312 Error associateRuntimeSupportFunctions();

313

314

315

316

317 void pushInitializersLoop(PushInitializersSendResultFn SendResult,

318 JITDylibSP JD);

319

320

321 void rt_pushInitializers(PushInitializersSendResultFn SendResult,

322 ExecutorAddr JDHeaderAddr);

323

324

325

326

327

328 void rt_pushSymbols(PushSymbolsInSendResultFn SendResult, ExecutorAddr Handle,

329 const std::vector<std::pair<StringRef, bool>> &Symbols);

330

331

332 Expected<uint64_t> createPThreadKey();

333

334 ExecutionSession &ES;

335 JITDylib &PlatformJD;

336 ObjectLinkingLayer &ObjLinkingLayer;

337 MachOHeaderMUBuilder BuildMachOHeaderMU;

338

339 SymbolStringPtr MachOHeaderStartSymbol = ES.intern("___dso_handle");

340

343 SymbolStringPtr Name;

344 ExecutorAddr Addr;

345 };

346

348 ES.intern("___orc_rt_macho_platform_bootstrap")};

350 ES.intern("___orc_rt_macho_platform_shutdown")};

352 ES.intern("___orc_rt_macho_register_ehframe_section")};

354 ES.intern("___orc_rt_macho_deregister_ehframe_section")};

356 ES.intern("___orc_rt_macho_register_jitdylib")};

358 ES.intern("___orc_rt_macho_deregister_jitdylib")};

360 ES.intern("___orc_rt_macho_register_object_symbol_table")};

362 ES.intern("___orc_rt_macho_deregister_object_symbol_table")};

364 ES.intern("___orc_rt_macho_register_object_platform_sections")};

366 ES.intern("___orc_rt_macho_deregister_object_platform_sections")};

368 ES.intern("___orc_rt_macho_create_pthread_key")};

370 ES.intern("___orc_rt_macho_register_objc_runtime_object")};

372 ES.intern("___orc_rt_macho_deregister_objc_runtime_object")};

373

374 DenseMap<JITDylib *, SymbolLookupSet> RegisteredInitSymbols;

375

376 std::mutex PlatformMutex;

377 bool ForceEHFrames = false;

378 BootstrapInfo *Bootstrap = nullptr;

379 DenseMap<JITDylib *, ExecutorAddr> JITDylibToHeaderAddr;

380 DenseMap<ExecutorAddr, JITDylib *> HeaderAddrToJITDylib;

381 DenseMap<JITDylib *, uint64_t> JITDylibToPThreadKey;

382};

386public:

390 void materialize(std::unique_ptr R) override;

392

393protected:

396

399

400private:

401 struct HeaderSymbol {

402 const char *Name;

404 };

405

406 static constexpr HeaderSymbol AdditionalHeaderSymbols[] = {

407 {"___mh_executable_header", 0}};

408

409 void addMachOHeader(JITDylib &JD, jitlink::LinkGraph &G,

410 const SymbolStringPtr &InitializerSymbol);

411 static MaterializationUnit::Interface

412 createHeaderInterface(MachOPlatform &MOP,

413 const SymbolStringPtr &HeaderStartSymbol);

414};

420 return std::make_unique(MOP, MOP.MachOHeaderStartSymbol,

421 std::move(Opts));

422}