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