31 llvm::Error &Err, std::list<PartialTranslationUnit> &
PTUs)
39 Err = llvm::joinErrors(std::move(Err), llvm::make_error<llvm::StringError>(
40 "Invalid CUDA architecture",
41 llvm::inconvertibleErrorCode()));
47 auto &PTU =
PTUs.back();
50 const llvm::Target *
Target = llvm::TargetRegistry::lookupTarget(
51 PTU.TheModule->getTargetTriple(),
Error);
53 return llvm::make_error<llvm::StringError>(std::move(
Error),
55 llvm::TargetOptions TO = llvm::TargetOptions();
56 std::unique_ptr<llvm::TargetMachine> TM(
Target->createTargetMachine(
57 PTU.TheModule->getTargetTriple(),
TargetOpts.CPU,
"", TO,
58 llvm::Reloc::Model::PIC_));
61 llvm::raw_svector_ostream dest(
PTXCode);
63 llvm::legacy::PassManager PM;
64 if (TM->addPassesToEmitFile(PM, dest,
nullptr,
65 llvm::CodeGenFileType::AssemblyFile)) {
66 return llvm::make_error<llvm::StringError>(
67 "NVPTX backend cannot produce PTX code.",
68 llvm::inconvertibleErrorCode());
71 PM.run(*PTU.TheModule);
89 struct FatBinInnerHeader {
111 : Kind(1 ), unknown02(0x0101), HeaderSize(
sizeof(*
this)),
112 DataSize(DataSize), unknown0c(0), CompressedSize(0),
113 SubHeaderSize(HeaderSize - 8), VersionMinor(2), VersionMajor(4),
114 CudaArch(CudaArch), unknown20(0), unknown24(0), Flags(Flags),
115 unknown2c(0), unknown30(0), unknown34(0), UncompressedSize(0),
116 unknown3c(0), unknown40(0), unknown44(0) {}
119 struct FatBinHeader {
127 : Magic(0xba55ed50), Version(1), HeaderSize(
sizeof(*
this)),
128 DataSize(DataSize), unknown0c(0) {}
131 FatBinHeader OuterHeader(
sizeof(FatBinInnerHeader) +
PTXCode.size());
133 ((
char *)&OuterHeader) + OuterHeader.HeaderSize);
136 FatBinFlags::AddressSize64 |
137 FatBinFlags::HostLinux);
139 ((
char *)&InnerHeader) + InnerHeader.HeaderSize);
145 std::string FatbinFileName =
"/" + PTU.
TheModule->getName().str() +
".fatbin";
147 VFS->addFile(FatbinFileName, 0,
148 llvm::MemoryBuffer::getMemBuffer(
152 CodeGenOpts.OffloadBinaryToEmbedFile = std::move(FatbinFileName);
156 return llvm::Error::success();
IncrementalCUDADeviceParser(CompilerInstance &DeviceInstance, CompilerInstance &HostInstance, IncrementalAction *DeviceAct, llvm::IntrusiveRefCntPtr< llvm::vfs::InMemoryFileSystem > VFS, llvm::Error &Err, std::list< PartialTranslationUnit > &PTUs)