184 lines
7.0 KiB
Diff
184 lines
7.0 KiB
Diff
|
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
|