Fixed a bug where DW_AT_start_scope would fall through to DW_AT_artificial in SymbolF...
authorGreg Clayton <gclayton@apple.com>
Fri, 18 Mar 2016 20:33:49 +0000 (20:33 +0000)
committerGreg Clayton <gclayton@apple.com>
Fri, 18 Mar 2016 20:33:49 +0000 (20:33 +0000)
llvm-svn: 263824

lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

index 4446d95..842575f 100644 (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());
+                                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)
+                                {
+                                    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());
                             }
-                        }
-                        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();
-                    }
+                            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: