OSDN Git Service

Refactor the handling of lexical block and inline scope ranges
authorEric Christopher <echristo@gmail.com>
Tue, 3 Dec 2013 00:45:59 +0000 (00:45 +0000)
committerEric Christopher <echristo@gmail.com>
Tue, 3 Dec 2013 00:45:59 +0000 (00:45 +0000)
into a single function. No functional change.

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

lib/CodeGen/AsmPrinter/DwarfDebug.cpp
lib/CodeGen/AsmPrinter/DwarfDebug.h

index 52a809f..ec5df1e 100644 (file)
@@ -467,6 +467,25 @@ bool DwarfDebug::isLexicalScopeDIENull(LexicalScope *Scope) {
   return !End;
 }
 
+void DwarfDebug::addScopeRangeList(CompileUnit *TheCU, DIE *ScopeDIE,
+                                   const SmallVectorImpl<InsnRange> &Range) {
+  // Emit offset in .debug_range as a relocatable label. emitDIE will handle
+  // emitting it appropriately.
+  TheCU->addSectionLabel(ScopeDIE, dwarf::DW_AT_ranges,
+                         Asm->GetTempSymbol("debug_ranges", GlobalRangeCount));
+  RangeSpanList *List = new RangeSpanList(GlobalRangeCount++);
+  for (SmallVectorImpl<InsnRange>::const_iterator RI = Range.begin(),
+                                                  RE = Range.end();
+       RI != RE; ++RI) {
+    RangeSpan Span(getLabelBeforeInsn(RI->first),
+                   getLabelAfterInsn(RI->second));
+    List->addRange(Span);
+  }
+
+  // Add the range list to the set of ranges to be emitted.
+  TheCU->addRangeList(List);
+}
+
 // Construct new DW_TAG_lexical_block for this scope and attach
 // DW_AT_low_pc/DW_AT_high_pc labels.
 DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
@@ -479,25 +498,10 @@ DIE *DwarfDebug::constructLexicalScopeDIE(CompileUnit *TheCU,
     return ScopeDIE;
 
   const SmallVectorImpl<InsnRange> &ScopeRanges = Scope->getRanges();
+
   // If we have multiple ranges, emit them into the range section.
   if (ScopeRanges.size() > 1) {
-    // .debug_range section has not been laid out yet. Emit offset in
-    // .debug_range as a relocatable label. emitDIE will handle
-    // emitting it appropriately.
-    TheCU->addSectionLabel(
-        ScopeDIE, dwarf::DW_AT_ranges,
-        Asm->GetTempSymbol("debug_ranges", GlobalRangeCount));
-    RangeSpanList *List = new RangeSpanList(GlobalRangeCount++);
-    for (SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin(),
-                                                    RE = ScopeRanges.end();
-         RI != RE; ++RI) {
-      RangeSpan Range(getLabelBeforeInsn(RI->first),
-                      getLabelAfterInsn(RI->second));
-      List->addRange(Range);
-    }
-
-    // Add the range list to the set of ranges to be emitted.
-    TheCU->addRangeList(List);
+    addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
     return ScopeDIE;
   }
 
@@ -537,25 +541,10 @@ DIE *DwarfDebug::constructInlinedScopeDIE(CompileUnit *TheCU,
   DIE *ScopeDIE = new DIE(dwarf::DW_TAG_inlined_subroutine);
   TheCU->addDIEEntry(ScopeDIE, dwarf::DW_AT_abstract_origin, OriginDIE);
 
-  if (ScopeRanges.size() > 1) {
-    // .debug_range section has not been laid out yet. Emit offset in
-    // .debug_range as a relocatable label. emitDIE will handle
-    // emitting it appropriately.
-    TheCU->addSectionLabel(
-        ScopeDIE, dwarf::DW_AT_ranges,
-        Asm->GetTempSymbol("debug_ranges", GlobalRangeCount));
-    RangeSpanList *List = new RangeSpanList(GlobalRangeCount++);
-    for (SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin(),
-                                                    RE = ScopeRanges.end();
-         RI != RE; ++RI) {
-      RangeSpan Range(getLabelBeforeInsn(RI->first),
-                      getLabelAfterInsn(RI->second));
-      List->addRange(Range);
-    }
-
-    // Add the range list to the set of ranges to be emitted.
-    TheCU->addRangeList(List);
-  } else {
+  // If we have multiple ranges, emit them into the range section.
+  if (ScopeRanges.size() > 1)
+    addScopeRangeList(TheCU, ScopeDIE, ScopeRanges);
+  else {
     SmallVectorImpl<InsnRange>::const_iterator RI = ScopeRanges.begin();
     MCSymbol *StartLabel = getLabelBeforeInsn(RI->first);
     MCSymbol *EndLabel = getLabelAfterInsn(RI->second);
index 6a28ac6..e49b05b 100644 (file)
@@ -501,6 +501,11 @@ class DwarfDebug {
   /// going to be null.
   bool isLexicalScopeDIENull(LexicalScope *Scope);
 
+  /// \brief A helper function to construct a RangeSpanList for a given
+  /// lexical scope.
+  void addScopeRangeList(CompileUnit *TheCU, DIE *ScopeDIE,
+                         const SmallVectorImpl<InsnRange> &Range);
+
   /// \brief Construct new DW_TAG_lexical_block for this scope and
   /// attach DW_AT_low_pc/DW_AT_high_pc labels.
   DIE *constructLexicalScopeDIE(CompileUnit *TheCU, LexicalScope *Scope);