diff options
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.cpp | 34 | ||||
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelLowering.h | 8 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 43 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 8 |
4 files changed, 93 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp index ad9bbe1d311..1f51d048597 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -464,6 +464,40 @@ unsigned PPCTargetLowering::getFunctionAlignment(const Function *F) const { return 2; } +/// getPreferredLSDADataFormat - Return the preferred exception handling data +/// format for the LSDA. +unsigned PPCTargetLowering::getPreferredLSDADataFormat() const { + if (getTargetMachine().getSubtarget<PPCSubtarget>().isDarwin()) + return dwarf::DW_EH_PE_pcrel; + + if (PPCSubTarget.isPPC64() || + getTargetMachine().getRelocationModel() == Reloc::PIC_) { + unsigned DataTy = + (PPCSubTarget.isPPC64() ? + dwarf::DW_EH_PE_udata8 : dwarf::DW_EH_PE_udata4); + return dwarf::DW_EH_PE_pcrel | DataTy; + } + + return dwarf::DW_EH_PE_absptr; +} + +/// getPreferredFDEDataFormat - Return the preferred exception handling data +/// format for the FDE. +unsigned PPCTargetLowering::getPreferredFDEDataFormat() const { + if (getTargetMachine().getSubtarget<PPCSubtarget>().isDarwin()) + return dwarf::DW_EH_PE_pcrel; + + if (PPCSubTarget.isPPC64() || + getTargetMachine().getRelocationModel() == Reloc::PIC_) { + unsigned DataTy = + (PPCSubTarget.isPPC64() ? + dwarf::DW_EH_PE_udata8 : dwarf::DW_EH_PE_udata4); + return dwarf::DW_EH_PE_pcrel | DataTy; + } + + return dwarf::DW_EH_PE_absptr; +} + //===----------------------------------------------------------------------===// // Node matching predicates, for use by the tblgen matching code. //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.h b/llvm/lib/Target/PowerPC/PPCISelLowering.h index 19fef4da0b4..9e5e36ad14e 100644 --- a/llvm/lib/Target/PowerPC/PPCISelLowering.h +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.h @@ -346,6 +346,14 @@ namespace llvm { /// getFunctionAlignment - Return the Log2 alignment of this function. virtual unsigned getFunctionAlignment(const Function *F) const; + /// getPreferredLSDADataFormat - Return the preferred exception handling data + /// format for the LSDA. + virtual unsigned getPreferredLSDADataFormat() const; + + /// getPreferredFDEDataFormat - Return the preferred exception handling data + /// format for the FDE. + virtual unsigned getPreferredFDEDataFormat() const; + private: SDValue getFramePointerFrameIndex(SelectionDAG & DAG) const; SDValue getReturnAddrFrameIndex(SelectionDAG & DAG) const; diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 15af42e8c48..3600987f26a 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1055,6 +1055,49 @@ unsigned X86TargetLowering::getFunctionAlignment(const Function *F) const { return F->hasFnAttr(Attribute::OptimizeForSize) ? 0 : 4; } +/// getPreferredLSDADataFormat - Return the preferred exception handling data +/// format for the LSDA. +unsigned X86TargetLowering::getPreferredLSDADataFormat() const { + if (Subtarget->isTargetDarwin()) + return dwarf::DW_EH_PE_pcrel; + + CodeModel::Model M = getTargetMachine().getCodeModel(); + + if (getTargetMachine().getRelocationModel() == Reloc::PIC_) { + if (!Subtarget->is64Bit() || M == CodeModel::Small) + return dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + + return dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8; + } + + if (M == CodeModel::Small) + return dwarf::DW_EH_PE_sdata4; + + return dwarf::DW_EH_PE_absptr; +} + +/// getPreferredFDEDataFormat - Return the preferred exception handling data +/// format for the FDE. +unsigned X86TargetLowering::getPreferredFDEDataFormat() const { + if (Subtarget->isTargetDarwin()) + return dwarf::DW_EH_PE_pcrel; + + CodeModel::Model M = getTargetMachine().getCodeModel(); + + if (getTargetMachine().getRelocationModel() == Reloc::PIC_) { + if (!Subtarget->is64Bit() || + M == CodeModel::Small || M == CodeModel::Medium) + return dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; + + return dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8; + } + + if (M == CodeModel::Small || M == CodeModel::Medium) + return dwarf::DW_EH_PE_sdata4; + + return dwarf::DW_EH_PE_absptr; +} + //===----------------------------------------------------------------------===// // Return Value Calling Convention Implementation //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index 1c612a13a25..64716e9d2c9 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -560,6 +560,14 @@ namespace llvm { /// getFunctionAlignment - Return the Log2 alignment of this function. virtual unsigned getFunctionAlignment(const Function *F) const; + /// getPreferredLSDADataFormat - Return the preferred exception handling data + /// format for the LSDA. + virtual unsigned getPreferredLSDADataFormat() const; + + /// getPreferredFDEDataFormat - Return the preferred exception handling data + /// format for the FDE. + virtual unsigned getPreferredFDEDataFormat() const; + private: /// Subtarget - Keep a pointer to the X86Subtarget around so that we can /// make the right decision when generating code for different targets. |