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, getELFRelocationTypeNameForLoongArch) { 56 EXPECT_EQ("R_LARCH_NONE", 57 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_NONE)); 58 EXPECT_EQ("R_LARCH_32", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32)); 59 EXPECT_EQ("R_LARCH_64", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64)); 60 EXPECT_EQ("R_LARCH_RELATIVE", 61 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELATIVE)); 62 EXPECT_EQ("R_LARCH_COPY", 63 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_COPY)); 64 EXPECT_EQ("R_LARCH_JUMP_SLOT", 65 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_JUMP_SLOT)); 66 EXPECT_EQ("R_LARCH_TLS_DTPMOD32", 67 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD32)); 68 EXPECT_EQ("R_LARCH_TLS_DTPMOD64", 69 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD64)); 70 EXPECT_EQ("R_LARCH_TLS_DTPREL32", 71 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL32)); 72 EXPECT_EQ("R_LARCH_TLS_DTPREL64", 73 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL64)); 74 EXPECT_EQ("R_LARCH_TLS_TPREL32", 75 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL32)); 76 EXPECT_EQ("R_LARCH_TLS_TPREL64", 77 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL64)); 78 EXPECT_EQ("R_LARCH_IRELATIVE", 79 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_IRELATIVE)); 80 81 EXPECT_EQ("R_LARCH_MARK_LA", 82 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_LA)); 83 EXPECT_EQ("R_LARCH_MARK_PCREL", 84 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_PCREL)); 85 EXPECT_EQ("R_LARCH_SOP_PUSH_PCREL", 86 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PCREL)); 87 EXPECT_EQ("R_LARCH_SOP_PUSH_ABSOLUTE", 88 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_ABSOLUTE)); 89 EXPECT_EQ("R_LARCH_SOP_PUSH_DUP", 90 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_DUP)); 91 EXPECT_EQ("R_LARCH_SOP_PUSH_GPREL", 92 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_GPREL)); 93 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_TPREL", 94 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_TPREL)); 95 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GOT", 96 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GOT)); 97 EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GD", 98 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GD)); 99 EXPECT_EQ("R_LARCH_SOP_PUSH_PLT_PCREL", 100 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PLT_PCREL)); 101 EXPECT_EQ("R_LARCH_SOP_ASSERT", 102 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ASSERT)); 103 EXPECT_EQ("R_LARCH_SOP_NOT", 104 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_NOT)); 105 EXPECT_EQ("R_LARCH_SOP_SUB", 106 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SUB)); 107 EXPECT_EQ("R_LARCH_SOP_SL", 108 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SL)); 109 EXPECT_EQ("R_LARCH_SOP_SR", 110 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SR)); 111 EXPECT_EQ("R_LARCH_SOP_ADD", 112 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ADD)); 113 EXPECT_EQ("R_LARCH_SOP_AND", 114 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_AND)); 115 EXPECT_EQ("R_LARCH_SOP_IF_ELSE", 116 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_IF_ELSE)); 117 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_5", 118 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_5)); 119 EXPECT_EQ("R_LARCH_SOP_POP_32_U_10_12", 120 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U_10_12)); 121 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_12", 122 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_12)); 123 EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_16", 124 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16)); 125 EXPECT_EQ( 126 "R_LARCH_SOP_POP_32_S_10_16_S2", 127 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16_S2)); 128 EXPECT_EQ("R_LARCH_SOP_POP_32_S_5_20", 129 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_5_20)); 130 EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_5_10_16_S2", 131 getELFRelocationTypeName(EM_LOONGARCH, 132 R_LARCH_SOP_POP_32_S_0_5_10_16_S2)); 133 EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_10_10_16_S2", 134 getELFRelocationTypeName(EM_LOONGARCH, 135 R_LARCH_SOP_POP_32_S_0_10_10_16_S2)); 136 EXPECT_EQ("R_LARCH_SOP_POP_32_U", 137 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U)); 138 EXPECT_EQ("R_LARCH_ADD8", 139 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD8)); 140 EXPECT_EQ("R_LARCH_ADD16", 141 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD16)); 142 EXPECT_EQ("R_LARCH_ADD24", 143 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD24)); 144 EXPECT_EQ("R_LARCH_ADD32", 145 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD32)); 146 EXPECT_EQ("R_LARCH_ADD64", 147 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD64)); 148 EXPECT_EQ("R_LARCH_SUB8", 149 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB8)); 150 EXPECT_EQ("R_LARCH_SUB16", 151 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB16)); 152 EXPECT_EQ("R_LARCH_SUB24", 153 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB24)); 154 EXPECT_EQ("R_LARCH_SUB32", 155 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB32)); 156 EXPECT_EQ("R_LARCH_SUB64", 157 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB64)); 158 EXPECT_EQ("R_LARCH_GNU_VTINHERIT", 159 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTINHERIT)); 160 EXPECT_EQ("R_LARCH_GNU_VTENTRY", 161 getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTENTRY)); 162 } 163 164 TEST(ELFTest, getELFRelativeRelocationType) { 165 EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE)); 166 } 167 168 // This is a test for the DataRegion helper struct, defined in ELF.h header. 169 TEST(ELFTest, DataRegionTest) { 170 std::vector<uint8_t> Data = {0, 1, 2}; 171 172 // Used to check that the operator[] works properly. 173 auto CheckOperator = [&](DataRegion<uint8_t> &R) { 174 for (size_t I = 0, E = Data.size(); I != E; ++I) { 175 Expected<uint8_t> ValOrErr = R[I]; 176 ASSERT_THAT_EXPECTED(ValOrErr, Succeeded()); 177 EXPECT_EQ(*ValOrErr, I); 178 } 179 }; 180 181 // Check we can use the constructor that takes an ArrayRef<T>. 182 DataRegion<uint8_t> Region(Data); 183 184 CheckOperator(Region); 185 const char *ErrMsg1 = 186 "the index is greater than or equal to the number of entries (3)"; 187 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg1)); 188 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg1)); 189 190 // Check we can use the constructor that takes the data begin and the 191 // data end pointers. 192 Region = {Data.data(), Data.data() + Data.size()}; 193 194 CheckOperator(Region); 195 const char *ErrMsg2 = "can't read past the end of the file"; 196 EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg2)); 197 EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg2)); 198 } 199