summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2011-02-16 18:42:29 +0100
committerMark Wielaard <[email protected]>2011-02-16 20:43:00 +0100
commit7702c87c53110fe8c515fd70e266c463c9962a71 (patch)
treebe2b174a0fc531f8120fb0cdf3f47966c4c3d23f
parent2321db3d9c235820c30a34edccd0fd4b7d3728ed (diff)
Fetch local hash from pending or finalized entry die. Use it in attr_value.
-rw-r--r--libdw/c++/dwarf_output16
1 files changed, 12 insertions, 4 deletions
diff --git a/libdw/c++/dwarf_output b/libdw/c++/dwarf_output
index bcca0dda..27ce8509 100644
--- a/libdw/c++/dwarf_output
+++ b/libdw/c++/dwarf_output
@@ -185,9 +185,7 @@ namespace elfutils
{
// Precompute our hash value based on our contents.
for (iterator i = begin (); i != end (); ++i)
- // XXX booo - still aren't handling circularity right...
- if (i->second.what_space () != dwarf::VS_reference)
- subr::hash_combine (_m_hash, *i);
+ subr::hash_combine (_m_hash, *i);
}
inline const _base &base () const
@@ -1402,8 +1400,18 @@ namespace elfutils
it != _m_children.end ();
++it)
{
+ // child lhash is always in the die_info, which might
+ // be in the pending_entry when not yet finalized, or
+ // part of the finalized child die_info.
size_t child_lhash;
- child_lhash = (*it)->_m_pending->_m_info->_m_local_hash;
+ struct pending_entry *pending = (*it)->_m_pending;
+ if (pending)
+ child_lhash = pending->_m_info->_m_local_hash;
+ else
+ {
+ die_info_pair *final_child = get_final_child (*it);
+ child_lhash = final_child->second._m_local_hash;
+ }
subr::hash_combine (children_hash, child_lhash);
}
subr::hash_combine (lhash, children_hash);