19 #include "llvm/IR/LegacyPassManager.h"
20 #include "llvm/MC/TargetRegistry.h"
21 #include "llvm/Target/TargetMachine.h"
26 Interpreter &Interp, std::unique_ptr<CompilerInstance> Instance,
31 HostParser(HostParser), VFS(FS) {
34 StringRef Arch =
CI->getTargetOpts().CPU;
35 if (!Arch.starts_with(
"sm_") || Arch.substr(3).getAsInteger(10,
SMVersion)) {
36 Err = llvm::joinErrors(std::move(Err), llvm::make_error<llvm::StringError>(
37 "Invalid CUDA architecture",
38 llvm::inconvertibleErrorCode()));
47 return PTU.takeError();
51 return PTX.takeError();
55 return std::move(Err);
57 std::string FatbinFileName =
58 "/incr_module_" + std::to_string(
PTUs.size()) +
".fatbin";
59 VFS->addFile(FatbinFileName, 0,
60 llvm::MemoryBuffer::getMemBuffer(
72 auto &PTU =
PTUs.back();
75 const llvm::Target *
Target = llvm::TargetRegistry::lookupTarget(
76 PTU.TheModule->getTargetTriple(), Error);
78 return llvm::make_error<llvm::StringError>(std::move(Error),
80 llvm::TargetOptions TO = llvm::TargetOptions();
81 llvm::TargetMachine *TargetMachine =
Target->createTargetMachine(
82 PTU.TheModule->getTargetTriple(),
getCI()->getTargetOpts().CPU,
"", TO,
83 llvm::Reloc::Model::PIC_);
84 PTU.TheModule->setDataLayout(TargetMachine->createDataLayout());
87 llvm::raw_svector_ostream dest(
PTXCode);
89 llvm::legacy::PassManager PM;
90 if (TargetMachine->addPassesToEmitFile(PM, dest,
nullptr,
91 llvm::CodeGenFileType::AssemblyFile)) {
92 return llvm::make_error<llvm::StringError>(
93 "NVPTX backend cannot produce PTX code.",
94 llvm::inconvertibleErrorCode());
97 if (!PM.run(*PTU.TheModule))
98 return llvm::make_error<llvm::StringError>(
"Failed to emit PTX code.",
99 llvm::inconvertibleErrorCode());
109 AddressSize64 = 0x01,
117 struct FatBinInnerHeader {
123 uint32_t CompressedSize;
124 uint32_t SubHeaderSize;
125 uint16_t VersionMinor;
126 uint16_t VersionMajor;
134 uint32_t UncompressedSize;
138 FatBinInnerHeader(uint32_t DataSize, uint32_t
CudaArch, uint32_t Flags)
139 :
Kind(1 ), unknown02(0x0101), HeaderSize(
sizeof(*
this)),
140 DataSize(DataSize), unknown0c(0), CompressedSize(0),
141 SubHeaderSize(HeaderSize - 8), VersionMinor(2), VersionMajor(4),
143 unknown2c(0), unknown30(0), unknown34(0), UncompressedSize(0),
144 unknown3c(0), unknown40(0), unknown44(0) {}
147 struct FatBinHeader {
154 FatBinHeader(uint32_t DataSize)
155 : Magic(0xba55ed50), Version(1), HeaderSize(
sizeof(*
this)),
156 DataSize(DataSize), unknown0c(0) {}
159 FatBinHeader OuterHeader(
sizeof(FatBinInnerHeader) +
PTXCode.size());
161 ((
char *)&OuterHeader) + OuterHeader.HeaderSize);
164 FatBinFlags::AddressSize64 |
165 FatBinFlags::HostLinux);
167 ((
char *)&InnerHeader) + InnerHeader.HeaderSize);
171 return llvm::Error::success();
llvm::MachO::Target Target
Defines the clang::TargetOptions class.
std::string CudaGpuBinaryFileName
Name of file passed with -fcuda-include-gpubinary option to forward to CUDA runtime back-end for inco...
CodeGenOptions & getCodeGenOpts()
llvm::SmallVector< char, 1024 > FatbinContent
llvm::SmallString< 1024 > PTXCode
IncrementalCUDADeviceParser(Interpreter &Interp, std::unique_ptr< CompilerInstance > Instance, IncrementalParser &HostParser, llvm::LLVMContext &LLVMCtx, llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS, llvm::Error &Err)
IncrementalParser & HostParser
llvm::Expected< PartialTranslationUnit & > Parse(llvm::StringRef Input) override
Parses incremental input by creating an in-memory file.
llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS
llvm::Expected< llvm::StringRef > GeneratePTX()
~IncrementalCUDADeviceParser()
llvm::Error GenerateFatbinary()
Provides support for incremental compilation.
std::list< PartialTranslationUnit > PTUs
List containing every information about every incrementally parsed piece of code.
CompilerInstance * getCI()
virtual llvm::Expected< PartialTranslationUnit & > Parse(llvm::StringRef Input)
Parses incremental input by creating an in-memory file.
std::unique_ptr< CompilerInstance > CI
Compiler instance performing the incremental compilation.
Provides top-level interfaces for incremental compilation and execution.
The JSON file list parser is used to communicate input to InstallAPI.