]> sourceware.org Git - libabigail.git/commitdiff
Fix canonicalizing of member types ... *AGAIN*
authorDodji Seketeli <dodji@redhat.com>
Sun, 22 Feb 2015 21:25:33 +0000 (22:25 +0100)
committerDodji Seketeli <dodji@redhat.com>
Sun, 22 Feb 2015 21:43:23 +0000 (22:43 +0100)
So abidiff libabigail.so libabigail.so is broken again.  Sigh.

It was broken by this wrong commit:

    commit 5b33223cb7b7d514bb8b0d31ed09a0ae14b8d7ce
    Author: Dodji Seketeli <dodji@redhat.com>
    Date:   Fri Feb 20 13:48:48 2015 +0100

Simplify canonicalizing handling for typedefs

    * src/abg-dwarf-reader.cc (build_ir_node_from_die): For typedefs,
    we don't need to test that the current scope is a class to know
    that we are looking at a member type.  Just looking at the
    is_member flag is enough.

So the issue arises when for instance, we are reading a class that
defines a member typedef (or enum) and uses that enum as the type of a
data member.  When reading that data member (before reading the
definition of the typedef), we read the type of the data member; so we
hit the typedef.  But build_ir_node_from_die() cannot fully construct
the scope of the typedef before handing off the typedef because we are
currently building it!  So it hands out a non-complete version of the
class that is being built;  'is_member' is not set to 'true' because
we are getting the type of the data member; it's not *necessarily* a
member type.  So we need to check !is_class_type(scope) to know if we
are given a member type.  I am now thinking that the "is_member" flag
is actually useless.  I think I'll remove it in a later patch.

Anyway, this fixes 'abidiff libabigail.so libabigail.so' again.  I
have some stashed patches that brings it's time down to ~ 45 seconds.
So we are getting close to being able to include that *ultimate* test in
regression test suite.  Oh well.

* src/abg-dwarf-reader.cc (build_ir_node_from_die): When building
typedefs, enum and memeber classes, check that the scope is a
member class to detect if we are building a member type.  In which
case the caller is going to handle the canonicalizing of the
member type *after* it's access specification has been adjusted.
Otherwise, that adjustments happens after the type has been
canonicalized and bad things happen at comparison type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
src/abg-dwarf-reader.cc

index f522b966adc57d1700cadd2b95a824491ede4330..cf55b98c8aa8e31a33f9e4b1848e87981c588b4f 100644 (file)
@@ -7168,7 +7168,7 @@ build_ir_node_from_die(read_context&      ctxt,
                                                 called_from_public_decl,
                                                 where_offset);
        result = add_decl_to_scope(t, scope);
-       if (t && !is_member_type)
+       if (t && !is_member_type && !is_class_type(scope))
          maybe_canonicalize_type(dwarf_dieoffset(die),
                                  die_is_from_alt_di,
                                  ctxt);
@@ -7235,7 +7235,7 @@ build_ir_node_from_die(read_context&      ctxt,
        enum_type_decl_sptr e = build_enum_type(ctxt,
                                                die_is_from_alt_di,
                                                die);
-       if (e && !is_member_type)
+       if (e && !is_member_type && !is_class_type(scope))
          {
            result = add_decl_to_scope(e, scope);
            maybe_canonicalize_type(dwarf_dieoffset(die),
@@ -7290,7 +7290,7 @@ build_ir_node_from_die(read_context&      ctxt,
        result = klass;
        // For klass to be eligible for canonicalization at this
        // point, it needs to be a non-member type.
-       if (!is_member_type)
+       if (!is_member_type && !is_class_type(scope))
          {
            // To be early canonicalized here, klass needs:
            if (// NOT be an incomplete type that is being currently
This page took 0.053028 seconds and 5 git commands to generate.