GCC doesn't emit DW_EH_PE_sdata4 for the FDE encoding on Darwin. I'm not sure
authorBill Wendling <isanbard@gmail.com>
Wed, 24 Dec 2008 05:25:49 +0000 (05:25 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 24 Dec 2008 05:25:49 +0000 (05:25 +0000)
about other platforms.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@61415 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetAsmInfo.h
lib/CodeGen/AsmPrinter/DwarfWriter.cpp
lib/Target/TargetAsmInfo.cpp
lib/Target/X86/X86TargetAsmInfo.cpp

index d4aadb964bd66d001d503c879ad1a1b777486305..6080619c3686afe397609d430dff4d8964184f05 100644 (file)
@@ -448,6 +448,11 @@ namespace llvm {
     ///
     bool DwarfRequiresFrameSection; // Defaults to true.
 
+    /// FDEEncodingRequiresSData4 - If set, the FDE Encoding in the EH section
+    /// includes DW_EH_PE_sdata4.
+    /// 
+    bool FDEEncodingRequiresSData4;         // Defaults to true
+
     /// GlobalEHDirective - This is the directive used to make exception frame
     /// tables globally visible.
     ///
@@ -814,6 +819,9 @@ namespace llvm {
     bool doesDwarfRequireFrameSection() const {
       return DwarfRequiresFrameSection;
     }
+    bool doesFDEEncodingRequireSData4() const {
+      return FDEEncodingRequiresSData4;
+    }
     const char *getGlobalEHDirective() const {
       return GlobalEHDirective;
     }
index d22bbb2f2c28329a963767a03faa7eb7a7e103cf..42ed34879e3f915ab0b4ed7f13564ff35859542a 100644 (file)
@@ -3017,13 +3017,25 @@ private:
 
       Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
       Asm->EOL("LSDA Encoding (pcrel sdata4)");
-      Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
-      Asm->EOL("FDE Encoding (pcrel sdata4)");
+
+      if (TAI->doesFDEEncodingRequireSData4()) {
+        Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+        Asm->EOL("FDE Encoding (pcrel sdata4)");
+      } else {
+        Asm->EmitInt8(DW_EH_PE_pcrel);
+        Asm->EOL("FDE Encoding (pcrel)");
+      }
    } else {
       Asm->EmitULEB128Bytes(1);
       Asm->EOL("Augmentation Size");
-      Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
-      Asm->EOL("FDE Encoding (pcrel sdata4)");
+
+      if (TAI->doesFDEEncodingRequireSData4()) {
+        Asm->EmitInt8(DW_EH_PE_pcrel | DW_EH_PE_sdata4);
+        Asm->EOL("FDE Encoding (pcrel sdata4)");
+      } else {
+        Asm->EmitInt8(DW_EH_PE_pcrel);
+        Asm->EOL("FDE Encoding (pcrel)");
+      }
     }
 
     // Indicate locations of general callee saved registers in frame.
index d79652ac5666c8473a9a34c4d38de05a8ad1b9f6..b6adbe7ac12160abba3c2420da3584f25c819a20 100644 (file)
@@ -99,6 +99,7 @@ void TargetAsmInfo::fillDefaultValues() {
   SupportsDebugInformation = false;
   SupportsExceptionHandling = false;
   DwarfRequiresFrameSection = true;
+  FDEEncodingRequiresSData4 = true;
   GlobalEHDirective = 0;
   SupportsWeakOmittedEHFrame = true;
   DwarfSectionOffsetDirective = 0;
index e3336509a766c2615b65a308c6ca1030dc0255da..0dfb8550f6d46febed0c790674fcc08deca77c6e 100644 (file)
@@ -70,6 +70,7 @@ X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM):
   COMMDirectiveTakesAlignment = (Subtarget->getDarwinVers() >= 9);
   HasDotTypeDotSizeDirective = false;
   HasSingleParameterDotFile = false;
+  FDEEncodingRequiresSData4 = false;
   if (TM.getRelocationModel() == Reloc::Static) {
     StaticCtorsSection = ".constructor";
     StaticDtorsSection = ".destructor";