135 lines · cpp
1//===- ELFYAMLTest.cpp - Tests for ELFYAML.cpp ----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Object/ELF.h"10#include "llvm/Object/ELFObjectFile.h"11#include "llvm/Object/ELFTypes.h"12#include "llvm/ObjectYAML/yaml2obj.h"13#include "llvm/Support/YAMLTraits.h"14#include "llvm/Testing/Support/Error.h"15#include "gtest/gtest.h"16 17using namespace llvm;18using namespace llvm::object;19 20template <class ELFT>21static Expected<ELFObjectFile<ELFT>> toBinary(SmallVectorImpl<char> &Storage,22 StringRef Yaml) {23 Storage.clear();24 raw_svector_ostream OS(Storage);25 yaml::Input YIn(Yaml);26 if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {}))27 return createStringError(std::errc::invalid_argument,28 "unable to convert YAML");29 30 return ELFObjectFile<ELFT>::create(MemoryBufferRef(OS.str(), "Binary"));31}32 33TEST(ELFRelocationTypeTest, RelocationTestForVE) {34 SmallString<0> Storage;35 Expected<ELFObjectFile<ELF64LE>> ExpectedFile = toBinary<ELF64LE>(Storage, R"(36--- !ELF37FileHeader:38 Class: ELFCLASS6439 Data: ELFDATA2LSB40 Type: ET_REL41 Machine: EM_VE42Sections:43 - Name: .rela.text44 Type: SHT_RELA45 Relocations:46 - Type: R_VE_NONE47 - Type: R_VE_REFLONG48 - Type: R_VE_REFQUAD49 - Type: R_VE_SREL3250 - Type: R_VE_HI3251 - Type: R_VE_LO3252 - Type: R_VE_PC_HI3253 - Type: R_VE_PC_LO3254 - Type: R_VE_GOT3255 - Type: R_VE_GOT_HI3256 - Type: R_VE_GOT_LO3257 - Type: R_VE_GOTOFF3258 - Type: R_VE_GOTOFF_HI3259 - Type: R_VE_GOTOFF_LO3260 - Type: R_VE_PLT3261 - Type: R_VE_PLT_HI3262 - Type: R_VE_PLT_LO3263 - Type: R_VE_RELATIVE64 - Type: R_VE_GLOB_DAT65 - Type: R_VE_JUMP_SLOT66 - Type: R_VE_COPY67 - Type: R_VE_DTPMOD6468 - Type: R_VE_DTPOFF6469 - Type: R_VE_TLS_GD_HI3270 - Type: R_VE_TLS_GD_LO3271 - Type: R_VE_TPOFF_HI3272 - Type: R_VE_TPOFF_LO3273 - Type: R_VE_CALL_HI3274 - Type: R_VE_CALL_LO32)");75 ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());76 const ELFObjectFile<ELF64LE> &File = *ExpectedFile;77 EXPECT_EQ("elf64-ve", File.getFileFormatName());78 EXPECT_EQ(Triple::ve, File.getArch());79 80 // Test relocation types.81 for (SectionRef Sec : File.sections()) {82 Expected<StringRef> NameOrErr = Sec.getName();83 ASSERT_THAT_EXPECTED(NameOrErr, Succeeded());84 StringRef SectionName = *NameOrErr;85 if (SectionName != ".rela.text")86 continue;87 88 for (RelocationRef R : Sec.relocations()) {89 SmallString<32> RelTypeName;90 using namespace llvm::ELF;91 92#define NAME_CHECK(ID) \93 case ID: \94 R.getTypeName(RelTypeName); \95 EXPECT_EQ(#ID, RelTypeName); \96 break97 98 switch (R.getType()) {99 NAME_CHECK(R_VE_NONE);100 NAME_CHECK(R_VE_REFLONG);101 NAME_CHECK(R_VE_REFQUAD);102 NAME_CHECK(R_VE_SREL32);103 NAME_CHECK(R_VE_HI32);104 NAME_CHECK(R_VE_LO32);105 NAME_CHECK(R_VE_PC_HI32);106 NAME_CHECK(R_VE_PC_LO32);107 NAME_CHECK(R_VE_GOT32);108 NAME_CHECK(R_VE_GOT_HI32);109 NAME_CHECK(R_VE_GOT_LO32);110 NAME_CHECK(R_VE_GOTOFF32);111 NAME_CHECK(R_VE_GOTOFF_HI32);112 NAME_CHECK(R_VE_GOTOFF_LO32);113 NAME_CHECK(R_VE_PLT32);114 NAME_CHECK(R_VE_PLT_HI32);115 NAME_CHECK(R_VE_PLT_LO32);116 NAME_CHECK(R_VE_RELATIVE);117 NAME_CHECK(R_VE_GLOB_DAT);118 NAME_CHECK(R_VE_JUMP_SLOT);119 NAME_CHECK(R_VE_COPY);120 NAME_CHECK(R_VE_DTPMOD64);121 NAME_CHECK(R_VE_DTPOFF64);122 NAME_CHECK(R_VE_TLS_GD_HI32);123 NAME_CHECK(R_VE_TLS_GD_LO32);124 NAME_CHECK(R_VE_TPOFF_HI32);125 NAME_CHECK(R_VE_TPOFF_LO32);126 NAME_CHECK(R_VE_CALL_HI32);127 NAME_CHECK(R_VE_CALL_LO32);128 default:129 FAIL() << "Found unexpected relocation type: " + Twine(R.getType());130 break;131 }132 }133 }134}135