//===- YAML2ObjTest.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/SmallString.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/Error.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace llvm; using namespace object; using namespace yaml; TEST(yaml2ObjectFile, ELF) { bool ErrorReported = false; auto ErrHandler = [&](const Twine &Msg) { ErrorReported = true; }; SmallString<0> Storage; std::unique_ptr Obj = yaml2ObjectFile(Storage, R"( --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64)", ErrHandler); ASSERT_FALSE(ErrorReported); ASSERT_TRUE(Obj); ASSERT_TRUE(Obj->isELF()); ASSERT_TRUE(Obj->isRelocatableObject()); } TEST(yaml2ObjectFile, Errors) { std::vector Errors; auto ErrHandler = [&](const Twine &Msg) { Errors.push_back("ObjectYAML: " + Msg.str()); }; SmallString<0> Storage; StringRef Yaml = R"( --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_X86_64 Symbols: - Name: foo - Name: foo - Name: foo )"; // 1. Test yaml2ObjectFile(). std::unique_ptr Obj = yaml2ObjectFile(Storage, Yaml, ErrHandler); ASSERT_FALSE(Obj); ASSERT_TRUE(Errors.size() == 2); ASSERT_TRUE(Errors[0] == "ObjectYAML: repeated symbol name: 'foo'"); ASSERT_TRUE(Errors[1] == Errors[0]); // 2. Test convertYAML(). Errors.clear(); Storage.clear(); raw_svector_ostream OS(Storage); yaml::Input YIn(Yaml); bool Res = convertYAML(YIn, OS, ErrHandler); ASSERT_FALSE(Res); ASSERT_TRUE(Errors.size() == 2); ASSERT_TRUE(Errors[0] == "ObjectYAML: repeated symbol name: 'foo'"); ASSERT_TRUE(Errors[1] == Errors[0]); }