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