181ad6265SDimitry Andric //===- OffloadEmitter.cpp -------------------------------------------------===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric 981ad6265SDimitry Andric #include "llvm/Object/OffloadBinary.h" 1081ad6265SDimitry Andric #include "llvm/ObjectYAML/OffloadYAML.h" 1181ad6265SDimitry Andric #include "llvm/ObjectYAML/yaml2obj.h" 1281ad6265SDimitry Andric #include "llvm/Support/Error.h" 1381ad6265SDimitry Andric #include "llvm/Support/raw_ostream.h" 1481ad6265SDimitry Andric 1581ad6265SDimitry Andric using namespace llvm; 1681ad6265SDimitry Andric using namespace OffloadYAML; 1781ad6265SDimitry Andric 1881ad6265SDimitry Andric namespace llvm { 1981ad6265SDimitry Andric namespace yaml { 2081ad6265SDimitry Andric yaml2offload(Binary & Doc,raw_ostream & Out,ErrorHandler EH)2181ad6265SDimitry Andricbool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) { 2281ad6265SDimitry Andric for (const auto &Member : Doc.Members) { 2381ad6265SDimitry Andric object::OffloadBinary::OffloadingImage Image{}; 2481ad6265SDimitry Andric if (Member.ImageKind) 2581ad6265SDimitry Andric Image.TheImageKind = *Member.ImageKind; 2681ad6265SDimitry Andric if (Member.OffloadKind) 2781ad6265SDimitry Andric Image.TheOffloadKind = *Member.OffloadKind; 2881ad6265SDimitry Andric if (Member.Flags) 2981ad6265SDimitry Andric Image.Flags = *Member.Flags; 3081ad6265SDimitry Andric 3106c3fb27SDimitry Andric if (Member.StringEntries) 3206c3fb27SDimitry Andric for (const auto &Entry : *Member.StringEntries) 3306c3fb27SDimitry Andric Image.StringData[Entry.Key] = Entry.Value; 3481ad6265SDimitry Andric 3581ad6265SDimitry Andric SmallVector<char, 1024> Data; 3681ad6265SDimitry Andric raw_svector_ostream OS(Data); 3781ad6265SDimitry Andric if (Member.Content) 3881ad6265SDimitry Andric Member.Content->writeAsBinary(OS); 3981ad6265SDimitry Andric Image.Image = MemoryBuffer::getMemBufferCopy(OS.str()); 4081ad6265SDimitry Andric 4181ad6265SDimitry Andric // Copy the data to a new buffer so we can modify the bytes directly. 42*5f757f3fSDimitry Andric auto Buffer = object::OffloadBinary::write(Image); 4381ad6265SDimitry Andric auto *TheHeader = 44*5f757f3fSDimitry Andric reinterpret_cast<object::OffloadBinary::Header *>(&Buffer[0]); 4581ad6265SDimitry Andric if (Doc.Version) 4681ad6265SDimitry Andric TheHeader->Version = *Doc.Version; 4781ad6265SDimitry Andric if (Doc.Size) 4881ad6265SDimitry Andric TheHeader->Size = *Doc.Size; 4981ad6265SDimitry Andric if (Doc.EntryOffset) 5081ad6265SDimitry Andric TheHeader->EntryOffset = *Doc.EntryOffset; 5181ad6265SDimitry Andric if (Doc.EntrySize) 5281ad6265SDimitry Andric TheHeader->EntrySize = *Doc.EntrySize; 5381ad6265SDimitry Andric 54*5f757f3fSDimitry Andric Out.write(Buffer.begin(), Buffer.size()); 5581ad6265SDimitry Andric } 5681ad6265SDimitry Andric 5781ad6265SDimitry Andric return true; 5881ad6265SDimitry Andric } 5981ad6265SDimitry Andric 6081ad6265SDimitry Andric } // namespace yaml 6181ad6265SDimitry Andric } // namespace llvm 62