jhuber6 updated this revision to Diff 421555. jhuber6 added a comment. Update handling for fatbinaries.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D120273/new/ https://reviews.llvm.org/D120273 Files: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp =================================================================== --- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -149,6 +149,10 @@ /// section string will be formatted as `.llvm.offloading.<triple>.<arch>`. #define OFFLOAD_SECTION_MAGIC_STR ".llvm.offloading." +/// The magic offset for the first object inside CUDA's fatbinary. This can be +/// different but it should work for what is passed here. +static constexpr unsigned FatbinaryOffset = 0x50; + /// Information for a device offloading file extracted from the host. struct DeviceFile { DeviceFile(StringRef Kind, StringRef TheTriple, StringRef Arch, @@ -162,7 +166,10 @@ }; namespace llvm { -/// Helper that allows DeviceFile to be used as a key in a DenseMap. +/// Helper that allows DeviceFile to be used as a key in a DenseMap. For now we +/// assume device files with matching architectures and triples but different +/// offloading kinds should be handlded together, this may not be true in the +/// future. template <> struct DenseMapInfo<DeviceFile> { static DeviceFile getEmptyKey() { return {DenseMapInfo<StringRef>::getEmptyKey(), @@ -202,11 +209,15 @@ } static StringRef getDeviceFileExtension(StringRef DeviceTriple, - bool IsBitcode = false) { + file_magic Magic) { Triple TheTriple(DeviceTriple); - if (TheTriple.isAMDGPU() || IsBitcode) + if (Magic == file_magic::bitcode) return "bc"; - if (TheTriple.isNVPTX()) + if (Magic == file_magic::cuda_fatbinary) + return "fatbin"; + if (Magic == file_magic::unknown) + return "s"; + if (TheTriple.isNVPTX() && Magic == file_magic::elf_relocatable) return "cubin"; return "o"; } @@ -310,8 +321,8 @@ if (Expected<StringRef> Contents = Sec.getContents()) { SmallString<128> TempFile; - StringRef DeviceExtension = getDeviceFileExtension( - DeviceTriple, identify_magic(*Contents) == file_magic::bitcode); + StringRef DeviceExtension = + getDeviceFileExtension(DeviceTriple, identify_magic(*Contents)); if (Error Err = createOutputFile(Prefix + "-" + Kind + "-" + DeviceTriple + "-" + Arch, DeviceExtension, TempFile)) @@ -424,8 +435,8 @@ StringRef Contents = CDS->getAsString(); SmallString<128> TempFile; - StringRef DeviceExtension = getDeviceFileExtension( - DeviceTriple, identify_magic(Contents) == file_magic::bitcode); + StringRef DeviceExtension = + getDeviceFileExtension(DeviceTriple, identify_magic(Contents)); if (Error Err = createOutputFile(Prefix + "-" + Kind + "-" + DeviceTriple + "-" + Arch, DeviceExtension, TempFile)) @@ -933,11 +944,34 @@ MemoryBuffer::getFileOrSTDIN(File); if (std::error_code EC = BufferOrErr.getError()) return createFileError(File, EC); + MemoryBufferRef Buffer = **BufferOrErr; file_magic Type = identify_magic((*BufferOrErr)->getBuffer()); - if (Type != file_magic::bitcode) { + switch (Type) { + case file_magic::bitcode: { + Expected<std::unique_ptr<lto::InputFile>> InputFileOrErr = + llvm::lto::InputFile::create(Buffer); + if (!InputFileOrErr) + return InputFileOrErr.takeError(); + + // Save the input file and the buffer associated with its memory. + BitcodeFiles.push_back(std::move(*InputFileOrErr)); + SavedBuffers.push_back(std::move(*BufferOrErr)); + continue; + } + case file_magic::cuda_fatbinary: { + // Cuda fatbinaries almost almost have an object eighty bytes from the + // beginning. This should be sufficient to identify the symbols. + Buffer = MemoryBufferRef( + (*BufferOrErr)->getBuffer().drop_front(FatbinaryOffset), "FatBinary"); + LLVM_FALLTHROUGH; + } + case file_magic::elf_relocatable: + case file_magic::elf_shared_object: + case file_magic::macho_object: + case file_magic::coff_object: { Expected<std::unique_ptr<ObjectFile>> ObjFile = - ObjectFile::createObjectFile(**BufferOrErr, Type); + ObjectFile::createObjectFile(Buffer); if (!ObjFile) return ObjFile.takeError(); @@ -953,15 +987,10 @@ else UsedInSharedLib.insert(Saver.save(*Name)); } - } else { - Expected<std::unique_ptr<lto::InputFile>> InputFileOrErr = - llvm::lto::InputFile::create(**BufferOrErr); - if (!InputFileOrErr) - return InputFileOrErr.takeError(); - - // Save the input file and the buffer associated with its memory. - BitcodeFiles.push_back(std::move(*InputFileOrErr)); - SavedBuffers.push_back(std::move(*BufferOrErr)); + continue; + } + default: + continue; } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits