//===-- yaml2obj.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/ObjectYAML/yaml2obj.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/ObjectYAML/ObjectYAML.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/WithColor.h"
#include "llvm/Support/YAMLTraits.h"

namespace llvm {
namespace yaml {

bool convertYAML(yaml::Input &YIn, raw_ostream &Out, ErrorHandler ErrHandler,
                 unsigned DocNum, uint64_t MaxSize) {
  unsigned CurDocNum = 0;
  do {
    if (++CurDocNum != DocNum)
      continue;

    yaml::YamlObjectFile Doc;
    YIn >> Doc;
    if (std::error_code EC = YIn.error()) {
      ErrHandler("failed to parse YAML input: " + EC.message());
      return false;
    }

    if (Doc.Arch)
      return yaml2archive(*Doc.Arch, Out, ErrHandler);
    if (Doc.Elf)
      return yaml2elf(*Doc.Elf, Out, ErrHandler, MaxSize);
    if (Doc.Coff)
      return yaml2coff(*Doc.Coff, Out, ErrHandler);
    if (Doc.MachO || Doc.FatMachO)
      return yaml2macho(Doc, Out, ErrHandler);
    if (Doc.Minidump)
      return yaml2minidump(*Doc.Minidump, Out, ErrHandler);
    if (Doc.Wasm)
      return yaml2wasm(*Doc.Wasm, Out, ErrHandler);
    if (Doc.Xcoff)
      return yaml2xcoff(*Doc.Xcoff, Out, ErrHandler);

    ErrHandler("unknown document type");
    return false;

  } while (YIn.nextDocument());

  ErrHandler("cannot find the " + Twine(DocNum) +
             getOrdinalSuffix(DocNum).data() + " document");
  return false;
}

std::unique_ptr<object::ObjectFile>
yaml2ObjectFile(SmallVectorImpl<char> &Storage, StringRef Yaml,
                ErrorHandler ErrHandler) {
  Storage.clear();
  raw_svector_ostream OS(Storage);

  yaml::Input YIn(Yaml);
  if (!convertYAML(YIn, OS, ErrHandler))
    return {};

  Expected<std::unique_ptr<object::ObjectFile>> ObjOrErr =
      object::ObjectFile::createObjectFile(
          MemoryBufferRef(OS.str(), "YamlObject"));
  if (ObjOrErr)
    return std::move(*ObjOrErr);

  ErrHandler(toString(ObjOrErr.takeError()));
  return {};
}

} // namespace yaml
} // namespace llvm
