aboutsummaryrefslogtreecommitdiff
path: root/llvm
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2023-09-01 09:19:25 -0700
committerFangrui Song <i@maskray.me>2023-09-01 09:19:25 -0700
commitf93c271d4cc11b865b87da1402e1cb33449fe4bf (patch)
tree882fed26ab9fd70700aea6abc6cd5f2326b4bf02 /llvm
parent0a97720d0197e60a10c93f8af7d24e5f6d6a9807 (diff)
downloadllvm-f93c271d4cc11b865b87da1402e1cb33449fe4bf.zip
llvm-f93c271d4cc11b865b87da1402e1cb33449fe4bf.tar.gz
llvm-f93c271d4cc11b865b87da1402e1cb33449fe4bf.tar.bz2
[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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/Object/OffloadBinary.h3
-rw-r--r--llvm/lib/Object/OffloadBinary.cpp7
-rw-r--r--llvm/lib/ObjectYAML/OffloadEmitter.cpp10
-rw-r--r--llvm/unittests/Object/OffloadingTest.cpp4
4 files changed, 10 insertions, 14 deletions
diff --git a/llvm/include/llvm/Object/OffloadBinary.h b/llvm/include/llvm/Object/OffloadBinary.h
index 320a8e1..dda1e7f 100644
--- a/llvm/include/llvm/Object/OffloadBinary.h
+++ b/llvm/include/llvm/Object/OffloadBinary.h
@@ -18,6 +18,7 @@
#define LLVM_OBJECT_OFFLOADBINARY_H
#include "llvm/ADT/MapVector.h"
+#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Object/Binary.h"
#include "llvm/Support/Error.h"
@@ -78,7 +79,7 @@ public:
static Expected<std::unique_ptr<OffloadBinary>> create(MemoryBufferRef);
/// Serialize the contents of \p File to a binary buffer to be read later.
- static std::unique_ptr<MemoryBuffer> write(const OffloadingImage &);
+ static SmallString<0> write(const OffloadingImage &);
static uint64_t getAlignment() { return 8; }
diff --git a/llvm/lib/Object/OffloadBinary.cpp b/llvm/lib/Object/OffloadBinary.cpp
index 342327d..1de784c 100644
--- a/llvm/lib/Object/OffloadBinary.cpp
+++ b/llvm/lib/Object/OffloadBinary.cpp
@@ -204,8 +204,7 @@ OffloadBinary::create(MemoryBufferRef Buf) {
new OffloadBinary(Buf, TheHeader, TheEntry));
}
-std::unique_ptr<MemoryBuffer>
-OffloadBinary::write(const OffloadingImage &OffloadingData) {
+SmallString<0> OffloadBinary::write(const OffloadingImage &OffloadingData) {
// Create a null-terminated string table with all the used strings.
StringTableBuilder StrTab(StringTableBuilder::ELF);
for (auto &KeyAndValue : OffloadingData.StringData) {
@@ -243,7 +242,7 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
TheEntry.ImageOffset = BinaryDataSize;
TheEntry.ImageSize = OffloadingData.Image->getBufferSize();
- SmallVector<char> Data;
+ SmallString<0> Data;
Data.reserve(TheHeader.Size);
raw_svector_ostream OS(Data);
OS << StringRef(reinterpret_cast<char *>(&TheHeader), sizeof(Header));
@@ -264,7 +263,7 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
OS.write_zeros(TheHeader.Size - OS.tell());
assert(TheHeader.Size == OS.tell() && "Size mismatch");
- return MemoryBuffer::getMemBufferCopy(OS.str());
+ return Data;
}
Error object::extractOffloadBinaries(MemoryBufferRef Buffer,
diff --git a/llvm/lib/ObjectYAML/OffloadEmitter.cpp b/llvm/lib/ObjectYAML/OffloadEmitter.cpp
index dfb5725..8692ad8 100644
--- a/llvm/lib/ObjectYAML/OffloadEmitter.cpp
+++ b/llvm/lib/ObjectYAML/OffloadEmitter.cpp
@@ -38,14 +38,10 @@ bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
Member.Content->writeAsBinary(OS);
Image.Image = MemoryBuffer::getMemBufferCopy(OS.str());
- std::unique_ptr<MemoryBuffer> Binary = object::OffloadBinary::write(Image);
-
// Copy the data to a new buffer so we can modify the bytes directly.
- SmallVector<char> NewBuffer;
- std::copy(Binary->getBufferStart(), Binary->getBufferEnd(),
- std::back_inserter(NewBuffer));
+ auto Buffer = object::OffloadBinary::write(Image);
auto *TheHeader =
- reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]);
+ reinterpret_cast<object::OffloadBinary::Header *>(&Buffer[0]);
if (Doc.Version)
TheHeader->Version = *Doc.Version;
if (Doc.Size)
@@ -55,7 +51,7 @@ bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
if (Doc.EntrySize)
TheHeader->EntrySize = *Doc.EntrySize;
- Out.write(NewBuffer.begin(), NewBuffer.size());
+ Out.write(Buffer.begin(), Buffer.size());
}
return true;
diff --git a/llvm/unittests/Object/OffloadingTest.cpp b/llvm/unittests/Object/OffloadingTest.cpp
index 77d8b14..18c9efa 100644
--- a/llvm/unittests/Object/OffloadingTest.cpp
+++ b/llvm/unittests/Object/OffloadingTest.cpp
@@ -43,8 +43,8 @@ TEST(OffloadingTest, checkOffloadingBinary) {
Data.StringData = StringData;
Data.Image = std::move(ImageData);
- auto BinaryBuffer = OffloadBinary::write(Data);
-
+ auto BinaryBuffer =
+ MemoryBuffer::getMemBufferCopy(OffloadBinary::write(Data));
auto BinaryOrErr = OffloadBinary::create(*BinaryBuffer);
if (!BinaryOrErr)
FAIL();