xref: /llvm-project/llvm/lib/ObjectYAML/OffloadEmitter.cpp (revision 5b7102d1f37eab7a8f17b7bf4124ca76fbdbd66d)
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