summaryrefslogtreecommitdiffstats
path: root/tests/dwarf-die-addr-die.c
diff options
context:
space:
mode:
authorMark Wielaard <[email protected]>2018-05-29 23:49:21 +0200
committerMark Wielaard <[email protected]>2018-05-31 17:03:19 +0200
commit7d6fe0a39f6ae5c516ffd63558e12b24297bf982 (patch)
tree30469e6da3f107797bb69a1d0a480eafc4ba50fd /tests/dwarf-die-addr-die.c
parentb37feac1a8ceebb0748cb28d219aa8387d0885dd (diff)
libdw: Handle split Dwarf Dies in dwarf_die_addr_die.
dwarf_die_addr_die can be used to turn an Dwarf_Die addr back into a full Dwarf_Die, just given the original Dwarf debug handle. This now also works for Dwarf_Dies which originated from a split Dwarf. Whenever a split Dwarf_CU is found the Dwarf it originated from is registered with the Dwarf that the skeleton Dwarf_CU came from. All registered split Dwarfs are then searched by dwarf_die_addr_die if the addr didn't match the main Dwarf or the alt Dwarf. One limitation in this implementation is that only DIEs that come from the main .debug_info in the .dwo are supported. Theoretically there could also be DIEs in an .debug_type or from other/multiple (comdat) sections. New tests are added for dwarf-4, dwarf-5, split-dwarf-4, split-dwarf-5 and version 4 and 5 dwo files. Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'tests/dwarf-die-addr-die.c')
-rw-r--r--tests/dwarf-die-addr-die.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/tests/dwarf-die-addr-die.c b/tests/dwarf-die-addr-die.c
index b4f6dbcd..7899988f 100644
--- a/tests/dwarf-die-addr-die.c
+++ b/tests/dwarf-die-addr-die.c
@@ -134,6 +134,20 @@ check_dbg (Dwarf *dbg)
res |= check_dbg (alt);
}
+ // Split or Type Dwarf_Dies gotten through dwarf_get_units.
+ Dwarf_CU *cu = NULL;
+ Dwarf_Die subdie;
+ uint8_t unit_type;
+ while (dwarf_get_units (dbg, cu, &cu, NULL,
+ &unit_type, NULL, &subdie) == 0)
+ {
+ if (dwarf_tag (&subdie) != DW_TAG_invalid)
+ {
+ printf ("checking %" PRIx8 " subdie\n", unit_type);
+ res |= check_die (&subdie);
+ }
+ }
+
return res;
}