summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff')
-rw-r--r--contrib/llvm/patches/patch-r262261-llvm-r200282-sparc.diff183
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
OpenPOWER on IntegriCloud