Merged "sane" commits from mjw/dwarf_output to dwarf branch

Mark Wielaard mjw at redhat.com
Thu Mar 17 12:01:12 UTC 2011


On Wed, 2011-03-16 at 14:40 -0700, Roland McGrath wrote:
> > I didn't do that, because I wanted the normal circularity check to catch
> > that. If we get a failure because of any circular reference,
> > self-reference or not, it is probably is something we need to
> > investigate. I cannot imagine when anything like that isn't some bug in
> > the producer.
> 
> Well, that's what dwarflint is for.  There is nothing algorithmically
> difficult about handling direct self-reference in the hash function.
> It exists in some data, whether by producer bug or not, so we have to
> handle it.  The kludge is just too ugly.

We cannot have ugly code :)

I added a dwarflint pass for it.
Attached and on the mjw/check_self_referential_die

Output of warning (on dwarfcmp, the problematic binary):
warning: .debug_info: DIE 0xed86a: attribute containing_type references DIE itself.
warning: .debug_info: DIE 0x1710eb: attribute containing_type references DIE itself.

Petr, if you think that is correct, I like to merge it to the dwarf
branch.

I removed the special DW_AT_containing_type case and just ignore all
self referential attribute values. Although I was tempted to just remove
it completely (since it is wrong, wrong, wrong).

It seems Dodji just posted a patch for gcc that might fix this issue by
properly outputting pointer-to-member-function. I haven't tried it yet
though. http://gcc.gnu.org/ml/gcc-patches/2011-03/msg00949.html

> > It this case it was
> > http://git.fedorahosted.org/git/?p=elfutils.git;a=commit;h=17a29217e9145989ca15479132f8d6d8f80f0258
> 
> Ok, I see the method now.  What is calling that?

It is used to get at the die_info_pair of a debug_info_entry in for
example get_die_info () from value::value_reference to access the
reference_hash of the die that it points to.

Cheers,

Mark

commit fab4929d16ea08b0929795d2cbd44f42cc161a0e
Author: Mark Wielaard <mjw at redhat.com>
Date:   Thu Mar 17 12:46:06 2011 +0100

    Workaround all self referential ref values, not just DW_AT_containing_type.

diff --git a/libdw/c++/dwarf_output b/libdw/c++/dwarf_output
index aeb192c..aab1598 100644
--- a/libdw/c++/dwarf_output
+++ b/libdw/c++/dwarf_output
@@ -1402,10 +1402,11 @@ namespace elfutils
              = dynamic_cast<const entry *> (it->second._m_value);
            if (ref != NULL)
              {
-               // Workaround weird case (bug?)
-               // https://fedorahosted.org/pipermail/elfutils-devel/2011-Februa
-               if (it->first == DW_AT_containing_type
-                   && ref->_m_pending == this)
+               // Workaround weird cases of self-referential DIE.
+               // This really is a bug in the producer and dwarflint
+               // should warn about it. But it is easy to work around
+               // so just do it for now, by ignoring such values.
+               if (ref->_m_pending == this)
                  continue;
                else
                  attr_rhashes ^= ref->get_reference_hash (stack);

-------------- next part --------------
A non-text attachment was scrubbed...
Name: check_self_referential_die.patch
Type: text/x-patch
Size: 3905 bytes
Desc: not available
Url : https://fedorahosted.org/pipermail/elfutils-devel/attachments/20110317/d3561e12/attachment.bin 


More information about the elfutils-devel mailing list