Hi,
I finally fully implemented the dwarf_output hashing algorithm, with a local hash that depends only on non-reference attributes and the local hash of the children of a die, and a reference hash that depends on the local hashes of all reference attributes (recursively) of the die.
This does reduce the number of attr_set hash collisions a lot. Unfortunately there are circular reference chains for some larger c++ programs. That was unexpected. Here is an example running dwarfcmp-test on itself:
$ src/dwarfcmp-test -T src/dwarfcmp-test src/dwarfcmp-test Reference chain cycle detected offset=[0x2898c8] already on the reference chain stack offset=[0x2889cb] subprogram offset=[0x2959bd] reference_type offset=[0x289b7c] structure_type offset=[0x2898c8] structure_type Aborted (core dumped)
And offset=[0x2898c8] is:
<structure_type offset=[0x2898c8] specification=[0x28889b] byte_size=0x8 decl_file="...libdw/c++/dwarf_data" decl_line=761 containing_type=[0x2898c8]>
Is this valid dwarf? Can a structure_type have a containing_type? A strict reading of the dwarf4 spec seems to imply only a DW_TAG_ptr_to_member_type may have a DW_AT_containing_type.
Not yet sure how to handle this case. The original algorithm depended on the reference chain not being cyclic on its own (when ignoring children). Obviously that isn't true in at least this case.
Code, plus cycle detection is on mjw/dwarf_output branch.
Cheers,
Mark