Refactor the handling of lexical block and inline scope ranges

into a single function. No functional change.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2013-12-03 00:45:59 +00:00
parent 5c21e864d9
commit 5b93ae5ab5
2 changed files with 30 additions and 36 deletions

View 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);

View 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);