diff options
author | Alex Brachet <alexbrachetmialot@gmail.com> | 2019-08-07 02:44:49 +0000 |
---|---|---|
committer | Alex Brachet <alexbrachetmialot@gmail.com> | 2019-08-07 02:44:49 +0000 |
commit | c22d9666fc3e132de3ed121eaf42c3e7e00c7440 (patch) | |
tree | cc49de623eca66937ec84e6f43edb64f3081514d /llvm/lib/ObjectYAML/yaml2obj.cpp | |
parent | 6cebeafac31ceb500494bb301e365363c3d5992a (diff) | |
download | bcm5719-llvm-c22d9666fc3e132de3ed121eaf42c3e7e00c7440.tar.gz bcm5719-llvm-c22d9666fc3e132de3ed121eaf42c3e7e00c7440.zip |
[yaml2obj] Move core yaml2obj code into lib and include for use in unit tests
Reviewers: jhenderson, rupprecht, MaskRay, grimar, labath
Reviewed By: rupprecht
Subscribers: gribozavr, mgrang, seiya, mgorny, sbc100, hiraditya, aheejin, jakehehrlich, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65255
llvm-svn: 368119
Diffstat (limited to 'llvm/lib/ObjectYAML/yaml2obj.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/yaml2obj.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/llvm/lib/ObjectYAML/yaml2obj.cpp b/llvm/lib/ObjectYAML/yaml2obj.cpp new file mode 100644 index 00000000000..f9bcba68c84 --- /dev/null +++ b/llvm/lib/ObjectYAML/yaml2obj.cpp @@ -0,0 +1,68 @@ +//===-- 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/Object/ObjectFile.h" +#include "llvm/ObjectYAML/ObjectYAML.h" +#include "llvm/Support/Errc.h" +#include "llvm/Support/YAMLTraits.h" + +namespace llvm { +namespace yaml { + +Error convertYAML(yaml::Input &YIn, raw_ostream &Out, unsigned DocNum) { + // TODO: make yaml2* functions return Error instead of int. + auto IntToErr = [](int Ret) -> Error { + if (Ret) + return createStringError(errc::invalid_argument, "yaml2obj failed"); + return Error::success(); + }; + + unsigned CurDocNum = 0; + do { + if (++CurDocNum == DocNum) { + yaml::YamlObjectFile Doc; + YIn >> Doc; + if (std::error_code EC = YIn.error()) + return createStringError(EC, "Failed to parse YAML input!"); + if (Doc.Elf) + return IntToErr(yaml2elf(*Doc.Elf, Out)); + if (Doc.Coff) + return IntToErr(yaml2coff(*Doc.Coff, Out)); + if (Doc.MachO || Doc.FatMachO) + return IntToErr(yaml2macho(Doc, Out)); + if (Doc.Minidump) + return IntToErr(yaml2minidump(*Doc.Minidump, Out)); + if (Doc.Wasm) + return IntToErr(yaml2wasm(*Doc.Wasm, Out)); + return createStringError(errc::invalid_argument, + "Unknown document type!"); + } + } while (YIn.nextDocument()); + + return createStringError(errc::invalid_argument, + "Cannot find the %u%s document", DocNum, + getOrdinalSuffix(DocNum).data()); +} + +Expected<std::unique_ptr<object::ObjectFile>> +yaml2ObjectFile(SmallVectorImpl<char> &Storage, StringRef Yaml) { + Storage.clear(); + raw_svector_ostream OS(Storage); + + yaml::Input YIn(Yaml); + if (Error E = convertYAML(YIn, OS)) + return std::move(E); + + return object::ObjectFile::createObjectFile( + MemoryBufferRef(OS.str(), "YamlObject")); +} + +} // namespace yaml +} // namespace llvm |