| //===- 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 |