brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · fdbafc2 Raw
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