1228c8f9cSJoseph Huber //===- OffloadEmitter.cpp -------------------------------------------------===// 2228c8f9cSJoseph Huber // 3228c8f9cSJoseph Huber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4228c8f9cSJoseph Huber // See https://llvm.org/LICENSE.txt for license information. 5228c8f9cSJoseph Huber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6228c8f9cSJoseph Huber // 7228c8f9cSJoseph Huber //===----------------------------------------------------------------------===// 8228c8f9cSJoseph Huber 9228c8f9cSJoseph Huber #include "llvm/Object/OffloadBinary.h" 10228c8f9cSJoseph Huber #include "llvm/ObjectYAML/OffloadYAML.h" 11228c8f9cSJoseph Huber #include "llvm/ObjectYAML/yaml2obj.h" 12228c8f9cSJoseph Huber #include "llvm/Support/raw_ostream.h" 13228c8f9cSJoseph Huber 14228c8f9cSJoseph Huber using namespace llvm; 15228c8f9cSJoseph Huber using namespace OffloadYAML; 16228c8f9cSJoseph Huber 17228c8f9cSJoseph Huber namespace llvm { 18228c8f9cSJoseph Huber namespace yaml { 19228c8f9cSJoseph Huber 20228c8f9cSJoseph Huber bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) { 21228c8f9cSJoseph Huber for (const auto &Member : Doc.Members) { 22228c8f9cSJoseph Huber object::OffloadBinary::OffloadingImage Image{}; 23228c8f9cSJoseph Huber if (Member.ImageKind) 24228c8f9cSJoseph Huber Image.TheImageKind = *Member.ImageKind; 25228c8f9cSJoseph Huber if (Member.OffloadKind) 26228c8f9cSJoseph Huber Image.TheOffloadKind = *Member.OffloadKind; 27228c8f9cSJoseph Huber if (Member.Flags) 28228c8f9cSJoseph Huber Image.Flags = *Member.Flags; 29228c8f9cSJoseph Huber 30ecb1d844SFangrui Song if (Member.StringEntries) 31ecb1d844SFangrui Song for (const auto &Entry : *Member.StringEntries) 32ecb1d844SFangrui Song Image.StringData[Entry.Key] = Entry.Value; 33228c8f9cSJoseph Huber 34228c8f9cSJoseph Huber SmallVector<char, 1024> Data; 35228c8f9cSJoseph Huber raw_svector_ostream OS(Data); 36228c8f9cSJoseph Huber if (Member.Content) 37228c8f9cSJoseph Huber Member.Content->writeAsBinary(OS); 38228c8f9cSJoseph Huber Image.Image = MemoryBuffer::getMemBufferCopy(OS.str()); 39228c8f9cSJoseph Huber 40228c8f9cSJoseph Huber // Copy the data to a new buffer so we can modify the bytes directly. 41*f93c271dSFangrui Song auto Buffer = object::OffloadBinary::write(Image); 42228c8f9cSJoseph Huber auto *TheHeader = 43*f93c271dSFangrui Song reinterpret_cast<object::OffloadBinary::Header *>(&Buffer[0]); 44228c8f9cSJoseph Huber if (Doc.Version) 45228c8f9cSJoseph Huber TheHeader->Version = *Doc.Version; 46228c8f9cSJoseph Huber if (Doc.Size) 47228c8f9cSJoseph Huber TheHeader->Size = *Doc.Size; 48228c8f9cSJoseph Huber if (Doc.EntryOffset) 49228c8f9cSJoseph Huber TheHeader->EntryOffset = *Doc.EntryOffset; 50228c8f9cSJoseph Huber if (Doc.EntrySize) 51228c8f9cSJoseph Huber TheHeader->EntrySize = *Doc.EntrySize; 52228c8f9cSJoseph Huber 53*f93c271dSFangrui Song Out.write(Buffer.begin(), Buffer.size()); 54228c8f9cSJoseph Huber } 55228c8f9cSJoseph Huber 56228c8f9cSJoseph Huber return true; 57228c8f9cSJoseph Huber } 58228c8f9cSJoseph Huber 59228c8f9cSJoseph Huber } // namespace yaml 60228c8f9cSJoseph Huber } // namespace llvm 61