forked from OSchip/llvm-project
135 lines
4.3 KiB
C++
135 lines
4.3 KiB
C++
|
//===- ELFYAMLTest.cpp - Tests for ELFYAML.cpp ----------------------------===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#include "llvm/Object/ELF.h"
|
||
|
#include "llvm/Object/ELFObjectFile.h"
|
||
|
#include "llvm/Object/ELFTypes.h"
|
||
|
#include "llvm/ObjectYAML/yaml2obj.h"
|
||
|
#include "llvm/Support/YAMLTraits.h"
|
||
|
#include "llvm/Testing/Support/Error.h"
|
||
|
#include "gtest/gtest.h"
|
||
|
|
||
|
using namespace llvm;
|
||
|
using namespace llvm::object;
|
||
|
|
||
|
template <class ELFT>
|
||
|
static Expected<ELFObjectFile<ELFT>> toBinary(SmallVectorImpl<char> &Storage,
|
||
|
StringRef Yaml) {
|
||
|
Storage.clear();
|
||
|
raw_svector_ostream OS(Storage);
|
||
|
yaml::Input YIn(Yaml);
|
||
|
if (!yaml::convertYAML(YIn, OS, [](const Twine &Msg) {}))
|
||
|
return createStringError(std::errc::invalid_argument,
|
||
|
"unable to convert YAML");
|
||
|
|
||
|
return ELFObjectFile<ELFT>::create(MemoryBufferRef(OS.str(), "Binary"));
|
||
|
}
|
||
|
|
||
|
TEST(ELFRelocationTypeTest, RelocationTestForVE) {
|
||
|
SmallString<0> Storage;
|
||
|
Expected<ELFObjectFile<ELF64LE>> ExpectedFile = toBinary<ELF64LE>(Storage, R"(
|
||
|
--- !ELF
|
||
|
FileHeader:
|
||
|
Class: ELFCLASS64
|
||
|
Data: ELFDATA2LSB
|
||
|
Type: ET_REL
|
||
|
Machine: EM_VE
|
||
|
Sections:
|
||
|
- Name: .rela.text
|
||
|
Type: SHT_RELA
|
||
|
Relocations:
|
||
|
- Type: R_VE_NONE
|
||
|
- Type: R_VE_REFLONG
|
||
|
- Type: R_VE_REFQUAD
|
||
|
- Type: R_VE_SREL32
|
||
|
- Type: R_VE_HI32
|
||
|
- Type: R_VE_LO32
|
||
|
- Type: R_VE_PC_HI32
|
||
|
- Type: R_VE_PC_LO32
|
||
|
- Type: R_VE_GOT32
|
||
|
- Type: R_VE_GOT_HI32
|
||
|
- Type: R_VE_GOT_LO32
|
||
|
- Type: R_VE_GOTOFF32
|
||
|
- Type: R_VE_GOTOFF_HI32
|
||
|
- Type: R_VE_GOTOFF_LO32
|
||
|
- Type: R_VE_PLT32
|
||
|
- Type: R_VE_PLT_HI32
|
||
|
- Type: R_VE_PLT_LO32
|
||
|
- Type: R_VE_RELATIVE
|
||
|
- Type: R_VE_GLOB_DAT
|
||
|
- Type: R_VE_JUMP_SLOT
|
||
|
- Type: R_VE_COPY
|
||
|
- Type: R_VE_DTPMOD64
|
||
|
- Type: R_VE_DTPOFF64
|
||
|
- Type: R_VE_TLS_GD_HI32
|
||
|
- Type: R_VE_TLS_GD_LO32
|
||
|
- Type: R_VE_TPOFF_HI32
|
||
|
- Type: R_VE_TPOFF_LO32
|
||
|
- Type: R_VE_CALL_HI32
|
||
|
- Type: R_VE_CALL_LO32)");
|
||
|
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
|
||
|
const ELFObjectFile<ELF64LE> &File = *ExpectedFile;
|
||
|
EXPECT_EQ("elf64-ve", File.getFileFormatName());
|
||
|
EXPECT_EQ(Triple::ve, File.getArch());
|
||
|
|
||
|
// Test relocation types.
|
||
|
for (SectionRef Sec : File.sections()) {
|
||
|
Expected<StringRef> NameOrErr = Sec.getName();
|
||
|
ASSERT_THAT_EXPECTED(NameOrErr, Succeeded());
|
||
|
StringRef SectionName = *NameOrErr;
|
||
|
if (SectionName != ".rela.text")
|
||
|
continue;
|
||
|
|
||
|
for (RelocationRef R : Sec.relocations()) {
|
||
|
SmallString<32> RelTypeName;
|
||
|
using namespace llvm::ELF;
|
||
|
|
||
|
#define NAME_CHECK(ID) \
|
||
|
case ID: \
|
||
|
R.getTypeName(RelTypeName); \
|
||
|
EXPECT_EQ(#ID, RelTypeName); \
|
||
|
break
|
||
|
|
||
|
switch (R.getType()) {
|
||
|
NAME_CHECK(R_VE_NONE);
|
||
|
NAME_CHECK(R_VE_REFLONG);
|
||
|
NAME_CHECK(R_VE_REFQUAD);
|
||
|
NAME_CHECK(R_VE_SREL32);
|
||
|
NAME_CHECK(R_VE_HI32);
|
||
|
NAME_CHECK(R_VE_LO32);
|
||
|
NAME_CHECK(R_VE_PC_HI32);
|
||
|
NAME_CHECK(R_VE_PC_LO32);
|
||
|
NAME_CHECK(R_VE_GOT32);
|
||
|
NAME_CHECK(R_VE_GOT_HI32);
|
||
|
NAME_CHECK(R_VE_GOT_LO32);
|
||
|
NAME_CHECK(R_VE_GOTOFF32);
|
||
|
NAME_CHECK(R_VE_GOTOFF_HI32);
|
||
|
NAME_CHECK(R_VE_GOTOFF_LO32);
|
||
|
NAME_CHECK(R_VE_PLT32);
|
||
|
NAME_CHECK(R_VE_PLT_HI32);
|
||
|
NAME_CHECK(R_VE_PLT_LO32);
|
||
|
NAME_CHECK(R_VE_RELATIVE);
|
||
|
NAME_CHECK(R_VE_GLOB_DAT);
|
||
|
NAME_CHECK(R_VE_JUMP_SLOT);
|
||
|
NAME_CHECK(R_VE_COPY);
|
||
|
NAME_CHECK(R_VE_DTPMOD64);
|
||
|
NAME_CHECK(R_VE_DTPOFF64);
|
||
|
NAME_CHECK(R_VE_TLS_GD_HI32);
|
||
|
NAME_CHECK(R_VE_TLS_GD_LO32);
|
||
|
NAME_CHECK(R_VE_TPOFF_HI32);
|
||
|
NAME_CHECK(R_VE_TPOFF_LO32);
|
||
|
NAME_CHECK(R_VE_CALL_HI32);
|
||
|
NAME_CHECK(R_VE_CALL_LO32);
|
||
|
default:
|
||
|
FAIL() << "Found unexpected relocation type: " + Twine(R.getType());
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|