1*d415bd75Srobert //===- OffloadEmitter.cpp -------------------------------------------------===// 2*d415bd75Srobert // 3*d415bd75Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*d415bd75Srobert // See https://llvm.org/LICENSE.txt for license information. 5*d415bd75Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*d415bd75Srobert // 7*d415bd75Srobert //===----------------------------------------------------------------------===// 8*d415bd75Srobert 9*d415bd75Srobert #include "llvm/Object/OffloadBinary.h" 10*d415bd75Srobert #include "llvm/ObjectYAML/OffloadYAML.h" 11*d415bd75Srobert #include "llvm/ObjectYAML/yaml2obj.h" 12*d415bd75Srobert #include "llvm/Support/Error.h" 13*d415bd75Srobert #include "llvm/Support/raw_ostream.h" 14*d415bd75Srobert 15*d415bd75Srobert using namespace llvm; 16*d415bd75Srobert using namespace OffloadYAML; 17*d415bd75Srobert 18*d415bd75Srobert namespace llvm { 19*d415bd75Srobert namespace yaml { 20*d415bd75Srobert yaml2offload(Binary & Doc,raw_ostream & Out,ErrorHandler EH)21*d415bd75Srobertbool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) { 22*d415bd75Srobert for (const auto &Member : Doc.Members) { 23*d415bd75Srobert object::OffloadBinary::OffloadingImage Image{}; 24*d415bd75Srobert if (Member.ImageKind) 25*d415bd75Srobert Image.TheImageKind = *Member.ImageKind; 26*d415bd75Srobert if (Member.OffloadKind) 27*d415bd75Srobert Image.TheOffloadKind = *Member.OffloadKind; 28*d415bd75Srobert if (Member.Flags) 29*d415bd75Srobert Image.Flags = *Member.Flags; 30*d415bd75Srobert 31*d415bd75Srobert StringMap<StringRef> &StringData = Image.StringData; 32*d415bd75Srobert if (Member.StringEntries) { 33*d415bd75Srobert for (const auto &Entry : *Member.StringEntries) { 34*d415bd75Srobert StringData[Entry.Key] = Entry.Value; 35*d415bd75Srobert } 36*d415bd75Srobert } 37*d415bd75Srobert 38*d415bd75Srobert SmallVector<char, 1024> Data; 39*d415bd75Srobert raw_svector_ostream OS(Data); 40*d415bd75Srobert if (Member.Content) 41*d415bd75Srobert Member.Content->writeAsBinary(OS); 42*d415bd75Srobert Image.Image = MemoryBuffer::getMemBufferCopy(OS.str()); 43*d415bd75Srobert 44*d415bd75Srobert std::unique_ptr<MemoryBuffer> Binary = object::OffloadBinary::write(Image); 45*d415bd75Srobert 46*d415bd75Srobert // Copy the data to a new buffer so we can modify the bytes directly. 47*d415bd75Srobert SmallVector<char> NewBuffer; 48*d415bd75Srobert std::copy(Binary->getBufferStart(), Binary->getBufferEnd(), 49*d415bd75Srobert std::back_inserter(NewBuffer)); 50*d415bd75Srobert auto *TheHeader = 51*d415bd75Srobert reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]); 52*d415bd75Srobert if (Doc.Version) 53*d415bd75Srobert TheHeader->Version = *Doc.Version; 54*d415bd75Srobert if (Doc.Size) 55*d415bd75Srobert TheHeader->Size = *Doc.Size; 56*d415bd75Srobert if (Doc.EntryOffset) 57*d415bd75Srobert TheHeader->EntryOffset = *Doc.EntryOffset; 58*d415bd75Srobert if (Doc.EntrySize) 59*d415bd75Srobert TheHeader->EntrySize = *Doc.EntrySize; 60*d415bd75Srobert 61*d415bd75Srobert Out.write(NewBuffer.begin(), NewBuffer.size()); 62*d415bd75Srobert } 63*d415bd75Srobert 64*d415bd75Srobert return true; 65*d415bd75Srobert } 66*d415bd75Srobert 67*d415bd75Srobert } // namespace yaml 68*d415bd75Srobert } // namespace llvm 69