1Pull in r200112 from upstream llvm trunk (by Venkatraman Govindaraju): 2 3 [Sparc] Add support for sparc relocation types in ELF object file. 4 5Introduced here: http://svnweb.freebsd.org/changeset/base/262261 6 7Index: test/MC/Sparc/sparc-relocations.s 8=================================================================== 9--- test/MC/Sparc/sparc-relocations.s 10+++ test/MC/Sparc/sparc-relocations.s 11@@ -1,5 +1,18 @@ 12 ! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s 13+! RUN: llvm-mc %s -arch=sparcv9 -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=CHECK-OBJ 14 15+ ! CHECK-OBJ: Format: ELF64-sparc 16+ ! CHECK-OBJ: Relocations [ 17+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 foo 18+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_LO10 sym 19+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HI22 sym 20+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_H44 sym 21+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_M44 sym 22+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym 23+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym 24+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym 25+ ! CHECK-ELF: ] 26+ 27 ! CHECK: call foo ! encoding: [0b01AAAAAA,A,A,A] 28 ! CHECK: ! fixup A - offset: 0, value: foo, kind: fixup_sparc_call30 29 call foo 30Index: include/llvm/Object/ELFObjectFile.h 31=================================================================== 32--- include/llvm/Object/ELFObjectFile.h 33+++ include/llvm/Object/ELFObjectFile.h 34@@ -922,6 +922,9 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() 35 return "ELF32-mips"; 36 case ELF::EM_PPC: 37 return "ELF32-ppc"; 38+ case ELF::EM_SPARC: 39+ case ELF::EM_SPARC32PLUS: 40+ return "ELF32-sparc"; 41 default: 42 return "ELF32-unknown"; 43 } 44@@ -937,6 +940,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() 45 return "ELF64-ppc64"; 46 case ELF::EM_S390: 47 return "ELF64-s390"; 48+ case ELF::EM_SPARCV9: 49+ return "ELF64-sparc"; 50 default: 51 return "ELF64-unknown"; 52 } 53@@ -967,6 +972,13 @@ unsigned ELFObjectFile<ELFT>::getArch() const { 54 : Triple::ppc64; 55 case ELF::EM_S390: 56 return Triple::systemz; 57+ 58+ case ELF::EM_SPARC: 59+ case ELF::EM_SPARC32PLUS: 60+ return Triple::sparc; 61+ case ELF::EM_SPARCV9: 62+ return Triple::sparcv9; 63+ 64 default: 65 return Triple::UnknownArch; 66 } 67Index: lib/Object/ELF.cpp 68=================================================================== 69--- lib/Object/ELF.cpp 70+++ lib/Object/ELF.cpp 71@@ -702,6 +702,98 @@ StringRef getELFRelocationTypeName(uint32_t Machin 72 break; 73 } 74 break; 75+ case ELF::EM_SPARC: 76+ case ELF::EM_SPARC32PLUS: 77+ case ELF::EM_SPARCV9: 78+ switch (Type) { 79+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_NONE); 80+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_8); 81+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_16); 82+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_32); 83+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP8); 84+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP16); 85+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP32); 86+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP30); 87+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP22); 88+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HI22); 89+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_22); 90+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_13); 91+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LO10); 92+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT10); 93+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT13); 94+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT22); 95+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC10); 96+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC22); 97+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WPLT30); 98+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_COPY); 99+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GLOB_DAT); 100+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_JMP_SLOT); 101+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_RELATIVE); 102+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA32); 103+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PLT32); 104+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HIPLT22); 105+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LOPLT10); 106+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT32); 107+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT22); 108+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT10); 109+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_10); 110+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_11); 111+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_64); 112+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_OLO10); 113+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HH22); 114+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HM10); 115+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LM22); 116+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_HH22); 117+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_HM10); 118+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_LM22); 119+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP16); 120+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP19); 121+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_7); 122+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_5); 123+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_6); 124+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP64); 125+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PLT64); 126+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HIX22); 127+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LOX10); 128+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_H44); 129+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_M44); 130+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_L44); 131+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_REGISTER); 132+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA64); 133+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA16); 134+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_HI22); 135+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_LO10); 136+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_ADD); 137+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_CALL); 138+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_HI22); 139+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_LO10); 140+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_ADD); 141+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_CALL); 142+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_HIX22); 143+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_LOX10); 144+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_ADD); 145+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_HI22); 146+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LO10); 147+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LD); 148+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LDX); 149+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_ADD); 150+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LE_HIX22); 151+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LE_LOX10); 152+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPMOD32); 153+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPMOD64); 154+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPOFF32); 155+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPOFF64); 156+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_TPOFF32); 157+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_TPOFF64); 158+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_HIX22); 159+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_LOX22); 160+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP_HIX22); 161+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP_LOX22); 162+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP); 163+ default: 164+ break; 165+ } 166+ break; 167 default: 168 break; 169 } 170