//===- OffloadEmitter.cpp -------------------------------------------------===//
//
// 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 "llvm/Object/OffloadBinary.h"
#include "llvm/ObjectYAML/OffloadYAML.h"
#include "llvm/ObjectYAML/yaml2obj.h"
#include "llvm/Support/Compression.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_ostream.h"

using namespace llvm;
using namespace OffloadYAML;

namespace llvm {
namespace yaml {

bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
  SmallVector<object::OffloadBinary::OffloadingImage> Images;
  for (const auto &Member : Doc.Members) {
    object::OffloadBinary::OffloadingImage Image{};
    if (Member.ImageKind)
      Image.TheImageKind = *Member.ImageKind;
    if (Member.OffloadKind)
      Image.TheOffloadKind = *Member.OffloadKind;
    if (Member.Flags)
      Image.Flags = *Member.Flags;

    if (Member.StringEntries)
      for (const auto &Entry : *Member.StringEntries)
        Image.StringData[Entry.Key] = Entry.Value;

    SmallVector<char, 1024> Data;
    raw_svector_ostream OS(Data);
    if (Member.Content)
      Member.Content->writeAsBinary(OS);
    Image.Image = MemoryBuffer::getMemBufferCopy(OS.str());
    Images.push_back(std::move(Image));
  }

  // Copy the data to a new buffer so we can modify the bytes directly.
  SmallString<0> Buffer;
  if (Doc.Compression) {
    Expected<SmallString<0>> CompressedOrErr = object::OffloadBinary::write(
        Images, compression::Params(*Doc.Compression));
    if (!CompressedOrErr) {
      EH(toString(CompressedOrErr.takeError()));
      return false;
    }
    Buffer = std::move(*CompressedOrErr);
  } else {
    Buffer = object::OffloadBinary::write(Images);
  }
  auto *TheHeader =
      reinterpret_cast<object::OffloadBinary::Header *>(&Buffer[0]);
  if (Doc.Version)
    TheHeader->Version = *Doc.Version;
  if (Doc.Size)
    TheHeader->Size = *Doc.Size;
  if (Doc.EntriesOffset)
    TheHeader->EntriesOffset = *Doc.EntriesOffset;
  if (Doc.EntriesCount)
    TheHeader->EntriesCount = *Doc.EntriesCount;

  Out.write(Buffer.begin(), Buffer.size());

  return true;
}

} // namespace yaml
} // namespace llvm
