Fixed a bug where DW_AT_start_scope would fall through to DW_AT_artificial in SymbolFileDWARF::ParseVariableDIE(). This was caught by the clang warning that catches unannotated case fall throughs.

llvm-svn: 263824
This commit is contained in:
Greg Clayton
2016-03-18 20:33:49 +00:00
parent fa771811b3
commit 31460392c1

View File

@@ -4200,44 +4200,45 @@ SymbolFileDWARF::ParseVariableDIE
}
break;
case DW_AT_specification:
{
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
spec_die = debug_info->GetDIE(DIERef(form_value));
{
DWARFDebugInfo* debug_info = DebugInfo();
if (debug_info)
spec_die = debug_info->GetDIE(DIERef(form_value));
}
break;
}
case DW_AT_start_scope:
{
if (form_value.Form() == DW_FORM_sec_offset)
{
DWARFRangeList dwarf_scope_ranges;
const DWARFDebugRanges* debug_ranges = DebugRanges();
debug_ranges->FindRanges(form_value.Unsigned(), dwarf_scope_ranges);
// All DW_AT_start_scope are relative to the base address of the
// compile unit. We add the compile unit base address to make
// sure all the addresses are properly fixed up.
for (size_t i = 0, count = dwarf_scope_ranges.GetSize(); i < count; ++i)
if (form_value.Form() == DW_FORM_sec_offset)
{
const DWARFRangeList::Entry& range = dwarf_scope_ranges.GetEntryRef(i);
scope_ranges.Append(range.GetRangeBase() + die.GetCU()->GetBaseAddress(),
range.GetByteSize());
}
}
else
{
// TODO: Handle the case when DW_AT_start_scope have form constant. The
// dwarf spec is a bit ambiguous about what is the expected behavior in
// case the enclosing block have a non coninious address range and the
// DW_AT_start_scope entry have a form constant.
GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_start_scope has unsupported form type (0x%x)\n",
die.GetID(),
form_value.Form());
}
DWARFRangeList dwarf_scope_ranges;
const DWARFDebugRanges* debug_ranges = DebugRanges();
debug_ranges->FindRanges(form_value.Unsigned(), dwarf_scope_ranges);
scope_ranges.Sort();
scope_ranges.CombineConsecutiveRanges();
}
// All DW_AT_start_scope are relative to the base address of the
// compile unit. We add the compile unit base address to make
// sure all the addresses are properly fixed up.
for (size_t i = 0, count = dwarf_scope_ranges.GetSize(); i < count; ++i)
{
const DWARFRangeList::Entry& range = dwarf_scope_ranges.GetEntryRef(i);
scope_ranges.Append(range.GetRangeBase() + die.GetCU()->GetBaseAddress(),
range.GetByteSize());
}
}
else
{
// TODO: Handle the case when DW_AT_start_scope have form constant. The
// dwarf spec is a bit ambiguous about what is the expected behavior in
// case the enclosing block have a non coninious address range and the
// DW_AT_start_scope entry have a form constant.
GetObjectFile()->GetModule()->ReportWarning ("0x%8.8" PRIx64 ": DW_AT_start_scope has unsupported form type (0x%x)\n",
die.GetID(),
form_value.Form());
}
scope_ranges.Sort();
scope_ranges.CombineConsecutiveRanges();
}
break;
case DW_AT_artificial: is_artificial = form_value.Boolean(); break;
case DW_AT_accessibility: break; //accessibility = DW_ACCESS_to_AccessType(form_value.Unsigned()); break;
case DW_AT_declaration: