| //===-- 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 |