From 1a2d25fcdd732fc3326c1e9a9729b3b2b08b5d17 Mon Sep 17 00:00:00 2001 From: Pavel Labath Date: Tue, 30 Mar 2021 09:57:32 +0200 Subject: [PATCH] Revert "[lldb/DWARF] Simplify DIE extraction code slightly" This reverts commit 1b96e133cf5215cb9ebfe7f14630f479c1611f22 due to failures on windows. --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp index e501bb9..86b1861 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -153,15 +153,17 @@ 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 (die_index_stack.size() == 0) { + if (depth == 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 @@ -199,12 +201,11 @@ void DWARFUnit::ExtractDIEsRWLocked() { m_die_array.back().SetHasChildren(false); } } else { - die.SetParentIndex(m_die_array.size() - die_index_stack.rbegin()[1]); + die.SetParentIndex(m_die_array.size() - die_index_stack[depth - 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); @@ -213,19 +214,24 @@ void DWARFUnit::ExtractDIEsRWLocked() { if (null_die) { // NULL DIE. - if (!die_index_stack.empty()) { + if (!die_index_stack.empty()) die_index_stack.pop_back(); - prev_die_had_children = false; - } + + if (depth > 0) + --depth; + 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 (die_index_stack.size() == 0) + if (depth == 0) break; // We are done with this compile unit! } -- 2.7.4