diff options
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff')
-rw-r--r-- | contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff b/contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff new file mode 100644 index 0000000..95f2868 --- /dev/null +++ b/contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff @@ -0,0 +1,183 @@ +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://svn.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<const TargetLoweringObjectFileELF &>(getObjFileLowering()); ++ MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>(); ++ ++ // 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<SparcAsmPrinter> 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 |