1*5921782fSKazushi (Jam) Marukawa //===- ELFYAMLTest.cpp - Tests for ELFYAML.cpp ----------------------------===//
2*5921782fSKazushi (Jam) Marukawa //
3*5921782fSKazushi (Jam) Marukawa // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*5921782fSKazushi (Jam) Marukawa // See https://llvm.org/LICENSE.txt for license information.
5*5921782fSKazushi (Jam) Marukawa // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*5921782fSKazushi (Jam) Marukawa //
7*5921782fSKazushi (Jam) Marukawa //===----------------------------------------------------------------------===//
8*5921782fSKazushi (Jam) Marukawa
9*5921782fSKazushi (Jam) Marukawa #include "llvm/Object/ELF.h"
10*5921782fSKazushi (Jam) Marukawa #include "llvm/Object/ELFObjectFile.h"
11*5921782fSKazushi (Jam) Marukawa #include "llvm/Object/ELFTypes.h"
12*5921782fSKazushi (Jam) Marukawa #include "llvm/ObjectYAML/yaml2obj.h"
13*5921782fSKazushi (Jam) Marukawa #include "llvm/Support/YAMLTraits.h"
14*5921782fSKazushi (Jam) Marukawa #include "llvm/Testing/Support/Error.h"
15*5921782fSKazushi (Jam) Marukawa #include "gtest/gtest.h"
16*5921782fSKazushi (Jam) Marukawa
17*5921782fSKazushi (Jam) Marukawa using namespace llvm;
18*5921782fSKazushi (Jam) Marukawa using namespace llvm::object;
19*5921782fSKazushi (Jam) Marukawa
20*5921782fSKazushi (Jam) Marukawa template <class ELFT>
toBinary(SmallVectorImpl<char> & Storage,StringRef Yaml)21*5921782fSKazushi (Jam) Marukawa static Expected<ELFObjectFile<ELFT>> toBinary(SmallVectorImpl<char> &Storage,
22*5921782fSKazushi (Jam) Marukawa StringRef Yaml) {
23*5921782fSKazushi (Jam) Marukawa Storage.clear();
24*5921782fSKazushi (Jam) Marukawa raw_svector_ostream OS(Storage);
25*5921782fSKazushi (Jam) Marukawa yaml::Input YIn(Yaml);
26*5921782fSKazushi (Jam) Marukawa if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {}))
27*5921782fSKazushi (Jam) Marukawa return createStringError(std::errc::invalid_argument,
28*5921782fSKazushi (Jam) Marukawa "unable to convert YAML");
29*5921782fSKazushi (Jam) Marukawa
30*5921782fSKazushi (Jam) Marukawa return ELFObjectFile<ELFT>::create(MemoryBufferRef(OS.str(), "Binary"));
31*5921782fSKazushi (Jam) Marukawa }
32*5921782fSKazushi (Jam) Marukawa
TEST(ELFRelocationTypeTest,RelocationTestForVE)33*5921782fSKazushi (Jam) Marukawa TEST(ELFRelocationTypeTest, RelocationTestForVE) {
34*5921782fSKazushi (Jam) Marukawa SmallString<0> Storage;
35*5921782fSKazushi (Jam) Marukawa Expected<ELFObjectFile<ELF64LE>> ExpectedFile = toBinary<ELF64LE>(Storage, R"(
36*5921782fSKazushi (Jam) Marukawa --- !ELF
37*5921782fSKazushi (Jam) Marukawa FileHeader:
38*5921782fSKazushi (Jam) Marukawa Class: ELFCLASS64
39*5921782fSKazushi (Jam) Marukawa Data: ELFDATA2LSB
40*5921782fSKazushi (Jam) Marukawa Type: ET_REL
41*5921782fSKazushi (Jam) Marukawa Machine: EM_VE
42*5921782fSKazushi (Jam) Marukawa Sections:
43*5921782fSKazushi (Jam) Marukawa - Name: .rela.text
44*5921782fSKazushi (Jam) Marukawa Type: SHT_RELA
45*5921782fSKazushi (Jam) Marukawa Relocations:
46*5921782fSKazushi (Jam) Marukawa - Type: R_VE_NONE
47*5921782fSKazushi (Jam) Marukawa - Type: R_VE_REFLONG
48*5921782fSKazushi (Jam) Marukawa - Type: R_VE_REFQUAD
49*5921782fSKazushi (Jam) Marukawa - Type: R_VE_SREL32
50*5921782fSKazushi (Jam) Marukawa - Type: R_VE_HI32
51*5921782fSKazushi (Jam) Marukawa - Type: R_VE_LO32
52*5921782fSKazushi (Jam) Marukawa - Type: R_VE_PC_HI32
53*5921782fSKazushi (Jam) Marukawa - Type: R_VE_PC_LO32
54*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOT32
55*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOT_HI32
56*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOT_LO32
57*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOTOFF32
58*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOTOFF_HI32
59*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GOTOFF_LO32
60*5921782fSKazushi (Jam) Marukawa - Type: R_VE_PLT32
61*5921782fSKazushi (Jam) Marukawa - Type: R_VE_PLT_HI32
62*5921782fSKazushi (Jam) Marukawa - Type: R_VE_PLT_LO32
63*5921782fSKazushi (Jam) Marukawa - Type: R_VE_RELATIVE
64*5921782fSKazushi (Jam) Marukawa - Type: R_VE_GLOB_DAT
65*5921782fSKazushi (Jam) Marukawa - Type: R_VE_JUMP_SLOT
66*5921782fSKazushi (Jam) Marukawa - Type: R_VE_COPY
67*5921782fSKazushi (Jam) Marukawa - Type: R_VE_DTPMOD64
68*5921782fSKazushi (Jam) Marukawa - Type: R_VE_DTPOFF64
69*5921782fSKazushi (Jam) Marukawa - Type: R_VE_TLS_GD_HI32
70*5921782fSKazushi (Jam) Marukawa - Type: R_VE_TLS_GD_LO32
71*5921782fSKazushi (Jam) Marukawa - Type: R_VE_TPOFF_HI32
72*5921782fSKazushi (Jam) Marukawa - Type: R_VE_TPOFF_LO32
73*5921782fSKazushi (Jam) Marukawa - Type: R_VE_CALL_HI32
74*5921782fSKazushi (Jam) Marukawa - Type: R_VE_CALL_LO32)");
75*5921782fSKazushi (Jam) Marukawa ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
76*5921782fSKazushi (Jam) Marukawa const ELFObjectFile<ELF64LE> &File = *ExpectedFile;
77*5921782fSKazushi (Jam) Marukawa EXPECT_EQ("elf64-ve", File.getFileFormatName());
78*5921782fSKazushi (Jam) Marukawa EXPECT_EQ(Triple::ve, File.getArch());
79*5921782fSKazushi (Jam) Marukawa
80*5921782fSKazushi (Jam) Marukawa // Test relocation types.
81*5921782fSKazushi (Jam) Marukawa for (SectionRef Sec : File.sections()) {
82*5921782fSKazushi (Jam) Marukawa Expected<StringRef> NameOrErr = Sec.getName();
83*5921782fSKazushi (Jam) Marukawa ASSERT_THAT_EXPECTED(NameOrErr, Succeeded());
84*5921782fSKazushi (Jam) Marukawa StringRef SectionName = *NameOrErr;
85*5921782fSKazushi (Jam) Marukawa if (SectionName != ".rela.text")
86*5921782fSKazushi (Jam) Marukawa continue;
87*5921782fSKazushi (Jam) Marukawa
88*5921782fSKazushi (Jam) Marukawa for (RelocationRef R : Sec.relocations()) {
89*5921782fSKazushi (Jam) Marukawa SmallString<32> RelTypeName;
90*5921782fSKazushi (Jam) Marukawa using namespace llvm::ELF;
91*5921782fSKazushi (Jam) Marukawa
92*5921782fSKazushi (Jam) Marukawa #define NAME_CHECK(ID) \
93*5921782fSKazushi (Jam) Marukawa case ID: \
94*5921782fSKazushi (Jam) Marukawa R.getTypeName(RelTypeName); \
95*5921782fSKazushi (Jam) Marukawa EXPECT_EQ(#ID, RelTypeName); \
96*5921782fSKazushi (Jam) Marukawa break
97*5921782fSKazushi (Jam) Marukawa
98*5921782fSKazushi (Jam) Marukawa switch (R.getType()) {
99*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_NONE);
100*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_REFLONG);
101*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_REFQUAD);
102*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_SREL32);
103*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_HI32);
104*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_LO32);
105*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_PC_HI32);
106*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_PC_LO32);
107*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOT32);
108*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOT_HI32);
109*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOT_LO32);
110*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOTOFF32);
111*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOTOFF_HI32);
112*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GOTOFF_LO32);
113*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_PLT32);
114*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_PLT_HI32);
115*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_PLT_LO32);
116*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_RELATIVE);
117*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_GLOB_DAT);
118*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_JUMP_SLOT);
119*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_COPY);
120*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_DTPMOD64);
121*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_DTPOFF64);
122*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_TLS_GD_HI32);
123*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_TLS_GD_LO32);
124*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_TPOFF_HI32);
125*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_TPOFF_LO32);
126*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_CALL_HI32);
127*5921782fSKazushi (Jam) Marukawa NAME_CHECK(R_VE_CALL_LO32);
128*5921782fSKazushi (Jam) Marukawa default:
129*5921782fSKazushi (Jam) Marukawa FAIL() << "Found unexpected relocation type: " + Twine(R.getType());
130*5921782fSKazushi (Jam) Marukawa break;
131*5921782fSKazushi (Jam) Marukawa }
132*5921782fSKazushi (Jam) Marukawa }
133*5921782fSKazushi (Jam) Marukawa }
134*5921782fSKazushi (Jam) Marukawa }
135