1Pull in r200282 from upstream llvm trunk (by Jakob Stoklund Olesen):
2
3  Fix the DWARF EH encodings for Sparc PIC code.
4
5  Also emit the stubs that were generated for references to typeinfo
6  symbols.
7
8Introduced here: http://svnweb.freebsd.org/changeset/base/262261
9
10Index: lib/Target/Sparc/SparcAsmPrinter.cpp
11===================================================================
12--- lib/Target/Sparc/SparcAsmPrinter.cpp
13+++ lib/Target/Sparc/SparcAsmPrinter.cpp
14@@ -23,7 +23,9 @@
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/CodeGen/AsmPrinter.h"
17 #include "llvm/CodeGen/MachineInstr.h"
18+#include "llvm/CodeGen/MachineModuleInfoImpls.h"
19 #include "llvm/CodeGen/MachineRegisterInfo.h"
20+#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
21 #include "llvm/MC/MCAsmInfo.h"
22 #include "llvm/MC/MCContext.h"
23 #include "llvm/MC/MCInst.h"
24@@ -54,6 +56,7 @@ namespace {
25 
26     virtual void EmitFunctionBodyStart();
27     virtual void EmitInstruction(const MachineInstr *MI);
28+    virtual void EmitEndOfAsmFile(Module &M);
29 
30     static const char *getRegisterName(unsigned RegNo) {
31       return SparcInstPrinter::getRegisterName(RegNo);
32@@ -450,6 +453,23 @@ bool SparcAsmPrinter::PrintAsmMemoryOperand(const
33   return false;
34 }
35 
36+void SparcAsmPrinter::EmitEndOfAsmFile(Module &M) {
37+  const TargetLoweringObjectFileELF &TLOFELF =
38+    static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering());
39+  MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
40+
41+  // Generate stubs for global variables.
42+  MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
43+  if (!Stubs.empty()) {
44+    OutStreamer.SwitchSection(TLOFELF.getDataSection());
45+    unsigned PtrSize = TM.getDataLayout()->getPointerSize(0);
46+    for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
47+      OutStreamer.EmitLabel(Stubs[i].first);
48+      OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), PtrSize);
49+    }
50+  }
51+}
52+
53 // Force static initialization.
54 extern "C" void LLVMInitializeSparcAsmPrinter() {
55   RegisterAsmPrinter<SparcAsmPrinter> X(TheSparcTarget);
56Index: lib/MC/MCObjectFileInfo.cpp
57===================================================================
58--- lib/MC/MCObjectFileInfo.cpp
59+++ lib/MC/MCObjectFileInfo.cpp
60@@ -310,6 +310,33 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Tri
61     FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
62     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
63       dwarf::DW_EH_PE_udata8;
64+  } else if (T.getArch() == Triple::sparc) {
65+    if (RelocM == Reloc::PIC_) {
66+      LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
67+      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
68+        dwarf::DW_EH_PE_sdata4;
69+      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
70+      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
71+        dwarf::DW_EH_PE_sdata4;
72+    } else {
73+      LSDAEncoding = dwarf::DW_EH_PE_absptr;
74+      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
75+      FDEEncoding = dwarf::DW_EH_PE_udata4;
76+      TTypeEncoding = dwarf::DW_EH_PE_absptr;
77+    }
78+  } else if (T.getArch() == Triple::sparcv9) {
79+    LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
80+    if (RelocM == Reloc::PIC_) {
81+      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
82+        dwarf::DW_EH_PE_sdata4;
83+      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
84+      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
85+        dwarf::DW_EH_PE_sdata4;
86+    } else {
87+      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
88+      FDEEncoding = dwarf::DW_EH_PE_udata4;
89+      TTypeEncoding = dwarf::DW_EH_PE_absptr;
90+    }
91   } else if (T.getArch() == Triple::systemz) {
92     // All currently-defined code models guarantee that 4-byte PC-relative
93     // values will be in range.
94Index: test/CodeGen/SPARC/exception.ll
95===================================================================
96--- test/CodeGen/SPARC/exception.ll
97+++ test/CodeGen/SPARC/exception.ll
98@@ -1,4 +1,7 @@
99-; RUN: llc < %s -march=sparc | FileCheck %s
100+; RUN: llc < %s -march=sparc   -relocation-model=static | FileCheck -check-prefix=V8ABS %s
101+; RUN: llc < %s -march=sparc   -relocation-model=pic    | FileCheck -check-prefix=V8PIC %s
102+; RUN: llc < %s -march=sparcv9 -relocation-model=static | FileCheck -check-prefix=V9ABS %s
103+; RUN: llc < %s -march=sparcv9 -relocation-model=pic    | FileCheck -check-prefix=V9PIC %s
104 
105 
106 %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo }
107@@ -9,23 +12,64 @@
108 @.cst = linker_private unnamed_addr constant [12 x i8] c"catched int\00", align 64
109 @.cst1 = linker_private unnamed_addr constant [14 x i8] c"catched float\00", align 64
110 
111-; CHECK-LABEL: main:
112-; CHECK:       .cfi_startproc
113-; CHECK:       .cfi_def_cfa_register {{30|%fp}}
114-; CHECK:       .cfi_window_save
115-; CHECK:       .cfi_register 15, 31
116+; V8ABS-LABEL: main:
117+; V8ABS:        .cfi_startproc
118+; V8ABS:        .cfi_personality 0, __gxx_personality_v0
119+; V8ABS:        .cfi_lsda 0,
120+; V8ABS:        .cfi_def_cfa_register {{30|%fp}}
121+; V8ABS:        .cfi_window_save
122+; V8ABS:        .cfi_register 15, 31
123 
124-; CHECK:        call __cxa_throw
125-; CHECK:        call __cxa_throw
126+; V8ABS:        call __cxa_throw
127+; V8ABS:        call __cxa_throw
128 
129-; CHECK:        call __cxa_begin_catch
130-; CHECK:        call __cxa_end_catch
131+; V8ABS:        call __cxa_begin_catch
132+; V8ABS:        call __cxa_end_catch
133 
134-; CHECK:        call __cxa_begin_catch
135-; CHECK:        call __cxa_end_catch
136+; V8ABS:        call __cxa_begin_catch
137+; V8ABS:        call __cxa_end_catch
138 
139-; CHECK:        .cfi_endproc
140+; V8ABS:        .cfi_endproc
141 
142+; V8PIC-LABEL: main:
143+; V8PIC:        .cfi_startproc
144+; V8PIC:        .cfi_personality 155, DW.ref.__gxx_personality_v0
145+; V8PIC:        .cfi_lsda 27,
146+; V8PIC:        .cfi_def_cfa_register {{30|%fp}}
147+; V8PIC:        .cfi_window_save
148+; V8PIC:        .cfi_register 15, 31
149+; V8PIC:        .section .gcc_except_table
150+; V8PIC-NOT:    .section
151+; V8PIC:        .word .L_ZTIi.DW.stub-
152+; V8PIC:        .data
153+; V8PIC: .L_ZTIi.DW.stub:
154+; V8PIC-NEXT:   .word _ZTIi
155+
156+; V9ABS-LABEL: main:
157+; V9ABS:        .cfi_startproc
158+; V9ABS:        .cfi_personality 0, __gxx_personality_v0
159+; V9ABS:        .cfi_lsda 27,
160+; V9ABS:        .cfi_def_cfa_register {{30|%fp}}
161+; V9ABS:        .cfi_window_save
162+; V9ABS:        .cfi_register 15, 31
163+; V9ABS:        .section .gcc_except_table
164+; V9ABS-NOT:    .section
165+; V9ABS:        .xword _ZTIi
166+
167+; V9PIC-LABEL: main:
168+; V9PIC:        .cfi_startproc
169+; V9PIC:        .cfi_personality 155, DW.ref.__gxx_personality_v0
170+; V9PIC:        .cfi_lsda 27,
171+; V9PIC:        .cfi_def_cfa_register {{30|%fp}}
172+; V9PIC:        .cfi_window_save
173+; V9PIC:        .cfi_register 15, 31
174+; V9PIC:        .section .gcc_except_table
175+; V9PIC-NOT:    .section
176+; V9PIC:        .word .L_ZTIi.DW.stub-
177+; V9PIC:        .data
178+; V9PIC: .L_ZTIi.DW.stub:
179+; V9PIC-NEXT:   .xword _ZTIi
180+
181 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 {
182 entry:
183   %0 = icmp eq i32 %argc, 2
184