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 2181ad6265SDimitry Andric bool 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 31*06c3fb27SDimitry Andric if (Member.StringEntries) 32*06c3fb27SDimitry Andric for (const auto &Entry : *Member.StringEntries) 33*06c3fb27SDimitry 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 std::unique_ptr<MemoryBuffer> Binary = object::OffloadBinary::write(Image); 4281ad6265SDimitry Andric 4381ad6265SDimitry Andric // Copy the data to a new buffer so we can modify the bytes directly. 4481ad6265SDimitry Andric SmallVector<char> NewBuffer; 4581ad6265SDimitry Andric std::copy(Binary->getBufferStart(), Binary->getBufferEnd(), 4681ad6265SDimitry Andric std::back_inserter(NewBuffer)); 4781ad6265SDimitry Andric auto *TheHeader = 4881ad6265SDimitry Andric reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]); 4981ad6265SDimitry Andric if (Doc.Version) 5081ad6265SDimitry Andric TheHeader->Version = *Doc.Version; 5181ad6265SDimitry Andric if (Doc.Size) 5281ad6265SDimitry Andric TheHeader->Size = *Doc.Size; 5381ad6265SDimitry Andric if (Doc.EntryOffset) 5481ad6265SDimitry Andric TheHeader->EntryOffset = *Doc.EntryOffset; 5581ad6265SDimitry Andric if (Doc.EntrySize) 5681ad6265SDimitry Andric TheHeader->EntrySize = *Doc.EntrySize; 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric Out.write(NewBuffer.begin(), NewBuffer.size()); 5981ad6265SDimitry Andric } 6081ad6265SDimitry Andric 6181ad6265SDimitry Andric return true; 6281ad6265SDimitry Andric } 6381ad6265SDimitry Andric 6481ad6265SDimitry Andric } // namespace yaml 6581ad6265SDimitry Andric } // namespace llvm 66