OSDN Git Service

Place dwarf headers at earliest possible point. Well behaved when skipping
authorJim Laskey <jlaskey@mac.com>
Wed, 14 Jun 2006 11:35:03 +0000 (11:35 +0000)
committerJim Laskey <jlaskey@mac.com>
Wed, 14 Jun 2006 11:35:03 +0000 (11:35 +0000)
functions.

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

include/llvm/CodeGen/DwarfWriter.h
lib/CodeGen/DwarfWriter.cpp
lib/CodeGen/MachineDebugInfo.cpp
lib/Target/PowerPC/PPCAsmPrinter.cpp
lib/Target/X86/X86ATTAsmPrinter.cpp

index 1575fbe..cfa90f2 100644 (file)
@@ -106,6 +106,15 @@ protected:
   ///
   bool didInitial;
   
+  /// shouldEmit - Flag to indicate if debug information should be emitted.
+  ///
+  bool shouldEmit;
+  
+  /// IsNormalText - Flag to indicate if routine is not special case text
+  /// (coalesced.)
+  // FIXME - should be able to debug coalesced functions.
+  bool IsNormalText;
+
   /// SubprogramCount - The running count of functions being compiled.
   ///
   unsigned SubprogramCount;
@@ -372,7 +381,7 @@ private:
 
   /// EmitInitial - Emit initial Dwarf declarations.
   ///
-  void EmitInitial() const;
+  void EmitInitial();
   
   /// EmitDIE - Recusively Emits a debug information entry.
   ///
@@ -448,9 +457,8 @@ private:
   void ConstructSubprogramDIEs();
 
   /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made.
-  /// When called it also checks to see if debug info is newly available.  if
-  /// so the initial Dwarf headers are emitted.
-  bool ShouldEmitDwarf();
+  ///
+  bool ShouldEmitDwarf() const { return shouldEmit; }
 
 public:
   
@@ -475,11 +483,15 @@ public:
   
   /// BeginFunction - Gather pre-function debug information.  Assumes being 
   /// emitted immediately after the function entry point.
-  void BeginFunction(MachineFunction *MF);
+  void BeginFunction(MachineFunction *MF, bool IsNormalText);
   
   /// EndFunction - Gather and emit post-function debug information.
   ///
   void EndFunction();
+  
+  /// NonFunction - Function does not have a true body.
+  ///
+  void NonFunction();
 };
 
 } // end llvm namespace
index 9aff438..3aadd97 100644 (file)
@@ -1646,7 +1646,11 @@ void DwarfWriter::ConstructRootScope(DebugScope *RootScope) {
 /// EmitInitial - Emit initial Dwarf declarations.  This is necessary for cc
 /// tools to recognize the object file contains Dwarf information.
 ///
-void DwarfWriter::EmitInitial() const {
+void DwarfWriter::EmitInitial() {
+  // Check to see if we already emitted intial headers.
+  if (didInitial) return;
+  didInitial = true;
+  
   // Dwarf sections base addresses.
   Asm->SwitchToDataSection(DwarfFrameSection, 0);
   EmitLabel("section_frame", 0);
@@ -1676,6 +1680,9 @@ void DwarfWriter::EmitInitial() const {
   EmitLabel("text_begin", 0);
   Asm->SwitchToDataSection(DataSection, 0);
   EmitLabel("data_begin", 0);
+  
+  // Emit common frame information.
+  EmitInitialDebugFrame();
 }
 
 /// EmitDIE - Recusively Emits a debug information entry.
@@ -2286,35 +2293,6 @@ void DwarfWriter::ConstructSubprogramDIEs() {
   }
 }
 
-/// ShouldEmitDwarf - Determine if Dwarf declarations should be made.
-///
-bool DwarfWriter::ShouldEmitDwarf() {
-  // Check if debug info is present.
-  if (!DebugInfo || !DebugInfo->hasInfo()) return false;
-  
-  // Make sure initial declarations are made.
-  if (!didInitial) {
-    EmitInitial();
-  
-    // Emit common frame information.
-    EmitInitialDebugFrame();
-  
-    // Create all the compile unit DIEs.
-    ConstructCompileUnitDIEs();
-    
-    // Create DIEs for each of the externally visible global variables.
-    ConstructGlobalDIEs();
-
-    // Create DIEs for each of the externally visible subprograms.
-    ConstructSubprogramDIEs();
-
-    didInitial = true;
-  }
-  
-  // Okay to emit.
-  return true;
-}
-
 //===----------------------------------------------------------------------===//
 // Main entry points.
 //
@@ -2328,6 +2306,8 @@ DwarfWriter::DwarfWriter(std::ostream &OS, AsmPrinter *A)
 , MF(NULL)
 , DebugInfo(NULL)
 , didInitial(false)
+, shouldEmit(false)
+, IsNormalText(false)
 , SubprogramCount(0)
 , CompileUnits()
 , Abbreviations()
@@ -2363,7 +2343,23 @@ DwarfWriter::~DwarfWriter() {
 /// SetDebugInfo - Set DebugInfo when it's known that pass manager has
 /// created it.  Set by the target AsmPrinter.
 void DwarfWriter::SetDebugInfo(MachineDebugInfo *DI) {
-  DebugInfo = DI;
+  // Make sure initial declarations are made.
+  if (!DebugInfo && DI->hasInfo()) {
+    DebugInfo = DI;
+    shouldEmit = true;
+    
+    // Emit initial sections
+    EmitInitial();
+  
+    // Create all the compile unit DIEs.
+    ConstructCompileUnitDIEs();
+    
+    // Create DIEs for each of the externally visible global variables.
+    ConstructGlobalDIEs();
+
+    // Create DIEs for each of the externally visible subprograms.
+    ConstructSubprogramDIEs();
+  }
 }
 
 /// BeginModule - Emit all Dwarf sections that should come prior to the content.
@@ -2420,17 +2416,24 @@ void DwarfWriter::EndModule() {
 
 /// BeginFunction - Gather pre-function debug information.  Assumes being 
 /// emitted immediately after the function entry point.
-void DwarfWriter::BeginFunction(MachineFunction *MF) {
+void DwarfWriter::BeginFunction(MachineFunction *MF, bool IsNormalText) {
   this->MF = MF;
+  // FIXME - should be able to debug coalesced functions.
+  this->IsNormalText = IsNormalText;
   
-  // Begin accumulating function debug information.
-  DebugInfo->BeginFunction(MF);
-  
-  if (!ShouldEmitDwarf()) return;
-  EOL("Dwarf Begin Function");
+  // FIXME - should be able to debug coalesced functions.
+  if (IsNormalText) {
+    // Begin accumulating function debug information.
+    DebugInfo->BeginFunction(MF);
+    
+    if (!ShouldEmitDwarf()) return;
+    EOL("Dwarf Begin Function");
   
-  // Assumes in correct section after the entry point.
-  EmitLabel("func_begin", ++SubprogramCount);
+    // Assumes in correct section after the entry point.
+    EmitLabel("func_begin", ++SubprogramCount);
+  } else {
+    ShouldEmitDwarf();
+  }
 }
 
 /// EndFunction - Gather and emit post-function debug information.
@@ -2439,14 +2442,17 @@ void DwarfWriter::EndFunction() {
   if (!ShouldEmitDwarf()) return;
   EOL("Dwarf End Function");
   
-  // Define end label for subprogram.
-  EmitLabel("func_end", SubprogramCount);
-  
-  // Construct scopes for subprogram.
-  ConstructRootScope(DebugInfo->getRootScope());
+  // FIXME - should be able to debug coalesced functions.
+  if (IsNormalText) {
+    // Define end label for subprogram.
+    EmitLabel("func_end", SubprogramCount);
   
-  // Emit function frame information.
-  EmitFunctionDebugFrame();
+    // Construct scopes for subprogram.
+    ConstructRootScope(DebugInfo->getRootScope());
+    
+    // Emit function frame information.
+    EmitFunctionDebugFrame();
+  }
   
   // Clear function debug information.
   DebugInfo->EndFunction();
index 2e3c034..09d0d2b 100644 (file)
@@ -262,10 +262,10 @@ public:
     Elements.push_back(ConstantUInt::get(Type::UIntTy, Field));
   }
   virtual void Apply(int64_t &Field) {
-    Elements.push_back(ConstantSInt::get(Type::IntTy, Field));
+    Elements.push_back(ConstantSInt::get(Type::LongTy, Field));
   }
   virtual void Apply(uint64_t &Field) {
-    Elements.push_back(ConstantUInt::get(Type::UIntTy, Field));
+    Elements.push_back(ConstantUInt::get(Type::ULongTy, Field));
   }
   virtual void Apply(bool &Field) {
     Elements.push_back(ConstantBool::get(Field));
@@ -345,10 +345,10 @@ public:
     Fields.push_back(Type::UIntTy);
   }
   virtual void Apply(int64_t &Field) {
-    Fields.push_back(Type::IntTy);
+    Fields.push_back(Type::LongTy);
   }
   virtual void Apply(uint64_t &Field) {
-    Fields.push_back(Type::UIntTy);
+    Fields.push_back(Type::ULongTy);
   }
   virtual void Apply(bool &Field) {
     Fields.push_back(Type::BoolTy);
index 8d520e7..44ab7f8 100644 (file)
@@ -488,8 +488,9 @@ void PPCAsmPrinter::printMachineInstruction(const MachineInstr *MI) {
 /// method to print assembly for each instruction.
 ///
 bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
-  // FIXME - is this the earliest this can be set?
   DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
+  // FIXME - should be able to debug coalesced functions.
+  bool IsNormalText = true;
 
   SetupMachineFunction(MF);
   O << "\n\n";
@@ -517,13 +518,14 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
                 ".section __TEXT,__textcoal_nt,coalesced,pure_instructions", F);
     O << "\t.globl\t" << CurrentFnName << "\n";
     O << "\t.weak_definition\t" << CurrentFnName << "\n";
+    IsNormalText = false;
     break;
   }
   EmitAlignment(4, F);
   O << CurrentFnName << ":\n";
 
   // Emit pre-function debug information.
-  DW.BeginFunction(&MF);
+  DW.BeginFunction(&MF, IsNormalText);
 
   // Print out code for the function.
   for (MachineFunction::const_iterator I = MF.begin(), E = MF.end();
index 3e690aa..f103bcc 100755 (executable)
@@ -29,6 +29,8 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   // Let PassManager know we need debug information and relay
   // the MachineDebugInfo address on to DwarfWriter.
   DW.SetDebugInfo(&getAnalysis<MachineDebugInfo>());
+  // FIXME - should be able to debug coalesced functions.
+  bool IsNormalText = true;
 
   SetupMachineFunction(MF);
   O << "\n\n";
@@ -72,13 +74,14 @@ bool X86ATTAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
       SwitchToTextSection("", F);
       O << "\t.weak " << CurrentFnName << "\n";
     }
+    IsNormalText = false;
     break;
   }
   O << CurrentFnName << ":\n";
 
   if (Subtarget->TargetType == X86Subtarget::isDarwin) {
     // Emit pre-function debug information.
-    DW.BeginFunction(&MF);
+    DW.BeginFunction(&MF, IsNormalText);
   }
 
   // Print out code for the function.