aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 15af42e..3600987 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/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
//===----------------------------------------------------------------------===//