1 Pull in r200282 from upstream llvm trunk (by Jakob Stoklund Olesen):
3 Fix the DWARF EH encodings for Sparc PIC code.
5 Also emit the stubs that were generated for references to typeinfo
8 Introduced here: http://svnweb.freebsd.org/changeset/base/262261
10 Index: lib/Target/Sparc/SparcAsmPrinter.cpp
11 ===================================================================
12 --- lib/Target/Sparc/SparcAsmPrinter.cpp
13 +++ lib/Target/Sparc/SparcAsmPrinter.cpp
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 {
26 virtual void EmitFunctionBodyStart();
27 virtual void EmitInstruction(const MachineInstr *MI);
28 + virtual void EmitEndOfAsmFile(Module &M);
30 static const char *getRegisterName(unsigned RegNo) {
31 return SparcInstPrinter::getRegisterName(RegNo);
32 @@ -450,6 +453,23 @@ bool SparcAsmPrinter::PrintAsmMemoryOperand(const
36 +void SparcAsmPrinter::EmitEndOfAsmFile(Module &M) {
37 + const TargetLoweringObjectFileELF &TLOFELF =
38 + static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering());
39 + MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
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);
53 // Force static initialization.
54 extern "C" void LLVMInitializeSparcAsmPrinter() {
55 RegisterAsmPrinter<SparcAsmPrinter> X(TheSparcTarget);
56 Index: 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;
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;
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;
87 + PersonalityEncoding = dwarf::DW_EH_PE_absptr;
88 + FDEEncoding = dwarf::DW_EH_PE_udata4;
89 + TTypeEncoding = dwarf::DW_EH_PE_absptr;
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.
94 Index: test/CodeGen/SPARC/exception.ll
95 ===================================================================
96 --- test/CodeGen/SPARC/exception.ll
97 +++ test/CodeGen/SPARC/exception.ll
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
106 %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo }
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
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
124 -; CHECK: call __cxa_throw
125 -; CHECK: call __cxa_throw
126 +; V8ABS: call __cxa_throw
127 +; V8ABS: call __cxa_throw
129 -; CHECK: call __cxa_begin_catch
130 -; CHECK: call __cxa_end_catch
131 +; V8ABS: call __cxa_begin_catch
132 +; V8ABS: call __cxa_end_catch
134 -; CHECK: call __cxa_begin_catch
135 -; CHECK: call __cxa_end_catch
136 +; V8ABS: call __cxa_begin_catch
137 +; V8ABS: call __cxa_end_catch
139 -; CHECK: .cfi_endproc
140 +; V8ABS: .cfi_endproc
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-
153 +; V8PIC: .L_ZTIi.DW.stub:
154 +; V8PIC-NEXT: .word _ZTIi
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
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-
178 +; V9PIC: .L_ZTIi.DW.stub:
179 +; V9PIC-NEXT: .xword _ZTIi
181 define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 {
183 %0 = icmp eq i32 %argc, 2