1263320SdimPull in r200112 from upstream llvm trunk (by Venkatraman Govindaraju): 2263320Sdim 3263320Sdim [Sparc] Add support for sparc relocation types in ELF object file. 4263320Sdim 5269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261 6263320Sdim 7263320SdimIndex: test/MC/Sparc/sparc-relocations.s 8263320Sdim=================================================================== 9263320Sdim--- test/MC/Sparc/sparc-relocations.s 10263320Sdim+++ test/MC/Sparc/sparc-relocations.s 11263320Sdim@@ -1,5 +1,18 @@ 12263320Sdim ! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s 13263320Sdim+! RUN: llvm-mc %s -arch=sparcv9 -filetype=obj | llvm-readobj -r | FileCheck %s --check-prefix=CHECK-OBJ 14263320Sdim 15263320Sdim+ ! CHECK-OBJ: Format: ELF64-sparc 16263320Sdim+ ! CHECK-OBJ: Relocations [ 17263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_WDISP30 foo 18263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_LO10 sym 19263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HI22 sym 20263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_H44 sym 21263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_M44 sym 22263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_L44 sym 23263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HH22 sym 24263320Sdim+ ! CHECK-OBJ: 0x{{[0-9,A-F]+}} R_SPARC_HM10 sym 25263320Sdim+ ! CHECK-ELF: ] 26263320Sdim+ 27263320Sdim ! CHECK: call foo ! encoding: [0b01AAAAAA,A,A,A] 28263320Sdim ! CHECK: ! fixup A - offset: 0, value: foo, kind: fixup_sparc_call30 29263320Sdim call foo 30263320SdimIndex: include/llvm/Object/ELFObjectFile.h 31263320Sdim=================================================================== 32263320Sdim--- include/llvm/Object/ELFObjectFile.h 33263320Sdim+++ include/llvm/Object/ELFObjectFile.h 34263320Sdim@@ -922,6 +922,9 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() 35263320Sdim return "ELF32-mips"; 36263320Sdim case ELF::EM_PPC: 37263320Sdim return "ELF32-ppc"; 38263320Sdim+ case ELF::EM_SPARC: 39263320Sdim+ case ELF::EM_SPARC32PLUS: 40263320Sdim+ return "ELF32-sparc"; 41263320Sdim default: 42263320Sdim return "ELF32-unknown"; 43263320Sdim } 44263320Sdim@@ -937,6 +940,8 @@ StringRef ELFObjectFile<ELFT>::getFileFormatName() 45263320Sdim return "ELF64-ppc64"; 46263320Sdim case ELF::EM_S390: 47263320Sdim return "ELF64-s390"; 48263320Sdim+ case ELF::EM_SPARCV9: 49263320Sdim+ return "ELF64-sparc"; 50263320Sdim default: 51263320Sdim return "ELF64-unknown"; 52263320Sdim } 53263320Sdim@@ -967,6 +972,13 @@ unsigned ELFObjectFile<ELFT>::getArch() const { 54263320Sdim : Triple::ppc64; 55263320Sdim case ELF::EM_S390: 56263320Sdim return Triple::systemz; 57263320Sdim+ 58263320Sdim+ case ELF::EM_SPARC: 59263320Sdim+ case ELF::EM_SPARC32PLUS: 60263320Sdim+ return Triple::sparc; 61263320Sdim+ case ELF::EM_SPARCV9: 62263320Sdim+ return Triple::sparcv9; 63263320Sdim+ 64263320Sdim default: 65263320Sdim return Triple::UnknownArch; 66263320Sdim } 67263320SdimIndex: lib/Object/ELF.cpp 68263320Sdim=================================================================== 69263320Sdim--- lib/Object/ELF.cpp 70263320Sdim+++ lib/Object/ELF.cpp 71263320Sdim@@ -702,6 +702,98 @@ StringRef getELFRelocationTypeName(uint32_t Machin 72263320Sdim break; 73263320Sdim } 74263320Sdim break; 75263320Sdim+ case ELF::EM_SPARC: 76263320Sdim+ case ELF::EM_SPARC32PLUS: 77263320Sdim+ case ELF::EM_SPARCV9: 78263320Sdim+ switch (Type) { 79263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_NONE); 80263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_8); 81263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_16); 82263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_32); 83263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP8); 84263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP16); 85263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP32); 86263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP30); 87263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP22); 88263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HI22); 89263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_22); 90263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_13); 91263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LO10); 92263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT10); 93263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT13); 94263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOT22); 95263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC10); 96263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC22); 97263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WPLT30); 98263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_COPY); 99263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GLOB_DAT); 100263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_JMP_SLOT); 101263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_RELATIVE); 102263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA32); 103263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PLT32); 104263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HIPLT22); 105263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LOPLT10); 106263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT32); 107263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT22); 108263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PCPLT10); 109263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_10); 110263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_11); 111263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_64); 112263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_OLO10); 113263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HH22); 114263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HM10); 115263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LM22); 116263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_HH22); 117263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_HM10); 118263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PC_LM22); 119263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP16); 120263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_WDISP19); 121263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_7); 122263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_5); 123263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_6); 124263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_DISP64); 125263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_PLT64); 126263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_HIX22); 127263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_LOX10); 128263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_H44); 129263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_M44); 130263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_L44); 131263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_REGISTER); 132263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA64); 133263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_UA16); 134263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_HI22); 135263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_LO10); 136263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_ADD); 137263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_GD_CALL); 138263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_HI22); 139263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_LO10); 140263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_ADD); 141263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDM_CALL); 142263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_HIX22); 143263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_LOX10); 144263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LDO_ADD); 145263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_HI22); 146263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LO10); 147263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LD); 148263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_LDX); 149263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_IE_ADD); 150263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LE_HIX22); 151263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_LE_LOX10); 152263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPMOD32); 153263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPMOD64); 154263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPOFF32); 155263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_DTPOFF64); 156263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_TPOFF32); 157263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_TLS_TPOFF64); 158263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_HIX22); 159263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_LOX22); 160263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP_HIX22); 161263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP_LOX22); 162263320Sdim+ LLVM_ELF_SWITCH_RELOC_TYPE_NAME(R_SPARC_GOTDATA_OP); 163263320Sdim+ default: 164263320Sdim+ break; 165263320Sdim+ } 166263320Sdim+ break; 167263320Sdim default: 168263320Sdim break; 169263320Sdim } 170