//===- ELFYAMLTest.cpp - Tests for ELFYAML.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/Object/ELF.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/ELFTypes.h" #include "llvm/ObjectYAML/yaml2obj.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Testing/Support/Error.h" #include "gtest/gtest.h" using namespace llvm; using namespace llvm::object; template static Expected> toBinary(SmallVectorImpl &Storage, StringRef Yaml) { Storage.clear(); raw_svector_ostream OS(Storage); yaml::Input YIn(Yaml); if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {})) return createStringError(std::errc::invalid_argument, "unable to convert YAML"); return ELFObjectFile::create(MemoryBufferRef(OS.str(), "Binary")); } TEST(ELFRelocationTypeTest, RelocationTestForVE) { SmallString<0> Storage; Expected> ExpectedFile = toBinary(Storage, R"( --- !ELF FileHeader: Class: ELFCLASS64 Data: ELFDATA2LSB Type: ET_REL Machine: EM_VE Sections: - Name: .rela.text Type: SHT_RELA Relocations: - Type: R_VE_NONE - Type: R_VE_REFLONG - Type: R_VE_REFQUAD - Type: R_VE_SREL32 - Type: R_VE_HI32 - Type: R_VE_LO32 - Type: R_VE_PC_HI32 - Type: R_VE_PC_LO32 - Type: R_VE_GOT32 - Type: R_VE_GOT_HI32 - Type: R_VE_GOT_LO32 - Type: R_VE_GOTOFF32 - Type: R_VE_GOTOFF_HI32 - Type: R_VE_GOTOFF_LO32 - Type: R_VE_PLT32 - Type: R_VE_PLT_HI32 - Type: R_VE_PLT_LO32 - Type: R_VE_RELATIVE - Type: R_VE_GLOB_DAT - Type: R_VE_JUMP_SLOT - Type: R_VE_COPY - Type: R_VE_DTPMOD64 - Type: R_VE_DTPOFF64 - Type: R_VE_TLS_GD_HI32 - Type: R_VE_TLS_GD_LO32 - Type: R_VE_TPOFF_HI32 - Type: R_VE_TPOFF_LO32 - Type: R_VE_CALL_HI32 - Type: R_VE_CALL_LO32)"); ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded()); const ELFObjectFile &File = *ExpectedFile; EXPECT_EQ("elf64-ve", File.getFileFormatName()); EXPECT_EQ(Triple::ve, File.getArch()); // Test relocation types. for (SectionRef Sec : File.sections()) { Expected NameOrErr = Sec.getName(); ASSERT_THAT_EXPECTED(NameOrErr, Succeeded()); StringRef SectionName = *NameOrErr; if (SectionName != ".rela.text") continue; for (RelocationRef R : Sec.relocations()) { SmallString<32> RelTypeName; using namespace llvm::ELF; #define NAME_CHECK(ID) \ case ID: \ R.getTypeName(RelTypeName); \ EXPECT_EQ(#ID, RelTypeName); \ break switch (R.getType()) { NAME_CHECK(R_VE_NONE); NAME_CHECK(R_VE_REFLONG); NAME_CHECK(R_VE_REFQUAD); NAME_CHECK(R_VE_SREL32); NAME_CHECK(R_VE_HI32); NAME_CHECK(R_VE_LO32); NAME_CHECK(R_VE_PC_HI32); NAME_CHECK(R_VE_PC_LO32); NAME_CHECK(R_VE_GOT32); NAME_CHECK(R_VE_GOT_HI32); NAME_CHECK(R_VE_GOT_LO32); NAME_CHECK(R_VE_GOTOFF32); NAME_CHECK(R_VE_GOTOFF_HI32); NAME_CHECK(R_VE_GOTOFF_LO32); NAME_CHECK(R_VE_PLT32); NAME_CHECK(R_VE_PLT_HI32); NAME_CHECK(R_VE_PLT_LO32); NAME_CHECK(R_VE_RELATIVE); NAME_CHECK(R_VE_GLOB_DAT); NAME_CHECK(R_VE_JUMP_SLOT); NAME_CHECK(R_VE_COPY); NAME_CHECK(R_VE_DTPMOD64); NAME_CHECK(R_VE_DTPOFF64); NAME_CHECK(R_VE_TLS_GD_HI32); NAME_CHECK(R_VE_TLS_GD_LO32); NAME_CHECK(R_VE_TPOFF_HI32); NAME_CHECK(R_VE_TPOFF_LO32); NAME_CHECK(R_VE_CALL_HI32); NAME_CHECK(R_VE_CALL_LO32); default: FAIL() << "Found unexpected relocation type: " + Twine(R.getType()); break; } } } }