Path: blob/main/contrib/llvm-project/llvm/lib/ObjectYAML/yaml2obj.cpp
35233 views
//===-- yaml2obj.cpp ------------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/ObjectYAML/yaml2obj.h"9#include "llvm/ADT/StringExtras.h"10#include "llvm/ADT/Twine.h"11#include "llvm/Object/ObjectFile.h"12#include "llvm/ObjectYAML/ObjectYAML.h"13#include "llvm/Support/Errc.h"14#include "llvm/Support/WithColor.h"15#include "llvm/Support/YAMLTraits.h"1617namespace llvm {18namespace yaml {1920bool convertYAML(yaml::Input &YIn, raw_ostream &Out, ErrorHandler ErrHandler,21unsigned DocNum, uint64_t MaxSize) {22unsigned CurDocNum = 0;23do {24if (++CurDocNum != DocNum)25continue;2627yaml::YamlObjectFile Doc;28YIn >> Doc;29if (std::error_code EC = YIn.error()) {30ErrHandler("failed to parse YAML input: " + EC.message());31return false;32}3334if (Doc.Arch)35return yaml2archive(*Doc.Arch, Out, ErrHandler);36if (Doc.Elf)37return yaml2elf(*Doc.Elf, Out, ErrHandler, MaxSize);38if (Doc.Coff)39return yaml2coff(*Doc.Coff, Out, ErrHandler);40if (Doc.Goff)41return yaml2goff(*Doc.Goff, Out, ErrHandler);42if (Doc.MachO || Doc.FatMachO)43return yaml2macho(Doc, Out, ErrHandler);44if (Doc.Minidump)45return yaml2minidump(*Doc.Minidump, Out, ErrHandler);46if (Doc.Offload)47return yaml2offload(*Doc.Offload, Out, ErrHandler);48if (Doc.Wasm)49return yaml2wasm(*Doc.Wasm, Out, ErrHandler);50if (Doc.Xcoff)51return yaml2xcoff(*Doc.Xcoff, Out, ErrHandler);52if (Doc.DXContainer)53return yaml2dxcontainer(*Doc.DXContainer, Out, ErrHandler);5455ErrHandler("unknown document type");56return false;5758} while (YIn.nextDocument());5960ErrHandler("cannot find the " + Twine(DocNum) +61getOrdinalSuffix(DocNum).data() + " document");62return false;63}6465std::unique_ptr<object::ObjectFile>66yaml2ObjectFile(SmallVectorImpl<char> &Storage, StringRef Yaml,67ErrorHandler ErrHandler) {68Storage.clear();69raw_svector_ostream OS(Storage);7071yaml::Input YIn(Yaml);72if (!convertYAML(YIn, OS, ErrHandler))73return {};7475Expected<std::unique_ptr<object::ObjectFile>> ObjOrErr =76object::ObjectFile::createObjectFile(77MemoryBufferRef(OS.str(), "YamlObject"));78if (ObjOrErr)79return std::move(*ObjOrErr);8081ErrHandler(toString(ObjOrErr.takeError()));82return {};83}8485} // namespace yaml86} // namespace llvm878889