11#ifndef PROTEUS_JITENGINEDEVICE_H
12#define PROTEUS_JITENGINEDEVICE_H
30#include <llvm/ADT/SmallPtrSet.h>
31#include <llvm/ADT/SmallVector.h>
32#include <llvm/ADT/StringRef.h>
33#include <llvm/Analysis/CallGraph.h>
34#include <llvm/Analysis/TargetTransformInfo.h>
35#include <llvm/Bitcode/BitcodeWriter.h>
36#include <llvm/CodeGen/CommandFlags.h>
37#include <llvm/CodeGen/MachineModuleInfo.h>
38#include <llvm/Config/llvm-config.h>
39#include <llvm/Demangle/Demangle.h>
40#include <llvm/ExecutionEngine/Orc/ThreadSafeModule.h>
41#include <llvm/IR/Constants.h>
42#include <llvm/IR/GlobalVariable.h>
43#include <llvm/IR/Instruction.h>
44#include <llvm/IR/Instructions.h>
45#include <llvm/IR/LLVMContext.h>
46#include <llvm/IR/LegacyPassManager.h>
47#include <llvm/IR/Module.h>
48#include <llvm/IR/ReplaceConstant.h>
49#include <llvm/IR/Type.h>
50#include <llvm/IR/Verifier.h>
51#include <llvm/IRReader/IRReader.h>
52#include <llvm/Linker/Linker.h>
53#include <llvm/MC/TargetRegistry.h>
54#include <llvm/Object/ELFObjectFile.h>
55#include <llvm/Passes/PassBuilder.h>
56#include <llvm/Support/Error.h>
57#include <llvm/Support/MemoryBuffer.h>
58#include <llvm/Support/MemoryBufferRef.h>
59#include <llvm/Target/TargetMachine.h>
60#include <llvm/Transforms/IPO/Internalize.h>
61#include <llvm/Transforms/Utils/Cloning.h>
62#include <llvm/Transforms/Utils/ModuleUtils.h>
84 std::unique_ptr<LLVMContext> Ctx;
85 SmallVector<std::string> LinkedModuleIds;
87 std::optional<SmallVector<std::unique_ptr<Module>>> ExtractedModules;
88 std::optional<HashT> ExtractedModuleHash;
89 std::optional<CallGraph> ModuleCallGraph;
90 std::unique_ptr<MemoryBuffer> DeviceBinary;
91 std::unordered_map<std::string, GlobalVarInfo> VarNameToGlobalInfo;
97 SmallVector<std::string> &&LinkedModuleIds)
99 LinkedModuleIds(LinkedModuleIds), LinkedModule(nullptr),
100 ExtractedModules(
std::nullopt), ModuleCallGraph(
std::nullopt),
101 DeviceBinary(nullptr) {}
117 if (ExtractedModules->size() == 1) {
118 LinkedModule = ExtractedModules->front().get();
119 if (
auto E = LinkedModule->materializeAll())
126 auto GeneratedLinkedModule =
128 SmallVector<std::unique_ptr<Module>> NewExtractedModules;
129 NewExtractedModules.emplace_back(std::move(GeneratedLinkedModule));
132 LinkedModule = ExtractedModules->front().get();
136 <<
"getLinkedModule " << T.
elapsed() <<
" ms\n");
139 return *LinkedModule;
143 const SmallVector<std::reference_wrapper<Module>>
147 SmallVector<std::reference_wrapper<Module>> ModulesRef;
148 for (
auto &M : ExtractedModules.value())
149 ModulesRef.emplace_back(*M);
154 ExtractedModules = std::move(Modules);
162 return ExtractedModuleHash.value();
166 if (ExtractedModuleHash)
167 ExtractedModuleHash =
hashCombine(ExtractedModuleHash.value(), HashValue);
169 ExtractedModuleHash = HashValue;
173 if (!ModuleCallGraph.has_value()) {
176 ModuleCallGraph.emplace(CallGraph(*LinkedModule));
178 return ModuleCallGraph.value();
185 return DeviceBinary->getMemBufferRef();
188 DeviceBinary = std::move(DeviceBinaryBuffer);
192 LinkedModuleIds.push_back(
ModuleId);
196 const void *DeviceAddr, uint64_t
VarSize) {
197 auto KV = VarNameToGlobalInfo.emplace(
200 auto TraceOut = [&KV]() {
201 auto GlobalName = KV.first->first;
202 auto &GVI = KV.first->second;
205 raw_svector_ostream OS(S);
206 OS <<
"[GVarInfo]: " << GlobalName <<
" HAddr:" << GVI.HostAddr
207 <<
" DevAddr:" << GVI.DevAddr <<
" VarSize:" << GVI.VarSize <<
"\n";
217 return VarNameToGlobalInfo;
224 std::optional<void *> Kernel;
225 std::unique_ptr<LLVMContext> Ctx;
227 ArrayRef<RuntimeConstantInfo *> RCInfoArray;
228 std::optional<std::unique_ptr<Module>> ExtractedModule;
229 std::optional<std::unique_ptr<MemoryBuffer>> Bitcode;
230 std::optional<std::reference_wrapper<BinaryInfo>> BinInfo;
231 std::optional<HashT> StaticHash;
232 std::optional<SmallVector<std::pair<std::string, StringRef>>>
237 ArrayRef<RuntimeConstantInfo *> RCInfoArray)
240 Bitcode{
std::nullopt}, BinInfo(BinInfo),
241 LambdaCalleeInfo(
std::nullopt) {}
245 assert(
Kernel.has_value() &&
"Expected Kernel is inited");
249 const std::string &
getName()
const {
return Name; }
251 bool hasModule()
const {
return ExtractedModule.has_value(); }
252 Module &
getModule()
const {
return *ExtractedModule->get(); }
255 ExtractedModule = std::move(Mod);
259 void setBitcode(std::unique_ptr<MemoryBuffer> ExtractedBitcode) {
260 Bitcode = std::move(ExtractedBitcode);
262 MemoryBufferRef
getBitcode() {
return Bitcode.value()->getMemBufferRef(); }
267 StaticHash =
hash(Name);
268 StaticHash =
hashCombine(StaticHash.value(), ModuleHash);
274 SmallVector<std::pair<std::string, StringRef>> &&LambdaInfo) {
275 LambdaCalleeInfo = std::move(LambdaInfo);
289 void **KernelArgs, uint64_t ShmemSize,
292 std::pair<std::unique_ptr<Module>, std::unique_ptr<MemoryBuffer>>
296 std::unique_ptr<Module> KernelModule =
297 static_cast<ImplT &
>(*this).tryExtractKernelModule(BinInfo,
KernelName,
299 std::unique_ptr<MemoryBuffer> Bitcode =
nullptr;
306 static_cast<ImplT &
>(*this).extractModules(BinInfo);
308 std::unique_ptr<Module> KernelModuleTmp =
nullptr;
312 KernelModule = llvm::CloneModule(LinkedModule);
343 if (&KernelModule->getContext() != &Ctx) {
344 SmallVector<char> CloneBuffer;
345 raw_svector_ostream OS(CloneBuffer);
346 WriteBitcodeToFile(*KernelModule, OS);
347 StringRef CloneStr = StringRef(CloneBuffer.data(), CloneBuffer.size());
348 auto ExpectedKernelModule =
349 parseBitcodeFile(MemoryBufferRef{CloneStr,
KernelName}, Ctx);
350 if (
auto E = ExpectedKernelModule.takeError())
353 KernelModule = std::move(*ExpectedKernelModule);
354 Bitcode = MemoryBuffer::getMemBufferCopy(CloneStr);
358 SmallVector<char> BitcodeBuffer;
359 raw_svector_ostream OS(BitcodeBuffer);
360 WriteBitcodeToFile(*KernelModule, OS);
361 auto BitcodeStr = StringRef{BitcodeBuffer.data(), BitcodeBuffer.size()};
362 Bitcode = MemoryBuffer::getMemBufferCopy(BitcodeStr);
365 return std::make_pair(std::move(KernelModule), std::move(Bitcode));
391 KernelInfo.
setModule(std::move(KernelModule));
392 KernelInfo.
setBitcode(std::move(BitcodeBuffer));
394 <<
"Extract kernel module " << T.
elapsed() <<
" ms\n");
418 SmallVector<RuntimeConstant> &LambdaJitValuesVec) {
427 Module &KernelModule =
getModule(KernelInfo);
429 <<
"=== LAMBDA MATCHING\n"
430 <<
"Caller trigger " << KernelInfo.
getName() <<
" -> "
431 << demangle(KernelInfo.
getName()) <<
"\n");
433 SmallVector<std::pair<std::string, StringRef>> LambdaCalleeInfo;
434 for (
auto &F : KernelModule.getFunctionList()) {
436 <<
" Trying F " << demangle(F.getName().str()) <<
"\n ");
440 LambdaCalleeInfo.emplace_back(F.getName(),
441 OptionalMapIt.value()->first);
448 const SmallVector<RuntimeConstant> &Values =
450 LambdaJitValuesVec.insert(LambdaJitValuesVec.end(), Values.begin(),
463 "Expected non-null device address for global variable");
484 std::optional<std::reference_wrapper<JITKernelInfo>>
503 HashT ModuleHash =
static_cast<ImplT &
>(*this).getModuleHash(BinInfo);
517 for (
auto &[Handle, FatbinInfo] :
JitEngineInfo.FatbinaryMap) {
519 Handle,
reinterpret_cast<FatbinWrapperT *
>(FatbinInfo.FatbinWrapper),
520 FatbinInfo.ModuleId);
522 for (
auto &LinkedBin : FatbinInfo.LinkedBinaries)
524 Handle,
reinterpret_cast<FatbinWrapperT *
>(LinkedBin.FatbinWrapper),
527 for (
auto &
Func : FatbinInfo.Functions)
531 for (
auto &
Var : FatbinInfo.Vars)
542 std::make_unique<CompilerAsync>(
Config::get().ProteusAsyncThreads);
567template <
typename ImplT>
570 JITKernelInfo &KernelInfo, dim3 GridDim, dim3 BlockDim,
void **KernelArgs,
576 SmallVector<RuntimeConstant> RCVec =
577 getRuntimeConstantValues(KernelArgs, KernelInfo.
getRCInfoArray());
579 SmallVector<RuntimeConstant> LambdaJitValuesVec;
586 hash(getStaticHash(KernelInfo), RCVec, LambdaJitValuesVec, BlockDim.x,
589 if (CGConfig.specializeDims() || CGConfig.specializeDimsRange())
590 HashValue =
hash(HashValue, GridDim.x, GridDim.y, GridDim.z);
593 CodeCache.lookup(HashValue);
603 std::string KernelMangled = (KernelInfo.
getName() + Suffix);
606 auto CompiledLib = CacheChain->lookup(HashValue);
609 relinkGlobalsObject(CompiledLib->ObjectModule->getMemBufferRef(),
610 BinInfo.getVarNameToGlobalInfo());
613 KernelMangled, CompiledLib->ObjectModule->getBufferStart(),
615 BinInfo.getVarNameToGlobalInfo());
617 CodeCache.insert(HashValue, KernelFunc, KernelInfo.
getName());
624 MemoryBufferRef KernelBitcode = getBitcode(KernelInfo);
625 std::unique_ptr<MemoryBuffer> ObjBuf =
nullptr;
630 if (!AsyncCompiler->isCompilationPending(HashValue)) {
635 KernelBitcode, HashValue, KernelInfo.
getName(), Suffix, BlockDim,
637 BinInfo.getVarNameToGlobalInfo(), GlobalLinkedBinaries, DeviceArch,
646 ObjBuf = AsyncCompiler->takeCompilationResult(
647 HashValue,
Config::get().ProteusAsyncTestBlocking);
650 KernelArgs, ShmemSize, Stream);
655 KernelBitcode, HashValue, KernelInfo.
getName(), Suffix, BlockDim,
657 BinInfo.getVarNameToGlobalInfo(), GlobalLinkedBinaries, DeviceArch,
667 KernelMangled, ObjBuf->getBufferStart(),
669 BinInfo.getVarNameToGlobalInfo());
671 CodeCache.insert(HashValue, KernelFunc, KernelInfo.
getName());
673 CacheChain->store(HashValue,
680template <
typename ImplT>
686 <<
"Register fatbinary Handle " << Handle <<
" FatbinWrapper "
688 <<
" ModuleId " <<
ModuleId <<
"\n");
693 SmallVector<std::string>{});
697 for (
int I = 0; Ptr !=
nullptr;
700 <<
"I " << I <<
" PrelinkedFatbin " << Ptr <<
"\n");
701 GlobalLinkedBinaries.insert(Ptr);
708 SmallVector<std::string>{
ModuleId});
721template <
typename ImplT>
726 <<
" To Handle " << Handle <<
"\n");
731 if (JITKernelInfoMap.contains(
Kernel)) {
733 <<
"Warning: duplicate register function for kernel " +
739 if (!HandleToBinaryInfo.count(Handle))
741 BinaryInfo &BinInfo = HandleToBinaryInfo[Handle];
744 <<
"Register function " <<
KernelName <<
" with binary handle "
747 JITKernelInfoMap[
Kernel] =
751template <
typename ImplT>
758 <<
" Binary " << (
void *)
FatbinWrapper->Binary <<
" ModuleId "
760 if (!HandleToBinaryInfo.count(Handle))
763 HandleToBinaryInfo[Handle].addModuleId(
ModuleId);
void const char * ModuleId
Definition CompilerInterfaceDevice.cpp:37
void * FatbinWrapper
Definition CompilerInterfaceDevice.cpp:36
const void const char * VarName
Definition CompilerInterfaceDevice.cpp:25
auto & JitEngineInfo
Definition CompilerInterfaceDevice.cpp:60
void char * KernelName
Definition CompilerInterfaceDevice.cpp:55
void * Kernel
Definition CompilerInterfaceDevice.cpp:55
JitEngineInfo registerFatBinary(Handle, FatbinWrapper, ModuleId)
const void const char uint64_t VarSize
Definition CompilerInterfaceDevice.cpp:26
const void * HostAddr
Definition CompilerInterfaceDevice.cpp:24
JitEngineInfo registerLinkedBinary(FatbinWrapper, ModuleId)
ArrayRef< RuntimeConstantInfo * > RCInfoArray
Definition CompilerInterfaceHost.cpp:27
#define PROTEUS_TIMER_OUTPUT(x)
Definition Config.h:440
#define PROTEUS_DBG(x)
Definition Debug.h:9
void getLambdaJitValues(StringRef FnName, SmallVector< RuntimeConstant > &LambdaJitValuesVec)
Definition JitEngineHost.cpp:178
#define TIMESCOPE(...)
Definition TimeTracing.h:66
Definition JitEngineDevice.h:81
FatbinWrapperT * getFatbinWrapper() const
Definition JitEngineDevice.h:103
void setExtractedModules(SmallVector< std::unique_ptr< Module > > &Modules)
Definition JitEngineDevice.h:153
std::unordered_map< std::string, GlobalVarInfo > & getVarNameToGlobalInfo()
Definition JitEngineDevice.h:216
MemoryBufferRef getDeviceBinary()
Definition JitEngineDevice.h:182
bool hasModuleHash() const
Definition JitEngineDevice.h:157
std::unique_ptr< LLVMContext > & getLLVMContext()
Definition JitEngineDevice.h:105
Module & getLinkedModule()
Definition JitEngineDevice.h:108
auto & getModuleIds()
Definition JitEngineDevice.h:220
bool hasLinkedModule() const
Definition JitEngineDevice.h:107
bool hasDeviceBinary()
Definition JitEngineDevice.h:181
const SmallVector< std::reference_wrapper< Module > > getExtractedModules() const
Definition JitEngineDevice.h:144
void updateModuleHash(HashT HashValue)
Definition JitEngineDevice.h:165
HashT getModuleHash() const
Definition JitEngineDevice.h:158
void insertGlobalVar(const char *VarName, const void *HostAddr, const void *DeviceAddr, uint64_t VarSize)
Definition JitEngineDevice.h:195
bool hasExtractedModules() const
Definition JitEngineDevice.h:142
void addModuleId(const char *ModuleId)
Definition JitEngineDevice.h:191
CallGraph & getCallGraph()
Definition JitEngineDevice.h:172
BinaryInfo(FatbinWrapperT *FatbinWrapper, SmallVector< std::string > &&LinkedModuleIds)
Definition JitEngineDevice.h:96
void setModuleHash(HashT HashValue)
Definition JitEngineDevice.h:164
void setDeviceBinary(std::unique_ptr< MemoryBuffer > DeviceBinaryBuffer)
Definition JitEngineDevice.h:187
Definition CompilationTask.h:19
std::unique_ptr< MemoryBuffer > compile(CompilationTask &&CT)
Definition CompilerSync.h:22
static CompilerSync & instance()
Definition CompilerSync.h:17
static Config & get()
Definition Config.h:334
bool ProteusRelinkGlobalsByCopy
Definition Config.h:343
bool ProteusDumpLLVMIR
Definition Config.h:342
const CodeGenerationConfig & getCGConfig(llvm::StringRef KName="") const
Definition Config.h:358
std::string toString() const
Definition Hashing.h:30
std::string toMangledSuffix() const
Definition Hashing.h:33
Definition JitEngineDevice.h:223
bool hasBitcode()
Definition JitEngineDevice.h:258
const std::string & getName() const
Definition JitEngineDevice.h:249
void createStaticHash(HashT ModuleHash)
Definition JitEngineDevice.h:266
JITKernelInfo(void *Kernel, BinaryInfo &BinInfo, char const *Name, ArrayRef< RuntimeConstantInfo * > RCInfoArray)
Definition JitEngineDevice.h:236
void * getKernel() const
Definition JitEngineDevice.h:244
bool hasModule() const
Definition JitEngineDevice.h:251
const HashT getStaticHash() const
Definition JitEngineDevice.h:265
BinaryInfo & getBinaryInfo() const
Definition JitEngineDevice.h:253
ArrayRef< RuntimeConstantInfo * > getRCInfoArray() const
Definition JitEngineDevice.h:250
Module & getModule() const
Definition JitEngineDevice.h:252
void setModule(std::unique_ptr< llvm::Module > Mod)
Definition JitEngineDevice.h:254
void setLambdaCalleeInfo(SmallVector< std::pair< std::string, StringRef > > &&LambdaInfo)
Definition JitEngineDevice.h:273
const auto & getLambdaCalleeInfo()
Definition JitEngineDevice.h:272
bool hasLambdaCalleeInfo()
Definition JitEngineDevice.h:271
MemoryBufferRef getBitcode()
Definition JitEngineDevice.h:262
bool hasStaticHash() const
Definition JitEngineDevice.h:264
std::unique_ptr< LLVMContext > & getLLVMContext()
Definition JitEngineDevice.h:248
void setBitcode(std::unique_ptr< MemoryBuffer > ExtractedBitcode)
Definition JitEngineDevice.h:259
Definition JitEngineDevice.h:281
MemoryBufferRef getBitcode(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.h:407
~JitEngineDevice()
Definition JitEngineDevice.h:545
typename DeviceTraits< ImplT >::DeviceError_t DeviceError_t
Definition JitEngineDevice.h:283
void extractModuleAndBitcode(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.h:368
JitEngineDevice()
Definition JitEngineDevice.h:513
std::unique_ptr< CompilerAsync > AsyncCompiler
Definition JitEngineDevice.h:564
std::unordered_map< const void *, BinaryInfo > HandleToBinaryInfo
Definition JitEngineDevice.h:477
DenseMap< const void *, JITKernelInfo > JITKernelInfoMap
Definition JitEngineDevice.h:563
typename DeviceTraits< ImplT >::DeviceStream_t DeviceStream_t
Definition JitEngineDevice.h:284
void finalizeRegistration()
Definition JitEngineDevice.h:712
MemoryCache< KernelFunction_t > CodeCache
Definition JitEngineDevice.h:559
Module & getModule(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.h:397
bool containsJITKernelInfo(const void *Func)
Definition JitEngineDevice.h:480
std::optional< std::reference_wrapper< JITKernelInfo > > getJITKernelInfo(const void *Func)
Definition JitEngineDevice.h:485
std::pair< std::unique_ptr< Module >, std::unique_ptr< MemoryBuffer > > extractKernelModule(BinaryInfo &BinInfo, StringRef KernelName, LLVMContext &Ctx)
Definition JitEngineDevice.h:293
SmallPtrSet< void *, 8 > GlobalLinkedBinaries
Definition JitEngineDevice.h:478
void registerFunction(void *Handle, void *Kernel, char *KernelName, ArrayRef< RuntimeConstantInfo * > RCInfoArray)
Definition JitEngineDevice.h:722
std::optional< ObjectCacheChain > CacheChain
Definition JitEngineDevice.h:560
void registerFatBinary(void *Handle, FatbinWrapperT *FatbinWrapper, const char *ModuleId)
Definition JitEngineDevice.h:681
DeviceError_t compileAndRun(JITKernelInfo &KernelInfo, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, typename DeviceTraits< ImplT >::DeviceStream_t Stream)
Definition JitEngineDevice.h:569
void registerLinkedBinary(void *Handle, FatbinWrapperT *FatbinWrapper, const char *ModuleId)
Definition JitEngineDevice.h:752
std::unordered_map< std::string, FatbinWrapperT * > ModuleIdToFatBinary
Definition JitEngineDevice.h:476
typename DeviceTraits< ImplT >::KernelFunction_t KernelFunction_t
Definition JitEngineDevice.h:285
StringRef getDeviceArch() const
Definition JitEngineDevice.h:510
void registerVar(void *Handle, const char *VarName, const void *HostAddr, uint64_t VarSize)
Definition JitEngineDevice.h:455
std::string DeviceArch
Definition JitEngineDevice.h:561
HashT getStaticHash(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.h:492
void getLambdaJitValues(JITKernelInfo &KernelInfo, SmallVector< RuntimeConstant > &LambdaJitValuesVec)
Definition JitEngineDevice.h:417
static JitEngineInfoRegistry & instance()
Definition JitEngineInfoRegistry.h:58
Definition JitEngine.h:32
Definition LambdaRegistry.h:19
std::optional< DenseMap< StringRef, SmallVector< RuntimeConstant > >::iterator > matchJitVariableMap(StringRef FnName)
Definition LambdaRegistry.h:32
const SmallVector< RuntimeConstant > & getJitVariables(StringRef LambdaTypeRef)
Definition LambdaRegistry.h:98
static LambdaRegistry & instance()
Definition LambdaRegistry.h:21
bool empty()
Definition LambdaRegistry.h:102
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.h:25
static void trace(llvm::StringRef Msg)
Definition Logger.h:30
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.h:19
Definition MemoryCache.h:31
void printStats()
Definition MemoryCache.h:62
void printKernelTrace()
Definition MemoryCache.h:76
Definition TimeTracing.h:33
uint64_t elapsed()
Definition TimeTracing.cpp:66
Definition CompiledLibrary.h:7
Definition MemoryCache.h:27
std::unique_ptr< Module > cloneKernelFromModules(ArrayRef< std::reference_wrapper< Module > > Mods, StringRef EntryName, function_ref< bool(const GlobalValue *)> ShouldCloneDefinition=nullptr)
Definition Cloning.h:513
HashT hash(FirstT &&First, RestTs &&...Rest)
Definition Hashing.h:168
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14
cudaError_t launchKernelDirect(void *KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.h:38
HashT hashRuntimeSpecializationConfig(const CodeGenerationConfig &CGConfig)
Definition Hashing.h:152
cudaError_t launchKernelFunction(CUfunction KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.h:78
HashT hashCodeGenConfig(const CodeGenerationConfig &CGConfig)
Definition Hashing.h:142
HashT hashCombine(HashT A, HashT B)
Definition Hashing.h:138
std::string toString(CodegenOption Option)
Definition Config.h:28
void * resolveDeviceGlobalAddr(const void *Addr)
Definition CoreDeviceCUDA.h:26
void internalize(Module &M, StringRef PreserveFunctionName)
Definition CoreLLVM.h:315
CUfunction getKernelFunctionFromImage(StringRef KernelName, const void *Image, bool RelinkGlobalsByCopy, const std::unordered_map< std::string, GlobalVarInfo > &VarNameToGlobalInfo)
Definition CoreDeviceCUDA.h:50
void runCleanupPassPipeline(Module &M)
Definition CoreLLVM.h:256
std::unique_ptr< Module > linkModules(LLVMContext &Ctx, SmallVector< std::unique_ptr< Module > > LinkedModules)
Definition CoreLLVM.h:238
static CacheEntry staticObject(MemoryBufferRef Buf)
Definition ObjectCache.h:31
Definition JitEngineDevice.h:279
Definition JitEngineDevice.h:74
const char * Binary
Definition JitEngineDevice.h:77
void ** PrelinkedFatbins
Definition JitEngineDevice.h:78
int32_t Magic
Definition JitEngineDevice.h:75
int32_t Version
Definition JitEngineDevice.h:76
Definition GlobalVarInfo.h:5