summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoseph Huber <huberjn@outlook.com>2024-02-14 22:09:48 -0600
committerJoseph Huber <huberjn@outlook.com>2024-02-14 22:11:21 -0600
commitfa9e297b8b63dacb962d99814e698658ad71f946 (patch)
treef71fa38a6e7598c94f2e07e158626ac9b0b538d1
parentd821650e13145a1acccd337c9853354ad6531507 (diff)
[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.
-rw-r--r--clang/tools/clang-offload-packager/ClangOffloadPackager.cpp53
1 files changed, 28 insertions, 25 deletions
diff --git a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
index 08de3f3a3771..c36a5aa58cee 100644
--- a/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
+++ b/clang/tools/clang-offload-packager/ClangOffloadPackager.cpp
@@ -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,