- Add target lowering methods to get the preferred format for the FDE and LSDA
[oota-llvm.git] / lib / Target / X86 / X86ISelLowering.cpp
index 15af42e8c48da43597f8ec0db2b7452870dace19..3600987f26a624ba6d80f3213bd939666f58c2dd 100644 (file)
@@ -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
 //===----------------------------------------------------------------------===//