11#ifndef PROTEUS_JITENGINEDEVICE_HPP
12#define PROTEUS_JITENGINEDEVICE_HPP
16#include <llvm/ADT/SmallPtrSet.h>
17#include <llvm/Analysis/CallGraph.h>
22#include <llvm/ADT/SmallVector.h>
23#include <llvm/ADT/StringRef.h>
24#include <llvm/Analysis/TargetTransformInfo.h>
25#include <llvm/Bitcode/BitcodeWriter.h>
26#include <llvm/CodeGen/CommandFlags.h>
27#include <llvm/CodeGen/MachineModuleInfo.h>
28#include <llvm/Config/llvm-config.h>
29#include <llvm/Demangle/Demangle.h>
30#include <llvm/ExecutionEngine/Orc/ThreadSafeModule.h>
31#include <llvm/IR/Constants.h>
32#include <llvm/IR/GlobalVariable.h>
33#include <llvm/IR/Instruction.h>
34#include <llvm/IR/Instructions.h>
35#include <llvm/IR/LLVMContext.h>
36#include <llvm/IR/LegacyPassManager.h>
37#include <llvm/IR/Module.h>
38#include <llvm/IR/ReplaceConstant.h>
39#include <llvm/IR/Type.h>
40#include <llvm/IR/Verifier.h>
41#include <llvm/IRReader/IRReader.h>
42#include <llvm/Linker/Linker.h>
43#include <llvm/MC/TargetRegistry.h>
44#include <llvm/Object/ELFObjectFile.h>
45#include <llvm/Passes/PassBuilder.h>
46#include <llvm/Support/Error.h>
47#include <llvm/Support/MemoryBuffer.h>
48#include <llvm/Support/MemoryBufferRef.h>
49#include <llvm/Target/TargetMachine.h>
50#include <llvm/Transforms/IPO/Internalize.h>
51#include <llvm/Transforms/Utils/Cloning.h>
52#include <llvm/Transforms/Utils/ModuleUtils.h>
82 std::unique_ptr<LLVMContext> Ctx;
83 SmallVector<std::string> LinkedModuleIds;
85 std::optional<SmallVector<std::unique_ptr<Module>>> ExtractedModules;
86 std::optional<HashT> ExtractedModuleHash;
87 std::optional<CallGraph> ModuleCallGraph;
88 std::unique_ptr<MemoryBuffer> DeviceBinary;
93 SmallVector<std::string> &&LinkedModuleIds)
95 LinkedModuleIds(LinkedModuleIds), LinkedModule(nullptr),
96 ExtractedModules(
std::nullopt), ModuleCallGraph(
std::nullopt),
97 DeviceBinary(nullptr) {}
112 if (ExtractedModules->size() == 1) {
113 LinkedModule = ExtractedModules->front().get();
114 if (
auto E = LinkedModule->materializeAll())
121 auto GeneratedLinkedModule =
123 SmallVector<std::unique_ptr<Module>> NewExtractedModules;
124 NewExtractedModules.emplace_back(std::move(GeneratedLinkedModule));
127 LinkedModule = ExtractedModules->front().get();
131 <<
"getLinkedModule " << T.
elapsed() <<
" ms\n");
134 return *LinkedModule;
138 const SmallVector<std::reference_wrapper<Module>>
141 SmallVector<std::reference_wrapper<Module>> ModulesRef;
142 for (
auto &M : ExtractedModules.value())
143 ModulesRef.emplace_back(*M);
148 ExtractedModules = std::move(Modules);
155 if (ExtractedModuleHash)
156 ExtractedModuleHash =
hashCombine(ExtractedModuleHash.value(), HashValue);
158 ExtractedModuleHash = HashValue;
162 if (!ModuleCallGraph.has_value()) {
165 ModuleCallGraph.emplace(CallGraph(*LinkedModule));
167 return ModuleCallGraph.value();
174 return DeviceBinary->getMemBufferRef();
177 DeviceBinary = std::move(DeviceBinaryBuffer);
181 LinkedModuleIds.push_back(
ModuleId);
188 std::optional<void *> Kernel;
189 std::unique_ptr<LLVMContext> Ctx;
191 ArrayRef<RuntimeConstantInfo *> RCInfoArray;
192 std::optional<std::unique_ptr<Module>> ExtractedModule;
193 std::optional<std::unique_ptr<MemoryBuffer>> Bitcode;
194 std::optional<std::reference_wrapper<BinaryInfo>> BinInfo;
195 std::optional<HashT> StaticHash;
196 std::optional<SmallVector<std::pair<std::string, StringRef>>>
201 ArrayRef<RuntimeConstantInfo *> RCInfoArray)
204 Bitcode{
std::nullopt}, BinInfo(BinInfo),
205 LambdaCalleeInfo(
std::nullopt) {}
209 assert(
Kernel.has_value() &&
"Expected Kernel is inited");
213 const std::string &
getName()
const {
return Name; }
215 bool hasModule()
const {
return ExtractedModule.has_value(); }
216 Module &
getModule()
const {
return *ExtractedModule->get(); }
219 ExtractedModule = std::move(Mod);
223 void setBitcode(std::unique_ptr<MemoryBuffer> ExtractedBitcode) {
224 Bitcode = std::move(ExtractedBitcode);
226 MemoryBufferRef
getBitcode() {
return Bitcode.value()->getMemBufferRef(); }
231 StaticHash =
hash(Name);
232 StaticHash =
hashCombine(StaticHash.value(), ModuleHash);
238 SmallVector<std::pair<std::string, StringRef>> &&LambdaInfo) {
239 LambdaCalleeInfo = std::move(LambdaInfo);
254 void **KernelArgs, uint64_t ShmemSize,
257 std::pair<std::unique_ptr<Module>, std::unique_ptr<MemoryBuffer>>
260 std::unique_ptr<Module> KernelModule =
261 static_cast<ImplT &
>(*this).tryExtractKernelModule(BinInfo,
KernelName,
263 std::unique_ptr<MemoryBuffer> Bitcode =
nullptr;
270 static_cast<ImplT &
>(*this).extractModules(BinInfo);
272 std::unique_ptr<Module> KernelModuleTmp =
nullptr;
276 KernelModule = llvm::CloneModule(LinkedModule);
307 if (&KernelModule->getContext() != &Ctx) {
308 SmallVector<char> CloneBuffer;
309 raw_svector_ostream OS(CloneBuffer);
310 WriteBitcodeToFile(*KernelModule, OS);
311 StringRef CloneStr = StringRef(CloneBuffer.data(), CloneBuffer.size());
312 auto ExpectedKernelModule =
313 parseBitcodeFile(MemoryBufferRef{CloneStr,
KernelName}, Ctx);
314 if (
auto E = ExpectedKernelModule.takeError())
317 KernelModule = std::move(*ExpectedKernelModule);
318 Bitcode = MemoryBuffer::getMemBufferCopy(CloneStr);
322 SmallVector<char> BitcodeBuffer;
323 raw_svector_ostream OS(BitcodeBuffer);
324 WriteBitcodeToFile(*KernelModule, OS);
325 auto BitcodeStr = StringRef{BitcodeBuffer.data(), BitcodeBuffer.size()};
326 Bitcode = MemoryBuffer::getMemBufferCopy(BitcodeStr);
329 return std::make_pair(std::move(KernelModule), std::move(Bitcode));
355 KernelInfo.
setModule(std::move(KernelModule));
356 KernelInfo.
setBitcode(std::move(BitcodeBuffer));
358 <<
"Extract kernel module " << T.
elapsed() <<
" ms\n");
382 SmallVector<RuntimeConstant> &LambdaJitValuesVec) {
390 Module &KernelModule =
getModule(KernelInfo);
392 <<
"=== LAMBDA MATCHING\n"
393 <<
"Caller trigger " << KernelInfo.
getName() <<
" -> "
394 << demangle(KernelInfo.
getName()) <<
"\n");
396 SmallVector<std::pair<std::string, StringRef>> LambdaCalleeInfo;
397 for (
auto &F : KernelModule.getFunctionList()) {
399 <<
" Trying F " << demangle(F.getName().str()) <<
"\n ");
403 LambdaCalleeInfo.emplace_back(F.getName(),
404 OptionalMapIt.value()->first);
411 const SmallVector<RuntimeConstant> &Values =
413 LambdaJitValuesVec.insert(LambdaJitValuesVec.end(), Values.begin(),
439 std::optional<std::reference_wrapper<JITKernelInfo>>
458 HashT ModuleHash =
static_cast<ImplT &
>(*this).getModuleHash(BinInfo);
474 void *resolveDeviceGlobalAddr(
const void *Addr) {
475 return static_cast<ImplT &
>(*this).resolveDeviceGlobalAddr(Addr);
478 void setLaunchBoundsForKernel(Module &M, Function &F,
size_t GridSize,
480 static_cast<ImplT &
>(*this).setLaunchBoundsForKernel(M, F, GridSize,
484 void setKernelDims(Module &M, dim3 &GridDim, dim3 &BlockDim) {
485 proteus::setKernelDims(M, GridDim, BlockDim);
489 dim3 BlockDim,
void **KernelArgs,
493 return static_cast<ImplT &
>(*this).launchKernelFunction(
494 KernelFunc, GridDim, BlockDim, KernelArgs, ShmemSize, Stream);
497 void relinkGlobalsObject(MemoryBufferRef Object) {
505 return static_cast<ImplT &
>(*this).getKernelFunctionFromImage(
KernelName,
513 void pruneIR(Module &M);
515 void internalize(Module &M, StringRef
KernelName);
517 void replaceGlobalVariablesWithPointers(Module &M);
540template <
typename ImplT>
541void JitEngineDevice<ImplT>::internalize(Module &M, StringRef
KernelName) {
545template <
typename ImplT>
546void JitEngineDevice<ImplT>::replaceGlobalVariablesWithPointers(Module &M) {
549 proteus::replaceGlobalVariablesWithPointers(M, VarNameToDevPtr);
551#if PROTEUS_ENABLE_DEBUG
552 Logger::logs(
"proteus") <<
"=== Linked M\n" << M <<
"=== End of Linked M\n";
553 if (verifyModule(M, &errs()))
555 "After linking, broken module found, JIT compilation aborted!");
561template <
typename ImplT>
562typename DeviceTraits<ImplT>::DeviceError_t
564 JITKernelInfo &KernelInfo, dim3 GridDim, dim3 BlockDim,
void **KernelArgs,
572 static std::once_flag Flag;
573 std::call_once(Flag, [&]() {
574 for (
auto &[GlobalName, HostAddr] : VarNameToDevPtr) {
576 VarNameToDevPtr.at(GlobalName) = DevPtr;
580 SmallVector<RuntimeConstant> RCVec =
581 getRuntimeConstantValues(KernelArgs, KernelInfo.
getRCInfoArray());
583 SmallVector<RuntimeConstant> LambdaJitValuesVec;
587 hash(getStaticHash(KernelInfo), RCVec, LambdaJitValuesVec, GridDim.x,
588 GridDim.y, GridDim.z, BlockDim.x, BlockDim.y, BlockDim.z);
591 CodeCache.lookup(HashValue);
599 std::string Suffix = mangleSuffix(HashValue);
600 std::string KernelMangled = (KernelInfo.
getName() + Suffix);
612 auto CacheBuf = StorageCache.lookup(HashValue);
615 relinkGlobalsObject(CacheBuf->getMemBufferRef());
620 CodeCache.insert(HashValue, KernelFunc, KernelInfo.
getName(), RCVec);
627 MemoryBufferRef KernelBitcode = getBitcode(KernelInfo);
628 std::unique_ptr<MemoryBuffer> ObjBuf =
nullptr;
634 if (!Compiler.isCompilationPending(HashValue)) {
639 KernelBitcode, HashValue, KernelInfo.
getName(), Suffix, BlockDim,
641 GlobalLinkedBinaries, DeviceArch,
654 ObjBuf = Compiler.takeCompilationResult(
655 HashValue,
Config::get().ProteusAsyncTestBlocking);
658 KernelArgs, ShmemSize, Stream);
663 KernelBitcode, HashValue, KernelInfo.
getName(), Suffix, BlockDim,
665 GlobalLinkedBinaries, DeviceArch,
679 KernelMangled, ObjBuf->getBufferStart(),
682 CodeCache.insert(HashValue, KernelFunc, KernelInfo.
getName(), RCVec);
684 StorageCache.store(HashValue, ObjBuf->getMemBufferRef());
691template <
typename ImplT>
697 <<
"Register fatbinary Handle " << Handle <<
" FatbinWrapper "
699 <<
" ModuleId " <<
ModuleId <<
"\n");
707 for (
int I = 0; Ptr !=
nullptr;
710 <<
"I " << I <<
" PrelinkedFatbin " << Ptr <<
"\n");
711 GlobalLinkedBinaries.insert(Ptr);
731template <
typename ImplT>
736 <<
" To Handle " << Handle <<
"\n");
741 if (JITKernelInfoMap.contains(
Kernel)) {
743 <<
"Warning: duplicate register function for kernel " +
749 if (!HandleToBinaryInfo.count(Handle))
751 BinaryInfo &BinInfo = HandleToBinaryInfo[Handle];
753 JITKernelInfoMap[
Kernel] =
757template <
typename ImplT>
762 <<
" Binary " << (
void *)
FatbinWrapper->Binary <<
" ModuleId "
765 if (!HandleToBinaryInfo.count(CurHandle))
768 HandleToBinaryInfo[CurHandle].addModuleId(
ModuleId);
770 GlobalLinkedModuleIds.push_back(
ModuleId);
void const char * ModuleId
Definition CompilerInterfaceDevice.cpp:31
void * FatbinWrapper
Definition CompilerInterfaceDevice.cpp:30
const char * VarName
Definition CompilerInterfaceDevice.cpp:20
void char * KernelName
Definition CompilerInterfaceDevice.cpp:50
void * Kernel
Definition CompilerInterfaceDevice.cpp:50
ArrayRef< RuntimeConstantInfo * > RCInfoArray
Definition CompilerInterfaceHost.cpp:24
#define PROTEUS_DBG(x)
Definition Debug.h:10
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:4
void getLambdaJitValues(StringRef FnName, SmallVector< RuntimeConstant > &LambdaJitValuesVec)
Definition JitEngineHost.cpp:271
#define TIMESCOPE(x)
Definition TimeTracing.hpp:64
#define PROTEUS_TIMER_OUTPUT(x)
Definition TimeTracing.hpp:57
Definition JitEngineDevice.hpp:79
FatbinWrapperT * getFatbinWrapper() const
Definition JitEngineDevice.hpp:99
void setExtractedModules(SmallVector< std::unique_ptr< Module > > &Modules)
Definition JitEngineDevice.hpp:147
MemoryBufferRef getDeviceBinary()
Definition JitEngineDevice.hpp:171
bool hasModuleHash() const
Definition JitEngineDevice.hpp:151
std::unique_ptr< LLVMContext > & getLLVMContext()
Definition JitEngineDevice.hpp:101
Module & getLinkedModule()
Definition JitEngineDevice.hpp:104
auto & getModuleIds()
Definition JitEngineDevice.hpp:184
bool hasLinkedModule() const
Definition JitEngineDevice.hpp:103
bool hasDeviceBinary()
Definition JitEngineDevice.hpp:170
const SmallVector< std::reference_wrapper< Module > > getExtractedModules() const
Definition JitEngineDevice.hpp:139
void updateModuleHash(HashT HashValue)
Definition JitEngineDevice.hpp:154
HashT getModuleHash() const
Definition JitEngineDevice.hpp:152
bool hasExtractedModules() const
Definition JitEngineDevice.hpp:137
void addModuleId(const char *ModuleId)
Definition JitEngineDevice.hpp:180
CallGraph & getCallGraph()
Definition JitEngineDevice.hpp:161
BinaryInfo(FatbinWrapperT *FatbinWrapper, SmallVector< std::string > &&LinkedModuleIds)
Definition JitEngineDevice.hpp:92
void setModuleHash(HashT HashValue)
Definition JitEngineDevice.hpp:153
void setDeviceBinary(std::unique_ptr< MemoryBuffer > DeviceBinaryBuffer)
Definition JitEngineDevice.hpp:176
Definition CompilationTask.hpp:17
static CompilerAsync & instance(int NumThreads)
Definition CompilerAsync.hpp:49
void joinAllThreads()
Definition CompilerAsync.hpp:86
std::unique_ptr< MemoryBuffer > compile(CompilationTask &&CT)
Definition CompilerSync.hpp:21
static CompilerSync & instance()
Definition CompilerSync.hpp:16
CodegenOption ProteusCodegen
Definition Config.hpp:129
static Config & get()
Definition Config.hpp:112
bool ProteusRelinkGlobalsByCopy
Definition Config.hpp:123
bool ProteusSpecializeDims
Definition Config.hpp:120
bool ProteusDumpLLVMIR
Definition Config.hpp:122
bool ProteusUseStoredCache
Definition Config.hpp:117
bool ProteusSpecializeArgs
Definition Config.hpp:119
bool ProteusSpecializeLaunchBounds
Definition Config.hpp:118
Definition Hashing.hpp:19
std::string toString() const
Definition Hashing.hpp:27
Definition JitEngineDevice.hpp:187
bool hasBitcode()
Definition JitEngineDevice.hpp:222
const std::string & getName() const
Definition JitEngineDevice.hpp:213
void createStaticHash(HashT ModuleHash)
Definition JitEngineDevice.hpp:230
JITKernelInfo(void *Kernel, BinaryInfo &BinInfo, char const *Name, ArrayRef< RuntimeConstantInfo * > RCInfoArray)
Definition JitEngineDevice.hpp:200
void * getKernel() const
Definition JitEngineDevice.hpp:208
bool hasModule() const
Definition JitEngineDevice.hpp:215
const HashT getStaticHash() const
Definition JitEngineDevice.hpp:229
BinaryInfo & getBinaryInfo() const
Definition JitEngineDevice.hpp:217
ArrayRef< RuntimeConstantInfo * > getRCInfoArray() const
Definition JitEngineDevice.hpp:214
Module & getModule() const
Definition JitEngineDevice.hpp:216
void setModule(std::unique_ptr< llvm::Module > Mod)
Definition JitEngineDevice.hpp:218
void setLambdaCalleeInfo(SmallVector< std::pair< std::string, StringRef > > &&LambdaInfo)
Definition JitEngineDevice.hpp:237
const auto & getLambdaCalleeInfo()
Definition JitEngineDevice.hpp:236
bool hasLambdaCalleeInfo()
Definition JitEngineDevice.hpp:235
MemoryBufferRef getBitcode()
Definition JitEngineDevice.hpp:226
bool hasStaticHash() const
Definition JitEngineDevice.hpp:228
std::unique_ptr< LLVMContext > & getLLVMContext()
Definition JitEngineDevice.hpp:212
void setBitcode(std::unique_ptr< MemoryBuffer > ExtractedBitcode)
Definition JitEngineDevice.hpp:223
Definition JitCache.hpp:32
void printStats()
Definition JitCache.hpp:67
Definition JitEngineDevice.hpp:245
JitCache< KernelFunction_t > CodeCache
Definition JitEngineDevice.hpp:527
MemoryBufferRef getBitcode(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.hpp:371
~JitEngineDevice()
Definition JitEngineDevice.hpp:522
typename DeviceTraits< ImplT >::DeviceError_t DeviceError_t
Definition JitEngineDevice.hpp:248
void extractModuleAndBitcode(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.hpp:332
void registerLinkedBinary(FatbinWrapperT *FatbinWrapper, const char *ModuleId)
Definition JitEngineDevice.hpp:758
JitEngineDevice()
Definition JitEngineDevice.hpp:520
std::unordered_map< const void *, BinaryInfo > HandleToBinaryInfo
Definition JitEngineDevice.hpp:431
DenseMap< const void *, JITKernelInfo > JITKernelInfoMap
Definition JitEngineDevice.hpp:532
typename DeviceTraits< ImplT >::DeviceStream_t DeviceStream_t
Definition JitEngineDevice.hpp:249
void registerFatBinaryEnd()
Definition JitEngineDevice.hpp:721
Module & getModule(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.hpp:361
JitStorageCache< KernelFunction_t > StorageCache
Definition JitEngineDevice.hpp:528
bool containsJITKernelInfo(const void *Func)
Definition JitEngineDevice.hpp:435
std::optional< std::reference_wrapper< JITKernelInfo > > getJITKernelInfo(const void *Func)
Definition JitEngineDevice.hpp:440
std::pair< std::unique_ptr< Module >, std::unique_ptr< MemoryBuffer > > extractKernelModule(BinaryInfo &BinInfo, StringRef KernelName, LLVMContext &Ctx)
Definition JitEngineDevice.hpp:258
SmallPtrSet< void *, 8 > GlobalLinkedBinaries
Definition JitEngineDevice.hpp:433
void registerFunction(void *Handle, void *Kernel, char *KernelName, ArrayRef< RuntimeConstantInfo * > RCInfoArray)
Definition JitEngineDevice.hpp:732
std::unordered_map< std::string, const void * > VarNameToDevPtr
Definition JitEngineDevice.hpp:530
void finalize()
Definition JitEngineDevice.hpp:464
void * CurHandle
Definition JitEngineDevice.hpp:429
void registerFatBinary(void *Handle, FatbinWrapperT *FatbinWrapper, const char *ModuleId)
Definition JitEngineDevice.hpp:692
DeviceError_t compileAndRun(JITKernelInfo &KernelInfo, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, typename DeviceTraits< ImplT >::DeviceStream_t Stream)
Definition JitEngineDevice.hpp:563
std::unordered_map< std::string, FatbinWrapperT * > ModuleIdToFatBinary
Definition JitEngineDevice.hpp:430
typename DeviceTraits< ImplT >::KernelFunction_t KernelFunction_t
Definition JitEngineDevice.hpp:250
void insertRegisterVar(const char *VarName, const void *Addr)
Definition JitEngineDevice.hpp:418
SmallVector< std::string > GlobalLinkedModuleIds
Definition JitEngineDevice.hpp:432
std::string DeviceArch
Definition JitEngineDevice.hpp:529
HashT getStaticHash(JITKernelInfo &KernelInfo)
Definition JitEngineDevice.hpp:447
void getLambdaJitValues(JITKernelInfo &KernelInfo, SmallVector< RuntimeConstant > &LambdaJitValuesVec)
Definition JitEngineDevice.hpp:381
Definition JitEngine.hpp:33
Definition JitStorageCache.hpp:36
void printStats()
Definition JitStorageCache.hpp:65
Definition LambdaRegistry.hpp:19
std::optional< DenseMap< StringRef, SmallVector< RuntimeConstant > >::iterator > matchJitVariableMap(StringRef FnName)
Definition LambdaRegistry.hpp:27
const SmallVector< RuntimeConstant > & getJitVariables(StringRef LambdaTypeRef)
Definition LambdaRegistry.hpp:74
static LambdaRegistry & instance()
Definition LambdaRegistry.hpp:21
bool empty()
Definition LambdaRegistry.hpp:78
static llvm::raw_ostream & outs(const std::string &Name)
Definition Logger.hpp:25
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.hpp:19
Definition TimeTracing.hpp:36
uint64_t elapsed()
Definition TimeTracing.hpp:45
Definition Dispatcher.cpp:14
std::unique_ptr< Module > cloneKernelFromModules(ArrayRef< std::reference_wrapper< Module > > Mods, StringRef EntryName)
Definition Cloning.h:496
HashT hash(FirstT &&First, RestTs &&...Rest)
Definition Hashing.hpp:73
cudaError_t launchKernelDirect(void *KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.hpp:20
cudaError_t launchKernelFunction(CUfunction KernelFunc, dim3 GridDim, dim3 BlockDim, void **KernelArgs, uint64_t ShmemSize, CUstream Stream)
Definition CoreDeviceCUDA.hpp:51
CUfunction getKernelFunctionFromImage(StringRef KernelName, const void *Image, bool RelinkGlobalsByCopy, const std::unordered_map< std::string, const void * > &VarNameToDevPtr)
Definition CoreDeviceCUDA.hpp:27
HashT hashCombine(HashT A, HashT B)
Definition Hashing.hpp:68
void pruneIR(Module &M, bool UnsetExternallyInitialized=true)
Definition CoreLLVM.hpp:202
std::string toString(CodegenOption Option)
Definition Config.hpp:23
void * resolveDeviceGlobalAddr(const void *Addr)
Definition CoreDeviceCUDA.hpp:12
void internalize(Module &M, StringRef PreserveFunctionName)
Definition CoreLLVM.hpp:237
void runCleanupPassPipeline(Module &M)
Definition CoreLLVM.hpp:178
std::unique_ptr< Module > linkModules(LLVMContext &Ctx, SmallVector< std::unique_ptr< Module > > LinkedModules)
Definition CoreLLVM.hpp:161
Definition Hashing.hpp:94
Definition JitEngineDevice.hpp:243
Definition JitEngineDevice.hpp:72
const char * Binary
Definition JitEngineDevice.hpp:75
void ** PrelinkedFatbins
Definition JitEngineDevice.hpp:76
int32_t Magic
Definition JitEngineDevice.hpp:73
int32_t Version
Definition JitEngineDevice.hpp:74