1 //===- ELFTest.cpp - Tests for ELF.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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "llvm/Object/ELF.h" 10 #include "llvm/Testing/Support/Error.h" 11 #include "gtest/gtest.h" 12 13 using namespace llvm; 14 using namespace llvm::object; 15 using namespace llvm::ELF; 16 17 TEST(ELFTest, getELFRelocationTypeNameForVE) { 18 EXPECT_EQ("R_VE_NONE", getELFRelocationTypeName(EM_VE, R_VE_NONE)); 19 EXPECT_EQ("R_VE_REFLONG", getELFRelocationTypeName(EM_VE, R_VE_REFLONG)); 20 EXPECT_EQ("R_VE_REFQUAD", getELFRelocationTypeName(EM_VE, R_VE_REFQUAD)); 21 EXPECT_EQ("R_VE_SREL32", getELFRelocationTypeName(EM_VE, R_VE_SREL32)); 22 EXPECT_EQ("R_VE_HI32", getELFRelocationTypeName(EM_VE, R_VE_HI32)); 23 EXPECT_EQ("R_VE_LO32", getELFRelocationTypeName(EM_VE, R_VE_LO32)); 24 EXPECT_EQ("R_VE_PC_HI32", getELFRelocationTypeName(EM_VE, R_VE_PC_HI32)); 25 EXPECT_EQ("R_VE_PC_LO32", getELFRelocationTypeName(EM_VE, R_VE_PC_LO32)); 26 EXPECT_EQ("R_VE_GOT32", getELFRelocationTypeName(EM_VE, R_VE_GOT32)); 27 EXPECT_EQ("R_VE_GOT_HI32", getELFRelocationTypeName(EM_VE, R_VE_GOT_HI32)); 28 EXPECT_EQ("R_VE_GOT_LO32", getELFRelocationTypeName(EM_VE, R_VE_GOT_LO32)); 29 EXPECT_EQ("R_VE_GOTOFF32", getELFRelocationTypeName(EM_VE, R_VE_GOTOFF32)); 30 EXPECT_EQ("R_VE_GOTOFF_HI32", 31 getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_HI32)); 32 EXPECT_EQ("R_VE_GOTOFF_LO32", 33 getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_LO32)); 34 EXPECT_EQ("R_VE_PLT32", getELFRelocationTypeName(EM_VE, R_VE_PLT32)); 35 EXPECT_EQ("R_VE_PLT_HI32", getELFRelocationTypeName(EM_VE, R_VE_PLT_HI32)); 36 EXPECT_EQ("R_VE_PLT_LO32", getELFRelocationTypeName(EM_VE, R_VE_PLT_LO32)); 37 EXPECT_EQ("R_VE_RELATIVE", getELFRelocationTypeName(EM_VE, R_VE_RELATIVE)); 38 EXPECT_EQ("R_VE_GLOB_DAT", getELFRelocationTypeName(EM_VE, R_VE_GLOB_DAT)); 39 EXPECT_EQ("R_VE_JUMP_SLOT", getELFRelocationTypeName(EM_VE, R_VE_JUMP_SLOT)); 40 EXPECT_EQ("R_VE_COPY", getELFRelocationTypeName(EM_VE, R_VE_COPY)); 41 EXPECT_EQ("R_VE_DTPMOD64", getELFRelocationTypeName(EM_VE, R_VE_DTPMOD64)); 42 EXPECT_EQ("R_VE_DTPOFF64", getELFRelocationTypeName(EM_VE, R_VE_DTPOFF64)); 43 EXPECT_EQ("R_VE_TLS_GD_HI32", 44 getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_HI32)); 45 EXPECT_EQ("R_VE_TLS_GD_LO32", 46 getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_LO32)); 47 EXPECT_EQ("R_VE_TPOFF_HI32", 48 getELFRelocationTypeName(EM_VE, R_VE_TPOFF_HI32)); 49 EXPECT_EQ("R_VE_TPOFF_LO32", 50 getELFRelocationTypeName(EM_VE, R_VE_TPOFF_LO32)); 51 EXPECT_EQ("R_VE_CALL_HI32", getELFRelocationTypeName(EM_VE, R_VE_CALL_HI32)); 52 EXPECT_EQ("R_VE_CALL_LO32", getELFRelocationTypeName(EM_VE, R_VE_CALL_LO32)); 53 } 54 55 TEST(ELFTest, getELFRelativeRelocationType) { 56 EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE)); 57 } 58 59 // This is a test for the DataRegion helper struct, defined in ELF.h header. 60 TEST(ELFTest, DataRegionTest) { 61 std::vector<uint8_t> Data = {0, 1, 2}; 62 63 // Used to check that the operator[] works properly. 64 auto CheckOperator = [&](DataRegion<uint8_t> &R) { 65 for (size_t I = 0, E = Data.size(); I != E; ++I) { 66 Expected<uint8_t> ValOrErr = R[I]; 67 ASSERT_THAT_EXPECTED(ValOrErr, Succeeded()); 68 EXPECT_EQ(*ValOrErr, I); 69 } 70 }; 71 72 // Check we can use the constructor that takes an ArrayRef<T>. 73 DataRegion<uint8_t> Region(Data); 74 75 CheckOperator(Region); 76 const char *ErrMsg1 = 77 "the index is greater than or equal to the number of entries (3)"; 78 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg1)); 79 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg1)); 80 81 // Check we can use the constructor that takes the data begin and the 82 // data end pointers. 83 Region = {Data.data(), Data.data() + Data.size()}; 84 85 CheckOperator(Region); 86 const char *ErrMsg2 = "can't read past the end of the file"; 87 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg2)); 88 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg2)); 89 } 90