xref: /llvm-project/llvm/tools/obj2yaml/offload2yaml.cpp (revision ecb1d84488431217d7a2902d65d5b326e68bfeb0)
1228c8f9cSJoseph Huber //===------ offload2yaml.cpp - obj2yaml conversion tool ---*- C++ -------*-===//
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 "obj2yaml.h"
10228c8f9cSJoseph Huber #include "llvm/BinaryFormat/Magic.h"
11228c8f9cSJoseph Huber #include "llvm/Object/OffloadBinary.h"
12228c8f9cSJoseph Huber #include "llvm/ObjectYAML/OffloadYAML.h"
13228c8f9cSJoseph Huber #include "llvm/Support/StringSaver.h"
14228c8f9cSJoseph Huber 
15228c8f9cSJoseph Huber using namespace llvm;
16228c8f9cSJoseph Huber 
17228c8f9cSJoseph Huber namespace {
18228c8f9cSJoseph Huber 
populateYAML(OffloadYAML::Binary & YAMLBinary,object::OffloadBinary & OB,UniqueStringSaver Saver)19228c8f9cSJoseph Huber void populateYAML(OffloadYAML::Binary &YAMLBinary, object::OffloadBinary &OB,
20228c8f9cSJoseph Huber                   UniqueStringSaver Saver) {
21228c8f9cSJoseph Huber   YAMLBinary.Members.emplace_back();
22228c8f9cSJoseph Huber   auto &Member = YAMLBinary.Members.back();
23228c8f9cSJoseph Huber   Member.ImageKind = OB.getImageKind();
24228c8f9cSJoseph Huber   Member.OffloadKind = OB.getOffloadKind();
25228c8f9cSJoseph Huber   Member.Flags = OB.getFlags();
26228c8f9cSJoseph Huber   if (!OB.strings().empty()) {
27228c8f9cSJoseph Huber     Member.StringEntries = std::vector<OffloadYAML::Binary::StringEntry>();
28228c8f9cSJoseph Huber     for (const auto &Entry : OB.strings())
29228c8f9cSJoseph Huber       Member.StringEntries->emplace_back(OffloadYAML::Binary::StringEntry(
30*ecb1d844SFangrui Song           {Saver.save(Entry.first), Saver.save(Entry.second)}));
31228c8f9cSJoseph Huber   }
32228c8f9cSJoseph Huber 
33228c8f9cSJoseph Huber   if (!OB.getImage().empty())
34228c8f9cSJoseph Huber     Member.Content = arrayRefFromStringRef(OB.getImage());
35228c8f9cSJoseph Huber }
36228c8f9cSJoseph Huber 
dump(MemoryBufferRef Source,UniqueStringSaver Saver)37228c8f9cSJoseph Huber Expected<OffloadYAML::Binary *> dump(MemoryBufferRef Source,
38228c8f9cSJoseph Huber                                      UniqueStringSaver Saver) {
39228c8f9cSJoseph Huber   Expected<std::unique_ptr<object::OffloadBinary>> OB =
40228c8f9cSJoseph Huber       object::OffloadBinary::create(Source);
41228c8f9cSJoseph Huber   if (!OB)
42228c8f9cSJoseph Huber     return OB.takeError();
43228c8f9cSJoseph Huber 
44228c8f9cSJoseph Huber   std::unique_ptr<OffloadYAML::Binary> YAMLBinary =
45228c8f9cSJoseph Huber       std::make_unique<OffloadYAML::Binary>();
46228c8f9cSJoseph Huber 
47228c8f9cSJoseph Huber   YAMLBinary->Members = std::vector<OffloadYAML::Binary::Member>();
48228c8f9cSJoseph Huber 
49228c8f9cSJoseph Huber   uint64_t Offset = 0;
50228c8f9cSJoseph Huber   while (Offset < (*OB)->getMemoryBufferRef().getBufferSize()) {
51228c8f9cSJoseph Huber     MemoryBufferRef Buffer = MemoryBufferRef(
52228c8f9cSJoseph Huber         (*OB)->getData().drop_front(Offset), (*OB)->getFileName());
53228c8f9cSJoseph Huber     auto BinaryOrErr = object::OffloadBinary::create(Buffer);
54228c8f9cSJoseph Huber     if (!BinaryOrErr)
55228c8f9cSJoseph Huber       return BinaryOrErr.takeError();
56228c8f9cSJoseph Huber 
57228c8f9cSJoseph Huber     object::OffloadBinary &Binary = **BinaryOrErr;
58228c8f9cSJoseph Huber 
59228c8f9cSJoseph Huber     populateYAML(*YAMLBinary, Binary, Saver);
60228c8f9cSJoseph Huber 
61228c8f9cSJoseph Huber     Offset += Binary.getSize();
62228c8f9cSJoseph Huber   }
63228c8f9cSJoseph Huber 
64228c8f9cSJoseph Huber   return YAMLBinary.release();
65228c8f9cSJoseph Huber }
66228c8f9cSJoseph Huber 
67228c8f9cSJoseph Huber } // namespace
68228c8f9cSJoseph Huber 
offload2yaml(raw_ostream & Out,MemoryBufferRef Source)69228c8f9cSJoseph Huber Error offload2yaml(raw_ostream &Out, MemoryBufferRef Source) {
70228c8f9cSJoseph Huber   BumpPtrAllocator Alloc;
71228c8f9cSJoseph Huber   UniqueStringSaver Saver(Alloc);
72228c8f9cSJoseph Huber 
73228c8f9cSJoseph Huber   Expected<OffloadYAML::Binary *> YAMLOrErr = dump(Source, Saver);
74228c8f9cSJoseph Huber   if (!YAMLOrErr)
75228c8f9cSJoseph Huber     return YAMLOrErr.takeError();
76228c8f9cSJoseph Huber 
77228c8f9cSJoseph Huber   std::unique_ptr<OffloadYAML::Binary> YAML(YAMLOrErr.get());
78228c8f9cSJoseph Huber   yaml::Output Yout(Out);
79228c8f9cSJoseph Huber   Yout << *YAML;
80228c8f9cSJoseph Huber 
81228c8f9cSJoseph Huber   return Error::success();
82228c8f9cSJoseph Huber }
83