diff options
| author | Mark Wielaard <[email protected]> | 2018-05-29 23:49:21 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2018-05-31 17:03:19 +0200 |
| commit | 7d6fe0a39f6ae5c516ffd63558e12b24297bf982 (patch) | |
| tree | 30469e6da3f107797bb69a1d0a480eafc4ba50fd /tests/dwarf-die-addr-die.c | |
| parent | b37feac1a8ceebb0748cb28d219aa8387d0885dd (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.c | 14 |
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; } |
