Index: llvm/include/llvm/BinaryFormat/ELF.h =================================================================== --- llvm/include/llvm/BinaryFormat/ELF.h +++ llvm/include/llvm/BinaryFormat/ELF.h @@ -312,6 +312,7 @@ 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 @@ #include "ELFRelocs/VE.def" }; + +// ELF Relocation types for CSKY +enum { +#include "ELFRelocs/CSKY.def" +}; + #undef ELF_RELOC // Section header. Index: llvm/include/llvm/BinaryFormat/ELFRelocs/CSKY.def =================================================================== --- /dev/null +++ llvm/include/llvm/BinaryFormat/ELFRelocs/CSKY.def @@ -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) Index: llvm/include/llvm/Object/ELFObjectFile.h =================================================================== --- llvm/include/llvm/Object/ELFObjectFile.h +++ llvm/include/llvm/Object/ELFObjectFile.h @@ -1112,6 +1112,8 @@ return "elf32-powerpc"; case ELF::EM_RISCV: return "elf32-littleriscv"; + case ELF::EM_CSKY: + return "elf32-littlecsky"; case ELF::EM_SPARC: case ELF::EM_SPARC32PLUS: return "elf32-sparc"; @@ -1224,6 +1226,8 @@ case ELF::EM_VE: return Triple::ve; + case ELF::EM_CSKY: + return Triple::csky; default: return Triple::UnknownArch; } Index: llvm/lib/Object/ELF.cpp =================================================================== --- llvm/lib/Object/ELF.cpp +++ llvm/lib/Object/ELF.cpp @@ -152,6 +152,13 @@ break; } break; + case ELF::EM_CSKY: + switch (Type) { +#include "llvm/BinaryFormat/ELFRelocs/CSKY.def" + default: + break; + } + break; default: break; } @@ -194,6 +201,8 @@ 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: Index: llvm/lib/ObjectYAML/ELFYAML.cpp =================================================================== --- llvm/lib/ObjectYAML/ELFYAML.cpp +++ llvm/lib/ObjectYAML/ELFYAML.cpp @@ -222,6 +222,7 @@ ECase(EM_LANAI); ECase(EM_BPF); ECase(EM_VE); + ECase(EM_CSKY); #undef ECase IO.enumFallback(Value); } @@ -666,6 +667,9 @@ 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; Index: llvm/test/Object/CSKY/elf-flags.yaml =================================================================== --- /dev/null +++ llvm/test/Object/CSKY/elf-flags.yaml @@ -0,0 +1,20 @@ +# RUN: yaml2obj %s -o %t +# RUN: llvm-readobj --file-headers %t | FileCheck -check-prefix=OBJ %s +# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s + +# OBJ: Flags [ (0x0) +# OBJ-NEXT: ] + +# YAML: FileHeader: +# YAML-NEXT: Class: ELFCLASS32 +# YAML-NEXT: Data: ELFDATA2LSB +# YAML-NEXT: Type: ET_EXEC +# YAML-NEXT: Machine: EM_CSKY + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_CSKY + Flags: [ ] Index: llvm/test/Object/CSKY/lit.local.cfg =================================================================== --- /dev/null +++ llvm/test/Object/CSKY/lit.local.cfg @@ -0,0 +1,2 @@ +if not 'CSKY' in config.root.targets: + config.unsupported = True