diff options
| -rw-r--r-- | llvm/include/llvm/Object/ELF.h | 99 | ||||
| -rw-r--r-- | llvm/include/llvm/Support/ELF.h | 91 | ||||
| -rw-r--r-- | llvm/test/Object/Inputs/trivial-object-test.elf-hexagon | bin | 0 -> 800 bytes | |||
| -rw-r--r-- | llvm/test/Object/objdump-relocations.test | 10 | 
4 files changed, 200 insertions, 0 deletions
diff --git a/llvm/include/llvm/Object/ELF.h b/llvm/include/llvm/Object/ELF.h index 4e6f50d97a3..cafcb5ed3d2 100644 --- a/llvm/include/llvm/Object/ELF.h +++ b/llvm/include/llvm/Object/ELF.h @@ -1414,6 +1414,98 @@ error_code ELFObjectFile<target_endianness, is64Bits>        res = "Unknown";      }      break; +  case ELF::EM_HEXAGON: +    switch (type) { +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_NONE); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B22_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B15_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B7_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_8); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_0); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_1); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_2); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GPREL16_3); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_HL16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B13_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B9_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B32_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B22_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B15_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B13_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B9_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_B7_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_12_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_10_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_9_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_8_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_7_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_32_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_COPY); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GLOB_DAT); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_JMP_SLOT); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_RELATIVE); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_PLT_B22_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPMOD_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_PLT_B22_PCREL); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_LO16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_HI16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_32); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_16); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_6_PCREL_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOTREL_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GOT_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_DTPREL_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_GD_GOT_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_IE_GOT_11_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_32_6_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_16_X); +      LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_HEX_TPREL_11_X); +    default: +      res = "Unknown"; +    } +    break;    default:      res = "Unknown";    } @@ -1489,6 +1581,9 @@ error_code ELFObjectFile<target_endianness, is64Bits>        res = "Unknown";      }      break; +  case ELF::EM_HEXAGON: +    res = symname; +    break;    default:      res = "Unknown";    } @@ -1888,6 +1983,8 @@ StringRef ELFObjectFile<target_endianness, is64Bits>        return "ELF32-x86-64";      case ELF::EM_ARM:        return "ELF32-arm"; +    case ELF::EM_HEXAGON: +      return "ELF32-hexagon";      default:        return "ELF32-unknown";      } @@ -1915,6 +2012,8 @@ unsigned ELFObjectFile<target_endianness, is64Bits>::getArch() const {      return Triple::x86_64;    case ELF::EM_ARM:      return Triple::arm; +  case ELF::EM_HEXAGON: +    return Triple::hexagon;    default:      return Triple::UnknownArch;    } diff --git a/llvm/include/llvm/Support/ELF.h b/llvm/include/llvm/Support/ELF.h index f2210dc0f24..40456ad3513 100644 --- a/llvm/include/llvm/Support/ELF.h +++ b/llvm/include/llvm/Support/ELF.h @@ -674,6 +674,97 @@ enum {    R_MIPS_NUM               = 218  }; +// ELF Relocation types for Hexagon +// Release 5 ABI - Document: 80-V9418-3 Rev. J +enum { +  R_HEX_NONE              =  0, +  R_HEX_B22_PCREL         =  1, +  R_HEX_B15_PCREL         =  2, +  R_HEX_B7_PCREL          =  3, +  R_HEX_LO16              =  4, +  R_HEX_HI16              =  5, +  R_HEX_32                =  6, +  R_HEX_16                =  7, +  R_HEX_8                 =  8, +  R_HEX_GPREL16_0         =  9, +  R_HEX_GPREL16_1         =  10, +  R_HEX_GPREL16_2         =  11, +  R_HEX_GPREL16_3         =  12, +  R_HEX_HL16              =  13, +  R_HEX_B13_PCREL         =  14, +  R_HEX_B9_PCREL          =  15, +  R_HEX_B32_PCREL_X       =  16, +  R_HEX_32_6_X            =  17, +  R_HEX_B22_PCREL_X       =  18, +  R_HEX_B15_PCREL_X       =  19, +  R_HEX_B13_PCREL_X       =  20, +  R_HEX_B9_PCREL_X        =  21, +  R_HEX_B7_PCREL_X        =  22, +  R_HEX_16_X              =  23, +  R_HEX_12_X              =  24, +  R_HEX_11_X              =  25, +  R_HEX_10_X              =  26, +  R_HEX_9_X               =  27, +  R_HEX_8_X               =  28, +  R_HEX_7_X               =  29, +  R_HEX_6_X               =  30, +  R_HEX_32_PCREL          =  31, +  R_HEX_COPY              =  32, +  R_HEX_GLOB_DAT          =  33, +  R_HEX_JMP_SLOT          =  34, +  R_HEX_RELATIVE          =  35, +  R_HEX_PLT_B22_PCREL     =  36, +  R_HEX_GOTREL_LO16       =  37, +  R_HEX_GOTREL_HI16       =  38, +  R_HEX_GOTREL_32         =  39, +  R_HEX_GOT_LO16          =  40, +  R_HEX_GOT_HI16          =  41, +  R_HEX_GOT_32            =  42, +  R_HEX_GOT_16            =  43, +  R_HEX_DTPMOD_32         =  44, +  R_HEX_DTPREL_LO16       =  45, +  R_HEX_DTPREL_HI16       =  46, +  R_HEX_DTPREL_32         =  47, +  R_HEX_DTPREL_16         =  48, +  R_HEX_GD_PLT_B22_PCREL  =  49, +  R_HEX_GD_GOT_LO16       =  50, +  R_HEX_GD_GOT_HI16       =  51, +  R_HEX_GD_GOT_32         =  52, +  R_HEX_GD_GOT_16         =  53, +  R_HEX_IE_LO16           =  54, +  R_HEX_IE_HI16           =  55, +  R_HEX_IE_32             =  56, +  R_HEX_IE_GOT_LO16       =  57, +  R_HEX_IE_GOT_HI16       =  58, +  R_HEX_IE_GOT_32         =  59, +  R_HEX_IE_GOT_16         =  60, +  R_HEX_TPREL_LO16        =  61, +  R_HEX_TPREL_HI16        =  62, +  R_HEX_TPREL_32          =  63, +  R_HEX_TPREL_16          =  64, +  R_HEX_6_PCREL_X         =  65, +  R_HEX_GOTREL_32_6_X     =  66, +  R_HEX_GOTREL_16_X       =  67, +  R_HEX_GOTREL_11_X       =  68, +  R_HEX_GOT_32_6_X        =  69, +  R_HEX_GOT_16_X          =  70, +  R_HEX_GOT_11_X          =  71, +  R_HEX_DTPREL_32_6_X     =  72, +  R_HEX_DTPREL_16_X       =  73, +  R_HEX_DTPREL_11_X       =  74, +  R_HEX_GD_GOT_32_6_X     =  75, +  R_HEX_GD_GOT_16_X       =  76, +  R_HEX_GD_GOT_11_X       =  77, +  R_HEX_IE_32_6_X         =  78, +  R_HEX_IE_16_X           =  79, +  R_HEX_IE_GOT_32_6_X     =  80, +  R_HEX_IE_GOT_16_X       =  81, +  R_HEX_IE_GOT_11_X       =  82, +  R_HEX_TPREL_32_6_X      =  83, +  R_HEX_TPREL_16_X        =  84, +  R_HEX_TPREL_11_X        =  85 +}; +  // Section header.  struct Elf32_Shdr {    Elf32_Word sh_name;      // Section name (index into string table) diff --git a/llvm/test/Object/Inputs/trivial-object-test.elf-hexagon b/llvm/test/Object/Inputs/trivial-object-test.elf-hexagon Binary files differnew file mode 100644 index 00000000000..566fa30012a --- /dev/null +++ b/llvm/test/Object/Inputs/trivial-object-test.elf-hexagon diff --git a/llvm/test/Object/objdump-relocations.test b/llvm/test/Object/objdump-relocations.test index c4b564e7231..a394a23a7e0 100644 --- a/llvm/test/Object/objdump-relocations.test +++ b/llvm/test/Object/objdump-relocations.test @@ -6,6 +6,8 @@ RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-i386 \  RUN:              | FileCheck %s -check-prefix ELF-i386  RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-x86-64 \  RUN:              | FileCheck %s -check-prefix ELF-x86-64 +RUN: llvm-objdump -r %p/Inputs/trivial-object-test.elf-hexagon \ +RUN:              | FileCheck %s -check-prefix ELF-hexagon  COFF-i386: .text  COFF-i386: IMAGE_REL_I386_DIR32 L_.str @@ -26,3 +28,11 @@ ELF-x86-64: .text  ELF-x86-64: R_X86_64_32S .rodata.str1.1  ELF-x86-64: R_X86_64_PC32 puts  ELF-x86-64: R_X86_64_PC32 SomeOtherFunction + +ELF-hexagon: .text +ELF-hexagon: R_HEX_GOTREL_HI16 .main +ELF-hexagon: R_HEX_GOTREL_LO16 .main +ELF-hexagon: R_HEX_HI16 puts +ELF-hexagon: R_HEX_LO16 puts +ELF-hexagon: R_HEX_B15_PCREL testf +ELF-hexagon: R_HEX_B22_PCREL puts  | 

