12#include "llvm/Config/llvm-config.h"
32#define DEBUG_TYPE "orc"
58 std::vector<Type *> HelperArgTypes;
59 for (
auto *Arg : HelperPrefixArgs)
60 HelperArgTypes.push_back(Arg->getType());
69 WrapperFn->setVisibility(WrapperVisibility);
74 std::vector<Value *> HelperArgs;
76 for (
auto &Arg : WrapperFn->args())
77 HelperArgs.push_back(&Arg);
78 auto *HelperResult = IB.CreateCall(HelperFn, HelperArgs);
79 if (HelperFn->getReturnType()->isVoidTy())
82 IB.CreateRet(HelperResult);
87class GenericLLVMIRPlatformSupport;
91class GenericLLVMIRPlatform :
public Platform {
93 GenericLLVMIRPlatform(GenericLLVMIRPlatformSupport &S) : S(S) {}
104 GenericLLVMIRPlatformSupport &S;
110class GlobalCtorDtorScraper {
112 GlobalCtorDtorScraper(GenericLLVMIRPlatformSupport &PS,
115 : PS(PS), InitFunctionPrefix(InitFunctionPrefix),
116 DeInitFunctionPrefix(DeInitFunctionPrefix) {}
121 GenericLLVMIRPlatformSupport &PS;
134 : J(J), InitFunctionPrefix(J.
mangle(
"__orc_init_func.")),
135 DeInitFunctionPrefix(J.
mangle(
"__orc_deinit_func.")) {
137 getExecutionSession().setPlatform(
138 std::make_unique<GenericLLVMIRPlatform>(*
this));
140 setInitTransform(J, GlobalCtorDtorScraper(*
this, InitFunctionPrefix,
141 DeInitFunctionPrefix));
145 StdInterposes[J.
mangleAndIntern(
"__lljit.platform_support_instance")] = {
151 cantFail(setupJITDylib(PlatformJD));
168 auto Ctx = std::make_unique<LLVMContext>();
169 auto M = std::make_unique<Module>(
"__standard_lib", *Ctx);
175 ConstantInt::get(Int64Ty,
reinterpret_cast<uintptr_t
>(&JD)),
178 DSOHandle->setInitializer(
181 auto *GenericIRPlatformSupportTy =
186 nullptr,
"__lljit.platform_support_instance");
192 {PlatformInstanceDecl, DSOHandle});
196 auto *AtExit = addHelperAndWrapper(
199 {PlatformInstanceDecl, DSOHandle});
203 AtExit->addRetAttr(AtExitExtAttr);
219 if ((*KV.first).starts_with(InitFunctionPrefix)) {
220 InitSymbols[&JD].add(KV.first,
222 InitFunctions[&JD].add(KV.first);
223 }
else if ((*KV.first).starts_with(DeInitFunctionPrefix)) {
224 DeInitFunctions[&JD].add(KV.first);
232 dbgs() <<
"GenericLLVMIRPlatformSupport getting initializers to run\n";
234 if (
auto Initializers = getInitializers(JD)) {
236 {
dbgs() <<
"GenericLLVMIRPlatformSupport running initializers\n"; });
237 for (
auto InitFnAddr : *Initializers) {
239 dbgs() <<
" Running init " <<
formatv(
"{0:x16}", InitFnAddr)
242 auto *InitFn = InitFnAddr.toPtr<void (*)()>();
246 return Initializers.takeError();
252 dbgs() <<
"GenericLLVMIRPlatformSupport getting deinitializers to run\n";
254 if (
auto Deinitializers = getDeinitializers(JD)) {
256 dbgs() <<
"GenericLLVMIRPlatformSupport running deinitializers\n";
258 for (
auto DeinitFnAddr : *Deinitializers) {
260 dbgs() <<
" Running deinit " <<
formatv(
"{0:x16}", DeinitFnAddr)
263 auto *DeinitFn = DeinitFnAddr.toPtr<void (*)()>();
267 return Deinitializers.takeError();
273 getExecutionSession().runSessionLocked(
274 [&]() { InitFunctions[&JD].add(InitName); });
278 getExecutionSession().runSessionLocked(
279 [&]() { DeInitFunctions[&JD].add(DeInitName); });
284 if (
auto Err = issueInitLookups(JD))
285 return std::move(Err);
288 std::vector<JITDylibSP> DFSLinkOrder;
290 if (
auto Err = getExecutionSession().runSessionLocked([&]() ->
Error {
292 DFSLinkOrder = std::move(*DFSLinkOrderOrErr);
294 return DFSLinkOrderOrErr.takeError();
296 for (
auto &NextJD : DFSLinkOrder) {
297 auto IFItr = InitFunctions.find(NextJD.get());
298 if (IFItr != InitFunctions.end()) {
299 LookupSymbols[NextJD.get()] = std::move(IFItr->second);
300 InitFunctions.erase(IFItr);
305 return std::move(Err);
308 dbgs() <<
"JITDylib init order is [ ";
312 dbgs() <<
"Looking up init functions:\n";
313 for (
auto &KV : LookupSymbols)
314 dbgs() <<
" \"" << KV.first->getName() <<
"\": " << KV.second <<
"\n";
317 auto &ES = getExecutionSession();
321 return LookupResult.takeError();
323 std::vector<ExecutorAddr> Initializers;
324 while (!DFSLinkOrder.empty()) {
325 auto &NextJD = *DFSLinkOrder.back();
326 DFSLinkOrder.pop_back();
327 auto InitsItr = LookupResult->find(&NextJD);
328 if (InitsItr == LookupResult->end())
330 for (
auto &KV : InitsItr->second)
331 Initializers.push_back(KV.second.getAddress());
338 auto &ES = getExecutionSession();
343 std::vector<JITDylibSP> DFSLinkOrder;
345 if (
auto Err = ES.runSessionLocked([&]() ->
Error {
346 if (auto DFSLinkOrderOrErr = JD.getDFSLinkOrder())
347 DFSLinkOrder = std::move(*DFSLinkOrderOrErr);
349 return DFSLinkOrderOrErr.takeError();
351 for (auto &NextJD : DFSLinkOrder) {
352 auto &JDLookupSymbols = LookupSymbols[NextJD.get()];
353 auto DIFItr = DeInitFunctions.find(NextJD.get());
354 if (DIFItr != DeInitFunctions.end()) {
355 LookupSymbols[NextJD.get()] = std::move(DIFItr->second);
356 DeInitFunctions.erase(DIFItr);
358 JDLookupSymbols.add(LLJITRunAtExits,
359 SymbolLookupFlags::WeaklyReferencedSymbol);
363 return std::move(Err);
366 dbgs() <<
"JITDylib deinit order is [ ";
367 for (
auto &JD : DFSLinkOrder)
370 dbgs() <<
"Looking up deinit functions:\n";
371 for (
auto &KV : LookupSymbols)
372 dbgs() <<
" \"" << KV.first->getName() <<
"\": " << KV.second <<
"\n";
378 return LookupResult.takeError();
380 std::vector<ExecutorAddr> DeInitializers;
381 for (
auto &NextJD : DFSLinkOrder) {
382 auto DeInitsItr = LookupResult->find(NextJD.get());
383 assert(DeInitsItr != LookupResult->end() &&
384 "Every JD should have at least __lljit_run_atexits");
386 auto RunAtExitsItr = DeInitsItr->second.find(LLJITRunAtExits);
387 if (RunAtExitsItr != DeInitsItr->second.end())
388 DeInitializers.push_back(RunAtExitsItr->second.getAddress());
390 for (
auto &KV : DeInitsItr->second)
391 if (KV.first != LLJITRunAtExits)
392 DeInitializers.push_back(KV.second.getAddress());
395 return DeInitializers;
402 std::vector<JITDylibSP> DFSLinkOrder;
404 if (
auto Err = getExecutionSession().runSessionLocked([&]() ->
Error {
406 DFSLinkOrder = std::move(*DFSLinkOrderOrErr);
408 return DFSLinkOrderOrErr.takeError();
410 for (
auto &NextJD : DFSLinkOrder) {
411 auto ISItr = InitSymbols.find(NextJD.get());
412 if (ISItr != InitSymbols.end()) {
413 RequiredInitSymbols[NextJD.get()] = std::move(ISItr->second);
414 InitSymbols.erase(ISItr);
426 static void registerCxaAtExitHelper(
void *Self,
void (*
F)(
void *),
void *Ctx,
429 dbgs() <<
"Registering cxa atexit function " << (
void *)
F <<
" for JD "
430 << (*
static_cast<JITDylib **
>(DSOHandle))->getName() <<
"\n";
432 static_cast<GenericLLVMIRPlatformSupport *
>(Self)->AtExitMgr.registerAtExit(
436 static void registerAtExitHelper(
void *Self,
void *DSOHandle,
void (*
F)()) {
438 dbgs() <<
"Registering atexit function " << (
void *)
F <<
" for JD "
439 << (*
static_cast<JITDylib **
>(DSOHandle))->getName() <<
"\n";
441 static_cast<GenericLLVMIRPlatformSupport *
>(Self)->AtExitMgr.registerAtExit(
442 reinterpret_cast<void (*)(
void *)
>(
F),
nullptr, DSOHandle);
445 static void runAtExitsHelper(
void *Self,
void *DSOHandle) {
447 dbgs() <<
"Running atexit functions for JD "
450 static_cast<GenericLLVMIRPlatformSupport *
>(Self)->AtExitMgr.runAtExits(
457 auto Ctx = std::make_unique<LLVMContext>();
458 auto M = std::make_unique<Module>(
"__standard_lib", *Ctx);
459 M->setDataLayout(J.getDataLayout());
461 auto *GenericIRPlatformSupportTy =
466 nullptr,
"__lljit.platform_support_instance");
472 auto *CxaAtExit = addHelperAndWrapper(
477 {PlatformInstanceDecl});
479 TargetLibraryInfo::getExtAttrForI32Return(J.getTargetTriple());
481 CxaAtExit->addRetAttr(CxaAtExitExtAttr);
487 std::string InitFunctionPrefix;
488 std::string DeInitFunctionPrefix;
496 return S.setupJITDylib(JD);
499Error GenericLLVMIRPlatform::teardownJITDylib(JITDylib &JD) {
503Error GenericLLVMIRPlatform::notifyAdding(ResourceTracker &RT,
504 const MaterializationUnit &MU) {
505 return S.notifyAdding(RT, MU);
508Expected<ThreadSafeModule>
509GlobalCtorDtorScraper::operator()(ThreadSafeModule TSM,
510 MaterializationResponsibility &R) {
512 auto &Ctx =
M.getContext();
513 auto *GlobalCtors =
M.getNamedGlobal(
"llvm.global_ctors");
514 auto *GlobalDtors =
M.getNamedGlobal(
"llvm.global_dtors");
516 auto RegisterCOrDtors = [&](GlobalVariable *GlobalCOrDtors,
517 bool isCtor) ->
Error {
521 std::string InitOrDeInitFunctionName;
523 raw_string_ostream(InitOrDeInitFunctionName)
524 << InitFunctionPrefix <<
M.getModuleIdentifier();
526 raw_string_ostream(InitOrDeInitFunctionName)
527 << DeInitFunctionPrefix <<
M.getModuleIdentifier();
529 MangleAndInterner
Mangle(PS.getExecutionSession(),
M.getDataLayout());
530 auto InternedInitOrDeInitName =
Mangle(InitOrDeInitFunctionName);
531 if (
auto Err =
R.defineMaterializing(
532 {{InternedInitOrDeInitName, JITSymbolFlags::Callable}}))
536 FunctionType::get(Type::getVoidTy(Ctx), {},
false),
539 std::vector<std::pair<Function *, unsigned>> InitsOrDeInits;
542 for (
auto E : COrDtors)
543 InitsOrDeInits.push_back(std::make_pair(
E.Func,
E.Priority));
546 auto *InitOrDeInitFuncEntryBlock =
549 for (
auto &KV : InitsOrDeInits)
550 IB.CreateCall(KV.first);
554 PS.registerInitFunc(
R.getTargetJITDylib(), InternedInitOrDeInitName);
556 PS.registerDeInitFunc(
R.getTargetJITDylib(), InternedInitOrDeInitName);
562 if (
auto Err = RegisterCOrDtors(GlobalCtors,
true))
564 if (
auto Err = RegisterCOrDtors(GlobalDtors,
false))
571 return std::move(Err);
573 return std::move(TSM);
580class InactivePlatformSupport :
public LLJIT::PlatformSupport {
582 InactivePlatformSupport() =
default;
585 LLVM_DEBUG(
dbgs() <<
"InactivePlatformSupport: no initializers running for "
590 Error deinitialize(JITDylib &JD)
override {
592 dbgs() <<
"InactivePlatformSupport: no deinitializers running for "
606 using SPSDLOpenSig = SPSExecutorAddr(SPSString, int32_t);
607 using SPSDLUpdateSig = int32_t(SPSExecutorAddr);
608 enum dlopen_mode : int32_t {
609 ORC_RT_RTLD_LAZY = 0x1,
610 ORC_RT_RTLD_NOW = 0x2,
611 ORC_RT_RTLD_LOCAL = 0x4,
612 ORC_RT_RTLD_GLOBAL = 0x8
615 auto &ES = J.getExecutionSession();
616 auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo(
618 StringRef WrapperToCall =
"__orc_rt_jit_dlopen_wrapper";
619 bool dlupdate =
false;
620 const Triple &TT = ES.getTargetTriple();
621 if (TT.isOSBinFormatMachO() || TT.isOSBinFormatELF()) {
622 if (InitializedDylib.contains(&JD)) {
623 WrapperToCall =
"__orc_rt_jit_dlupdate_wrapper";
626 InitializedDylib.insert(&JD);
629 if (
auto WrapperAddr =
630 ES.lookup(MainSearchOrder, J.mangleAndIntern(WrapperToCall))) {
633 auto E = ES.callSPSWrapper<SPSDLUpdateSig>(WrapperAddr->getAddress(),
634 result, DSOHandles[&JD]);
641 return ES.callSPSWrapper<SPSDLOpenSig>(WrapperAddr->getAddress(),
642 DSOHandles[&JD], JD.getName(),
643 int32_t(ORC_RT_RTLD_LAZY));
645 return WrapperAddr.takeError();
652 using SPSDLCloseSig = int32_t(SPSExecutorAddr);
654 auto &ES = J.getExecutionSession();
655 auto MainSearchOrder = J.getMainJITDylib().withLinkOrderDo(
658 if (
auto WrapperAddr = ES.lookup(
659 MainSearchOrder, J.mangleAndIntern(
"__orc_rt_jit_dlclose_wrapper"))) {
661 auto E = J.getExecutionSession().callSPSWrapper<SPSDLCloseSig>(
662 WrapperAddr->getAddress(), result, DSOHandles[&JD]);
668 DSOHandles.erase(&JD);
669 InitializedDylib.erase(&JD);
671 return WrapperAddr.takeError();
688 dbgs() <<
" No explicitly set JITTargetMachineBuilder. "
689 "Detecting host...\n";
692 JTMB = std::move(*JTMBOrErr);
694 return JTMBOrErr.takeError();
699 "NumCompileThreads cannot be used with a custom ExecutionSession or "
700 "ExecutorProcessControl",
703#if !LLVM_ENABLE_THREADS
707 " but LLVM was compiled with LLVM_ENABLE_THREADS=Off",
712 [[maybe_unused]]
bool ConcurrentCompilationSettingDefaulted =
716#if LLVM_ENABLE_THREADS
722#if !LLVM_ENABLE_THREADS
725 "LLJIT concurrent compilation support requested, but LLVM was built "
726 "with LLVM_ENABLE_THREADS=Off",
732 dbgs() <<
" JITTargetMachineBuilder is "
734 <<
" Pre-constructed ExecutionSession: " << (
ES ?
"Yes" :
"No")
738 dbgs() <<
DL->getStringRepresentation() <<
"\n";
740 dbgs() <<
"None (will be created by JITTargetMachineBuilder)\n";
742 dbgs() <<
" Custom object-linking-layer creator: "
744 <<
" Custom compile-function creator: "
746 <<
" Custom platform-setup function: "
748 <<
" Support concurrent compilation: "
750 if (ConcurrentCompilationSettingDefaulted)
751 dbgs() <<
" (defaulted based on ES / EPC / NumCompileThreads)\n";
759 if (
auto DLOrErr =
JTMB->getDefaultDataLayoutForTarget())
760 DL = std::move(*DLOrErr);
762 return DLOrErr.takeError();
768 dbgs() <<
"ExecutorProcessControl not specified, "
769 "Creating SelfExecutorProcessControl instance\n";
772 std::unique_ptr<TaskDispatcher>
D =
nullptr;
773#if LLVM_ENABLE_THREADS
775 std::optional<size_t> NumThreads = std ::nullopt;
778 D = std::make_unique<DynamicThreadPoolTaskDispatcher>(NumThreads);
780 D = std::make_unique<InPlaceTaskDispatcher>();
784 EPC = std::move(*EPCOrErr);
786 return EPCOrErr.takeError();
789 dbgs() <<
"Using explicitly specified ExecutorProcessControl instance "
790 <<
EPC.get() <<
"\n";
794 dbgs() <<
"Using explicitly specified ExecutionSession instance "
802 auto &TT =
JTMB->getTargetTriple();
803 bool UseJITLink =
false;
804 switch (TT.getArch()) {
810 UseJITLink = !TT.isOSBinFormatCOFF();
816 UseJITLink = TT.isOSBinFormatELF();
819 UseJITLink = !TT.isOSBinFormatCOFF();
822 UseJITLink = TT.isPPC64ELFv2ABI();
825 UseJITLink = TT.isOSBinFormatELF();
831 if (!
JTMB->getCodeModel())
836 return std::make_unique<ObjectLinkingLayer>(
ES);
844 LLVM_DEBUG(
dbgs() <<
"Creating default Process JD setup function\n");
849 J.getExecutionSession());
851 return G.takeError();
861 if (
auto Err =
ES->endSession())
862 ES->reportError(std::move(Err));
870 auto JD =
ES->createJITDylib(std::move(Name));
872 return JD.takeError();
881 return G.takeError();
883 if (
auto *ExistingJD =
ES->getJITDylibByName(Path))
886 auto &JD =
ES->createBareJITDylib(Path);
892 std::unique_ptr<MemoryBuffer> LibBuffer) {
894 std::move(LibBuffer));
896 return G.takeError();
906 return G.takeError();
914 assert(TSM &&
"Can not add null module");
928 std::unique_ptr<MemoryBuffer> Obj) {
929 assert(Obj &&
"Can not add null object");
940 if (
auto Sym =
ES->lookup(
943 return Sym->getAddress();
958 return std::make_unique<SectionMemoryManager>();
961 std::make_unique<RTDyldObjectLinkingLayer>(
ES, std::move(GetMemMgr));
963 if (S.
JTMB->getTargetTriple().isOSBinFormatCOFF()) {
964 Layer->setOverrideObjectFlagsWithResponsibilityFlags(
true);
965 Layer->setAutoClaimResponsibilityForObjectSymbols(
true);
968 if (S.
JTMB->getTargetTriple().isOSBinFormatELF() &&
971 Layer->setAutoClaimResponsibilityForObjectSymbols(
true);
976 return std::unique_ptr<ObjectLayer>(std::move(Layer));
989 return std::make_unique<ConcurrentIRCompiler>(std::move(JTMB));
993 return TM.takeError();
995 return std::make_unique<TMOwningSimpleCompiler>(std::move(*TM));
1003 assert(!(S.
EPC && S.
ES) &&
"EPC and ES should not both be set");
1006 ES = std::make_unique<ExecutionSession>(std::move(S.
EPC));
1008 ES = std::move(S.
ES);
1011 ES = std::make_unique<ExecutionSession>(std::move(*EPC));
1013 Err = EPC.takeError();
1020 Err = ObjLayer.takeError();
1029 if (!CompileFunction) {
1030 Err = CompileFunction.takeError();
1047 Err = ProcSymsJD.takeError();
1065 Err = PlatformJDOrErr.takeError();
1076 Err = MainOrErr.takeError();
1082 std::string MangledName;
1091 if (M.getDataLayout().isDefault())
1092 M.setDataLayout(
DL);
1094 if (M.getDataLayout() !=
DL)
1096 "Added modules have incompatible data layouts: " +
1097 M.getDataLayout().getStringRepresentation() +
" (module) vs " +
1098 DL.getStringRepresentation() +
" (jit)",
1105 LLVM_DEBUG({
dbgs() <<
"Setting up orc platform support for LLJIT\n"; });
1117 auto DLLNameStr = DLLName.
str();
1118 auto DLLJD = J.loadPlatformDynamicLibrary(DLLNameStr.c_str());
1120 return DLLJD.takeError();
1131 if (!ProcessSymbolsJD)
1133 "Native platforms require a process symbols JITDylib",
1140 if (!ObjLinkingLayer)
1142 "ExecutorNativePlatform requires ObjectLinkingLayer",
1145 std::unique_ptr<MemoryBuffer> RuntimeArchiveBuffer;
1146 if (OrcRuntime.index() == 0) {
1149 return A.takeError();
1150 RuntimeArchiveBuffer = std::move(*
A);
1152 RuntimeArchiveBuffer = std::move(std::get<1>(OrcRuntime));
1160 switch (TT.getObjectFormat()) {
1162 const char *VCRuntimePath =
nullptr;
1163 bool StaticVCRuntime =
false;
1165 VCRuntimePath = VCRuntime->first.c_str();
1166 StaticVCRuntime = VCRuntime->second;
1169 *ObjLinkingLayer, PlatformJD, std::move(RuntimeArchiveBuffer),
1173 return P.takeError();
1178 *ObjLinkingLayer, std::move(RuntimeArchiveBuffer));
1180 return G.takeError();
1186 return P.takeError();
1191 *ObjLinkingLayer, std::move(RuntimeArchiveBuffer));
1193 return G.takeError();
1197 ES.setPlatform(std::move(*
P));
1199 return P.takeError();
1213 {
dbgs() <<
"Setting up GenericLLVMIRPlatform support for LLJIT\n"; });
1215 if (!ProcessSymbolsJD)
1217 "Native platforms require a process symbols JITDylib",
1225 bool UseEHFrames =
true;
1234 std::optional<bool> ForceEHFrames;
1236 "darwin-use-ehframes-only", ForceEHFrames))
1238 if (ForceEHFrames.has_value())
1239 UseEHFrames = *ForceEHFrames;
1241 UseEHFrames =
false;
1247 OLL->addPlugin(std::move(*UIRP));
1250 return UIRP.takeError();
1258 OLL->addPlugin(std::move(*EHFP));
1261 return EHFP.takeError();
1266 std::make_unique<GenericLLVMIRPlatformSupport>(J, PlatformJD));
1273 {
dbgs() <<
"Explicitly deactivated platform support for LLJIT\n"; });
1281 TT =
JTMB->getTargetTriple();
1286 assert(TSM &&
"Can not add null module");
1289 [&](
Module &M) ->
Error { return applyDataLayout(M); }))
1292 return CODLayer->add(JD, std::move(TSM));
1305 LCTMgr = std::move(S.
LCTMgr);
1309 LCTMgr = std::move(*LCTMgrOrErr);
1311 Err = LCTMgrOrErr.takeError();
1326 "IndirectStubsManagerBuilder for target " +
1336 CODLayer = std::make_unique<CompileOnDemandLayer>(*
ES, *IPLayer, *LCTMgr,
1337 std::move(ISMBuilder));
1340 CODLayer->setCloneToNewContextOnEmit(
true);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_ATTRIBUTE_USED
Module.h This file contains the declarations for the Module class.
Machine Check Debug Module
static StringRef getName(Value *V)
LLVM_ABI llvm::orc::shared::CWrapperFunctionResult llvm_orc_deregisterEHFrameSectionAllocAction(const char *ArgData, size_t ArgSize)
LLVM_ABI llvm::orc::shared::CWrapperFunctionResult llvm_orc_registerEHFrameSectionAllocAction(const char *ArgData, size_t ArgSize)
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ None
No attributes have been set.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Helper for Errors used as out-parameters.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
LLVM_ABI bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
void setVisibility(VisibilityTypes V)
@ ExternalLinkage
Externally visible function.
LLVM_ABI void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Flags for symbols in the JIT.
LLVM_ABI void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
This interface provides simple read-only access to a block of memory, and provides simple methods for...
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFile(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, bool IsVolatile=false, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, returning a new MemoryBuffer if successful,...
A Module instance is used to store all the information related to an LLVM module.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
LLVM_ABI bool ends_with_insensitive(StringRef Suffix) const
Check if this string ends with the given Suffix, ignoring case.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Triple - Helper class for working with autoconf configuration names.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
const std::string & str() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
const std::string & getName() const
Get the name for this JITLinkDylib.
static Expected< std::unique_ptr< EHFrameRegistrationPlugin > > Create(ExecutionSession &ES)
static Expected< std::unique_ptr< EPCDynamicLibrarySearchGenerator > > Load(ExecutionSession &ES, const char *LibraryPath, SymbolPredicate Allow=SymbolPredicate(), AddAbsoluteSymbolsFn AddAbsoluteSymbols=nullptr)
Permanently loads the library at the given path and, on success, returns an EPCDynamicLibrarySearchGe...
static Expected< std::unique_ptr< EPCDynamicLibrarySearchGenerator > > GetForTargetProcess(ExecutionSession &ES, SymbolPredicate Allow=SymbolPredicate(), AddAbsoluteSymbolsFn AddAbsoluteSymbols=nullptr)
Creates a EPCDynamicLibrarySearchGenerator that searches for symbols in the target process.
An ExecutionSession represents a running JIT program.
void setPlatform(std::unique_ptr< Platform > P)
Set the Platform for this ExecutionSession.
LLVM_ABI JITDylib & createBareJITDylib(std::string Name)
Add a new bare JITDylib to this ExecutionSession.
Error getBootstrapMapValue(StringRef Key, std::optional< T > &Val) const
Look up and SPS-deserialize a bootstrap map value.
static ExecutorAddr fromPtr(T *Ptr, UnwrapFn &&Unwrap=UnwrapFn())
Create an ExecutorAddr from the given pointer.
An interface for Itanium __cxa_atexit interposer implementations.
Represents a JIT'd dynamic library.
Error define(std::unique_ptr< MaterializationUnitType > &&MU, ResourceTrackerSP RT=nullptr)
Define all symbols provided by the materialization unit to be part of this JITDylib.
ExecutionSession & getExecutionSession() const
Get a reference to the ExecutionSession for this JITDylib.
LLVM_ABI void addToLinkOrder(const JITDylibSearchOrder &NewLinks)
Append the given JITDylibSearchOrder to the link order for this JITDylib (discarding any elements alr...
static LLVM_ABI Expected< std::vector< JITDylibSP > > getDFSLinkOrder(ArrayRef< JITDylibSP > JDs)
Returns the given JITDylibs and all of their transitive dependencies in DFS order (based on linkage r...
LLVM_ABI ResourceTrackerSP getDefaultResourceTracker()
Get the default resource tracker for this JITDylib.
GeneratorT & addGenerator(std::unique_ptr< GeneratorT > DefGenerator)
Adds a definition generator to this JITDylib and returns a referenece to it.
A utility class for building TargetMachines for JITs.
static LLVM_ABI Expected< JITTargetMachineBuilder > detectHost()
Create a JITTargetMachineBuilder for the host system.
LLVM_ABI Expected< std::unique_ptr< TargetMachine > > createTargetMachine()
Create a TargetMachine.
LLVM_ABI Error prepareForConstruction()
Called prior to JIT class construcion to fix up defaults.
ProcessSymbolsJITDylibSetupFunction SetupProcessSymbolsJITDylib
ObjectLinkingLayerCreator CreateObjectLinkingLayer
unsigned NumCompileThreads
std::unique_ptr< ExecutionSession > ES
unique_function< Error(LLJIT &)> PrePlatformSetup
CompileFunctionCreator CreateCompileFunction
std::optional< bool > SupportConcurrentCompilation
bool LinkProcessSymbolsByDefault
std::unique_ptr< ExecutorProcessControl > EPC
std::optional< DataLayout > DL
std::optional< JITTargetMachineBuilder > JTMB
PlatformSetupFunction SetUpPlatform
A pre-fabricated ORC JIT stack that can serve as an alternative to MCJIT.
static Expected< std::unique_ptr< ObjectLayer > > createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES)
void setPlatformSupport(std::unique_ptr< PlatformSupport > PS)
Set the PlatformSupport instance.
std::unique_ptr< ExecutionSession > ES
LLJIT(LLJITBuilderState &S, Error &Err)
Create an LLJIT instance with a single compile thread.
Error addObjectFile(ResourceTrackerSP RT, std::unique_ptr< MemoryBuffer > Obj)
Adds an object file to the given JITDylib.
Expected< JITDylib & > createJITDylib(std::string Name)
Create a new JITDylib with the given name and return a reference to it.
JITDylibSearchOrder DefaultLinks
const DataLayout & getDataLayout() const
Returns a reference to the DataLayout for this instance.
ObjectLayer & getObjLinkingLayer()
Returns a reference to the ObjLinkingLayer.
std::unique_ptr< ObjectTransformLayer > ObjTransformLayer
virtual ~LLJIT()
Destruct this instance.
std::string mangle(StringRef UnmangledName) const
Returns a linker-mangled version of UnmangledName.
JITDylibSP getPlatformJITDylib()
Returns the Platform JITDylib, which will contain the ORC runtime (if given) and any platform symbols...
Expected< JITDylib & > loadPlatformDynamicLibrary(const char *Path)
Load a (real) dynamic library and make its symbols available through a new JITDylib with the same nam...
std::unique_ptr< IRTransformLayer > InitHelperTransformLayer
std::unique_ptr< IRCompileLayer > CompileLayer
const Triple & getTargetTriple() const
Returns a reference to the triple for this instance.
JITDylibSP getProcessSymbolsJITDylib()
Returns the ProcessSymbols JITDylib, which by default reflects non-JIT'd symbols in the host process.
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...
static Expected< std::unique_ptr< IRCompileLayer::IRCompiler > > createCompileFunction(LLJITBuilderState &S, JITTargetMachineBuilder JTMB)
JITDylib * ProcessSymbols
ExecutionSession & getExecutionSession()
Returns the ExecutionSession for this instance.
std::unique_ptr< IRTransformLayer > TransformLayer
SymbolStringPtr mangleAndIntern(StringRef UnmangledName) const
Returns an interned, linker-mangled version of UnmangledName.
Error linkStaticLibraryInto(JITDylib &JD, std::unique_ptr< MemoryBuffer > LibBuffer)
Link a static library into the given JITDylib.
Error applyDataLayout(Module &M)
std::unique_ptr< ObjectLayer > ObjLinkingLayer
LLVM_ABI friend Expected< JITDylibSP > setUpGenericLLVMIRPlatform(LLJIT &J)
Configure the LLJIT instance to scrape modules for llvm.global_ctors and llvm.global_dtors variables ...
Error addIRModule(ResourceTrackerSP RT, ThreadSafeModule TSM)
Adds an IR module with the given ResourceTracker.
ExecutorAddr LazyCompileFailureAddr
std::unique_ptr< LazyCallThroughManager > LCTMgr
LLVM_ABI Error prepareForConstruction()
IndirectStubsManagerBuilderFunction ISMBuilder
LLVM_ABI Error addLazyIRModule(JITDylib &JD, ThreadSafeModule M)
Add a module to be lazily compiled to JITDylib JD.
LoadAndLinkDynLibrary(LLJIT &J)
Error operator()(JITDylib &JD, StringRef DLLName)
Tracks responsibility for materialization, and mediates interactions between MaterializationUnits and...
A MaterializationUnit represents a set of symbol definitions that can be materialized as a group,...
const SymbolFlagsMap & getSymbols() const
Return the set of symbols that this source provides.
const SymbolStringPtr & getInitializerSymbol() const
Returns the initialization symbol for this MaterializationUnit (if any).
An ObjectLayer implementation built on JITLink.
API to remove / transfer ownership of JIT resources.
JITDylib & getJITDylib() const
Return the JITDylib targeted by this tracker.
static Expected< std::unique_ptr< SelfExecutorProcessControl > > Create(std::shared_ptr< SymbolStringPool > SSP=nullptr, std::unique_ptr< TaskDispatcher > D=nullptr, std::unique_ptr< jitlink::JITLinkMemoryManager > MemMgr=nullptr)
Create a SelfExecutorProcessControl with the given symbol string pool and memory manager.
static Expected< std::unique_ptr< StaticLibraryDefinitionGenerator > > Create(ObjectLayer &L, std::unique_ptr< MemoryBuffer > ArchiveBuffer, std::unique_ptr< object::Archive > Archive, VisitMembersFunction VisitMembers=VisitMembersFunction(), GetObjectFileInterface GetObjFileInterface=GetObjectFileInterface())
Try to create a StaticLibrarySearchGenerator from the given memory buffer and Archive object.
static Expected< std::unique_ptr< StaticLibraryDefinitionGenerator > > Load(ObjectLayer &L, const char *FileName, VisitMembersFunction VisitMembers=VisitMembersFunction(), GetObjectFileInterface GetObjFileInterface=GetObjectFileInterface())
Try to create a StaticLibraryDefinitionGenerator from the given path.
Pointer to a pooled string representing a symbol name.
An LLVM Module together with a shared ThreadSafeContext.
decltype(auto) withModuleDo(Func &&F)
Locks the associated ThreadSafeContext and calls the given function on the contained Module.
static Expected< std::shared_ptr< UnwindInfoRegistrationPlugin > > Create(ExecutionSession &ES, ExecutorAddr Register, ExecutorAddr Deregister)
A raw_ostream that writes to an std::string.
SPSSequence< char > SPSString
SPS tag type for strings, which are equivalent to sequences of chars.
JITDylibSearchOrder makeJITDylibSearchOrder(ArrayRef< JITDylib * > JDs, JITDylibLookupFlags Flags=JITDylibLookupFlags::MatchExportedSymbolsOnly)
Convenience function for creating a search order from an ArrayRef of JITDylib*, all with the same fla...
std::vector< std::pair< JITDylib *, JITDylibLookupFlags > > JITDylibSearchOrder
A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search order during symbol lookup.
IntrusiveRefCntPtr< JITDylib > JITDylibSP
LLVM_ABI iterator_range< CtorDtorIterator > getDestructors(const Module &M)
Create an iterator range over the entries of the llvm.global_ctors array.
IntrusiveRefCntPtr< ResourceTracker > ResourceTrackerSP
std::unique_ptr< AbsoluteSymbolsMaterializationUnit > absoluteSymbols(SymbolMap Symbols)
Create an AbsoluteSymbolsMaterializationUnit with the given symbols.
LLVM_ABI iterator_range< CtorDtorIterator > getConstructors(const Module &M)
Create an iterator range over the entries of the llvm.global_ctors array.
@ MatchExportedSymbolsOnly
DenseMap< SymbolStringPtr, ExecutorSymbolDef > SymbolMap
A map from symbol names (as SymbolStringPtrs) to JITSymbols (address/flags pairs).
LLVM_ABI Expected< JITDylibSP > setUpInactivePlatform(LLJIT &J)
Configure the LLJIT instance to disable platform support explicitly.
LLVM_ATTRIBUTE_USED void linkComponents()
LLVM_ABI std::function< std::unique_ptr< IndirectStubsManager >()> createLocalIndirectStubsManagerBuilder(const Triple &T)
Create a local indirect stubs manager builder.
LLVM_ABI Expected< std::unique_ptr< LazyCallThroughManager > > createLocalLazyCallThroughManager(const Triple &T, ExecutionSession &ES, ExecutorAddr ErrorHandlerAddr)
Create a LocalLazyCallThroughManager from the given triple and execution session.
LLVM_ABI Expected< JITDylibSP > setUpGenericLLVMIRPlatform(LLJIT &J)
Configure the LLJIT instance to scrape modules for llvm.global_ctors and llvm.global_dtors variables ...
LLVM_ABI Error setUpOrcPlatformManually(LLJIT &J)
Configure the LLJIT instance to use orc runtime support.
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto formatv(bool Validate, const char *Fmt, Ts &&...Vals)
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
Expected< T > errorOrToExpected(ErrorOr< T > &&EO)
Convert an ErrorOr<T> to an Expected<T>.
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Implement std::hash so that hash_code can be used in STL containers.