21#include "llvm/IR/LegacyPassManager.h"
22#include "llvm/IR/Module.h"
23#include "llvm/MC/TargetRegistry.h"
24#include "llvm/Target/TargetMachine.h"
32 llvm::Error &Err, std::list<PartialTranslationUnit> &
PTUs)
43 llvm::Error &Err, std::list<PartialTranslationUnit> &
PTUs)
49 if (!
Arch.starts_with(
"sm_") ||
Arch.substr(3).getAsInteger(10, SMVersion)) {
50 Err = llvm::joinErrors(std::move(Err), llvm::make_error<llvm::StringError>(
51 "Invalid CUDA architecture",
52 llvm::inconvertibleErrorCode()));
58 auto &PTU =
PTUs.back();
61 const llvm::Target *
Target = llvm::TargetRegistry::lookupTarget(
62 PTU.TheModule->getTargetTriple(),
Error);
64 return llvm::make_error<llvm::StringError>(std::move(
Error),
66 llvm::TargetOptions TO = llvm::TargetOptions();
67 std::unique_ptr<llvm::TargetMachine> TM(
Target->createTargetMachine(
69 llvm::Reloc::Model::PIC_));
72 llvm::raw_svector_ostream dest(PTXCode);
74 llvm::legacy::PassManager PM;
75 if (TM->addPassesToEmitFile(PM, dest,
nullptr,
76 llvm::CodeGenFileType::AssemblyFile)) {
77 return llvm::make_error<llvm::StringError>(
78 "NVPTX backend cannot produce PTX code.",
79 llvm::inconvertibleErrorCode());
82 PM.run(*PTU.TheModule);
85 while (PTXCode.size() % 8)
90llvm::Error IncrementalCUDADeviceParser::GenerateFatbinary() {
100 struct FatBinInnerHeader {
122 :
Kind(1 ), unknown02(0x0101), HeaderSize(sizeof(*this)),
123 DataSize(DataSize), unknown0c(0), CompressedSize(0),
124 SubHeaderSize(HeaderSize - 8), VersionMinor(2), VersionMajor(4),
125 CudaArch(CudaArch), unknown20(0), unknown24(0), Flags(Flags),
126 unknown2c(0), unknown30(0), unknown34(0), UncompressedSize(0),
127 unknown3c(0), unknown40(0), unknown44(0) {}
130 struct FatBinHeader {
138 : Magic(0xba55ed50), Version(1), HeaderSize(sizeof(*this)),
139 DataSize(DataSize), unknown0c(0) {}
142 FatBinHeader OuterHeader(
sizeof(FatBinInnerHeader) + PTXCode.size());
143 FatbinContent.append((
char *)&OuterHeader,
144 ((
char *)&OuterHeader) + OuterHeader.HeaderSize);
146 FatBinInnerHeader InnerHeader(PTXCode.size(), SMVersion,
147 FatBinFlags::AddressSize64 |
148 FatBinFlags::HostLinux);
149 FatbinContent.append((
char *)&InnerHeader,
150 ((
char *)&InnerHeader) + InnerHeader.HeaderSize);
152 FatbinContent.append(PTXCode.begin(), PTXCode.end());
154 const PartialTranslationUnit &PTU =
PTUs.back();
156 std::string FatbinFileName =
"/" + PTU.TheModule->getName().str() +
".fatbin";
158 VFS->addFile(FatbinFileName, 0,
159 llvm::MemoryBuffer::getMemBuffer(
160 llvm::StringRef(FatbinContent.data(), FatbinContent.size()),
163 CodeGenOpts.OffloadBinaryToEmbedFile = std::move(FatbinFileName);
165 FatbinContent.clear();
167 return llvm::Error::success();
173 return PTX.takeError();
175 return GenerateFatbinary();
Defines the clang::TargetOptions class.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
A custom action enabling the incremental processing functionality.
IncrementalCUDADeviceParser(CompilerInstance &DeviceInstance, CompilerInstance &HostInstance, IncrementalAction *DeviceAct, llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS, llvm::Error &Err, std::list< PartialTranslationUnit > &PTUs)
~IncrementalCUDADeviceParser() override
llvm::Error GenerateOffloadBinary() override
IncrementalDeviceParser(CompilerInstance &DeviceInstance, CompilerInstance &HostInstance, IncrementalAction *DeviceAct, llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS, llvm::Error &Err, std::list< PartialTranslationUnit > &PTUs)
CodeGenOptions & CodeGenOpts
~IncrementalDeviceParser() override
llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS
const TargetOptions & TargetOpts
IncrementalParser(CompilerInstance &Instance, IncrementalAction *Act, llvm::Error &Err, std::list< PartialTranslationUnit > &PTUs)
std::list< PartialTranslationUnit > & PTUs
std::string CPU
If given, the name of the target CPU to generate code for.
Top level wrappers for InstallAPI frontend operations.
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __packed_splat4 uint16_t