[ELF] Add a new e_machine value EM_CSKY and add some CSKY relocation types

This is the split part of D86269, which add a new ELF machine flag called EM_CSKY and related relocations.
Some target-specific flags and tests for csky can be added in follow-up patches later.

Differential Revision: https://reviews.llvm.org/D86610
This commit is contained in:
Zi Xuan Wu 2020-09-02 17:02:17 +08:00
parent d5c45041f1
commit 69f2c79f2a
6 changed files with 113 additions and 0 deletions

View File

@ -312,6 +312,7 @@ enum {
EM_LANAI = 244, // Lanai 32-bit processor
EM_BPF = 247, // Linux kernel bpf virtual machine
EM_VE = 251, // NEC SX-Aurora VE
EM_CSKY = 252, // C-SKY 32-bit processor
};
// Object file classes.
@ -772,6 +773,12 @@ enum {
#include "ELFRelocs/VE.def"
};
// ELF Relocation types for CSKY
enum {
#include "ELFRelocs/CSKY.def"
};
#undef ELF_RELOC
// Section header.

View File

@ -0,0 +1,74 @@
#ifndef ELF_RELOC
#error "ELF_RELOC must be defined"
#endif
ELF_RELOC(R_CKCORE_NONE, 0)
ELF_RELOC(R_CKCORE_ADDR32, 1)
ELF_RELOC(R_CKCORE_PCREL_IMM8_4, 2)
ELF_RELOC(R_CKCORE_PCREL_IMM11_2, 3)
ELF_RELOC(R_CKCORE_PCREL_IMM4_2, 4)
ELF_RELOC(R_CKCORE_PCREL32, 5)
ELF_RELOC(R_CKCORE_PCREL_JSR_IMM11_2, 6)
ELF_RELOC(R_CKCORE_GNU_VTINHERIT, 7)
ELF_RELOC(R_CKCORE_GNU_VTENTRY, 8)
ELF_RELOC(R_CKCORE_RELATIVE, 9)
ELF_RELOC(R_CKCORE_COPY, 10)
ELF_RELOC(R_CKCORE_GLOB_DAT, 11)
ELF_RELOC(R_CKCORE_JUMP_SLOT, 12)
ELF_RELOC(R_CKCORE_GOTOFF, 13)
ELF_RELOC(R_CKCORE_GOTPC, 14)
ELF_RELOC(R_CKCORE_GOT32, 15)
ELF_RELOC(R_CKCORE_PLT32, 16)
ELF_RELOC(R_CKCORE_ADDRGOT, 17)
ELF_RELOC(R_CKCORE_ADDRPLT, 18)
ELF_RELOC(R_CKCORE_PCREL_IMM26_2, 19)
ELF_RELOC(R_CKCORE_PCREL_IMM16_2, 20)
ELF_RELOC(R_CKCORE_PCREL_IMM16_4, 21)
ELF_RELOC(R_CKCORE_PCREL_IMM10_2, 22)
ELF_RELOC(R_CKCORE_PCREL_IMM10_4, 23)
ELF_RELOC(R_CKCORE_ADDR_HI16, 24)
ELF_RELOC(R_CKCORE_ADDR_LO16, 25)
ELF_RELOC(R_CKCORE_GOTPC_HI16, 26)
ELF_RELOC(R_CKCORE_GOTPC_LO16, 27)
ELF_RELOC(R_CKCORE_GOTOFF_HI16, 28)
ELF_RELOC(R_CKCORE_GOTOFF_LO16, 29)
ELF_RELOC(R_CKCORE_GOT12, 30)
ELF_RELOC(R_CKCORE_GOT_HI16, 31)
ELF_RELOC(R_CKCORE_GOT_LO16, 32)
ELF_RELOC(R_CKCORE_PLT12, 33)
ELF_RELOC(R_CKCORE_PLT_HI16, 34)
ELF_RELOC(R_CKCORE_PLT_LO16, 35)
ELF_RELOC(R_CKCORE_ADDRGOT_HI16, 36)
ELF_RELOC(R_CKCORE_ADDRGOT_LO16, 37)
ELF_RELOC(R_CKCORE_ADDRPLT_HI16, 38)
ELF_RELOC(R_CKCORE_ADDRPLT_LO16, 39)
ELF_RELOC(R_CKCORE_PCREL_JSR_IMM26_2, 40)
ELF_RELOC(R_CKCORE_TOFFSET_LO16, 41)
ELF_RELOC(R_CKCORE_DOFFSET_LO16, 42)
ELF_RELOC(R_CKCORE_PCREL_IMM18_2, 43)
ELF_RELOC(R_CKCORE_DOFFSET_IMM18, 44)
ELF_RELOC(R_CKCORE_DOFFSET_IMM18_2, 45)
ELF_RELOC(R_CKCORE_DOFFSET_IMM18_4, 46)
ELF_RELOC(R_CKCORE_GOTOFF_IMM18, 47)
ELF_RELOC(R_CKCORE_GOT_IMM18_4, 48)
ELF_RELOC(R_CKCORE_PLT_IMM18_4, 49)
ELF_RELOC(R_CKCORE_PCREL_IMM7_4, 50)
ELF_RELOC(R_CKCORE_TLS_LE32, 51)
ELF_RELOC(R_CKCORE_TLS_IE32, 52)
ELF_RELOC(R_CKCORE_TLS_GD32, 53)
ELF_RELOC(R_CKCORE_TLS_LDM32, 54)
ELF_RELOC(R_CKCORE_TLS_LDO32, 55)
ELF_RELOC(R_CKCORE_TLS_DTPMOD32, 56)
ELF_RELOC(R_CKCORE_TLS_DTPOFF32, 57)
ELF_RELOC(R_CKCORE_TLS_TPOFF32, 58)
ELF_RELOC(R_CKCORE_PCREL_FLRW_IMM8_4, 59)
ELF_RELOC(R_CKCORE_NOJSRI, 60)
ELF_RELOC(R_CKCORE_CALLGRAPH, 61)
ELF_RELOC(R_CKCORE_IRELATIVE, 62)
ELF_RELOC(R_CKCORE_PCREL_BLOOP_IMM4_4, 63)
ELF_RELOC(R_CKCORE_PCREL_BLOOP_IMM12_4, 64)
ELF_RELOC(R_CKCORE_PCREL_VLRW_IMM12_1, 65)
ELF_RELOC(R_CKCORE_PCREL_VLRW_IMM12_2, 66)
ELF_RELOC(R_CKCORE_PCREL_VLRW_IMM12_4, 67)
ELF_RELOC(R_CKCORE_PCREL_VLRW_IMM12_8, 68)

View File

@ -1112,6 +1112,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() const {
return "elf32-powerpc";
case ELF::EM_RISCV:
return "elf32-littleriscv";
case ELF::EM_CSKY:
return "elf32-csky";
case ELF::EM_SPARC:
case ELF::EM_SPARC32PLUS:
return "elf32-sparc";
@ -1224,6 +1226,8 @@ template <class ELFT> Triple::ArchType ELFObjectFile<ELFT>::getArch() const {
case ELF::EM_VE:
return Triple::ve;
case ELF::EM_CSKY:
return Triple::csky;
default:
return Triple::UnknownArch;
}

View File

@ -152,6 +152,13 @@ StringRef llvm::object::getELFRelocationTypeName(uint32_t Machine,
break;
}
break;
case ELF::EM_CSKY:
switch (Type) {
#include "llvm/BinaryFormat/ELFRelocs/CSKY.def"
default:
break;
}
break;
default:
break;
}
@ -194,6 +201,8 @@ uint32_t llvm::object::getELFRelativeRelocationType(uint32_t Machine) {
case ELF::EM_SPARC32PLUS:
case ELF::EM_SPARCV9:
return ELF::R_SPARC_RELATIVE;
case ELF::EM_CSKY:
return ELF::R_CKCORE_RELATIVE;
case ELF::EM_AMDGPU:
break;
case ELF::EM_BPF:

View File

@ -230,6 +230,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(
ECase(EM_LANAI);
ECase(EM_BPF);
ECase(EM_VE);
ECase(EM_CSKY);
#undef ECase
IO.enumFallback<Hex16>(Value);
}
@ -674,6 +675,9 @@ void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration(
case ELF::EM_VE:
#include "llvm/BinaryFormat/ELFRelocs/VE.def"
break;
case ELF::EM_CSKY:
#include "llvm/BinaryFormat/ELFRelocs/CSKY.def"
break;
case ELF::EM_PPC64:
#include "llvm/BinaryFormat/ELFRelocs/PowerPC64.def"
break;

View File

@ -282,3 +282,18 @@ TEST(ELFObjectFileTest, MachineTestForMSP430) {
for (const DataForTest &D : generateData(ELF::EM_MSP430))
checkFormatAndArch(D, Formats[I++], Triple::msp430);
}
TEST(ELFObjectFileTest, MachineTestForCSKY) {
std::array<StringRef, 4> Formats = {"elf32-csky", "elf32-csky",
"elf64-unknown", "elf64-unknown"};
size_t I = 0;
for (const DataForTest &D : generateData(ELF::EM_CSKY))
checkFormatAndArch(D, Formats[I++], Triple::csky);
}
// ELF relative relocation type test.
TEST(ELFObjectFileTest, RelativeRelocationTypeTest) {
EXPECT_EQ(ELF::R_CKCORE_RELATIVE, getELFRelativeRelocationType(ELF::EM_CSKY));
}