1263320SdimPull in r200282 from upstream llvm trunk (by Jakob Stoklund Olesen):
2263320Sdim
3263320Sdim  Fix the DWARF EH encodings for Sparc PIC code.
4263320Sdim
5263320Sdim  Also emit the stubs that were generated for references to typeinfo
6263320Sdim  symbols.
7263320Sdim
8269012SemasteIntroduced here: http://svnweb.freebsd.org/changeset/base/262261
9263320Sdim
10263320SdimIndex: lib/Target/Sparc/SparcAsmPrinter.cpp
11263320Sdim===================================================================
12263320Sdim--- lib/Target/Sparc/SparcAsmPrinter.cpp
13263320Sdim+++ lib/Target/Sparc/SparcAsmPrinter.cpp
14263320Sdim@@ -23,7 +23,9 @@
15263320Sdim #include "llvm/ADT/SmallString.h"
16263320Sdim #include "llvm/CodeGen/AsmPrinter.h"
17263320Sdim #include "llvm/CodeGen/MachineInstr.h"
18263320Sdim+#include "llvm/CodeGen/MachineModuleInfoImpls.h"
19263320Sdim #include "llvm/CodeGen/MachineRegisterInfo.h"
20263320Sdim+#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
21263320Sdim #include "llvm/MC/MCAsmInfo.h"
22263320Sdim #include "llvm/MC/MCContext.h"
23263320Sdim #include "llvm/MC/MCInst.h"
24263320Sdim@@ -54,6 +56,7 @@ namespace {
25263320Sdim 
26263320Sdim     virtual void EmitFunctionBodyStart();
27263320Sdim     virtual void EmitInstruction(const MachineInstr *MI);
28263320Sdim+    virtual void EmitEndOfAsmFile(Module &M);
29263320Sdim 
30263320Sdim     static const char *getRegisterName(unsigned RegNo) {
31263320Sdim       return SparcInstPrinter::getRegisterName(RegNo);
32263320Sdim@@ -450,6 +453,23 @@ bool SparcAsmPrinter::PrintAsmMemoryOperand(const
33263320Sdim   return false;
34263320Sdim }
35263320Sdim 
36263320Sdim+void SparcAsmPrinter::EmitEndOfAsmFile(Module &M) {
37263320Sdim+  const TargetLoweringObjectFileELF &TLOFELF =
38263320Sdim+    static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering());
39263320Sdim+  MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
40263320Sdim+
41263320Sdim+  // Generate stubs for global variables.
42263320Sdim+  MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
43263320Sdim+  if (!Stubs.empty()) {
44263320Sdim+    OutStreamer.SwitchSection(TLOFELF.getDataSection());
45263320Sdim+    unsigned PtrSize = TM.getDataLayout()->getPointerSize(0);
46263320Sdim+    for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
47263320Sdim+      OutStreamer.EmitLabel(Stubs[i].first);
48263320Sdim+      OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), PtrSize);
49263320Sdim+    }
50263320Sdim+  }
51263320Sdim+}
52263320Sdim+
53263320Sdim // Force static initialization.
54263320Sdim extern "C" void LLVMInitializeSparcAsmPrinter() {
55263320Sdim   RegisterAsmPrinter<SparcAsmPrinter> X(TheSparcTarget);
56263320SdimIndex: lib/MC/MCObjectFileInfo.cpp
57263320Sdim===================================================================
58263320Sdim--- lib/MC/MCObjectFileInfo.cpp
59263320Sdim+++ lib/MC/MCObjectFileInfo.cpp
60263320Sdim@@ -310,6 +310,33 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Tri
61263320Sdim     FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
62263320Sdim     TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
63263320Sdim       dwarf::DW_EH_PE_udata8;
64263320Sdim+  } else if (T.getArch() == Triple::sparc) {
65263320Sdim+    if (RelocM == Reloc::PIC_) {
66263320Sdim+      LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
67263320Sdim+      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
68263320Sdim+        dwarf::DW_EH_PE_sdata4;
69263320Sdim+      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
70263320Sdim+      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
71263320Sdim+        dwarf::DW_EH_PE_sdata4;
72263320Sdim+    } else {
73263320Sdim+      LSDAEncoding = dwarf::DW_EH_PE_absptr;
74263320Sdim+      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
75263320Sdim+      FDEEncoding = dwarf::DW_EH_PE_udata4;
76263320Sdim+      TTypeEncoding = dwarf::DW_EH_PE_absptr;
77263320Sdim+    }
78263320Sdim+  } else if (T.getArch() == Triple::sparcv9) {
79263320Sdim+    LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
80263320Sdim+    if (RelocM == Reloc::PIC_) {
81263320Sdim+      PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
82263320Sdim+        dwarf::DW_EH_PE_sdata4;
83263320Sdim+      FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
84263320Sdim+      TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
85263320Sdim+        dwarf::DW_EH_PE_sdata4;
86263320Sdim+    } else {
87263320Sdim+      PersonalityEncoding = dwarf::DW_EH_PE_absptr;
88263320Sdim+      FDEEncoding = dwarf::DW_EH_PE_udata4;
89263320Sdim+      TTypeEncoding = dwarf::DW_EH_PE_absptr;
90263320Sdim+    }
91263320Sdim   } else if (T.getArch() == Triple::systemz) {
92263320Sdim     // All currently-defined code models guarantee that 4-byte PC-relative
93263320Sdim     // values will be in range.
94263320SdimIndex: test/CodeGen/SPARC/exception.ll
95263320Sdim===================================================================
96263320Sdim--- test/CodeGen/SPARC/exception.ll
97263320Sdim+++ test/CodeGen/SPARC/exception.ll
98263320Sdim@@ -1,4 +1,7 @@
99263320Sdim-; RUN: llc < %s -march=sparc | FileCheck %s
100263320Sdim+; RUN: llc < %s -march=sparc   -relocation-model=static | FileCheck -check-prefix=V8ABS %s
101263320Sdim+; RUN: llc < %s -march=sparc   -relocation-model=pic    | FileCheck -check-prefix=V8PIC %s
102263320Sdim+; RUN: llc < %s -march=sparcv9 -relocation-model=static | FileCheck -check-prefix=V9ABS %s
103263320Sdim+; RUN: llc < %s -march=sparcv9 -relocation-model=pic    | FileCheck -check-prefix=V9PIC %s
104263320Sdim 
105263320Sdim 
106263320Sdim %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo }
107263320Sdim@@ -9,23 +12,64 @@
108263320Sdim @.cst = linker_private unnamed_addr constant [12 x i8] c"catched int\00", align 64
109263320Sdim @.cst1 = linker_private unnamed_addr constant [14 x i8] c"catched float\00", align 64
110263320Sdim 
111263320Sdim-; CHECK-LABEL: main:
112263320Sdim-; CHECK:       .cfi_startproc
113263320Sdim-; CHECK:       .cfi_def_cfa_register {{30|%fp}}
114263320Sdim-; CHECK:       .cfi_window_save
115263320Sdim-; CHECK:       .cfi_register 15, 31
116263320Sdim+; V8ABS-LABEL: main:
117263320Sdim+; V8ABS:        .cfi_startproc
118263320Sdim+; V8ABS:        .cfi_personality 0, __gxx_personality_v0
119263320Sdim+; V8ABS:        .cfi_lsda 0,
120263320Sdim+; V8ABS:        .cfi_def_cfa_register {{30|%fp}}
121263320Sdim+; V8ABS:        .cfi_window_save
122263320Sdim+; V8ABS:        .cfi_register 15, 31
123263320Sdim 
124263320Sdim-; CHECK:        call __cxa_throw
125263320Sdim-; CHECK:        call __cxa_throw
126263320Sdim+; V8ABS:        call __cxa_throw
127263320Sdim+; V8ABS:        call __cxa_throw
128263320Sdim 
129263320Sdim-; CHECK:        call __cxa_begin_catch
130263320Sdim-; CHECK:        call __cxa_end_catch
131263320Sdim+; V8ABS:        call __cxa_begin_catch
132263320Sdim+; V8ABS:        call __cxa_end_catch
133263320Sdim 
134263320Sdim-; CHECK:        call __cxa_begin_catch
135263320Sdim-; CHECK:        call __cxa_end_catch
136263320Sdim+; V8ABS:        call __cxa_begin_catch
137263320Sdim+; V8ABS:        call __cxa_end_catch
138263320Sdim 
139263320Sdim-; CHECK:        .cfi_endproc
140263320Sdim+; V8ABS:        .cfi_endproc
141263320Sdim 
142263320Sdim+; V8PIC-LABEL: main:
143263320Sdim+; V8PIC:        .cfi_startproc
144263320Sdim+; V8PIC:        .cfi_personality 155, DW.ref.__gxx_personality_v0
145263320Sdim+; V8PIC:        .cfi_lsda 27,
146263320Sdim+; V8PIC:        .cfi_def_cfa_register {{30|%fp}}
147263320Sdim+; V8PIC:        .cfi_window_save
148263320Sdim+; V8PIC:        .cfi_register 15, 31
149263320Sdim+; V8PIC:        .section .gcc_except_table
150263320Sdim+; V8PIC-NOT:    .section
151263320Sdim+; V8PIC:        .word .L_ZTIi.DW.stub-
152263320Sdim+; V8PIC:        .data
153263320Sdim+; V8PIC: .L_ZTIi.DW.stub:
154263320Sdim+; V8PIC-NEXT:   .word _ZTIi
155263320Sdim+
156263320Sdim+; V9ABS-LABEL: main:
157263320Sdim+; V9ABS:        .cfi_startproc
158263320Sdim+; V9ABS:        .cfi_personality 0, __gxx_personality_v0
159263320Sdim+; V9ABS:        .cfi_lsda 27,
160263320Sdim+; V9ABS:        .cfi_def_cfa_register {{30|%fp}}
161263320Sdim+; V9ABS:        .cfi_window_save
162263320Sdim+; V9ABS:        .cfi_register 15, 31
163263320Sdim+; V9ABS:        .section .gcc_except_table
164263320Sdim+; V9ABS-NOT:    .section
165263320Sdim+; V9ABS:        .xword _ZTIi
166263320Sdim+
167263320Sdim+; V9PIC-LABEL: main:
168263320Sdim+; V9PIC:        .cfi_startproc
169263320Sdim+; V9PIC:        .cfi_personality 155, DW.ref.__gxx_personality_v0
170263320Sdim+; V9PIC:        .cfi_lsda 27,
171263320Sdim+; V9PIC:        .cfi_def_cfa_register {{30|%fp}}
172263320Sdim+; V9PIC:        .cfi_window_save
173263320Sdim+; V9PIC:        .cfi_register 15, 31
174263320Sdim+; V9PIC:        .section .gcc_except_table
175263320Sdim+; V9PIC-NOT:    .section
176263320Sdim+; V9PIC:        .word .L_ZTIi.DW.stub-
177263320Sdim+; V9PIC:        .data
178263320Sdim+; V9PIC: .L_ZTIi.DW.stub:
179263320Sdim+; V9PIC-NEXT:   .xword _ZTIi
180263320Sdim+
181263320Sdim define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 {
182263320Sdim entry:
183263320Sdim   %0 = icmp eq i32 %argc, 2
184