brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · 8390233 Raw
87 lines · cpp
1//===-- yaml2obj.cpp ------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ObjectYAML/yaml2obj.h"10#include "llvm/ADT/StringExtras.h"11#include "llvm/ADT/Twine.h"12#include "llvm/Object/ObjectFile.h"13#include "llvm/ObjectYAML/ObjectYAML.h"14#include "llvm/Support/WithColor.h"15#include "llvm/Support/YAMLTraits.h"16 17namespace llvm {18namespace yaml {19 20bool convertYAML(yaml::Input &YIn, raw_ostream &Out, ErrorHandler ErrHandler,21                 unsigned DocNum, uint64_t MaxSize) {22  unsigned CurDocNum = 0;23  do {24    if (++CurDocNum != DocNum)25      continue;26 27    yaml::YamlObjectFile Doc;28    YIn >> Doc;29    if (std::error_code EC = YIn.error()) {30      ErrHandler("failed to parse YAML input: " + EC.message());31      return false;32    }33 34    if (Doc.Arch)35      return yaml2archive(*Doc.Arch, Out, ErrHandler);36    if (Doc.Elf)37      return yaml2elf(*Doc.Elf, Out, ErrHandler, MaxSize);38    if (Doc.Coff)39      return yaml2coff(*Doc.Coff, Out, ErrHandler);40    if (Doc.Goff)41      return yaml2goff(*Doc.Goff, Out, ErrHandler);42    if (Doc.MachO || Doc.FatMachO)43      return yaml2macho(Doc, Out, ErrHandler);44    if (Doc.Minidump)45      return yaml2minidump(*Doc.Minidump, Out, ErrHandler);46    if (Doc.Offload)47      return yaml2offload(*Doc.Offload, Out, ErrHandler);48    if (Doc.Wasm)49      return yaml2wasm(*Doc.Wasm, Out, ErrHandler);50    if (Doc.Xcoff)51      return yaml2xcoff(*Doc.Xcoff, Out, ErrHandler);52    if (Doc.DXContainer)53      return yaml2dxcontainer(*Doc.DXContainer, Out, ErrHandler);54 55    ErrHandler("unknown document type");56    return false;57 58  } while (YIn.nextDocument());59 60  ErrHandler("cannot find the " + Twine(DocNum) +61             getOrdinalSuffix(DocNum).data() + " document");62  return false;63}64 65std::unique_ptr<object::ObjectFile>66yaml2ObjectFile(SmallVectorImpl<char> &Storage, StringRef Yaml,67                ErrorHandler ErrHandler) {68  Storage.clear();69  raw_svector_ostream OS(Storage);70 71  yaml::Input YIn(Yaml);72  if (!convertYAML(YIn, OS, ErrHandler))73    return {};74 75  Expected<std::unique_ptr<object::ObjectFile>> ObjOrErr =76      object::ObjectFile::createObjectFile(77          MemoryBufferRef(OS.str(), "YamlObject"));78  if (ObjOrErr)79    return std::move(*ObjOrErr);80 81  ErrHandler(toString(ObjOrErr.takeError()));82  return {};83}84 85} // namespace yaml86} // namespace llvm87