Skip to content

Commit

Permalink
[ClangPackager] Fix passing in multiple instances of file
Browse files Browse the repository at this point in the history
Summary:
This is necessary because CMake build tools might need to generate
several files but are unable to put them in separate images. This patch
sipmly moves the file handling out into a separate split iterator.
  • Loading branch information
jhuber6 committed Feb 15, 2024
1 parent d821650 commit fa9e297
Showing 1 changed file with 28 additions and 25 deletions.
53 changes: 28 additions & 25 deletions clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,33 +104,36 @@ static Error bundleImages() {
inconvertibleErrorCode(),
"'file' and 'triple' are required image arguments");

OffloadBinary::OffloadingImage ImageBinary{};
std::unique_ptr<llvm::MemoryBuffer> DeviceImage;
for (const auto &[Key, Value] : Args) {
if (Key == "file") {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
llvm::MemoryBuffer::getFileOrSTDIN(Value);
if (std::error_code EC = ObjectOrErr.getError())
return errorCodeToError(EC);

// Clang uses the '.o' suffix for LTO bitcode.
if (identify_magic((*ObjectOrErr)->getBuffer()) == file_magic::bitcode)
ImageBinary.TheImageKind = object::IMG_Bitcode;
else
ImageBinary.TheImageKind =
getImageKind(sys::path::extension(Value).drop_front());
ImageBinary.Image = std::move(*ObjectOrErr);
} else if (Key == "kind") {
ImageBinary.TheOffloadKind = getOffloadKind(Value);
} else {
ImageBinary.StringData[Key] = Value;
// Permit using multiple instances of `file` in a single string.
for (auto &File : llvm::split(Args["file"], ",")) {
OffloadBinary::OffloadingImage ImageBinary{};
std::unique_ptr<llvm::MemoryBuffer> DeviceImage;

llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
llvm::MemoryBuffer::getFileOrSTDIN(File);
if (std::error_code EC = ObjectOrErr.getError())
return errorCodeToError(EC);

// Clang uses the '.o' suffix for LTO bitcode.
if (identify_magic((*ObjectOrErr)->getBuffer()) == file_magic::bitcode)
ImageBinary.TheImageKind = object::IMG_Bitcode;
else
ImageBinary.TheImageKind =
getImageKind(sys::path::extension(File).drop_front());
ImageBinary.Image = std::move(*ObjectOrErr);
for (const auto &[Key, Value] : Args) {
if (Key == "kind") {
ImageBinary.TheOffloadKind = getOffloadKind(Value);
} else if (Key != "file") {
ImageBinary.StringData[Key] = Value;
}
}
llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary);
if (Buffer.size() % OffloadBinary::getAlignment() != 0)
return createStringError(inconvertibleErrorCode(),
"Offload binary has invalid size alignment");
OS << Buffer;
}
llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary);
if (Buffer.size() % OffloadBinary::getAlignment() != 0)
return createStringError(inconvertibleErrorCode(),
"Offload binary has invalid size alignment");
OS << Buffer;
}

if (Error E = writeFile(OutputFile,
Expand Down

0 comments on commit fa9e297

Please sign in to comment.