|  | //===-- 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.Offload) | 
|  | return yaml2offload(*Doc.Offload, Out, ErrHandler); | 
|  | if (Doc.Wasm) | 
|  | return yaml2wasm(*Doc.Wasm, Out, ErrHandler); | 
|  | if (Doc.Xcoff) | 
|  | return yaml2xcoff(*Doc.Xcoff, Out, ErrHandler); | 
|  | if (Doc.DXContainer) | 
|  | return yaml2dxcontainer(*Doc.DXContainer, 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 |