Skip to content

Commit fa9e297

Browse files
committed
[ClangPackager] Fix passing in multiple instances of file
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.
1 parent d821650 commit fa9e297

File tree

1 file changed

+28
-25
lines changed

1 file changed

+28
-25
lines changed

clang/tools/clang-offload-packager/ClangOffloadPackager.cpp

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -104,33 +104,36 @@ static Error bundleImages() {
104104
inconvertibleErrorCode(),
105105
"'file' and 'triple' are required image arguments");
106106

107-
OffloadBinary::OffloadingImage ImageBinary{};
108-
std::unique_ptr<llvm::MemoryBuffer> DeviceImage;
109-
for (const auto &[Key, Value] : Args) {
110-
if (Key == "file") {
111-
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
112-
llvm::MemoryBuffer::getFileOrSTDIN(Value);
113-
if (std::error_code EC = ObjectOrErr.getError())
114-
return errorCodeToError(EC);
115-
116-
// Clang uses the '.o' suffix for LTO bitcode.
117-
if (identify_magic((*ObjectOrErr)->getBuffer()) == file_magic::bitcode)
118-
ImageBinary.TheImageKind = object::IMG_Bitcode;
119-
else
120-
ImageBinary.TheImageKind =
121-
getImageKind(sys::path::extension(Value).drop_front());
122-
ImageBinary.Image = std::move(*ObjectOrErr);
123-
} else if (Key == "kind") {
124-
ImageBinary.TheOffloadKind = getOffloadKind(Value);
125-
} else {
126-
ImageBinary.StringData[Key] = Value;
107+
// Permit using multiple instances of `file` in a single string.
108+
for (auto &File : llvm::split(Args["file"], ",")) {
109+
OffloadBinary::OffloadingImage ImageBinary{};
110+
std::unique_ptr<llvm::MemoryBuffer> DeviceImage;
111+
112+
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr =
113+
llvm::MemoryBuffer::getFileOrSTDIN(File);
114+
if (std::error_code EC = ObjectOrErr.getError())
115+
return errorCodeToError(EC);
116+
117+
// Clang uses the '.o' suffix for LTO bitcode.
118+
if (identify_magic((*ObjectOrErr)->getBuffer()) == file_magic::bitcode)
119+
ImageBinary.TheImageKind = object::IMG_Bitcode;
120+
else
121+
ImageBinary.TheImageKind =
122+
getImageKind(sys::path::extension(File).drop_front());
123+
ImageBinary.Image = std::move(*ObjectOrErr);
124+
for (const auto &[Key, Value] : Args) {
125+
if (Key == "kind") {
126+
ImageBinary.TheOffloadKind = getOffloadKind(Value);
127+
} else if (Key != "file") {
128+
ImageBinary.StringData[Key] = Value;
129+
}
127130
}
131+
llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary);
132+
if (Buffer.size() % OffloadBinary::getAlignment() != 0)
133+
return createStringError(inconvertibleErrorCode(),
134+
"Offload binary has invalid size alignment");
135+
OS << Buffer;
128136
}
129-
llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary);
130-
if (Buffer.size() % OffloadBinary::getAlignment() != 0)
131-
return createStringError(inconvertibleErrorCode(),
132-
"Offload binary has invalid size alignment");
133-
OS << Buffer;
134137
}
135138

136139
if (Error E = writeFile(OutputFile,

0 commit comments

Comments
 (0)