//===- 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/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) {
  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;

    StringMap<StringRef> &StringData = Image.StringData;
    if (Member.StringEntries) {
      for (const auto &Entry : *Member.StringEntries) {
        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());

    std::unique_ptr<MemoryBuffer> Binary = object::OffloadBinary::write(Image);

    // Copy the data to a new buffer so we can modify the bytes directly.
    SmallVector<char> NewBuffer;
    std::copy(Binary->getBufferStart(), Binary->getBufferEnd(),
              std::back_inserter(NewBuffer));
    auto *TheHeader =
        reinterpret_cast<object::OffloadBinary::Header *>(&NewBuffer[0]);
    if (Doc.Version)
      TheHeader->Version = *Doc.Version;
    if (Doc.Size)
      TheHeader->Size = *Doc.Size;
    if (Doc.EntryOffset)
      TheHeader->EntryOffset = *Doc.EntryOffset;
    if (Doc.EntrySize)
      TheHeader->EntrySize = *Doc.EntrySize;

    Out.write(NewBuffer.begin(), NewBuffer.size());
  }

  return true;
}

} // namespace yaml
} // namespace llvm
