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());
63 FunctionType::get(WrapperFnType->getReturnType(), HelperArgTypes,
false);
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.")) {
138 std::make_unique<GenericLLVMIRPlatform>(*
this));
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");
190 *M,
"__lljit_run_atexits", FunctionType::get(VoidTy, {},
false),
192 {PlatformInstanceDecl, DSOHandle});
196 auto *AtExit = addHelperAndWrapper(
197 *M,
"atexit", FunctionType::get(IntTy, {AtExitCallbackPtrTy},
false),
199 {PlatformInstanceDecl, DSOHandle});
203 AtExit->addRetAttr(AtExitExtAttr);
211 InitSymbols[&JD].add(InitSym, SymbolLookupFlags::WeaklyReferencedSymbol);
219 if ((*KV.first).starts_with(InitFunctionPrefix)) {
220 InitSymbols[&JD].add(KV.first,
221 SymbolLookupFlags::WeaklyReferencedSymbol);
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();
274 [&]() { InitFunctions[&JD].add(InitName); });
279 [&]() { DeInitFunctions[&JD].add(DeInitName); });
284 if (
auto Err = issueInitLookups(JD))
285 return std::move(Err);
288 std::vector<JITDylibSP> DFSLinkOrder;
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";
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());
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 "
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 "
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 "
448 << (*
static_cast<JITDylib **
>(DSOHandle))->getName() <<
"\n";
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");
469 auto *BytePtrTy = PointerType::getUnqual(*Ctx);
470 auto *CxaAtExitCallbackPtrTy = PointerType::getUnqual(*Ctx);
472 auto *CxaAtExit = addHelperAndWrapper(
474 FunctionType::get(IntTy, {CxaAtExitCallbackPtrTy, BytePtrTy, BytePtrTy},
477 {PlatformInstanceDecl});
479 TargetLibraryInfo::getExtAttrForI32Return(J.getTargetTriple());
481 CxaAtExit->addRetAttr(CxaAtExitExtAttr);
487 std::string InitFunctionPrefix;
488 std::string DeInitFunctionPrefix;
496 return S.setupJITDylib(JD);
505 return S.notifyAdding(RT, MU);
512 auto &Ctx =
M.getContext();
513 auto *GlobalCtors =
M.getNamedGlobal(
"llvm.global_ctors");
514 auto *GlobalDtors =
M.getNamedGlobal(
"llvm.global_dtors");
517 bool isCtor) ->
Error {
521 std::string InitOrDeInitFunctionName;
524 << InitFunctionPrefix <<
M.getModuleIdentifier();
527 << DeInitFunctionPrefix <<
M.getModuleIdentifier();
530 auto InternedInitOrDeInitName =
Mangle(InitOrDeInitFunctionName);
531 if (
auto Err =
R.defineMaterializing(
532 {{InternedInitOrDeInitName, JITSymbolFlags::Callable}}))
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);
582 InactivePlatformSupport() =
default;
585 LLVM_DEBUG(
dbgs() <<
"InactivePlatformSupport: no initializers running for "
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
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 =
633 auto E = ES.callSPSWrapper<SPSDLUpdateSig>(WrapperAddr->getAddress(),
634 result, DSOHandles[&JD]);
638 return make_error<StringError>(
"dlupdate failed",
641 return ES.callSPSWrapper<SPSDLOpenSig>(WrapperAddr->getAddress(),
643 int32_t(ORC_RT_RTLD_LAZY));
645 return WrapperAddr.takeError();
652 using SPSDLCloseSig = int32_t(SPSExecutorAddr);
658 if (
auto WrapperAddr = ES.lookup(
662 WrapperAddr->getAddress(), result, DSOHandles[&JD]);
666 return make_error<StringError>(
"dlclose failed",
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();
697 if ((
ES || EPC) && NumCompileThreads)
698 return make_error<StringError>(
699 "NumCompileThreads cannot be used with a custom ExecutionSession or "
700 "ExecutorProcessControl",
703#if !LLVM_ENABLE_THREADS
704 if (NumCompileThreads)
705 return make_error<StringError>(
706 "LLJIT num-compile-threads is " +
Twine(NumCompileThreads) +
707 " but LLVM was compiled with LLVM_ENABLE_THREADS=Off",
712 [[maybe_unused]]
bool ConcurrentCompilationSettingDefaulted =
713 !SupportConcurrentCompilation;
715 if (!SupportConcurrentCompilation) {
716#if LLVM_ENABLE_THREADS
717 SupportConcurrentCompilation = NumCompileThreads ||
ES || EPC;
719 SupportConcurrentCompilation =
false;
722#if !LLVM_ENABLE_THREADS
723 if (*SupportConcurrentCompilation)
724 return make_error<StringError>(
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")
740 dbgs() <<
"None (will be created by JITTargetMachineBuilder)\n";
742 dbgs() <<
" Custom object-linking-layer creator: "
743 << (CreateObjectLinkingLayer ?
"Yes" :
"No") <<
"\n"
744 <<
" Custom compile-function creator: "
745 << (CreateCompileFunction ?
"Yes" :
"No") <<
"\n"
746 <<
" Custom platform-setup function: "
747 << (SetUpPlatform ?
"Yes" :
"No") <<
"\n"
748 <<
" Support concurrent compilation: "
749 << (*SupportConcurrentCompilation ?
"Yes" :
"No");
750 if (ConcurrentCompilationSettingDefaulted)
751 dbgs() <<
" (defaulted based on ES / EPC / NumCompileThreads)\n";
754 dbgs() <<
" Number of compile threads: " << 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
774 if (*SupportConcurrentCompilation) {
775 std::optional<size_t> NumThreads = std ::nullopt;
776 if (NumCompileThreads)
777 NumThreads = NumCompileThreads;
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 "
801 if (!CreateObjectLinkingLayer) {
802 auto &
TT = JTMB->getTargetTriple();
803 bool UseJITLink =
false;
831 if (!JTMB->getCodeModel())
834 CreateObjectLinkingLayer =
836 return std::make_unique<ObjectLinkingLayer>(
ES);
843 if (!SetupProcessSymbolsJITDylib && LinkProcessSymbolsByDefault) {
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();
945 return Sym.takeError();
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)
1095 return make_error<StringError>(
1096 "Added modules have incompatible data layouts: " +
1097 M.getDataLayout().getStringRepresentation() +
" (module) vs " +
1105 LLVM_DEBUG({
dbgs() <<
"Setting up orc platform support for LLJIT\n"; });
1115 return make_error<StringError>(
"DLLName not ending with .dll",
1117 auto DLLNameStr = DLLName.
str();
1120 return DLLJD.takeError();
1131 if (!ProcessSymbolsJD)
1132 return make_error<StringError>(
1133 "Native platforms require a process symbols JITDylib",
1140 if (!ObjLinkingLayer)
1141 return make_error<StringError>(
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();
1203 return make_error<StringError>(
"Unsupported object format in triple " +
1213 {
dbgs() <<
"Setting up GenericLLVMIRPlatform support for LLJIT\n"; });
1215 if (!ProcessSymbolsJD)
1216 return make_error<StringError>(
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();
1325 Err = make_error<StringError>(
"Could not construct "
1326 "IndirectStubsManagerBuilder for target " +
1336 CODLayer = std::make_unique<CompileOnDemandLayer>(*
ES, *IPLayer, *LCTMgr,
1337 std::move(ISMBuilder));
1340 CODLayer->setCloneToNewContextOnEmit(
true);
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
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")
#define LLVM_ATTRIBUTE_USED
Module.h This file contains the declarations for the Module class.
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)
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.
const std::string & getStringRepresentation() const
Returns the string representation of the DataLayout.
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.
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.
@ 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 isPPC64ELFv2ABI() const
Tests whether the target 64-bit PowerPC big endian ABI is ELFv2.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
ArchType getArch() const
Get the parsed architecture type of this triple.
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
const std::string & str() const
bool isOSDarwin() const
Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, DriverKit, XROS, or bridgeOS).
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
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.
Error callSPSWrapper(ExecutorAddr WrapperFnAddr, WrapperCallArgTs &&...WrapperCallArgs)
Run a wrapper function using SPS to serialize the arguments and deserialize the results.
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.
decltype(auto) runSessionLocked(Func &&F)
Run the given lambda with the session mutex locked.
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...
auto withLinkOrderDo(Func &&F) -> decltype(F(std::declval< const JITDylibSearchOrder & >()))
Do something with the link order (run under the session lock).
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
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< 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.
JITDylib & getMainJITDylib()
Returns a reference to the JITDylib representing the JIT'd main program.
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)
Mangles symbol names then uniques them in the context of an ExecutionSession.
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)
SPS tag type for sequences.
A raw_ostream that writes to an std::string.
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...
LLVM_ABI iterator_range< CtorDtorIterator > getDestructors(const Module &M)
Create an iterator range over the entries of the llvm.global_ctors array.
std::vector< std::pair< JITDylib *, JITDylibLookupFlags > > JITDylibSearchOrder
A list of (JITDylib*, JITDylibLookupFlags) pairs to be used as a search order during symbol lookup.
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
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)
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.
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.
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.
Function object to check whether the second component of a container supported by std::get (like std:...