@@ -104,33 +104,36 @@ static Error bundleImages() {
104
104
inconvertibleErrorCode (),
105
105
" 'file' and 'triple' are required image arguments" );
106
106
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
+ }
127
130
}
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;
128
136
}
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;
134
137
}
135
138
136
139
if (Error E = writeFile (OutputFile,
0 commit comments