aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML/OffloadEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ObjectYAML/OffloadEmitter.cpp')
-rw-r--r--llvm/lib/ObjectYAML/OffloadEmitter.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/llvm/lib/ObjectYAML/OffloadEmitter.cpp b/llvm/lib/ObjectYAML/OffloadEmitter.cpp
new file mode 100644
index 000000000000..3ffbc4ff0e11
--- /dev/null
+++ b/llvm/lib/ObjectYAML/OffloadEmitter.cpp
@@ -0,0 +1,68 @@
+//===- OffloadEmitter.cpp -------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Object/OffloadBinary.h"
+#include "llvm/ObjectYAML/OffloadYAML.h"
+#include "llvm/ObjectYAML/yaml2obj.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+using namespace OffloadYAML;
+
+namespace llvm {
+namespace yaml {
+
+bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
+ for (const auto &Member : Doc.Members) {
+ object::OffloadBinary::OffloadingImage Image{};
+ if (Member.ImageKind)
+ Image.TheImageKind = *Member.ImageKind;
+ if (Member.OffloadKind)
+ Image.TheOffloadKind = *Member.OffloadKind;
+ if (Member.Flags)
+ Image.Flags = *Member.Flags;
+
+ StringMap<StringRef> &StringData = Image.StringData;
+ if (Member.StringEntries) {
+ for (const auto &Entry : *Member.StringEntries) {
+ StringData[Entry.Key] = Entry.Value;
+ }
+ }
+
+ SmallVector<char, 1024> Data;
+ raw_svector_ostream OS(Data);
+ if (Member.Content)
+ 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 *TheHeader =
+ reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]);
+ if (Doc.Version)
+ TheHeader->Version = *Doc.Version;
+ if (Doc.Size)
+ TheHeader->Size = *Doc.Size;
+ if (Doc.EntryOffset)
+ TheHeader->EntryOffset = *Doc.EntryOffset;
+ if (Doc.EntrySize)
+ TheHeader->EntrySize = *Doc.EntrySize;
+
+ Out.write(NewBuffer.begin(), NewBuffer.size());
+ }
+
+ return true;
+}
+
+} // namespace yaml
+} // namespace llvm