Fix bug with non-recursive inline walking
This commit is contained in:
parent
ab63c34827
commit
50483783cb
@ -384,6 +384,9 @@ namespace libdwarf {
|
|||||||
ASSERT(die.get_tag() == DW_TAG_subprogram || die.get_tag() == DW_TAG_inlined_subroutine);
|
ASSERT(die.get_tag() == DW_TAG_subprogram || die.get_tag() == DW_TAG_inlined_subroutine);
|
||||||
// get_inlines_info is recursive and recurses into dies with pc ranges matching the pc we're looking for,
|
// get_inlines_info is recursive and recurses into dies with pc ranges matching the pc we're looking for,
|
||||||
// however, because I wouldn't want anything stack overflowing I'm breaking the recursion out into a loop
|
// however, because I wouldn't want anything stack overflowing I'm breaking the recursion out into a loop
|
||||||
|
// while looping when we find the target die we need to be able to store a die somewhere that doesn't die
|
||||||
|
// at the end of the list traversal, we'll use this as a holder for it
|
||||||
|
die_object current_obj_holder(dbg, nullptr);
|
||||||
optional<std::reference_wrapper<const die_object>> current_die = die;
|
optional<std::reference_wrapper<const die_object>> current_die = die;
|
||||||
while(current_die.has_value()) {
|
while(current_die.has_value()) {
|
||||||
auto child = current_die.unwrap().get().get_child();
|
auto child = current_die.unwrap().get().get_child();
|
||||||
@ -393,7 +396,7 @@ namespace libdwarf {
|
|||||||
optional<std::reference_wrapper<const die_object>> target_die;
|
optional<std::reference_wrapper<const die_object>> target_die;
|
||||||
walk_die_list(
|
walk_die_list(
|
||||||
child,
|
child,
|
||||||
[this, &cu_die, pc, dwversion, &inlines, &target_die] (const die_object& die) {
|
[this, &cu_die, pc, dwversion, &inlines, &target_die, ¤t_obj_holder] (const die_object& die) {
|
||||||
if(die.get_tag() == DW_TAG_inlined_subroutine && die.pc_in_die(dwversion, pc)) {
|
if(die.get_tag() == DW_TAG_inlined_subroutine && die.pc_in_die(dwversion, pc)) {
|
||||||
const auto name = subprogram_symbol(die, dwversion);
|
const auto name = subprogram_symbol(die, dwversion);
|
||||||
auto file_i = die.get_unsigned_attribute(DW_AT_call_file);
|
auto file_i = die.get_unsigned_attribute(DW_AT_call_file);
|
||||||
@ -427,7 +430,8 @@ namespace libdwarf {
|
|||||||
name,
|
name,
|
||||||
true
|
true
|
||||||
});
|
});
|
||||||
target_die = die;
|
current_obj_holder = die.clone();
|
||||||
|
target_die = current_obj_holder;
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user