//===------ offload2yaml.cpp - obj2yaml conversion tool ---*- C++ -------*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "obj2yaml.h"
#include "llvm/BinaryFormat/Magic.h"
#include "llvm/Object/OffloadBinary.h"
#include "llvm/ObjectYAML/OffloadYAML.h"
#include "llvm/Support/StringSaver.h"

using namespace llvm;

namespace {

void populateYAML(OffloadYAML::Binary &YAMLBinary, object::OffloadBinary &OB,
                  UniqueStringSaver Saver) {
  YAMLBinary.Members.emplace_back();
  auto &Member = YAMLBinary.Members.back();
  Member.ImageKind = OB.getImageKind();
  Member.OffloadKind = OB.getOffloadKind();
  Member.Flags = OB.getFlags();
  if (!OB.strings().empty()) {
    Member.StringEntries = std::vector<OffloadYAML::Binary::StringEntry>();
    for (const auto &Entry : OB.strings())
      Member.StringEntries->emplace_back(OffloadYAML::Binary::StringEntry(
          {Saver.save(Entry.getKey()), Saver.save(Entry.getValue())}));
  }

  if (!OB.getImage().empty())
    Member.Content = arrayRefFromStringRef(OB.getImage());
}

Expected<OffloadYAML::Binary *> dump(MemoryBufferRef Source,
                                     UniqueStringSaver Saver) {
  Expected<std::unique_ptr<object::OffloadBinary>> OB =
      object::OffloadBinary::create(Source);
  if (!OB)
    return OB.takeError();

  std::unique_ptr<OffloadYAML::Binary> YAMLBinary =
      std::make_unique<OffloadYAML::Binary>();

  YAMLBinary->Members = std::vector<OffloadYAML::Binary::Member>();

  uint64_t Offset = 0;
  while (Offset < (*OB)->getMemoryBufferRef().getBufferSize()) {
    MemoryBufferRef Buffer = MemoryBufferRef(
        (*OB)->getData().drop_front(Offset), (*OB)->getFileName());
    auto BinaryOrErr = object::OffloadBinary::create(Buffer);
    if (!BinaryOrErr)
      return BinaryOrErr.takeError();

    object::OffloadBinary &Binary = **BinaryOrErr;

    populateYAML(*YAMLBinary, Binary, Saver);

    Offset += Binary.getSize();
  }

  return YAMLBinary.release();
}

} // namespace

Error offload2yaml(raw_ostream &Out, MemoryBufferRef Source) {
  BumpPtrAllocator Alloc;
  UniqueStringSaver Saver(Alloc);

  Expected<OffloadYAML::Binary *> YAMLOrErr = dump(Source, Saver);
  if (!YAMLOrErr)
    return YAMLOrErr.takeError();

  std::unique_ptr<OffloadYAML::Binary> YAML(YAMLOrErr.get());
  yaml::Output Yout(Out);
  Yout << *YAML;

  return Error::success();
}
