Skip to content

Commit f93c271

Browse files
committed
[Object] Change OffloadBinary::write to return SmallString<0>
SmallString<0> is more flexible and avoids an unneeded copy in ObjectYAML/OffloadEmitter.cpp. Reviewed By: jhuber6 Differential Revision: https://reviews.llvm.org/D159335
1 parent 0a97720 commit f93c271

File tree

6 files changed

+17
-19
lines changed

6 files changed

+17
-19
lines changed

clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ Expected<OffloadFile> getInputBitcodeLibrary(StringRef Input) {
184184
Image.StringData["arch"] = Arch;
185185
Image.Image = std::move(*ImageOrError);
186186

187-
std::unique_ptr<MemoryBuffer> Binary = OffloadBinary::write(Image);
187+
std::unique_ptr<MemoryBuffer> Binary =
188+
MemoryBuffer::getMemBufferCopy(OffloadBinary::write(Image));
188189
auto NewBinaryOrErr = OffloadBinary::create(*Binary);
189190
if (!NewBinaryOrErr)
190191
return NewBinaryOrErr.takeError();
@@ -909,7 +910,8 @@ Expected<SmallVector<std::unique_ptr<MemoryBuffer>>>
909910
bundleOpenMP(ArrayRef<OffloadingImage> Images) {
910911
SmallVector<std::unique_ptr<MemoryBuffer>> Buffers;
911912
for (const OffloadingImage &Image : Images)
912-
Buffers.emplace_back(OffloadBinary::write(Image));
913+
Buffers.emplace_back(
914+
MemoryBuffer::getMemBufferCopy(OffloadBinary::write(Image)));
913915

914916
return std::move(Buffers);
915917
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ static Error bundleImages() {
126126
ImageBinary.StringData[Key] = Value;
127127
}
128128
}
129-
std::unique_ptr<MemoryBuffer> Buffer = OffloadBinary::write(ImageBinary);
130-
if (Buffer->getBufferSize() % OffloadBinary::getAlignment() != 0)
129+
llvm::SmallString<0> Buffer = OffloadBinary::write(ImageBinary);
130+
if (Buffer.size() % OffloadBinary::getAlignment() != 0)
131131
return createStringError(inconvertibleErrorCode(),
132132
"Offload binary has invalid size alignment");
133-
OS << Buffer->getBuffer();
133+
OS << Buffer;
134134
}
135135

136136
if (Error E = writeFile(OutputFile,

llvm/include/llvm/Object/OffloadBinary.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define LLVM_OBJECT_OFFLOADBINARY_H
1919

2020
#include "llvm/ADT/MapVector.h"
21+
#include "llvm/ADT/SmallString.h"
2122
#include "llvm/ADT/StringRef.h"
2223
#include "llvm/Object/Binary.h"
2324
#include "llvm/Support/Error.h"
@@ -78,7 +79,7 @@ class OffloadBinary : public Binary {
7879
static Expected<std::unique_ptr<OffloadBinary>> create(MemoryBufferRef);
7980

8081
/// Serialize the contents of \p File to a binary buffer to be read later.
81-
static std::unique_ptr<MemoryBuffer> write(const OffloadingImage &);
82+
static SmallString<0> write(const OffloadingImage &);
8283

8384
static uint64_t getAlignment() { return 8; }
8485

llvm/lib/Object/OffloadBinary.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,7 @@ OffloadBinary::create(MemoryBufferRef Buf) {
204204
new OffloadBinary(Buf, TheHeader, TheEntry));
205205
}
206206

207-
std::unique_ptr<MemoryBuffer>
208-
OffloadBinary::write(const OffloadingImage &OffloadingData) {
207+
SmallString<0> OffloadBinary::write(const OffloadingImage &OffloadingData) {
209208
// Create a null-terminated string table with all the used strings.
210209
StringTableBuilder StrTab(StringTableBuilder::ELF);
211210
for (auto &KeyAndValue : OffloadingData.StringData) {
@@ -243,7 +242,7 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
243242
TheEntry.ImageOffset = BinaryDataSize;
244243
TheEntry.ImageSize = OffloadingData.Image->getBufferSize();
245244

246-
SmallVector<char> Data;
245+
SmallString<0> Data;
247246
Data.reserve(TheHeader.Size);
248247
raw_svector_ostream OS(Data);
249248
OS << StringRef(reinterpret_cast<char *>(&TheHeader), sizeof(Header));
@@ -264,7 +263,7 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
264263
OS.write_zeros(TheHeader.Size - OS.tell());
265264
assert(TheHeader.Size == OS.tell() && "Size mismatch");
266265

267-
return MemoryBuffer::getMemBufferCopy(OS.str());
266+
return Data;
268267
}
269268

270269
Error object::extractOffloadBinaries(MemoryBufferRef Buffer,

llvm/lib/ObjectYAML/OffloadEmitter.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,10 @@ bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
3838
Member.Content->writeAsBinary(OS);
3939
Image.Image = MemoryBuffer::getMemBufferCopy(OS.str());
4040

41-
std::unique_ptr<MemoryBuffer> Binary = object::OffloadBinary::write(Image);
42-
4341
// Copy the data to a new buffer so we can modify the bytes directly.
44-
SmallVector<char> NewBuffer;
45-
std::copy(Binary->getBufferStart(), Binary->getBufferEnd(),
46-
std::back_inserter(NewBuffer));
42+
auto Buffer = object::OffloadBinary::write(Image);
4743
auto *TheHeader =
48-
reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]);
44+
reinterpret_cast<object::OffloadBinary::Header *>(&Buffer[0]);
4945
if (Doc.Version)
5046
TheHeader->Version = *Doc.Version;
5147
if (Doc.Size)
@@ -55,7 +51,7 @@ bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
5551
if (Doc.EntrySize)
5652
TheHeader->EntrySize = *Doc.EntrySize;
5753

58-
Out.write(NewBuffer.begin(), NewBuffer.size());
54+
Out.write(Buffer.begin(), Buffer.size());
5955
}
6056

6157
return true;

llvm/unittests/Object/OffloadingTest.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ TEST(OffloadingTest, checkOffloadingBinary) {
4343
Data.StringData = StringData;
4444
Data.Image = std::move(ImageData);
4545

46-
auto BinaryBuffer = OffloadBinary::write(Data);
47-
46+
auto BinaryBuffer =
47+
MemoryBuffer::getMemBufferCopy(OffloadBinary::write(Data));
4848
auto BinaryOrErr = OffloadBinary::create(*BinaryBuffer);
4949
if (!BinaryOrErr)
5050
FAIL();

0 commit comments

Comments
 (0)