diff options
Diffstat (limited to 'llvm/lib/ObjectYAML/OffloadEmitter.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/OffloadEmitter.cpp | 68 |
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 |