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