File indexing completed on 2026-05-10 08:43:53
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef LLVM_EXECUTIONENGINE_ORC_LLJIT_H
0014 #define LLVM_EXECUTIONENGINE_ORC_LLJIT_H
0015
0016 #include "llvm/ADT/SmallSet.h"
0017 #include "llvm/ExecutionEngine/Orc/AbsoluteSymbols.h"
0018 #include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h"
0019 #include "llvm/ExecutionEngine/Orc/CompileUtils.h"
0020 #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
0021 #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
0022 #include "llvm/ExecutionEngine/Orc/IRPartitionLayer.h"
0023 #include "llvm/ExecutionEngine/Orc/IRTransformLayer.h"
0024 #include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"
0025 #include "llvm/ExecutionEngine/Orc/ThreadSafeModule.h"
0026 #include "llvm/Support/Debug.h"
0027 #include "llvm/Support/ThreadPool.h"
0028 #include <variant>
0029
0030 namespace llvm {
0031 namespace orc {
0032
0033 class LLJITBuilderState;
0034 class LLLazyJITBuilderState;
0035 class ObjectTransformLayer;
0036 class ExecutorProcessControl;
0037
0038
0039
0040
0041 class LLJIT {
0042 template <typename, typename, typename> friend class LLJITBuilderSetters;
0043
0044 friend Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J);
0045
0046 public:
0047
0048 class PlatformSupport {
0049 public:
0050 virtual ~PlatformSupport();
0051
0052 virtual Error initialize(JITDylib &JD) = 0;
0053
0054 virtual Error deinitialize(JITDylib &JD) = 0;
0055
0056 protected:
0057 static void setInitTransform(LLJIT &J,
0058 IRTransformLayer::TransformFunction T);
0059 };
0060
0061
0062
0063 virtual ~LLJIT();
0064
0065
0066 ExecutionSession &getExecutionSession() { return *ES; }
0067
0068
0069 const Triple &getTargetTriple() const { return TT; }
0070
0071
0072 const DataLayout &getDataLayout() const { return DL; }
0073
0074
0075 JITDylib &getMainJITDylib() { return *Main; }
0076
0077
0078
0079
0080
0081
0082 JITDylibSP getProcessSymbolsJITDylib();
0083
0084
0085
0086
0087
0088
0089 JITDylibSP getPlatformJITDylib();
0090
0091
0092
0093 JITDylib *getJITDylibByName(StringRef Name) {
0094 return ES->getJITDylibByName(Name);
0095 }
0096
0097
0098
0099
0100
0101
0102
0103
0104 Expected<JITDylib &> loadPlatformDynamicLibrary(const char *Path);
0105
0106
0107
0108
0109
0110
0111
0112 Error linkStaticLibraryInto(JITDylib &JD,
0113 std::unique_ptr<MemoryBuffer> LibBuffer);
0114
0115
0116
0117
0118
0119
0120
0121 Error linkStaticLibraryInto(JITDylib &JD, const char *Path);
0122
0123
0124
0125
0126
0127
0128
0129 Expected<JITDylib &> createJITDylib(std::string Name);
0130
0131
0132
0133
0134 JITDylibSearchOrder defaultLinkOrder() { return DefaultLinks; }
0135
0136
0137 Error addIRModule(ResourceTrackerSP RT, ThreadSafeModule TSM);
0138
0139
0140 Error addIRModule(JITDylib &JD, ThreadSafeModule TSM);
0141
0142
0143 Error addIRModule(ThreadSafeModule TSM) {
0144 return addIRModule(*Main, std::move(TSM));
0145 }
0146
0147
0148 Error addObjectFile(ResourceTrackerSP RT, std::unique_ptr<MemoryBuffer> Obj);
0149
0150
0151 Error addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj);
0152
0153
0154 Error addObjectFile(std::unique_ptr<MemoryBuffer> Obj) {
0155 return addObjectFile(*Main, std::move(Obj));
0156 }
0157
0158
0159
0160 Expected<ExecutorAddr> lookupLinkerMangled(JITDylib &JD,
0161 SymbolStringPtr Name);
0162
0163
0164
0165 Expected<ExecutorAddr> lookupLinkerMangled(JITDylib &JD,
0166 StringRef Name) {
0167 return lookupLinkerMangled(JD, ES->intern(Name));
0168 }
0169
0170
0171
0172
0173 Expected<ExecutorAddr> lookupLinkerMangled(StringRef Name) {
0174 return lookupLinkerMangled(*Main, Name);
0175 }
0176
0177
0178 Expected<ExecutorAddr> lookup(JITDylib &JD, StringRef UnmangledName) {
0179 return lookupLinkerMangled(JD, mangle(UnmangledName));
0180 }
0181
0182
0183 Expected<ExecutorAddr> lookup(StringRef UnmangledName) {
0184 return lookup(*Main, UnmangledName);
0185 }
0186
0187
0188 void setPlatformSupport(std::unique_ptr<PlatformSupport> PS) {
0189 this->PS = std::move(PS);
0190 }
0191
0192
0193 PlatformSupport *getPlatformSupport() { return PS.get(); }
0194
0195
0196 Error initialize(JITDylib &JD) {
0197 DEBUG_WITH_TYPE("orc", {
0198 dbgs() << "LLJIT running initializers for JITDylib \"" << JD.getName()
0199 << "\"\n";
0200 });
0201 assert(PS && "PlatformSupport must be set to run initializers.");
0202 return PS->initialize(JD);
0203 }
0204
0205
0206 Error deinitialize(JITDylib &JD) {
0207 DEBUG_WITH_TYPE("orc", {
0208 dbgs() << "LLJIT running deinitializers for JITDylib \"" << JD.getName()
0209 << "\"\n";
0210 });
0211 assert(PS && "PlatformSupport must be set to run initializers.");
0212 return PS->deinitialize(JD);
0213 }
0214
0215
0216 ObjectLayer &getObjLinkingLayer() { return *ObjLinkingLayer; }
0217
0218
0219 ObjectTransformLayer &getObjTransformLayer() { return *ObjTransformLayer; }
0220
0221
0222 IRTransformLayer &getIRTransformLayer() { return *TransformLayer; }
0223
0224
0225 IRCompileLayer &getIRCompileLayer() { return *CompileLayer; }
0226
0227
0228 std::string mangle(StringRef UnmangledName) const;
0229
0230
0231 SymbolStringPtr mangleAndIntern(StringRef UnmangledName) const {
0232 return ES->intern(mangle(UnmangledName));
0233 }
0234
0235 protected:
0236 static Expected<std::unique_ptr<ObjectLayer>>
0237 createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES);
0238
0239 static Expected<std::unique_ptr<IRCompileLayer::IRCompiler>>
0240 createCompileFunction(LLJITBuilderState &S, JITTargetMachineBuilder JTMB);
0241
0242
0243 LLJIT(LLJITBuilderState &S, Error &Err);
0244
0245 Error applyDataLayout(Module &M);
0246
0247 std::unique_ptr<ExecutionSession> ES;
0248 std::unique_ptr<PlatformSupport> PS;
0249
0250 JITDylib *ProcessSymbols = nullptr;
0251 JITDylib *Platform = nullptr;
0252 JITDylib *Main = nullptr;
0253
0254 JITDylibSearchOrder DefaultLinks;
0255
0256 DataLayout DL;
0257 Triple TT;
0258
0259 std::unique_ptr<ObjectLayer> ObjLinkingLayer;
0260 std::unique_ptr<ObjectTransformLayer> ObjTransformLayer;
0261 std::unique_ptr<IRCompileLayer> CompileLayer;
0262 std::unique_ptr<IRTransformLayer> TransformLayer;
0263 std::unique_ptr<IRTransformLayer> InitHelperTransformLayer;
0264 };
0265
0266
0267
0268 class LLLazyJIT : public LLJIT {
0269 template <typename, typename, typename> friend class LLJITBuilderSetters;
0270
0271 public:
0272
0273
0274 void setPartitionFunction(IRPartitionLayer::PartitionFunction Partition) {
0275 IPLayer->setPartitionFunction(std::move(Partition));
0276 }
0277
0278
0279 CompileOnDemandLayer &getCompileOnDemandLayer() { return *CODLayer; }
0280
0281
0282 Error addLazyIRModule(JITDylib &JD, ThreadSafeModule M);
0283
0284
0285 Error addLazyIRModule(ThreadSafeModule M) {
0286 return addLazyIRModule(*Main, std::move(M));
0287 }
0288
0289 private:
0290
0291
0292 LLLazyJIT(LLLazyJITBuilderState &S, Error &Err);
0293
0294 std::unique_ptr<LazyCallThroughManager> LCTMgr;
0295 std::unique_ptr<IRPartitionLayer> IPLayer;
0296 std::unique_ptr<CompileOnDemandLayer> CODLayer;
0297 };
0298
0299 class LLJITBuilderState {
0300 public:
0301 using ObjectLinkingLayerCreator =
0302 std::function<Expected<std::unique_ptr<ObjectLayer>>(ExecutionSession &,
0303 const Triple &)>;
0304
0305 using CompileFunctionCreator =
0306 std::function<Expected<std::unique_ptr<IRCompileLayer::IRCompiler>>(
0307 JITTargetMachineBuilder JTMB)>;
0308
0309 using ProcessSymbolsJITDylibSetupFunction =
0310 unique_function<Expected<JITDylibSP>(LLJIT &J)>;
0311
0312 using PlatformSetupFunction = unique_function<Expected<JITDylibSP>(LLJIT &J)>;
0313
0314 using NotifyCreatedFunction = std::function<Error(LLJIT &)>;
0315
0316 std::unique_ptr<ExecutorProcessControl> EPC;
0317 std::unique_ptr<ExecutionSession> ES;
0318 std::optional<JITTargetMachineBuilder> JTMB;
0319 std::optional<DataLayout> DL;
0320 bool LinkProcessSymbolsByDefault = true;
0321 ProcessSymbolsJITDylibSetupFunction SetupProcessSymbolsJITDylib;
0322 ObjectLinkingLayerCreator CreateObjectLinkingLayer;
0323 CompileFunctionCreator CreateCompileFunction;
0324 unique_function<Error(LLJIT &)> PrePlatformSetup;
0325 PlatformSetupFunction SetUpPlatform;
0326 NotifyCreatedFunction NotifyCreated;
0327 unsigned NumCompileThreads = 0;
0328 std::optional<bool> SupportConcurrentCompilation;
0329
0330
0331 Error prepareForConstruction();
0332 };
0333
0334 template <typename JITType, typename SetterImpl, typename State>
0335 class LLJITBuilderSetters {
0336 public:
0337
0338
0339 SetterImpl &
0340 setExecutorProcessControl(std::unique_ptr<ExecutorProcessControl> EPC) {
0341 assert(
0342 !impl().ES &&
0343 "setExecutorProcessControl should not be called if an ExecutionSession "
0344 "has already been set");
0345 impl().EPC = std::move(EPC);
0346 return impl();
0347 }
0348
0349
0350 SetterImpl &setExecutionSession(std::unique_ptr<ExecutionSession> ES) {
0351 assert(
0352 !impl().EPC &&
0353 "setExecutionSession should not be called if an ExecutorProcessControl "
0354 "object has already been set");
0355 impl().ES = std::move(ES);
0356 return impl();
0357 }
0358
0359
0360
0361
0362
0363 SetterImpl &setJITTargetMachineBuilder(JITTargetMachineBuilder JTMB) {
0364 impl().JTMB = std::move(JTMB);
0365 return impl();
0366 }
0367
0368
0369
0370 std::optional<JITTargetMachineBuilder> &getJITTargetMachineBuilder() {
0371 return impl().JTMB;
0372 }
0373
0374
0375
0376 SetterImpl &setDataLayout(std::optional<DataLayout> DL) {
0377 impl().DL = std::move(DL);
0378 return impl();
0379 }
0380
0381
0382
0383
0384
0385
0386
0387 SetterImpl &setLinkProcessSymbolsByDefault(bool LinkProcessSymbolsByDefault) {
0388 impl().LinkProcessSymbolsByDefault = LinkProcessSymbolsByDefault;
0389 return impl();
0390 }
0391
0392
0393
0394
0395
0396 SetterImpl &setProcessSymbolsJITDylibSetup(
0397 LLJITBuilderState::ProcessSymbolsJITDylibSetupFunction
0398 SetupProcessSymbolsJITDylib) {
0399 impl().SetupProcessSymbolsJITDylib = std::move(SetupProcessSymbolsJITDylib);
0400 return impl();
0401 }
0402
0403
0404
0405
0406
0407 SetterImpl &setObjectLinkingLayerCreator(
0408 LLJITBuilderState::ObjectLinkingLayerCreator CreateObjectLinkingLayer) {
0409 impl().CreateObjectLinkingLayer = std::move(CreateObjectLinkingLayer);
0410 return impl();
0411 }
0412
0413
0414
0415
0416
0417
0418
0419 SetterImpl &setCompileFunctionCreator(
0420 LLJITBuilderState::CompileFunctionCreator CreateCompileFunction) {
0421 impl().CreateCompileFunction = std::move(CreateCompileFunction);
0422 return impl();
0423 }
0424
0425
0426
0427
0428
0429
0430
0431
0432 SetterImpl &
0433 setPrePlatformSetup(unique_function<Error(LLJIT &)> PrePlatformSetup) {
0434 impl().PrePlatformSetup = std::move(PrePlatformSetup);
0435 return impl();
0436 }
0437
0438
0439
0440
0441
0442 SetterImpl &
0443 setPlatformSetUp(LLJITBuilderState::PlatformSetupFunction SetUpPlatform) {
0444 impl().SetUpPlatform = std::move(SetUpPlatform);
0445 return impl();
0446 }
0447
0448
0449
0450
0451
0452 SetterImpl &
0453 setNotifyCreatedCallback(LLJITBuilderState::NotifyCreatedFunction Callback) {
0454 impl().NotifyCreated = std::move(Callback);
0455 return impl();
0456 }
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470 SetterImpl &setNumCompileThreads(unsigned NumCompileThreads) {
0471 impl().NumCompileThreads = NumCompileThreads;
0472 return impl();
0473 }
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483 SetterImpl &setSupportConcurrentCompilation(
0484 std::optional<bool> SupportConcurrentCompilation) {
0485 impl().SupportConcurrentCompilation = SupportConcurrentCompilation;
0486 return impl();
0487 }
0488
0489
0490 Expected<std::unique_ptr<JITType>> create() {
0491 if (auto Err = impl().prepareForConstruction())
0492 return std::move(Err);
0493
0494 Error Err = Error::success();
0495 std::unique_ptr<JITType> J(new JITType(impl(), Err));
0496 if (Err)
0497 return std::move(Err);
0498
0499 if (impl().NotifyCreated)
0500 if (Error Err = impl().NotifyCreated(*J))
0501 return std::move(Err);
0502
0503 return std::move(J);
0504 }
0505
0506 protected:
0507 SetterImpl &impl() { return static_cast<SetterImpl &>(*this); }
0508 };
0509
0510
0511 class LLJITBuilder
0512 : public LLJITBuilderState,
0513 public LLJITBuilderSetters<LLJIT, LLJITBuilder, LLJITBuilderState> {};
0514
0515 class LLLazyJITBuilderState : public LLJITBuilderState {
0516 friend class LLLazyJIT;
0517
0518 public:
0519 using IndirectStubsManagerBuilderFunction =
0520 std::function<std::unique_ptr<IndirectStubsManager>()>;
0521
0522 Triple TT;
0523 ExecutorAddr LazyCompileFailureAddr;
0524 std::unique_ptr<LazyCallThroughManager> LCTMgr;
0525 IndirectStubsManagerBuilderFunction ISMBuilder;
0526
0527 Error prepareForConstruction();
0528 };
0529
0530 template <typename JITType, typename SetterImpl, typename State>
0531 class LLLazyJITBuilderSetters
0532 : public LLJITBuilderSetters<JITType, SetterImpl, State> {
0533 public:
0534
0535
0536
0537 SetterImpl &setLazyCompileFailureAddr(ExecutorAddr Addr) {
0538 this->impl().LazyCompileFailureAddr = Addr;
0539 return this->impl();
0540 }
0541
0542
0543
0544
0545
0546 SetterImpl &
0547 setLazyCallthroughManager(std::unique_ptr<LazyCallThroughManager> LCTMgr) {
0548 this->impl().LCTMgr = std::move(LCTMgr);
0549 return this->impl();
0550 }
0551
0552
0553
0554
0555
0556 SetterImpl &setIndirectStubsManagerBuilder(
0557 LLLazyJITBuilderState::IndirectStubsManagerBuilderFunction ISMBuilder) {
0558 this->impl().ISMBuilder = std::move(ISMBuilder);
0559 return this->impl();
0560 }
0561 };
0562
0563
0564 class LLLazyJITBuilder
0565 : public LLLazyJITBuilderState,
0566 public LLLazyJITBuilderSetters<LLLazyJIT, LLLazyJITBuilder,
0567 LLLazyJITBuilderState> {};
0568
0569
0570
0571 Error setUpOrcPlatformManually(LLJIT &J);
0572
0573
0574
0575 class ExecutorNativePlatform {
0576 public:
0577
0578 ExecutorNativePlatform(std::string OrcRuntimePath)
0579 : OrcRuntime(std::move(OrcRuntimePath)) {}
0580
0581
0582 ExecutorNativePlatform(std::unique_ptr<MemoryBuffer> OrcRuntimeMB)
0583 : OrcRuntime(std::move(OrcRuntimeMB)) {}
0584
0585
0586
0587
0588 ExecutorNativePlatform &addVCRuntime(std::string VCRuntimePath,
0589 bool StaticVCRuntime) {
0590 VCRuntime = {std::move(VCRuntimePath), StaticVCRuntime};
0591 return *this;
0592 }
0593
0594 Expected<JITDylibSP> operator()(LLJIT &J);
0595
0596 private:
0597 std::variant<std::string, std::unique_ptr<MemoryBuffer>> OrcRuntime;
0598 std::optional<std::pair<std::string, bool>> VCRuntime;
0599 };
0600
0601
0602
0603
0604
0605 Expected<JITDylibSP> setUpGenericLLVMIRPlatform(LLJIT &J);
0606
0607
0608
0609
0610
0611 Expected<JITDylibSP> setUpInactivePlatform(LLJIT &J);
0612
0613
0614
0615 class ORCPlatformSupport : public LLJIT::PlatformSupport {
0616 public:
0617 ORCPlatformSupport(orc::LLJIT &J) : J(J) {}
0618 Error initialize(orc::JITDylib &JD) override;
0619 Error deinitialize(orc::JITDylib &JD) override;
0620
0621 private:
0622 orc::LLJIT &J;
0623 DenseMap<orc::JITDylib *, orc::ExecutorAddr> DSOHandles;
0624 SmallPtrSet<JITDylib const *, 8> InitializedDylib;
0625 };
0626
0627 }
0628 }
0629
0630 #endif