LLVM 18.0.0git
LLJIT.h
Go to the documentation of this file.
1//===----- LLJIT.h -- An ORC-based JIT for compiling LLVM IR ----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// An ORC-based JIT for compiling LLVM IR.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_EXECUTIONENGINE_ORC_LLJIT_H
14#define LLVM_EXECUTIONENGINE_ORC_LLJIT_H
15
23#include "llvm/Support/Debug.h"
25#include <variant>
26
27namespace llvm {
28namespace orc {
29
30class LLJITBuilderState;
31class LLLazyJITBuilderState;
32class ObjectTransformLayer;
33class ExecutorProcessControl;
34
35/// A pre-fabricated ORC JIT stack that can serve as an alternative to MCJIT.
36///
37/// Create instances using LLJITBuilder.
38class LLJIT {
39 template <typename, typename, typename> friend class LLJITBuilderSetters;
40
42
43public:
44 /// Initializer support for LLJIT.
46 public:
48
49 virtual Error initialize(JITDylib &JD) = 0;
50
51 virtual Error deinitialize(JITDylib &JD) = 0;
52
53 protected:
54 static void setInitTransform(LLJIT &J,
56 };
57
58 /// Destruct this instance. If a multi-threaded instance, waits for all
59 /// compile threads to complete.
60 virtual ~LLJIT();
61
62 /// Returns the ExecutionSession for this instance.
64
65 /// Returns a reference to the triple for this instance.
66 const Triple &getTargetTriple() const { return TT; }
67
68 /// Returns a reference to the DataLayout for this instance.
69 const DataLayout &getDataLayout() const { return DL; }
70
71 /// Returns a reference to the JITDylib representing the JIT'd main program.
73
74 /// Returns the ProcessSymbols JITDylib, which by default reflects non-JIT'd
75 /// symbols in the host process.
76 ///
77 /// Note: JIT'd code should not be added to the ProcessSymbols JITDylib. Use
78 /// the main JITDylib or a custom JITDylib instead.
80
81 /// Returns the Platform JITDylib, which will contain the ORC runtime (if
82 /// given) and any platform symbols.
83 ///
84 /// Note: JIT'd code should not be added to the Platform JITDylib. Use the
85 /// main JITDylib or a custom JITDylib instead.
87
88 /// Returns the JITDylib with the given name, or nullptr if no JITDylib with
89 /// that name exists.
91 return ES->getJITDylibByName(Name);
92 }
93
94 /// Load a (real) dynamic library and make its symbols available through a
95 /// new JITDylib with the same name.
96 ///
97 /// If the given *executor* path contains a valid platform dynamic library
98 /// then that library will be loaded, and a new bare JITDylib whose name is
99 /// the given path will be created to make the library's symbols available to
100 /// JIT'd code.
102
103 /// Link a static library into the given JITDylib.
104 ///
105 /// If the given MemoryBuffer contains a valid static archive (or a universal
106 /// binary with an archive slice that fits the LLJIT instance's platform /
107 /// architecture) then it will be added to the given JITDylib using a
108 /// StaticLibraryDefinitionGenerator.
110 std::unique_ptr<MemoryBuffer> LibBuffer);
111
112 /// Link a static library into the given JITDylib.
113 ///
114 /// If the given *host* path contains a valid static archive (or a universal
115 /// binary with an archive slice that fits the LLJIT instance's platform /
116 /// architecture) then it will be added to the given JITDylib using a
117 /// StaticLibraryDefinitionGenerator.
118 Error linkStaticLibraryInto(JITDylib &JD, const char *Path);
119
120 /// Create a new JITDylib with the given name and return a reference to it.
121 ///
122 /// JITDylib names must be unique. If the given name is derived from user
123 /// input or elsewhere in the environment then the client should check
124 /// (e.g. by calling getJITDylibByName) that the given name is not already in
125 /// use.
127
128 /// Returns the default link order for this LLJIT instance. This link order
129 /// will be appended to the link order of JITDylibs created by LLJIT's
130 /// createJITDylib method.
132
133 /// Adds an IR module with the given ResourceTracker.
135
136 /// Adds an IR module to the given JITDylib.
138
139 /// Adds an IR module to the Main JITDylib.
141 return addIRModule(*Main, std::move(TSM));
142 }
143
144 /// Adds an object file to the given JITDylib.
145 Error addObjectFile(ResourceTrackerSP RT, std::unique_ptr<MemoryBuffer> Obj);
146
147 /// Adds an object file to the given JITDylib.
148 Error addObjectFile(JITDylib &JD, std::unique_ptr<MemoryBuffer> Obj);
149
150 /// Adds an object file to the given JITDylib.
151 Error addObjectFile(std::unique_ptr<MemoryBuffer> Obj) {
152 return addObjectFile(*Main, std::move(Obj));
153 }
154
155 /// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
156 /// look up symbols based on their IR name use the lookup function instead).
159
160 /// Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to
161 /// look up symbols based on their IR name use the lookup function instead).
163 StringRef Name) {
164 return lookupLinkerMangled(JD, ES->intern(Name));
165 }
166
167 /// Look up a symbol in the main JITDylib by the symbol's linker-mangled name
168 /// (to look up symbols based on their IR name use the lookup function
169 /// instead).
171 return lookupLinkerMangled(*Main, Name);
172 }
173
174 /// Look up a symbol in JITDylib JD based on its IR symbol name.
176 return lookupLinkerMangled(JD, mangle(UnmangledName));
177 }
178
179 /// Look up a symbol in the main JITDylib based on its IR symbol name.
181 return lookup(*Main, UnmangledName);
182 }
183
184 /// Set the PlatformSupport instance.
185 void setPlatformSupport(std::unique_ptr<PlatformSupport> PS) {
186 this->PS = std::move(PS);
187 }
188
189 /// Get the PlatformSupport instance.
191
192 /// Run the initializers for the given JITDylib.
194 DEBUG_WITH_TYPE("orc", {
195 dbgs() << "LLJIT running initializers for JITDylib \"" << JD.getName()
196 << "\"\n";
197 });
198 assert(PS && "PlatformSupport must be set to run initializers.");
199 return PS->initialize(JD);
200 }
201
202 /// Run the deinitializers for the given JITDylib.
204 DEBUG_WITH_TYPE("orc", {
205 dbgs() << "LLJIT running deinitializers for JITDylib \"" << JD.getName()
206 << "\"\n";
207 });
208 assert(PS && "PlatformSupport must be set to run initializers.");
209 return PS->deinitialize(JD);
210 }
211
212 /// Returns a reference to the ObjLinkingLayer
214
215 /// Returns a reference to the object transform layer.
217
218 /// Returns a reference to the IR transform layer.
220
221 /// Returns a reference to the IR compile layer.
223
224 /// Returns a linker-mangled version of UnmangledName.
225 std::string mangle(StringRef UnmangledName) const;
226
227 /// Returns an interned, linker-mangled version of UnmangledName.
229 return ES->intern(mangle(UnmangledName));
230 }
231
232protected:
235
238
239 /// Create an LLJIT instance with a single compile thread.
240 LLJIT(LLJITBuilderState &S, Error &Err);
241
243
245
246 std::unique_ptr<ExecutionSession> ES;
247 std::unique_ptr<PlatformSupport> PS;
248
250 JITDylib *Platform = nullptr;
251 JITDylib *Main = nullptr;
252
254
257 std::unique_ptr<ThreadPool> CompileThreads;
258
259 std::unique_ptr<ObjectLayer> ObjLinkingLayer;
260 std::unique_ptr<ObjectTransformLayer> ObjTransformLayer;
261 std::unique_ptr<IRCompileLayer> CompileLayer;
262 std::unique_ptr<IRTransformLayer> TransformLayer;
263 std::unique_ptr<IRTransformLayer> InitHelperTransformLayer;
264};
265
266/// An extended version of LLJIT that supports lazy function-at-a-time
267/// compilation of LLVM IR.
268class LLLazyJIT : public LLJIT {
269 template <typename, typename, typename> friend class LLJITBuilderSetters;
270
271public:
272
273 /// Sets the partition function.
274 void
276 CODLayer->setPartitionFunction(std::move(Partition));
277 }
278
279 /// Returns a reference to the on-demand layer.
281
282 /// Add a module to be lazily compiled to JITDylib JD.
284
285 /// Add a module to be lazily compiled to the main JITDylib.
287 return addLazyIRModule(*Main, std::move(M));
288 }
289
290private:
291
292 // Create a single-threaded LLLazyJIT instance.
294
295 std::unique_ptr<LazyCallThroughManager> LCTMgr;
296 std::unique_ptr<CompileOnDemandLayer> CODLayer;
297};
298
300public:
302 std::function<Expected<std::unique_ptr<ObjectLayer>>(ExecutionSession &,
303 const Triple &)>;
304
306 std::function<Expected<std::unique_ptr<IRCompileLayer::IRCompiler>>(
308
311
313
314 std::unique_ptr<ExecutorProcessControl> EPC;
315 std::unique_ptr<ExecutionSession> ES;
316 std::optional<JITTargetMachineBuilder> JTMB;
317 std::optional<DataLayout> DL;
324 unsigned NumCompileThreads = 0;
326
327 /// Called prior to JIT class construcion to fix up defaults.
329};
330
331template <typename JITType, typename SetterImpl, typename State>
333public:
334 /// Set a ExecutorProcessControl for this instance.
335 /// This should not be called if ExecutionSession has already been set.
336 SetterImpl &
337 setExecutorProcessControl(std::unique_ptr<ExecutorProcessControl> EPC) {
338 assert(
339 !impl().ES &&
340 "setExecutorProcessControl should not be called if an ExecutionSession "
341 "has already been set");
342 impl().EPC = std::move(EPC);
343 return impl();
344 }
345
346 /// Set an ExecutionSession for this instance.
347 SetterImpl &setExecutionSession(std::unique_ptr<ExecutionSession> ES) {
348 assert(
349 !impl().EPC &&
350 "setExecutionSession should not be called if an ExecutorProcessControl "
351 "object has already been set");
352 impl().ES = std::move(ES);
353 return impl();
354 }
355
356 /// Set the JITTargetMachineBuilder for this instance.
357 ///
358 /// If this method is not called, JITTargetMachineBuilder::detectHost will be
359 /// used to construct a default target machine builder for the host platform.
361 impl().JTMB = std::move(JTMB);
362 return impl();
363 }
364
365 /// Return a reference to the JITTargetMachineBuilder.
366 ///
367 std::optional<JITTargetMachineBuilder> &getJITTargetMachineBuilder() {
368 return impl().JTMB;
369 }
370
371 /// Set a DataLayout for this instance. If no data layout is specified then
372 /// the target's default data layout will be used.
373 SetterImpl &setDataLayout(std::optional<DataLayout> DL) {
374 impl().DL = std::move(DL);
375 return impl();
376 }
377
378 /// The LinkProcessSymbolsDyDefault flag determines whether the "Process"
379 /// JITDylib will be added to the default link order at LLJIT construction
380 /// time. If true, the Process JITDylib will be added as the last item in the
381 /// default link order. If false (or if the Process JITDylib is disabled via
382 /// setProcessSymbolsJITDylibSetup) then the Process JITDylib will not appear
383 /// in the default link order.
384 SetterImpl &setLinkProcessSymbolsByDefault(bool LinkProcessSymbolsByDefault) {
385 impl().LinkProcessSymbolsByDefault = LinkProcessSymbolsByDefault;
386 return impl();
387 }
388
389 /// Set a setup function for the process symbols dylib. If not provided,
390 /// but LinkProcessSymbolsJITDylibByDefault is true, then the process-symbols
391 /// JITDylib will be configured with a DynamicLibrarySearchGenerator with a
392 /// default symbol filter.
395 SetupProcessSymbolsJITDylib) {
396 impl().SetupProcessSymbolsJITDylib = std::move(SetupProcessSymbolsJITDylib);
397 return impl();
398 }
399
400 /// Set an ObjectLinkingLayer creation function.
401 ///
402 /// If this method is not called, a default creation function will be used
403 /// that will construct an RTDyldObjectLinkingLayer.
405 LLJITBuilderState::ObjectLinkingLayerCreator CreateObjectLinkingLayer) {
406 impl().CreateObjectLinkingLayer = std::move(CreateObjectLinkingLayer);
407 return impl();
408 }
409
410 /// Set a CompileFunctionCreator.
411 ///
412 /// If this method is not called, a default creation function wil be used
413 /// that will construct a basic IR compile function that is compatible with
414 /// the selected number of threads (SimpleCompiler for '0' compile threads,
415 /// ConcurrentIRCompiler otherwise).
417 LLJITBuilderState::CompileFunctionCreator CreateCompileFunction) {
418 impl().CreateCompileFunction = std::move(CreateCompileFunction);
419 return impl();
420 }
421
422 /// Set a setup function to be run just before the PlatformSetupFunction is
423 /// run.
424 ///
425 /// This can be used to customize the LLJIT instance before the platform is
426 /// set up. E.g. By installing a debugger support plugin before the platform
427 /// is set up (when the ORC runtime is loaded) we enable debugging of the
428 /// runtime itself.
429 SetterImpl &
431 impl().PrePlatformSetup = std::move(PrePlatformSetup);
432 return impl();
433 }
434
435 /// Set up an PlatformSetupFunction.
436 ///
437 /// If this method is not called then setUpGenericLLVMIRPlatform
438 /// will be used to configure the JIT's platform support.
439 SetterImpl &
441 impl().SetUpPlatform = std::move(SetUpPlatform);
442 return impl();
443 }
444
445 /// Set the number of compile threads to use.
446 ///
447 /// If set to zero, compilation will be performed on the execution thread when
448 /// JITing in-process. If set to any other number N, a thread pool of N
449 /// threads will be created for compilation.
450 ///
451 /// If this method is not called, behavior will be as if it were called with
452 /// a zero argument.
453 SetterImpl &setNumCompileThreads(unsigned NumCompileThreads) {
454 impl().NumCompileThreads = NumCompileThreads;
455 return impl();
456 }
457
458 /// Enable / disable debugger support (off by default).
459 SetterImpl &setEnableDebuggerSupport(bool EnableDebuggerSupport) {
460 impl().EnableDebuggerSupport = EnableDebuggerSupport;
461 return impl();
462 }
463
464 /// Set an ExecutorProcessControl object.
465 ///
466 /// If the platform uses ObjectLinkingLayer by default and no
467 /// ObjectLinkingLayerCreator has been set then the ExecutorProcessControl
468 /// object will be used to supply the memory manager for the
469 /// ObjectLinkingLayer.
471 impl().EPC = &EPC;
472 return impl();
473 }
474
475 /// Create an instance of the JIT.
477 if (auto Err = impl().prepareForConstruction())
478 return std::move(Err);
479
480 Error Err = Error::success();
481 std::unique_ptr<JITType> J(new JITType(impl(), Err));
482 if (Err)
483 return std::move(Err);
484 return std::move(J);
485 }
486
487protected:
488 SetterImpl &impl() { return static_cast<SetterImpl &>(*this); }
489};
490
491/// Constructs LLJIT instances.
493 : public LLJITBuilderState,
494 public LLJITBuilderSetters<LLJIT, LLJITBuilder, LLJITBuilderState> {};
495
497 friend class LLLazyJIT;
498
499public:
501 std::function<std::unique_ptr<IndirectStubsManager>()>;
502
505 std::unique_ptr<LazyCallThroughManager> LCTMgr;
507
509};
510
511template <typename JITType, typename SetterImpl, typename State>
513 : public LLJITBuilderSetters<JITType, SetterImpl, State> {
514public:
515 /// Set the address in the target address to call if a lazy compile fails.
516 ///
517 /// If this method is not called then the value will default to 0.
519 this->impl().LazyCompileFailureAddr = Addr;
520 return this->impl();
521 }
522
523 /// Set the lazy-callthrough manager.
524 ///
525 /// If this method is not called then a default, in-process lazy callthrough
526 /// manager for the host platform will be used.
527 SetterImpl &
528 setLazyCallthroughManager(std::unique_ptr<LazyCallThroughManager> LCTMgr) {
529 this->impl().LCTMgr = std::move(LCTMgr);
530 return this->impl();
531 }
532
533 /// Set the IndirectStubsManager builder function.
534 ///
535 /// If this method is not called then a default, in-process
536 /// IndirectStubsManager builder for the host platform will be used.
539 this->impl().ISMBuilder = std::move(ISMBuilder);
540 return this->impl();
541 }
542};
543
544/// Constructs LLLazyJIT instances.
546 : public LLLazyJITBuilderState,
547 public LLLazyJITBuilderSetters<LLLazyJIT, LLLazyJITBuilder,
548 LLLazyJITBuilderState> {};
549
550/// Configure the LLJIT instance to use orc runtime support. This overload
551/// assumes that the client has manually configured a Platform object.
553
554/// Configure the LLJIT instance to use the ORC runtime and the detected
555/// native target for the executor.
557public:
558 /// Set up using path to Orc runtime.
559 ExecutorNativePlatform(std::string OrcRuntimePath)
560 : OrcRuntime(std::move(OrcRuntimePath)) {}
561
562 /// Set up using the given memory buffer.
563 ExecutorNativePlatform(std::unique_ptr<MemoryBuffer> OrcRuntimeMB)
564 : OrcRuntime(std::move(OrcRuntimeMB)) {}
565
566 // TODO: add compiler-rt.
567
568 /// Add a path to the VC runtime.
569 ExecutorNativePlatform &addVCRuntime(std::string VCRuntimePath,
570 bool StaticVCRuntime) {
571 VCRuntime = {std::move(VCRuntimePath), StaticVCRuntime};
572 return *this;
573 }
574
576
577private:
578 std::variant<std::string, std::unique_ptr<MemoryBuffer>> OrcRuntime;
579 std::optional<std::pair<std::string, bool>> VCRuntime;
580};
581
582/// Configure the LLJIT instance to scrape modules for llvm.global_ctors and
583/// llvm.global_dtors variables and (if present) build initialization and
584/// deinitialization functions. Platform specific initialization configurations
585/// should be preferred where available.
587
588/// Configure the LLJIT instance to disable platform support explicitly. This is
589/// useful in two cases: for platforms that don't have such requirements and for
590/// platforms, that we have no explicit support yet and that don't work well
591/// with the generic IR platform.
593
594} // End namespace orc
595} // End namespace llvm
596
597#endif // LLVM_EXECUTIONENGINE_ORC_LLJIT_H
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define DEBUG_WITH_TYPE(TYPE, X)
DEBUG_WITH_TYPE macro - This macro should be used by passes to emit debug information.
Definition: Debug.h:64
uint64_t Addr
std::string Name
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:110
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
static ErrorSuccess success()
Create a success value.
Definition: Error.h:334
Tagged union holding either a T or a Error.
Definition: Error.h:474
A smart pointer to a reference-counted object that inherits from RefCountedBase or ThreadSafeRefCount...
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
std::function< std::optional< GlobalValueSet >(GlobalValueSet Requested)> PartitionFunction
Partitioning function.
An ExecutionSession represents a running JIT program.
Definition: Core.h:1389
Represents an address in the executor process.
Configure the LLJIT instance to use the ORC runtime and the detected native target for the executor.
Definition: LLJIT.h:556
ExecutorNativePlatform & addVCRuntime(std::string VCRuntimePath, bool StaticVCRuntime)
Add a path to the VC runtime.
Definition: LLJIT.h:569
ExecutorNativePlatform(std::unique_ptr< MemoryBuffer > OrcRuntimeMB)
Set up using the given memory buffer.
Definition: LLJIT.h:563
ExecutorNativePlatform(std::string OrcRuntimePath)
Set up using path to Orc runtime.
Definition: LLJIT.h:559
Expected< JITDylibSP > operator()(LLJIT &J)
Definition: LLJIT.cpp:1137
ExecutorProcessControl supports interaction with a JIT target process.
A layer that applies a transform to emitted modules.
Represents a JIT'd dynamic library.
Definition: Core.h:958
A utility class for building TargetMachines for JITs.
SetterImpl & setLinkProcessSymbolsByDefault(bool LinkProcessSymbolsByDefault)
The LinkProcessSymbolsDyDefault flag determines whether the "Process" JITDylib will be added to the d...
Definition: LLJIT.h:384
SetterImpl & setExecutorProcessControl(ExecutorProcessControl &EPC)
Set an ExecutorProcessControl object.
Definition: LLJIT.h:470
std::optional< JITTargetMachineBuilder > & getJITTargetMachineBuilder()
Return a reference to the JITTargetMachineBuilder.
Definition: LLJIT.h:367
SetterImpl & setPrePlatformSetup(unique_function< Error(LLJIT &)> PrePlatformSetup)
Set a setup function to be run just before the PlatformSetupFunction is run.
Definition: LLJIT.h:430
SetterImpl & setCompileFunctionCreator(LLJITBuilderState::CompileFunctionCreator CreateCompileFunction)
Set a CompileFunctionCreator.
Definition: LLJIT.h:416
SetterImpl & setEnableDebuggerSupport(bool EnableDebuggerSupport)
Enable / disable debugger support (off by default).
Definition: LLJIT.h:459
SetterImpl & setNumCompileThreads(unsigned NumCompileThreads)
Set the number of compile threads to use.
Definition: LLJIT.h:453
SetterImpl & setDataLayout(std::optional< DataLayout > DL)
Set a DataLayout for this instance.
Definition: LLJIT.h:373
SetterImpl & setJITTargetMachineBuilder(JITTargetMachineBuilder JTMB)
Set the JITTargetMachineBuilder for this instance.
Definition: LLJIT.h:360
SetterImpl & setExecutorProcessControl(std::unique_ptr< ExecutorProcessControl > EPC)
Set a ExecutorProcessControl for this instance.
Definition: LLJIT.h:337
SetterImpl & setObjectLinkingLayerCreator(LLJITBuilderState::ObjectLinkingLayerCreator CreateObjectLinkingLayer)
Set an ObjectLinkingLayer creation function.
Definition: LLJIT.h:404
SetterImpl & setPlatformSetUp(LLJITBuilderState::PlatformSetupFunction SetUpPlatform)
Set up an PlatformSetupFunction.
Definition: LLJIT.h:440
Expected< std::unique_ptr< JITType > > create()
Create an instance of the JIT.
Definition: LLJIT.h:476
SetterImpl & setExecutionSession(std::unique_ptr< ExecutionSession > ES)
Set an ExecutionSession for this instance.
Definition: LLJIT.h:347
SetterImpl & setProcessSymbolsJITDylibSetup(LLJITBuilderState::ProcessSymbolsJITDylibSetupFunction SetupProcessSymbolsJITDylib)
Set a setup function for the process symbols dylib.
Definition: LLJIT.h:393
Error prepareForConstruction()
Called prior to JIT class construcion to fix up defaults.
Definition: LLJIT.cpp:670
ProcessSymbolsJITDylibSetupFunction SetupProcessSymbolsJITDylib
Definition: LLJIT.h:319
ObjectLinkingLayerCreator CreateObjectLinkingLayer
Definition: LLJIT.h:320
std::function< Expected< std::unique_ptr< IRCompileLayer::IRCompiler > >(JITTargetMachineBuilder JTMB)> CompileFunctionCreator
Definition: LLJIT.h:307
std::unique_ptr< ExecutionSession > ES
Definition: LLJIT.h:315
unique_function< Error(LLJIT &)> PrePlatformSetup
Definition: LLJIT.h:322
std::function< Expected< std::unique_ptr< ObjectLayer > >(ExecutionSession &, const Triple &)> ObjectLinkingLayerCreator
Definition: LLJIT.h:303
CompileFunctionCreator CreateCompileFunction
Definition: LLJIT.h:321
std::unique_ptr< ExecutorProcessControl > EPC
Definition: LLJIT.h:314
std::optional< DataLayout > DL
Definition: LLJIT.h:317
std::optional< JITTargetMachineBuilder > JTMB
Definition: LLJIT.h:316
PlatformSetupFunction SetUpPlatform
Definition: LLJIT.h:323
Constructs LLJIT instances.
Definition: LLJIT.h:494
Initializer support for LLJIT.
Definition: LLJIT.h:45
virtual Error deinitialize(JITDylib &JD)=0
virtual Error initialize(JITDylib &JD)=0
static void setInitTransform(LLJIT &J, IRTransformLayer::TransformFunction T)
Definition: LLJIT.cpp:663
A pre-fabricated ORC JIT stack that can serve as an alternative to MCJIT.
Definition: LLJIT.h:38
static Expected< std::unique_ptr< ObjectLayer > > createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES)
Definition: LLJIT.cpp:902
void setPlatformSupport(std::unique_ptr< PlatformSupport > PS)
Set the PlatformSupport instance.
Definition: LLJIT.h:185
std::unique_ptr< ExecutionSession > ES
Definition: LLJIT.h:246
Error addObjectFile(ResourceTrackerSP RT, std::unique_ptr< MemoryBuffer > Obj)
Adds an object file to the given JITDylib.
Definition: LLJIT.cpp:880
Expected< JITDylib & > createJITDylib(std::string Name)
Create a new JITDylib with the given name and return a reference to it.
Definition: LLJIT.cpp:822
JITDylib & getMainJITDylib()
Returns a reference to the JITDylib representing the JIT'd main program.
Definition: LLJIT.h:72
JITDylibSearchOrder DefaultLinks
Definition: LLJIT.h:253
const DataLayout & getDataLayout() const
Returns a reference to the DataLayout for this instance.
Definition: LLJIT.h:69
void recordCtorDtors(Module &M)
Error initialize(JITDylib &JD)
Run the initializers for the given JITDylib.
Definition: LLJIT.h:193
Error addIRModule(ThreadSafeModule TSM)
Adds an IR module to the Main JITDylib.
Definition: LLJIT.h:140
ObjectLayer & getObjLinkingLayer()
Returns a reference to the ObjLinkingLayer.
Definition: LLJIT.h:213
Expected< ExecutorAddr > lookupLinkerMangled(JITDylib &JD, StringRef Name)
Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to look up symbols based on thei...
Definition: LLJIT.h:162
IRCompileLayer & getIRCompileLayer()
Returns a reference to the IR compile layer.
Definition: LLJIT.h:222
std::unique_ptr< ObjectTransformLayer > ObjTransformLayer
Definition: LLJIT.h:260
friend Expected< JITDylibSP > setUpGenericLLVMIRPlatform(LLJIT &J)
Configure the LLJIT instance to scrape modules for llvm.global_ctors and llvm.global_dtors variables ...
Definition: LLJIT.cpp:1219
virtual ~LLJIT()
Destruct this instance.
Definition: LLJIT.cpp:811
IRTransformLayer & getIRTransformLayer()
Returns a reference to the IR transform layer.
Definition: LLJIT.h:219
std::string mangle(StringRef UnmangledName) const
Returns a linker-mangled version of UnmangledName.
Definition: LLJIT.cpp:1089
JITDylib * Main
Definition: LLJIT.h:251
Expected< ExecutorAddr > lookup(JITDylib &JD, StringRef UnmangledName)
Look up a symbol in JITDylib JD based on its IR symbol name.
Definition: LLJIT.h:175
JITDylibSP getPlatformJITDylib()
Returns the Platform JITDylib, which will contain the ORC runtime (if given) and any platform symbols...
Definition: LLJIT.cpp:820
Expected< JITDylib & > loadPlatformDynamicLibrary(const char *Path)
Load a (real) dynamic library and make its symbols available through a new JITDylib with the same nam...
Definition: LLJIT.cpp:831
std::unique_ptr< IRTransformLayer > InitHelperTransformLayer
Definition: LLJIT.h:263
Error deinitialize(JITDylib &JD)
Run the deinitializers for the given JITDylib.
Definition: LLJIT.h:203
std::unique_ptr< IRCompileLayer > CompileLayer
Definition: LLJIT.h:261
Expected< ExecutorAddr > lookup(StringRef UnmangledName)
Look up a symbol in the main JITDylib based on its IR symbol name.
Definition: LLJIT.h:180
const Triple & getTargetTriple() const
Returns a reference to the triple for this instance.
Definition: LLJIT.h:66
JITDylibSP getProcessSymbolsJITDylib()
Returns the ProcessSymbols JITDylib, which by default reflects non-JIT'd symbols in the host process.
Definition: LLJIT.cpp:818
Expected< ExecutorAddr > lookupLinkerMangled(JITDylib &JD, SymbolStringPtr Name)
Look up a symbol in JITDylib JD by the symbol's linker-mangled name (to look up symbols based on thei...
Definition: LLJIT.cpp:891
static Expected< std::unique_ptr< IRCompileLayer::IRCompiler > > createCompileFunction(LLJITBuilderState &S, JITTargetMachineBuilder JTMB)
Definition: LLJIT.cpp:931
PlatformSupport * getPlatformSupport()
Get the PlatformSupport instance.
Definition: LLJIT.h:190
JITDylib * ProcessSymbols
Definition: LLJIT.h:249
ExecutionSession & getExecutionSession()
Returns the ExecutionSession for this instance.
Definition: LLJIT.h:63
std::unique_ptr< IRTransformLayer > TransformLayer
Definition: LLJIT.h:262
SymbolStringPtr mangleAndIntern(StringRef UnmangledName) const
Returns an interned, linker-mangled version of UnmangledName.
Definition: LLJIT.h:228
DataLayout DL
Definition: LLJIT.h:255
Error addObjectFile(std::unique_ptr< MemoryBuffer > Obj)
Adds an object file to the given JITDylib.
Definition: LLJIT.h:151
Error linkStaticLibraryInto(JITDylib &JD, std::unique_ptr< MemoryBuffer > LibBuffer)
Link a static library into the given JITDylib.
Definition: LLJIT.cpp:844
Error applyDataLayout(Module &M)
Definition: LLJIT.cpp:1098
std::unique_ptr< ThreadPool > CompileThreads
Definition: LLJIT.h:257
std::unique_ptr< ObjectLayer > ObjLinkingLayer
Definition: LLJIT.h:259
std::unique_ptr< PlatformSupport > PS
Definition: LLJIT.h:247
JITDylibSearchOrder defaultLinkOrder()
Returns the default link order for this LLJIT instance.
Definition: LLJIT.h:131
JITDylib * getJITDylibByName(StringRef Name)
Returns the JITDylib with the given name, or nullptr if no JITDylib with that name exists.
Definition: LLJIT.h:90
ObjectTransformLayer & getObjTransformLayer()
Returns a reference to the object transform layer.
Definition: LLJIT.h:216
Triple TT
Definition: LLJIT.h:256
Error addIRModule(ResourceTrackerSP RT, ThreadSafeModule TSM)
Adds an IR module with the given ResourceTracker.
Definition: LLJIT.cpp:866
Expected< ExecutorAddr > lookupLinkerMangled(StringRef Name)
Look up a symbol in the main JITDylib by the symbol's linker-mangled name (to look up symbols based o...
Definition: LLJIT.h:170
SetterImpl & setLazyCompileFailureAddr(ExecutorAddr Addr)
Set the address in the target address to call if a lazy compile fails.
Definition: LLJIT.h:518
SetterImpl & setLazyCallthroughManager(std::unique_ptr< LazyCallThroughManager > LCTMgr)
Set the lazy-callthrough manager.
Definition: LLJIT.h:528
SetterImpl & setIndirectStubsManagerBuilder(LLLazyJITBuilderState::IndirectStubsManagerBuilderFunction ISMBuilder)
Set the IndirectStubsManager builder function.
Definition: LLJIT.h:537
ExecutorAddr LazyCompileFailureAddr
Definition: LLJIT.h:504
std::unique_ptr< LazyCallThroughManager > LCTMgr
Definition: LLJIT.h:505
std::function< std::unique_ptr< IndirectStubsManager >()> IndirectStubsManagerBuilderFunction
Definition: LLJIT.h:501
IndirectStubsManagerBuilderFunction ISMBuilder
Definition: LLJIT.h:506
Constructs LLLazyJIT instances.
Definition: LLJIT.h:548
An extended version of LLJIT that supports lazy function-at-a-time compilation of LLVM IR.
Definition: LLJIT.h:268
void setPartitionFunction(CompileOnDemandLayer::PartitionFunction Partition)
Sets the partition function.
Definition: LLJIT.h:275
Error addLazyIRModule(ThreadSafeModule M)
Add a module to be lazily compiled to the main JITDylib.
Definition: LLJIT.h:286
CompileOnDemandLayer & getCompileOnDemandLayer()
Returns a reference to the on-demand layer.
Definition: LLJIT.h:280
Error addLazyIRModule(JITDylib &JD, ThreadSafeModule M)
Add a module to be lazily compiled to JITDylib JD.
Definition: LLJIT.cpp:1251
Interface for Layers that accept object files.
Definition: Layer.h:133
Platforms set up standard symbols and mediate interactions between dynamic initializers (e....
Definition: Core.h:1318
Pointer to a pooled string representing a symbol name.
An LLVM Module together with a shared ThreadSafeContext.
std::vector< std::pair< JITDylib *, JITDylibLookupFlags > > JITDylibSearchOrder
A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search order during symbol lookup.
Definition: Core.h:162
Expected< JITDylibSP > setUpInactivePlatform(LLJIT &J)
Configure the LLJIT instance to disable platform support explicitly.
Definition: LLJIT.cpp:1237
Expected< JITDylibSP > setUpGenericLLVMIRPlatform(LLJIT &J)
Configure the LLJIT instance to scrape modules for llvm.global_ctors and llvm.global_dtors variables ...
Definition: LLJIT.cpp:1219
Error setUpOrcPlatformManually(LLJIT &J)
Configure the LLJIT instance to use orc runtime support.
Definition: LLJIT.cpp:1112
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:163
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1854
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858