xref: /llvm-project/llvm/unittests/Object/ELFTest.cpp (revision c3a9c905fbc486add75e16218fe58a04b7b6c282)
15921782fSKazushi (Jam) Marukawa //===- ELFTest.cpp - Tests for ELF.cpp ------------------------------------===//
25921782fSKazushi (Jam) Marukawa //
35921782fSKazushi (Jam) Marukawa // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45921782fSKazushi (Jam) Marukawa // See https://llvm.org/LICENSE.txt for license information.
55921782fSKazushi (Jam) Marukawa // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65921782fSKazushi (Jam) Marukawa //
75921782fSKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
85921782fSKazushi (Jam) Marukawa 
95921782fSKazushi (Jam) Marukawa #include "llvm/Object/ELF.h"
10141906faSGeorgii Rymar #include "llvm/Testing/Support/Error.h"
115921782fSKazushi (Jam) Marukawa #include "gtest/gtest.h"
125921782fSKazushi (Jam) Marukawa 
135921782fSKazushi (Jam) Marukawa using namespace llvm;
145921782fSKazushi (Jam) Marukawa using namespace llvm::object;
155921782fSKazushi (Jam) Marukawa using namespace llvm::ELF;
165921782fSKazushi (Jam) Marukawa 
TEST(ELFTest,getELFRelocationTypeNameForVE)175921782fSKazushi (Jam) Marukawa TEST(ELFTest, getELFRelocationTypeNameForVE) {
185921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_NONE", getELFRelocationTypeName(EM_VE, R_VE_NONE));
195921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_REFLONG", getELFRelocationTypeName(EM_VE, R_VE_REFLONG));
205921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_REFQUAD", getELFRelocationTypeName(EM_VE, R_VE_REFQUAD));
215921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_SREL32", getELFRelocationTypeName(EM_VE, R_VE_SREL32));
225921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_HI32", getELFRelocationTypeName(EM_VE, R_VE_HI32));
235921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_LO32", getELFRelocationTypeName(EM_VE, R_VE_LO32));
245921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_PC_HI32", getELFRelocationTypeName(EM_VE, R_VE_PC_HI32));
255921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_PC_LO32", getELFRelocationTypeName(EM_VE, R_VE_PC_LO32));
265921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOT32", getELFRelocationTypeName(EM_VE, R_VE_GOT32));
275921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOT_HI32", getELFRelocationTypeName(EM_VE, R_VE_GOT_HI32));
285921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOT_LO32", getELFRelocationTypeName(EM_VE, R_VE_GOT_LO32));
295921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOTOFF32", getELFRelocationTypeName(EM_VE, R_VE_GOTOFF32));
305921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOTOFF_HI32",
315921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_HI32));
325921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GOTOFF_LO32",
335921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_GOTOFF_LO32));
345921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_PLT32", getELFRelocationTypeName(EM_VE, R_VE_PLT32));
355921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_PLT_HI32", getELFRelocationTypeName(EM_VE, R_VE_PLT_HI32));
365921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_PLT_LO32", getELFRelocationTypeName(EM_VE, R_VE_PLT_LO32));
375921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_RELATIVE", getELFRelocationTypeName(EM_VE, R_VE_RELATIVE));
385921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_GLOB_DAT", getELFRelocationTypeName(EM_VE, R_VE_GLOB_DAT));
395921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_JUMP_SLOT", getELFRelocationTypeName(EM_VE, R_VE_JUMP_SLOT));
405921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_COPY", getELFRelocationTypeName(EM_VE, R_VE_COPY));
415921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_DTPMOD64", getELFRelocationTypeName(EM_VE, R_VE_DTPMOD64));
425921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_DTPOFF64", getELFRelocationTypeName(EM_VE, R_VE_DTPOFF64));
435921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_TLS_GD_HI32",
445921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_HI32));
455921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_TLS_GD_LO32",
465921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_TLS_GD_LO32));
475921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_TPOFF_HI32",
485921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_TPOFF_HI32));
495921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_TPOFF_LO32",
505921782fSKazushi (Jam) Marukawa             getELFRelocationTypeName(EM_VE, R_VE_TPOFF_LO32));
515921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_CALL_HI32", getELFRelocationTypeName(EM_VE, R_VE_CALL_HI32));
525921782fSKazushi (Jam) Marukawa   EXPECT_EQ("R_VE_CALL_LO32", getELFRelocationTypeName(EM_VE, R_VE_CALL_LO32));
535921782fSKazushi (Jam) Marukawa }
545921782fSKazushi (Jam) Marukawa 
TEST(ELFTest,getELFRelocationTypeNameForLoongArch)55e53e6ec6SLu Weining TEST(ELFTest, getELFRelocationTypeNameForLoongArch) {
56e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_NONE",
57e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_NONE));
58e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_32", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32));
59e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_64", getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64));
60e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_RELATIVE",
61e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELATIVE));
62e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_COPY",
63e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_COPY));
64e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_JUMP_SLOT",
65e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_JUMP_SLOT));
66e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_DTPMOD32",
67e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD32));
68e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_DTPMOD64",
69e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPMOD64));
70e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_DTPREL32",
71e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL32));
72e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_DTPREL64",
73e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_DTPREL64));
74e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_TPREL32",
75e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL32));
76e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_TLS_TPREL64",
77e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_TPREL64));
78e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_IRELATIVE",
79e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_IRELATIVE));
80e53e6ec6SLu Weining 
81e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_MARK_LA",
82e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_LA));
83e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_MARK_PCREL",
84e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_MARK_PCREL));
85e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_PCREL",
86e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PCREL));
87e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_ABSOLUTE",
88e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_ABSOLUTE));
89e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_DUP",
90e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_DUP));
91e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_GPREL",
92e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_GPREL));
93e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_TPREL",
94e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_TPREL));
95e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GOT",
96e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GOT));
97e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_TLS_GD",
98e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_TLS_GD));
99e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_PUSH_PLT_PCREL",
100e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_PUSH_PLT_PCREL));
101e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_ASSERT",
102e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ASSERT));
103e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_NOT",
104e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_NOT));
105e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_SUB",
106e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SUB));
107e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_SL",
108e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SL));
109e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_SR",
110e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_SR));
111e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_ADD",
112e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_ADD));
113e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_AND",
114e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_AND));
115e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_IF_ELSE",
116e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_IF_ELSE));
117e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_5",
118e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_5));
119e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_U_10_12",
120e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U_10_12));
121e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_12",
122e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_12));
123e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_10_16",
124e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16));
125e53e6ec6SLu Weining   EXPECT_EQ(
126e53e6ec6SLu Weining       "R_LARCH_SOP_POP_32_S_10_16_S2",
127e53e6ec6SLu Weining       getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_10_16_S2));
128e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_5_20",
129e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_S_5_20));
130e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_5_10_16_S2",
131e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH,
132e53e6ec6SLu Weining                                      R_LARCH_SOP_POP_32_S_0_5_10_16_S2));
133e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_S_0_10_10_16_S2",
134e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH,
135e53e6ec6SLu Weining                                      R_LARCH_SOP_POP_32_S_0_10_10_16_S2));
136e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SOP_POP_32_U",
137e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SOP_POP_32_U));
138e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_ADD8",
139e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD8));
140e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_ADD16",
141e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD16));
142e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_ADD24",
143e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD24));
144e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_ADD32",
145e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD32));
146e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_ADD64",
147e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD64));
148e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SUB8",
149e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB8));
150e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SUB16",
151e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB16));
152e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SUB24",
153e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB24));
154e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SUB32",
155e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB32));
156e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_SUB64",
157e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB64));
158e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_GNU_VTINHERIT",
159e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTINHERIT));
160e53e6ec6SLu Weining   EXPECT_EQ("R_LARCH_GNU_VTENTRY",
161e53e6ec6SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GNU_VTENTRY));
1620c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_B16",
1630c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B16));
1640c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_B21",
1650c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B21));
1660c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_B26",
1670c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_B26));
1680c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_ABS_HI20",
1690c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_HI20));
1700c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_ABS_LO12",
1710c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS_LO12));
1720c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_ABS64_LO20",
1730c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_LO20));
1740c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_ABS64_HI12",
1750c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ABS64_HI12));
1760c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_PCALA_HI20",
1770c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_HI20));
1780c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_PCALA_LO12",
1790c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA_LO12));
1800c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_PCALA64_LO20",
1810c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_LO20));
1820c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_PCALA64_HI12",
1830c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCALA64_HI12));
1840c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT_PC_HI20",
1850c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_HI20));
1860c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT_PC_LO12",
1870c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_PC_LO12));
1880c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT64_PC_LO20",
1890c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_LO20));
1900c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT64_PC_HI12",
1910c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_PC_HI12));
1920c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT_HI20",
1930c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_HI20));
1940c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT_LO12",
1950c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT_LO12));
1960c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT64_LO20",
1970c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_LO20));
1980c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_GOT64_HI12",
1990c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_GOT64_HI12));
2000c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LE_HI20",
2010c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_HI20));
2020c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LE_LO12",
2030c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE_LO12));
2040c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LE64_LO20",
2050c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_LO20));
2060c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LE64_HI12",
2070c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LE64_HI12));
2080c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE_PC_HI20",
2090c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_HI20));
2100c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE_PC_LO12",
2110c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_PC_LO12));
2120c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE64_PC_LO20",
2130c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_LO20));
2140c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE64_PC_HI12",
2150c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_PC_HI12));
2160c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE_HI20",
2170c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_HI20));
2180c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE_LO12",
2190c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE_LO12));
2200c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE64_LO20",
2210c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_LO20));
2220c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_IE64_HI12",
2230c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_IE64_HI12));
2240c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LD_PC_HI20",
2250c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_PC_HI20));
2260c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_LD_HI20",
2270c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_LD_HI20));
2280c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_GD_PC_HI20",
2290c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_PC_HI20));
2300c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_TLS_GD_HI20",
2310c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_TLS_GD_HI20));
2320c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_32_PCREL",
2330c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_32_PCREL));
2340c8bfbb3SWANG Xuerui   EXPECT_EQ("R_LARCH_RELAX",
2350c8bfbb3SWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_RELAX));
236bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_ALIGN",
237bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ALIGN));
238bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_PCREL20_S2",
239bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_PCREL20_S2));
240bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_ADD6",
241bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD6));
242bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_SUB6",
243bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB6));
244bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_ADD_ULEB128",
245bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_ADD_ULEB128));
246bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_SUB_ULEB128",
247bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_SUB_ULEB128));
248bb39a8aaSWANG Xuerui   EXPECT_EQ("R_LARCH_64_PCREL",
249bb39a8aaSWANG Xuerui             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_64_PCREL));
250*c3a9c905SLu Weining   EXPECT_EQ("R_LARCH_CALL36",
251*c3a9c905SLu Weining             getELFRelocationTypeName(EM_LOONGARCH, R_LARCH_CALL36));
252e53e6ec6SLu Weining }
253e53e6ec6SLu Weining 
TEST(ELFTest,getELFRelativeRelocationType)2545921782fSKazushi (Jam) Marukawa TEST(ELFTest, getELFRelativeRelocationType) {
255d1057f96SKazushi (Jam) Marukawa   EXPECT_EQ(ELF::R_VE_RELATIVE, getELFRelativeRelocationType(EM_VE));
25628b4838aSWANG Xuerui   EXPECT_EQ(ELF::R_LARCH_RELATIVE, getELFRelativeRelocationType(EM_LOONGARCH));
2575921782fSKazushi (Jam) Marukawa }
258141906faSGeorgii Rymar 
259141906faSGeorgii Rymar // This is a test for the DataRegion helper struct, defined in ELF.h header.
TEST(ELFTest,DataRegionTest)260141906faSGeorgii Rymar TEST(ELFTest, DataRegionTest) {
261141906faSGeorgii Rymar   std::vector<uint8_t> Data = {0, 1, 2};
262141906faSGeorgii Rymar 
263141906faSGeorgii Rymar   // Used to check that the operator[] works properly.
264141906faSGeorgii Rymar   auto CheckOperator = [&](DataRegion<uint8_t> &R) {
265141906faSGeorgii Rymar     for (size_t I = 0, E = Data.size(); I != E; ++I) {
266141906faSGeorgii Rymar       Expected<uint8_t> ValOrErr = R[I];
267141906faSGeorgii Rymar       ASSERT_THAT_EXPECTED(ValOrErr, Succeeded());
268141906faSGeorgii Rymar       EXPECT_EQ(*ValOrErr, I);
269141906faSGeorgii Rymar     }
270141906faSGeorgii Rymar   };
271141906faSGeorgii Rymar 
272141906faSGeorgii Rymar   // Check we can use the constructor that takes an ArrayRef<T>.
273141906faSGeorgii Rymar   DataRegion<uint8_t> Region(Data);
274141906faSGeorgii Rymar 
275141906faSGeorgii Rymar   CheckOperator(Region);
276141906faSGeorgii Rymar   const char *ErrMsg1 =
277141906faSGeorgii Rymar       "the index is greater than or equal to the number of entries (3)";
278141906faSGeorgii Rymar   EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg1));
279141906faSGeorgii Rymar   EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg1));
280141906faSGeorgii Rymar 
281141906faSGeorgii Rymar   // Check we can use the constructor that takes the data begin and the
282141906faSGeorgii Rymar   // data end pointers.
283141906faSGeorgii Rymar   Region = {Data.data(), Data.data() + Data.size()};
284141906faSGeorgii Rymar 
285141906faSGeorgii Rymar   CheckOperator(Region);
286141906faSGeorgii Rymar   const char *ErrMsg2 = "can't read past the end of the file";
287141906faSGeorgii Rymar   EXPECT_THAT_ERROR(Region[3].takeError(), FailedWithMessage(ErrMsg2));
288141906faSGeorgii Rymar   EXPECT_THAT_ERROR(Region[4].takeError(), FailedWithMessage(ErrMsg2));
289141906faSGeorgii Rymar }
2908bdbebbeSNathan Sidwell 
2918bdbebbeSNathan Sidwell // Test the sysV and the gnu hash functions, particularly with UTF-8 unicode.
2928bdbebbeSNathan Sidwell // Use names long enough for the hash's recycling of the high bits to kick in.
2938bdbebbeSNathan Sidwell // Explicitly encode the UTF-8 to avoid encoding transliterations.
TEST(ELFTest,Hash)2948bdbebbeSNathan Sidwell TEST(ELFTest, Hash) {
2958bdbebbeSNathan Sidwell   EXPECT_EQ(hashSysV("FooBarBazToto"), 0x5ec3e8fU);
2968bdbebbeSNathan Sidwell   EXPECT_EQ(hashGnu("FooBarBazToto"), 0x5478be61U);
2978bdbebbeSNathan Sidwell 
2988bdbebbeSNathan Sidwell   // boom��pants
2998bdbebbeSNathan Sidwell   EXPECT_EQ(hashSysV("boom\xf0\x9f\x92\xa5pants"), 0x5a0cf53U);
3008bdbebbeSNathan Sidwell   EXPECT_EQ(hashGnu("boom\xf0\x9f\x92\xa5pants"), 0xf5dda2deU);
3018bdbebbeSNathan Sidwell 
3028bdbebbeSNathan Sidwell   // woot!�� �� ��
3038bdbebbeSNathan Sidwell   EXPECT_EQ(hashSysV("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "
3048bdbebbeSNathan Sidwell                      "\xf0\x9f\x8c\x88"), 0x3522e38U);
3058bdbebbeSNathan Sidwell   EXPECT_EQ(hashGnu("woot!\xf0\x9f\xa7\x99 \xf0\x9f\x92\x91 "
3068bdbebbeSNathan Sidwell                     "\xf0\x9f\x8c\x88"), 0xf7603f3U);
3078bdbebbeSNathan Sidwell 
3088bdbebbeSNathan Sidwell   // This string hashes to 0x100000000 in the originally formulated function,
3098bdbebbeSNathan Sidwell   // when long is 64 bits -- but that was never the intent. The code was
3108bdbebbeSNathan Sidwell   // presuming 32-bit long. Thus make sure that extra bit doesn't appear.
3118bdbebbeSNathan Sidwell   EXPECT_EQ(hashSysV("ZZZZZW9p"), 0U);
3128bdbebbeSNathan Sidwell }
313