libdw_visit_scopes: Don't recurse into imported unit children.
There were two issues with __libdw_visit_scopes. First it returned an
error whenever called with a root DIE that didn't have any children.
However a DIE abbrev can have DW_CHILDREN_yes set and still have an
empty child list. It is inefficient and should be fixed in the DWARF
producer, but it is legal DWARF. Also the function shouldn't hide real
DWARF errors found by dwarf_child () or dwarf_siblingof (). Secondly
__libdw_visit_scopes would recurse into an imported unit and then
forget about the rest of the children of the root DIE. For an imported
unit the children of that unit DIE should be treated as if they were
logical children of the root DIE and not increase the recursion depth.
Both issues were shown by a systemtap bug using dwarf_getscopes () on
a CU that had various partial units imported through dwz.
See http://sourceware.org/bugzilla/show_bug.cgi?id=15671
Signed-off-by: Mark Wielaard <mjw@redhat.com>
diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 59b6c63..700c166 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,11 @@
+2013-06-26 Mark Wielaard <mjw@redhat.com>
+
+ * libdw_visit_scopes.c (__libdw_visit_scopes): Don't reject root
+ DIEs without children. Return an error whenever dwarf_child or
+ dwarf_siblingof return an error. Don't call recurse and increase
+ the depth for an imported unit. Walk the children of an imported
+ unit as if they are logical children of the parent root DIE.
+
2013-05-03 Mark Wielaard <mjw@redhat.com>
* dwarf_getsrclines.c (dwarf_getsrclines): Only set end_sequence