Pull in r200282 from upstream llvm trunk (by Jakob Stoklund Olesen): Fix the DWARF EH encodings for Sparc PIC code. Also emit the stubs that were generated for references to typeinfo symbols. Introduced here: http://svnweb.freebsd.org/changeset/base/262261 Index: lib/Target/Sparc/SparcAsmPrinter.cpp =================================================================== --- lib/Target/Sparc/SparcAsmPrinter.cpp +++ lib/Target/Sparc/SparcAsmPrinter.cpp @@ -23,7 +23,9 @@ #include "llvm/ADT/SmallString.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/CodeGen/MachineRegisterInfo.h" +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInst.h" @@ -54,6 +56,7 @@ namespace { virtual void EmitFunctionBodyStart(); virtual void EmitInstruction(const MachineInstr *MI); + virtual void EmitEndOfAsmFile(Module &M); static const char *getRegisterName(unsigned RegNo) { return SparcInstPrinter::getRegisterName(RegNo); @@ -450,6 +453,23 @@ bool SparcAsmPrinter::PrintAsmMemoryOperand(const return false; } +void SparcAsmPrinter::EmitEndOfAsmFile(Module &M) { + const TargetLoweringObjectFileELF &TLOFELF = + static_cast(getObjFileLowering()); + MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo(); + + // Generate stubs for global variables. + MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList(); + if (!Stubs.empty()) { + OutStreamer.SwitchSection(TLOFELF.getDataSection()); + unsigned PtrSize = TM.getDataLayout()->getPointerSize(0); + for (unsigned i = 0, e = Stubs.size(); i != e; ++i) { + OutStreamer.EmitLabel(Stubs[i].first); + OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(), PtrSize); + } + } +} + // Force static initialization. extern "C" void LLVMInitializeSparcAsmPrinter() { RegisterAsmPrinter X(TheSparcTarget); Index: lib/MC/MCObjectFileInfo.cpp =================================================================== --- lib/MC/MCObjectFileInfo.cpp +++ lib/MC/MCObjectFileInfo.cpp @@ -310,6 +310,33 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Tri FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8; TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8; + } else if (T.getArch() == Triple::sparc) { + if (RelocM == Reloc::PIC_) { + LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | + dwarf::DW_EH_PE_sdata4; + FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | + dwarf::DW_EH_PE_sdata4; + } else { + LSDAEncoding = dwarf::DW_EH_PE_absptr; + PersonalityEncoding = dwarf::DW_EH_PE_absptr; + FDEEncoding = dwarf::DW_EH_PE_udata4; + TTypeEncoding = dwarf::DW_EH_PE_absptr; + } + } else if (T.getArch() == Triple::sparcv9) { + LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + if (RelocM == Reloc::PIC_) { + PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | + dwarf::DW_EH_PE_sdata4; + FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | + dwarf::DW_EH_PE_sdata4; + } else { + PersonalityEncoding = dwarf::DW_EH_PE_absptr; + FDEEncoding = dwarf::DW_EH_PE_udata4; + TTypeEncoding = dwarf::DW_EH_PE_absptr; + } } else if (T.getArch() == Triple::systemz) { // All currently-defined code models guarantee that 4-byte PC-relative // values will be in range. Index: test/CodeGen/SPARC/exception.ll =================================================================== --- test/CodeGen/SPARC/exception.ll +++ test/CodeGen/SPARC/exception.ll @@ -1,4 +1,7 @@ -; RUN: llc < %s -march=sparc | FileCheck %s +; RUN: llc < %s -march=sparc -relocation-model=static | FileCheck -check-prefix=V8ABS %s +; RUN: llc < %s -march=sparc -relocation-model=pic | FileCheck -check-prefix=V8PIC %s +; RUN: llc < %s -march=sparcv9 -relocation-model=static | FileCheck -check-prefix=V9ABS %s +; RUN: llc < %s -march=sparcv9 -relocation-model=pic | FileCheck -check-prefix=V9PIC %s %struct.__fundamental_type_info_pseudo = type { %struct.__type_info_pseudo } @@ -9,23 +12,64 @@ @.cst = linker_private unnamed_addr constant [12 x i8] c"catched int\00", align 64 @.cst1 = linker_private unnamed_addr constant [14 x i8] c"catched float\00", align 64 -; CHECK-LABEL: main: -; CHECK: .cfi_startproc -; CHECK: .cfi_def_cfa_register {{30|%fp}} -; CHECK: .cfi_window_save -; CHECK: .cfi_register 15, 31 +; V8ABS-LABEL: main: +; V8ABS: .cfi_startproc +; V8ABS: .cfi_personality 0, __gxx_personality_v0 +; V8ABS: .cfi_lsda 0, +; V8ABS: .cfi_def_cfa_register {{30|%fp}} +; V8ABS: .cfi_window_save +; V8ABS: .cfi_register 15, 31 -; CHECK: call __cxa_throw -; CHECK: call __cxa_throw +; V8ABS: call __cxa_throw +; V8ABS: call __cxa_throw -; CHECK: call __cxa_begin_catch -; CHECK: call __cxa_end_catch +; V8ABS: call __cxa_begin_catch +; V8ABS: call __cxa_end_catch -; CHECK: call __cxa_begin_catch -; CHECK: call __cxa_end_catch +; V8ABS: call __cxa_begin_catch +; V8ABS: call __cxa_end_catch -; CHECK: .cfi_endproc +; V8ABS: .cfi_endproc +; V8PIC-LABEL: main: +; V8PIC: .cfi_startproc +; V8PIC: .cfi_personality 155, DW.ref.__gxx_personality_v0 +; V8PIC: .cfi_lsda 27, +; V8PIC: .cfi_def_cfa_register {{30|%fp}} +; V8PIC: .cfi_window_save +; V8PIC: .cfi_register 15, 31 +; V8PIC: .section .gcc_except_table +; V8PIC-NOT: .section +; V8PIC: .word .L_ZTIi.DW.stub- +; V8PIC: .data +; V8PIC: .L_ZTIi.DW.stub: +; V8PIC-NEXT: .word _ZTIi + +; V9ABS-LABEL: main: +; V9ABS: .cfi_startproc +; V9ABS: .cfi_personality 0, __gxx_personality_v0 +; V9ABS: .cfi_lsda 27, +; V9ABS: .cfi_def_cfa_register {{30|%fp}} +; V9ABS: .cfi_window_save +; V9ABS: .cfi_register 15, 31 +; V9ABS: .section .gcc_except_table +; V9ABS-NOT: .section +; V9ABS: .xword _ZTIi + +; V9PIC-LABEL: main: +; V9PIC: .cfi_startproc +; V9PIC: .cfi_personality 155, DW.ref.__gxx_personality_v0 +; V9PIC: .cfi_lsda 27, +; V9PIC: .cfi_def_cfa_register {{30|%fp}} +; V9PIC: .cfi_window_save +; V9PIC: .cfi_register 15, 31 +; V9PIC: .section .gcc_except_table +; V9PIC-NOT: .section +; V9PIC: .word .L_ZTIi.DW.stub- +; V9PIC: .data +; V9PIC: .L_ZTIi.DW.stub: +; V9PIC-NEXT: .xword _ZTIi + define i32 @main(i32 %argc, i8** nocapture readnone %argv) unnamed_addr #0 { entry: %0 = icmp eq i32 %argc, 2