Fix DWARF debugging information on x86/Linux and (hopefully)
authorAnton Korobeynikov <asl@math.spbu.ru>
Wed, 7 Mar 2007 02:47:57 +0000 (02:47 +0000)
committerAnton Korobeynikov <asl@math.spbu.ru>
Wed, 7 Mar 2007 02:47:57 +0000 (02:47 +0000)
Mingw32/Cygwin targets. This fixes PR978

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

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

index a109d77db654638d3c82e495abc7280c35a189c1..36f5a1906b522d863f1c6b093f3623c07b5dbe6b 100644 (file)
@@ -246,6 +246,10 @@ namespace llvm {
     
     //===--- Dwarf Emission Directives -----------------------------------===//
 
+    /// AbsoluteSectionOffsets - True if we should emit abolute section
+    /// offsets. Defaults to false.
+    bool AbsoluteSectionOffsets;
+    
     /// HasLEB128 - True if target asm supports leb128 directives.
     ///
     bool HasLEB128; // Defaults to false.
@@ -266,6 +270,9 @@ namespace llvm {
     ///
     bool DwarfRequiresFrameSection; // Defaults to true.
 
+    /// DwarfSectionOffsetDirective - Special section offset directive.
+    const char* DwarfSectionOffsetDirective; // Defaults to NULL
+    
     /// DwarfAbbrevSection - Section directive for Dwarf abbrev.
     ///
     const char *DwarfAbbrevSection; // Defaults to ".debug_abbrev".
@@ -494,6 +501,9 @@ namespace llvm {
     const char *getHiddenDirective() const {
       return HiddenDirective;
     }
+    bool isAbsoluteSectionOffsets() const {
+      return AbsoluteSectionOffsets;
+    }
     bool hasLEB128() const {
       return HasLEB128;
     }
@@ -509,6 +519,9 @@ namespace llvm {
     bool getDwarfRequiresFrameSection() const {
       return DwarfRequiresFrameSection;
     }
+    const char *getDwarfSectionOffsetDirective() const {
+      return DwarfSectionOffsetDirective;
+    }    
     const char *getDwarfAbbrevSection() const {
       return DwarfAbbrevSection;
     }
index 0bf37a77eefb807a91ca0924ccaa84813d5e5b6b..74978506d9d6c0aec45ff77eb12fe2ba355cce95 100644 (file)
@@ -823,8 +823,12 @@ public:
   void PrintLabelName(DWLabel Label) const {
     PrintLabelName(Label.Tag, Label.Number);
   }
-  void PrintLabelName(const char *Tag, unsigned Number) const {
-    O << TAI->getPrivateGlobalPrefix() << Tag;
+  void PrintLabelName(const char *Tag, unsigned Number,
+                      bool isInSection = false) const {
+    if (isInSection && TAI->getDwarfSectionOffsetDirective())
+      O << TAI->getDwarfSectionOffsetDirective() << Tag;
+    else
+      O << TAI->getPrivateGlobalPrefix() << Tag;
     if (Number) O << Number;
   }
   
@@ -907,7 +911,44 @@ public:
       PrintLabelName(TagLo, NumberLo);
     }
   }
-                      
+
+  void EmitSectionOffset(const char* Label, const char* Section,
+                         unsigned LabelNumber, unsigned SectionNumber,
+                         bool IsSmall = false) const {
+    if (TAI->needsSet()) {
+      static unsigned SetCounter = 1;
+      
+      O << "\t.set\t";
+      PrintLabelName("set", SetCounter);
+      O << ",";
+      PrintLabelName(Label, LabelNumber, true);
+      if (!TAI->isAbsoluteSectionOffsets()) {
+        O << "-";
+        PrintLabelName(Section, SectionNumber);
+      }      
+      O << "\n";
+      
+      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
+        O << TAI->getData32bitsDirective();
+      else
+        O << TAI->getData64bitsDirective();
+        
+      PrintLabelName("set", SetCounter);
+      ++SetCounter;
+    } else {
+      if (IsSmall || TAI->getAddressSize() == sizeof(int32_t))
+        O << TAI->getData32bitsDirective();
+      else
+        O << TAI->getData64bitsDirective();
+        
+      PrintLabelName(Label, LabelNumber, true);
+      if (!TAI->isAbsoluteSectionOffsets()) {
+        O << "-";
+        PrintLabelName(Section, SectionNumber);
+      }
+    }    
+  }
+  
   /// EmitFrameMoves - Emit frame instructions to describe the layout of the
   /// frame.
   void EmitFrameMoves(const char *BaseLabel, unsigned BaseLabelID,
@@ -1649,8 +1690,11 @@ private:
   CompileUnit *NewCompileUnit(CompileUnitDesc *UnitDesc, unsigned ID) {
     // Construct debug information entry.
     DIE *Die = new DIE(DW_TAG_compile_unit);
-    AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0),
-                                                  DWLabel("section_line", 0));
+    if (TAI->isAbsoluteSectionOffsets())
+      AddLabel(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0));
+    else
+      AddDelta(Die, DW_AT_stmt_list, DW_FORM_data4, DWLabel("section_line", 0),
+               DWLabel("section_line", 0));      
     AddString(Die, DW_AT_producer,  DW_FORM_string, UnitDesc->getProducer());
     AddUInt  (Die, DW_AT_language,  DW_FORM_data1,  UnitDesc->getLanguage());
     AddString(Die, DW_AT_name,      DW_FORM_string, UnitDesc->getFileName());
@@ -2065,7 +2109,7 @@ private:
                            
     Asm->EmitInt32(ContentSize);  Asm->EOL("Length of Compilation Unit Info");
     Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF version number");
-    EmitDifference("abbrev_begin", 0, "section_abbrev", 0, true);
+    EmitSectionOffset("abbrev_begin", "section_abbrev", 0, 0, true);
     Asm->EOL("Offset Into Abbrev. Section");
     Asm->EmitInt8(TAI->getAddressSize()); Asm->EOL("Address Size (in bytes)");
   
@@ -2323,8 +2367,8 @@ private:
     Asm->EOL("Length of Frame Information Entry");
     
     EmitLabel("frame_begin", SubprogramCount);
-    
-    EmitDifference("frame_common_begin", 0, "section_frame", 0, true);
+
+    EmitSectionOffset("frame_common_begin", "section_frame", 0, 0, true);
     Asm->EOL("FDE CIE offset");
 
     EmitReference("func_begin", SubprogramCount);
@@ -2358,8 +2402,8 @@ private:
     EmitLabel("pubnames_begin", Unit->getID());
     
     Asm->EmitInt16(DWARF_VERSION); Asm->EOL("DWARF Version");
-    
-    EmitDifference("info_begin", Unit->getID(), "section_info", 0, true);
+
+    EmitSectionOffset("info_begin", "section_info", Unit->getID(), 0, true);
     Asm->EOL("Offset of Compilation Unit Info");
 
     EmitDifference("info_end", Unit->getID(), "info_begin", Unit->getID(),true);
@@ -2786,9 +2830,9 @@ private:
       Asm->EOL("Length of Frame Information Entry");
       
       EmitLabel("eh_frame_begin", SubprogramCount);
-      
-      EmitDifference("eh_frame_begin", SubprogramCount,
-                     "section_eh_frame", 0, true);
+
+      EmitSectionOffset("eh_frame_begin", "section_eh_frame",
+                        SubprogramCount, 0, true);
       Asm->EOL("FDE CIE offset");
 
       EmitReference("eh_func_begin", SubprogramCount, true);
@@ -2951,8 +2995,8 @@ private:
     // Emit the landng pad site information.
     for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) {
       const LandingPadInfo &LandingPad = LandingPads[i];
-      EmitDifference("label", LandingPad.BeginLabel,
-                     "eh_func_begin", SubprogramCount);
+      EmitSectionOffset("label", "eh_func_begin",
+                        LandingPad.BeginLabel, SubprogramCount);
       Asm->EOL("Region start");
       
       EmitDifference("label", LandingPad.EndLabel,
@@ -2965,8 +3009,8 @@ private:
         else
           Asm->EmitInt64(0);
       } else {
-        EmitDifference("label", LandingPad.LandingPadLabel,
-                       "eh_func_begin", SubprogramCount);
+        EmitSectionOffset("label", "eh_func_begin",
+                          LandingPad.LandingPadLabel, SubprogramCount);
       }
       Asm->EOL("Landing pad");
 
index efc54841b43d7e8bca9f22038f7342ea68e4be31..da477493440ef058adc67929e7857e2a1ddc6f34 100644 (file)
@@ -69,11 +69,13 @@ TargetAsmInfo::TargetAsmInfo() :
   UsedDirective(0),
   WeakRefDirective(0),
   HiddenDirective("\t.hidden\t"),
+  AbsoluteSectionOffsets(false),
   HasLEB128(false),
   HasDotLoc(false),
   HasDotFile(false),
   SupportsExceptionHandling(false),
   DwarfRequiresFrameSection(true),
+  DwarfSectionOffsetDirective(0),
   DwarfAbbrevSection(".debug_abbrev"),
   DwarfInfoSection(".debug_info"),
   DwarfLineSection(".debug_line"),
@@ -106,3 +108,4 @@ unsigned TargetAsmInfo::getInlineAsmLength(const char *Str) const {
   // Multiply by the worst-case length for each instruction.
   return NumInsts * MaxInstLength;
 }
+
index 23cab9dff7758ba7da9553ad42cf8ff6f6b8ed15..c66862aec6292380a92f4695cb9a8442032a47fc 100644 (file)
@@ -97,6 +97,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
   case X86Subtarget::isELF:
     // Set up DWARF directives
     HasLEB128 = true;  // Target asm supports leb128 directives (little-endian)
+    AbsoluteSectionOffsets = true;
     // bool HasLEB128; // Defaults to false.
     // hasDotLoc - True if target asm supports .loc directives.
     // bool HasDotLoc; // Defaults to false.
@@ -130,9 +131,11 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
 
     // Set up DWARF directives
     HasLEB128 = true;  // Target asm supports leb128 directives (little-endian)
+    AbsoluteSectionOffsets = true;
     PrivateGlobalPrefix = "L";  // Prefix for private global symbols
     WeakRefDirective = "\t.weak\t";
     DwarfRequiresFrameSection = false;
+    DwarfSectionOffsetDirective = "\t.secrel32\t";
     DwarfAbbrevSection =  "\t.section\t.debug_abbrev,\"dr\"";
     DwarfInfoSection =    "\t.section\t.debug_info,\"dr\"";
     DwarfLineSection =    "\t.section\t.debug_line,\"dr\"";