Index: include/llvm/Object/ELFObjectFile.h =================================================================== --- include/llvm/Object/ELFObjectFile.h +++ include/llvm/Object/ELFObjectFile.h @@ -913,6 +913,8 @@ return "ELF32-lanai"; case ELF::EM_MIPS: return "ELF32-mips"; + case ELF::EM_NDS32: + return "ELF32-nds32"; case ELF::EM_PPC: return "ELF32-ppc"; case ELF::EM_RISCV: @@ -981,6 +983,8 @@ return Triple::hexagon; case ELF::EM_LANAI: return Triple::lanai; + case ELF::EM_NDS32: + return Triple::nds32; case ELF::EM_MIPS: switch (EF.getHeader()->e_ident[ELF::EI_CLASS]) { case ELF::ELFCLASS32: Index: include/llvm/Object/RelocVisitor.h =================================================================== --- include/llvm/Object/RelocVisitor.h +++ include/llvm/Object/RelocVisitor.h @@ -211,6 +211,14 @@ HasError = true; return RelocToApply(); } + case Triple::nds32: + switch (RelocType) { + case llvm::ELF::R_NDS32_32: + return visitELF_NDS32_32(R, Value); + default: + HasError = true; + return RelocToApply(); + } case Triple::sparc: switch (RelocType) { case llvm::ELF::R_SPARC_32: @@ -362,6 +370,12 @@ return RelocToApply(Res, 4); } + /// NDS32 ELF + RelocToApply visitELF_NDS32_32(RelocationRef R, uint64_t Value) { + uint32_t Res = Value & 0xFFFFFFFF; + return RelocToApply(Res, 4); + } + /// MIPS ELF RelocToApply visitELF_MIPS_32(RelocationRef R, uint64_t Value) { uint32_t Res = Value & 0xFFFFFFFF; Index: include/llvm/Support/ELF.h =================================================================== --- include/llvm/Support/ELF.h +++ include/llvm/Support/ELF.h @@ -582,6 +582,11 @@ #include "ELFRelocs/Hexagon.def" }; +// ELF Relocation type for NDS32 +enum { +#include "ELFRelocs/NDS32.def" +}; + // ELF Relocation type for Lanai. enum { #include "ELFRelocs/Lanai.def" Index: include/llvm/Support/ELFRelocs/NDS32.def =================================================================== --- /dev/null +++ include/llvm/Support/ELFRelocs/NDS32.def @@ -0,0 +1,141 @@ + +#ifndef ELF_RELOC +#error "ELF_RELOC must be defined" +#endif + +ELF_RELOC(R_NDS32_NONE, 0) +ELF_RELOC(R_NDS32_16, 1) +ELF_RELOC(R_NDS32_32, 2) +ELF_RELOC(R_NDS32_20, 3) +ELF_RELOC(R_NDS32_9_PCREL, 4) +ELF_RELOC(R_NDS32_15_PCREL, 5) +ELF_RELOC(R_NDS32_17_PCREL, 6) +ELF_RELOC(R_NDS32_25_PCREL, 7) +ELF_RELOC(R_NDS32_HI20, 8) +ELF_RELOC(R_NDS32_LO12S3, 9) +ELF_RELOC(R_NDS32_LO12S2, 10) +ELF_RELOC(R_NDS32_LO12S1, 11) +ELF_RELOC(R_NDS32_LO12S0, 12) +ELF_RELOC(R_NDS32_SDA15S3, 13) +ELF_RELOC(R_NDS32_SDA15S2, 14) +ELF_RELOC(R_NDS32_SDA15S1, 15) +ELF_RELOC(R_NDS32_SDA15S0, 16) +ELF_RELOC(R_NDS32_GNU_VTINHERIT, 17) +ELF_RELOC(R_NDS32_GNU_VTENTRY, 18) +ELF_RELOC(R_NDS32_16_RELA, 19) +ELF_RELOC(R_NDS32_32_RELA, 20) +ELF_RELOC(R_NDS32_20_RELA, 21) +ELF_RELOC(R_NDS32_9_PCREL_RELA, 22) +ELF_RELOC(R_NDS32_15_PCREL_RELA, 23) +ELF_RELOC(R_NDS32_17_PCREL_RELA, 24) +ELF_RELOC(R_NDS32_25_PCREL_RELA, 25) +ELF_RELOC(R_NDS32_HI20_RELA, 26) +ELF_RELOC(R_NDS32_LO12S3_RELA, 27) +ELF_RELOC(R_NDS32_LO12S2_RELA, 28) +ELF_RELOC(R_NDS32_LO12S1_RELA, 29) +ELF_RELOC(R_NDS32_LO12S0_RELA, 30) +ELF_RELOC(R_NDS32_SDA15S3_RELA, 31) +ELF_RELOC(R_NDS32_SDA15S2_RELA, 32) +ELF_RELOC(R_NDS32_SDA15S1_RELA, 33) +ELF_RELOC(R_NDS32_SDA15S0_RELA, 34) +ELF_RELOC(R_NDS32_RELA_GNU_VTINHERIT, 35) +ELF_RELOC(R_NDS32_RELA_GNU_VTENTRY, 36) +ELF_RELOC(R_NDS32_GOT20, 37) +ELF_RELOC(R_NDS32_25_PLTREL, 38) +ELF_RELOC(R_NDS32_COPY, 39) +ELF_RELOC(R_NDS32_GLOB_DAT, 40) +ELF_RELOC(R_NDS32_JMP_SLOT, 41) +ELF_RELOC(R_NDS32_RELATIVE, 42) +ELF_RELOC(R_NDS32_GOTOFF, 43) +ELF_RELOC(R_NDS32_GOTPC20, 44) +ELF_RELOC(R_NDS32_GOT_HI20, 45) +ELF_RELOC(R_NDS32_GOT_LO12, 46) +ELF_RELOC(R_NDS32_GOTPC_HI20, 47) +ELF_RELOC(R_NDS32_GOTPC_LO12, 48) +ELF_RELOC(R_NDS32_GOTOFF_HI20, 49) +ELF_RELOC(R_NDS32_GOTOFF_LO12, 50) +ELF_RELOC(R_NDS32_INSN16, 51) +ELF_RELOC(R_NDS32_LABEL, 52) +ELF_RELOC(R_NDS32_LONGCALL1, 53) +ELF_RELOC(R_NDS32_LONGCALL2, 54) +ELF_RELOC(R_NDS32_LONGCALL3, 55) +ELF_RELOC(R_NDS32_LONGJUMP1, 56) +ELF_RELOC(R_NDS32_LONGJUMP2, 57) +ELF_RELOC(R_NDS32_LONGJUMP3, 58) +ELF_RELOC(R_NDS32_LOADSTORE, 59) +ELF_RELOC(R_NDS32_9_FIXED_RELA, 60) +ELF_RELOC(R_NDS32_15_FIXED_RELA, 61) +ELF_RELOC(R_NDS32_17_FIXED_RELA, 62) +ELF_RELOC(R_NDS32_25_FIXED_RELA, 63) +ELF_RELOC(R_NDS32_PLTREL_HI20, 64) +ELF_RELOC(R_NDS32_PLTREL_LO12, 65) +ELF_RELOC(R_NDS32_PLT_GOTREL_HI20, 66) +ELF_RELOC(R_NDS32_PLT_GOTREL_LO12, 67) +ELF_RELOC(R_NDS32_SDA12S2_DP_RELA, 68) +ELF_RELOC(R_NDS32_SDA12S2_SP_RELA, 69) +ELF_RELOC(R_NDS32_LO12S2_DP_RELA, 70) +ELF_RELOC(R_NDS32_LO12S2_SP_RELA, 71) +ELF_RELOC(R_NDS32_LO12S0_ORI_RELA, 72) +ELF_RELOC(R_NDS32_SDA16S3_RELA, 73) +ELF_RELOC(R_NDS32_SDA17S2_RELA, 74) +ELF_RELOC(R_NDS32_SDA18S1_RELA, 75) +ELF_RELOC(R_NDS32_SDA19S0_RELA, 76) +ELF_RELOC(R_NDS32_DWARF2_OP1_RELA, 77) +ELF_RELOC(R_NDS32_DWARF2_OP2_RELA, 78) +ELF_RELOC(R_NDS32_DWARF2_LEB_RELA, 79) +ELF_RELOC(R_NDS32_UPDATE_TA_RELA, 80) +ELF_RELOC(R_NDS32_9_PLTREL, 81) +ELF_RELOC(R_NDS32_PLT_GOTREL_LO20, 82) +ELF_RELOC(R_NDS32_PLT_GOTREL_LO15, 83) +ELF_RELOC(R_NDS32_PLT_GOTREL_LO19, 84) +ELF_RELOC(R_NDS32_GOT_LO15, 85) +ELF_RELOC(R_NDS32_GOT_LO19, 86) +ELF_RELOC(R_NDS32_GOTOFF_LO15, 87) +ELF_RELOC(R_NDS32_GOTOFF_LO19, 88) +ELF_RELOC(R_NDS32_GOT15S2_RELA, 89) +ELF_RELOC(R_NDS32_GOT17S2_RELA, 90) +ELF_RELOC(R_NDS32_5_RELA, 91) +ELF_RELOC(R_NDS32_10_UPCREL_RELA, 92) +ELF_RELOC(R_NDS32_SDA_FP7U2_RELA, 93) +ELF_RELOC(R_NDS32_WORD_9_PCREL_RELA, 94) +ELF_RELOC(R_NDS32_25_ABS_RELA, 95) +ELF_RELOC(R_NDS32_17IFC_PCREL_RELA, 96) +ELF_RELOC(R_NDS32_10IFCU_PCREL_RELA, 97) +ELF_RELOC(R_NDS32_TLS_LE_HI20, 98) +ELF_RELOC(R_NDS32_TLS_LE_LO12, 99) +ELF_RELOC(R_NDS32_TLS_IE_HI20, 100) +ELF_RELOC(R_NDS32_TLS_IE_LO12S2, 101) +ELF_RELOC(R_NDS32_TLS_TPOFF, 102) +ELF_RELOC(R_NDS32_TLS_LE_20, 103) +ELF_RELOC(R_NDS32_TLS_LE_15S0, 104) +ELF_RELOC(R_NDS32_TLS_LE_15S1, 105) +ELF_RELOC(R_NDS32_TLS_LE_15S2, 106) +ELF_RELOC(R_NDS32_LONGCALL4, 107) +ELF_RELOC(R_NDS32_LONGCALL5, 108) +ELF_RELOC(R_NDS32_LONGCALL6, 109) +ELF_RELOC(R_NDS32_LONGJUMP4, 110) +ELF_RELOC(R_NDS32_LONGJUMP5, 111) +ELF_RELOC(R_NDS32_LONGJUMP6, 112) +ELF_RELOC(R_NDS32_LONGJUMP7, 113) +ELF_RELOC(R_NDS32_RELAX_ENTRY, 192) +ELF_RELOC(R_NDS32_GOT_SUFF, 193) +ELF_RELOC(R_NDS32_GOTOFF_SUFF, 194) +ELF_RELOC(R_NDS32_PLT_GOT_SUFF, 195) +ELF_RELOC(R_NDS32_MULCALL_SUFF, 196) +ELF_RELOC(R_NDS32_PTR, 197) +ELF_RELOC(R_NDS32_PTR_COUNT, 198) +ELF_RELOC(R_NDS32_PTR_RESOLVED, 199) +ELF_RELOC(R_NDS32_PLTBLOCK, 200) +ELF_RELOC(R_NDS32_RELAX_REGION_BEGIN,201) +ELF_RELOC(R_NDS32_RELAX_REGION_END, 202) +ELF_RELOC(R_NDS32_MINUEND, 203) +ELF_RELOC(R_NDS32_SUBTRAHEND, 204) +ELF_RELOC(R_NDS32_DIFF8, 205) +ELF_RELOC(R_NDS32_DIFF16, 206) +ELF_RELOC(R_NDS32_DIFF32, 207) +ELF_RELOC(R_NDS32_DIFF_ULEB128, 208) +ELF_RELOC(R_NDS32_DATA, 209) +ELF_RELOC(R_NDS32_TRAN, 210) +ELF_RELOC(R_NDS32_TLS_LE_ADD, 211) +ELF_RELOC(R_NDS32_TLS_LE_LS, 212) +ELF_RELOC(R_NDS32_EMPTY, 213) Index: lib/Object/ELF.cpp =================================================================== --- lib/Object/ELF.cpp +++ lib/Object/ELF.cpp @@ -61,6 +61,13 @@ break; } break; + case ELF::EM_NDS32: + switch (Type) { +#include "llvm/Support/ELFRelocs/NDS32.def" + default: + break; + } + break; case ELF::EM_HEXAGON: switch (Type) { #include "llvm/Support/ELFRelocs/Hexagon.def" Index: lib/ObjectYAML/ELFYAML.cpp =================================================================== --- lib/ObjectYAML/ELFYAML.cpp +++ lib/ObjectYAML/ELFYAML.cpp @@ -196,6 +196,7 @@ ECase(EM_AMDGPU) ECase(EM_RISCV) ECase(EM_LANAI) + ECase(EM_NDS32) ECase(EM_BPF) #undef ECase } @@ -539,6 +540,9 @@ case ELF::EM_LANAI: #include "llvm/Support/ELFRelocs/Lanai.def" break; + case ELF::EM_NDS32: +#include "llvm/Support/ELFRelocs/NDS32.def" + break; case ELF::EM_AMDGPU: #include "llvm/Support/ELFRelocs/AMDGPU.def" break; Index: tools/llvm-objdump/llvm-objdump.cpp =================================================================== --- tools/llvm-objdump/llvm-objdump.cpp +++ tools/llvm-objdump/llvm-objdump.cpp @@ -738,6 +738,7 @@ case ELF::EM_MIPS: case ELF::EM_BPF: case ELF::EM_RISCV: + case ELF::EM_NDS32: res = Target; break; case ELF::EM_WEBASSEMBLY: Index: tools/llvm-readobj/ELFDumper.cpp =================================================================== --- tools/llvm-readobj/ELFDumper.cpp +++ tools/llvm-readobj/ELFDumper.cpp @@ -822,6 +822,7 @@ ENUM_ENT(EM_SPARCV9, "Sparc v9"), ENUM_ENT(EM_TRICORE, "Siemens Tricore"), ENUM_ENT(EM_ARC, "ARC"), + ENUM_ENT(EM_NDS32, "NDS32"), ENUM_ENT(EM_H8_300, "Hitachi H8/300"), ENUM_ENT(EM_H8_300H, "Hitachi H8/300H"), ENUM_ENT(EM_H8S, "Hitachi H8S"),