Index: llvm/include/llvm/BinaryFormat/ELF.h =================================================================== --- llvm/include/llvm/BinaryFormat/ELF.h +++ llvm/include/llvm/BinaryFormat/ELF.h @@ -767,6 +767,21 @@ #include "ELFRelocs/MSP430.def" }; +// Xtensa specific e_flags +enum : unsigned { + /* Four-bit Xtensa machine type field. */ + EF_XTENSA_MACH = 0x0000000f, + /* Various CPU types. */ + E_XTENSA_MACH = 0x00000000, + EF_XTENSA_XT_INSN = 0x00000100, + EF_XTENSA_XT_LIT = 0x00000200, +}; + +// ELF Relocation types for Xtensa +enum { +#include "ELFRelocs/Xtensa.def" +}; + #undef ELF_RELOC // Section header. Index: llvm/include/llvm/BinaryFormat/ELFRelocs/Xtensa.def =================================================================== --- /dev/null +++ llvm/include/llvm/BinaryFormat/ELFRelocs/Xtensa.def @@ -0,0 +1,59 @@ +#ifndef ELF_RELOC +#error "ELF_RELOC must be defined" +#endif + +ELF_RELOC (R_XTENSA_NONE, 0) +ELF_RELOC (R_XTENSA_32, 1) +ELF_RELOC (R_XTENSA_RTLD, 2) +ELF_RELOC (R_XTENSA_GLOB_DAT, 3) +ELF_RELOC (R_XTENSA_JMP_SLOT, 4) +ELF_RELOC (R_XTENSA_RELATIVE, 5) +ELF_RELOC (R_XTENSA_PLT, 6) +ELF_RELOC (R_XTENSA_OP0, 8) +ELF_RELOC (R_XTENSA_OP1, 9) +ELF_RELOC (R_XTENSA_OP2, 10) +ELF_RELOC (R_XTENSA_ASM_EXPAND, 11) +ELF_RELOC (R_XTENSA_ASM_SIMPLIFY, 12) +ELF_RELOC (R_XTENSA_32_PCREL, 14) +ELF_RELOC (R_XTENSA_GNU_VTINHERIT, 15) +ELF_RELOC (R_XTENSA_GNU_VTENTRY, 16) +ELF_RELOC (R_XTENSA_DIFF8, 17) +ELF_RELOC (R_XTENSA_DIFF16, 18) +ELF_RELOC (R_XTENSA_DIFF32, 19) +ELF_RELOC (R_XTENSA_SLOT0_OP, 20) +ELF_RELOC (R_XTENSA_SLOT1_OP, 21) +ELF_RELOC (R_XTENSA_SLOT2_OP, 22) +ELF_RELOC (R_XTENSA_SLOT3_OP, 23) +ELF_RELOC (R_XTENSA_SLOT4_OP, 24) +ELF_RELOC (R_XTENSA_SLOT5_OP, 25) +ELF_RELOC (R_XTENSA_SLOT6_OP, 26) +ELF_RELOC (R_XTENSA_SLOT7_OP, 27) +ELF_RELOC (R_XTENSA_SLOT8_OP, 28) +ELF_RELOC (R_XTENSA_SLOT9_OP, 29) +ELF_RELOC (R_XTENSA_SLOT10_OP, 30) +ELF_RELOC (R_XTENSA_SLOT11_OP, 31) +ELF_RELOC (R_XTENSA_SLOT12_OP, 32) +ELF_RELOC (R_XTENSA_SLOT13_OP, 33) +ELF_RELOC (R_XTENSA_SLOT14_OP, 34) +ELF_RELOC (R_XTENSA_SLOT0_ALT, 35) +ELF_RELOC (R_XTENSA_SLOT1_ALT, 36) +ELF_RELOC (R_XTENSA_SLOT2_ALT, 37) +ELF_RELOC (R_XTENSA_SLOT3_ALT, 38) +ELF_RELOC (R_XTENSA_SLOT4_ALT, 39) +ELF_RELOC (R_XTENSA_SLOT5_ALT, 40) +ELF_RELOC (R_XTENSA_SLOT6_ALT, 41) +ELF_RELOC (R_XTENSA_SLOT7_ALT, 42) +ELF_RELOC (R_XTENSA_SLOT8_ALT, 43) +ELF_RELOC (R_XTENSA_SLOT9_ALT, 44) +ELF_RELOC (R_XTENSA_SLOT10_ALT, 45) +ELF_RELOC (R_XTENSA_SLOT11_ALT, 46) +ELF_RELOC (R_XTENSA_SLOT12_ALT, 47) +ELF_RELOC (R_XTENSA_SLOT13_ALT, 48) +ELF_RELOC (R_XTENSA_SLOT14_ALT, 49) +ELF_RELOC (R_XTENSA_TLSDESC_FN, 50) +ELF_RELOC (R_XTENSA_TLSDESC_ARG, 51) +ELF_RELOC (R_XTENSA_TLS_DTPOFF, 52) +ELF_RELOC (R_XTENSA_TLS_TPOFF, 53) +ELF_RELOC (R_XTENSA_TLS_FUNC, 54) +ELF_RELOC (R_XTENSA_TLS_ARG, 55) +ELF_RELOC (R_XTENSA_TLS_CALL, 56) Index: llvm/include/llvm/Object/ELFObjectFile.h =================================================================== --- llvm/include/llvm/Object/ELFObjectFile.h +++ llvm/include/llvm/Object/ELFObjectFile.h @@ -1076,6 +1076,8 @@ return "ELF32-sparc"; case ELF::EM_AMDGPU: return "ELF32-amdgpu"; + case ELF::EM_XTENSA: + return "ELF32-Xtensa"; default: return "ELF32-unknown"; } @@ -1178,7 +1180,8 @@ case ELF::EM_BPF: return IsLittleEndian ? Triple::bpfel : Triple::bpfeb; - + case ELF::EM_XTENSA: + return Triple::xtensa; default: return Triple::UnknownArch; } Index: llvm/include/llvm/module.modulemap =================================================================== --- llvm/include/llvm/module.modulemap +++ llvm/include/llvm/module.modulemap @@ -72,6 +72,7 @@ textual header "BinaryFormat/ELFRelocs/Sparc.def" textual header "BinaryFormat/ELFRelocs/SystemZ.def" textual header "BinaryFormat/ELFRelocs/x86_64.def" + textual header "BinaryFormat/ELFRelocs/Xtensa.def" textual header "BinaryFormat/WasmRelocs.def" textual header "BinaryFormat/MsgPack.def" } Index: llvm/lib/Object/ELF.cpp =================================================================== --- llvm/lib/Object/ELF.cpp +++ llvm/lib/Object/ELF.cpp @@ -145,6 +145,13 @@ break; } break; + case ELF::EM_XTENSA: + switch (Type) { +#include "llvm/BinaryFormat/ELFRelocs/Xtensa.def" + default: + break; + } + break; default: break; } Index: llvm/lib/ObjectYAML/ELFYAML.cpp =================================================================== --- llvm/lib/ObjectYAML/ELFYAML.cpp +++ llvm/lib/ObjectYAML/ELFYAML.cpp @@ -420,6 +420,11 @@ break; case ELF::EM_X86_64: break; + case ELF::EM_XTENSA: + BCase(EF_XTENSA_XT_INSN); + BCaseMask(E_XTENSA_MACH, EF_XTENSA_MACH); + BCase(EF_XTENSA_XT_LIT); + break; default: llvm_unreachable("Unsupported architecture"); } @@ -671,6 +676,9 @@ case ELF::EM_BPF: #include "llvm/BinaryFormat/ELFRelocs/BPF.def" break; + case ELF::EM_XTENSA: +#include "llvm/BinaryFormat/ELFRelocs/Xtensa.def" + break; default: llvm_unreachable("Unsupported architecture"); } Index: llvm/test/Object/Xtensa/elf-flags.yaml =================================================================== --- /dev/null +++ llvm/test/Object/Xtensa/elf-flags.yaml @@ -0,0 +1,21 @@ +# RUN: yaml2obj %s > %t +# RUN: llvm-readobj -file-headers %t | FileCheck -check-prefix=OBJ %s +# RUN: obj2yaml %t | FileCheck -check-prefix=YAML %s + +# OBJ: Flags [ (0x200) +# OBJ-NEXT: 0x200 +# OBJ-NEXT: ] + +# YAML: FileHeader: +# YAML-NEXT: Class: ELFCLASS32 +# YAML-NEXT: Data: ELFDATA2LSB +# YAML-NEXT: Type: ET_EXEC +# YAML-NEXT: Machine: EM_XTENSA +# YAML-NEXT: Flags: [ E_XTENSA_MACH, EF_XTENSA_XT_LIT ] +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_XTENSA + Flags: [ EF_XTENSA_XT_LIT ] Index: llvm/test/Object/Xtensa/lit.local.cfg =================================================================== --- /dev/null +++ llvm/test/Object/Xtensa/lit.local.cfg @@ -0,0 +1,3 @@ +if not 'Xtensa' in config.root.targets: + config.unsupported = True +