forked from OSchip/llvm-project
[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.
This commit is contained in:
parent
92ddd3c1b6
commit
1b96e133cf
|
@ -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<uint32_t> 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!
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue