//===- 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;
}
}
}
}