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