From 1b96e133cf5215cb9ebfe7f14630f479c1611f22 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Sat, 27 Mar 2021 21:00:59 +0100 Subject: [PATCH] [lldb/DWARF] Simplify DIE extraction code slightly Remove the "depth" variable, as the same information can be obtained through die_index_stack.size(). Also add a test case for a one tricky case I noticed -- a unit containing only a null unit die. --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp index 86b1861..e501bb9 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -153,17 +153,15 @@ void DWARFUnit::ExtractDIEsRWLocked() { DWARFDebugInfoEntry die; - uint32_t depth = 0; // We are in our compile unit, parse starting at the offset we were told to // parse const DWARFDataExtractor &data = GetData(); std::vector die_index_stack; die_index_stack.reserve(32); - die_index_stack.push_back(0); bool prev_die_had_children = false; while (offset < next_cu_offset && die.Extract(data, this, &offset)) { const bool null_die = die.IsNULL(); - if (depth == 0) { + if (die_index_stack.size() == 0) { assert(m_die_array.empty() && "Compile unit DIE already added"); // The average bytes per DIE entry has been seen to be around 14-20 so @@ -201,11 +199,12 @@ void DWARFUnit::ExtractDIEsRWLocked() { m_die_array.back().SetHasChildren(false); } } else { - die.SetParentIndex(m_die_array.size() - die_index_stack[depth - 1]); + die.SetParentIndex(m_die_array.size() - die_index_stack.rbegin()[1]); if (die_index_stack.back()) m_die_array[die_index_stack.back()].SetSiblingIndex( m_die_array.size() - die_index_stack.back()); + die_index_stack.back() = m_die_array.size(); // Only push the DIE if it isn't a NULL DIE m_die_array.push_back(die); @@ -214,24 +213,19 @@ void DWARFUnit::ExtractDIEsRWLocked() { if (null_die) { // NULL DIE. - if (!die_index_stack.empty()) + if (!die_index_stack.empty()) { die_index_stack.pop_back(); - - if (depth > 0) - --depth; - prev_die_had_children = false; + prev_die_had_children = false; + } } else { - die_index_stack.back() = m_die_array.size() - 1; // Normal DIE const bool die_has_children = die.HasChildren(); - if (die_has_children) { + if (die_has_children) die_index_stack.push_back(0); - ++depth; - } prev_die_had_children = die_has_children; } - if (depth == 0) + if (die_index_stack.size() == 0) break; // We are done with this compile unit! } -- 2.7.4