mirror of
https://github.com/intel/llvm.git
synced 2026-01-21 12:19:23 +08:00
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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user