From patchwork Mon May 18 11:50:36 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dodji Seketeli X-Patchwork-Id: 39289 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5A7F4388A825; Mon, 18 May 2020 11:50:52 +0000 (GMT) X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [217.70.183.201]) by sourceware.org (Postfix) with ESMTPS id A2F24388A83F for ; Mon, 18 May 2020 11:50:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org A2F24388A83F Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=seketeli.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=dodji@seketeli.org X-Originating-IP: 91.166.131.130 Received: from localhost (91-166-131-130.subs.proxad.net [91.166.131.130]) (Authenticated sender: dodj@seketeli.org) by relay8-d.mail.gandi.net (Postfix) with ESMTPSA id 703F51BF209 for ; Mon, 18 May 2020 11:50:37 +0000 (UTC) Received: by localhost (Postfix, from userid 1001) id 70BB31A033D; Mon, 18 May 2020 13:50:36 +0200 (CEST) From: Dodji Seketeli To: libabigail@sourceware.org Subject: [PATCH 2/3] dwarf-reader: support several anonymous data members in a given class Organization: Me, myself and I References: <86mu65a2i2.fsf@seketeli.org> X-Operating-System: Red Hat Enterprise Linux Server 7.7 X-URL: http://www.seketeli.net/~dodji X-Patchwork-State: Committed Date: Mon, 18 May 2020 13:50:36 +0200 In-Reply-To: <86mu65a2i2.fsf@seketeli.org> (Dodji Seketeli's message of "Mon, 18 May 2020 13:47:33 +0200") Message-ID: <86eerha2cz.fsf@seketeli.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.3 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_ASCII_DIVIDERS, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SCC_10_SHORT_WORD_LINES, SCC_5_SHORT_WORD_LINES, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , Errors-To: libabigail-bounces@sourceware.org Sender: "Libabigail" Hello, At the moment, if a class has more than one anonymous data member, we are just keeping the first one and dropping the others. This patch fixes that. Now that there is the possibility of having several anonymous data members in a given class we need to be able to name them correctly, to tell them apart. That means we cannot use the name returned by var_decl::get_name() as that name is empty for an anonymous data member. This patch thus introduces a new method var_decl::get_anon_dm_reliable_name() which returns a name that is reliable (non-empty) even when the var_decl designates an anonymous data member. Note that there are many situations where we still need to have var_decl::get_name() behave like it used to, so we can't make it invariably return what var_decl::get_anon_dm_reliable_name() returns today. * include/abg-ir.h (class_or_union::find_anonymous_data_member): Declare a new member function. (class_or_union::find_data_member): Declare a new overload. (var_decl::get_anon_dm_reliable_name): Declare new member function. * src/abg-ir.cc (var_decl::get_pretty_representation): Make this work on a var_decl is going to be used to represent an anonymous data member even before the var_decl has been added to its finale scope. This is useful to make class_or_union::find_data_member work on a var_decl that is to be used as an anonymous data member. (var_decl::get_anon_dm_reliable_name): Define new member function. (class_or_union::find_data_member): In the existing overload that takes a string, look for the named data member inside the anonymous data members. Define a new overload that takes a var_decl_sptr, to look for anonymous data members. (class_or_union::find_anonymous_data_member): Define a new member function. (lookup_data_member): Use the existing class_or_union::find_data_member. * src/abg-reader.cc: (build_class_decl): Use the full anonymous variable for lookup, rather than its name which is empty and will thus give false positives. * src/abg-dwarf-reader.cc (add_or_update_class_type): Likewise. * src/abg-comparison.cc (class_or_union_diff::ensure_lookup_tables_populated): Name anonymous data members properly - as opposed to wrongly using their empty name. * src/abg-reporter-priv.cc (represent): In the overload for var_diff_sptr, make sure that changes to the /type/ of a variable declaration are always reported. * tests/data/test-abidiff-exit/test-member-size-report0.txt: Adjust as we now emit more detailed changes about anonymous data members. * tests/data/test-abidiff-exit/test-member-size-report1.txt: Likewise. * tests/data/test-annotate/test-anonymous-members-0.o.abi: Adjust to reflect the fact that a class can now have several anonymous data members. * tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi: Likewise. * tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt: Likewise. * tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt: Likewise. * tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt: Likewise. Signed-off-by: Dodji Seketeli Applied to master. --- include/abg-ir.h | 9 + src/abg-comparison.cc | 20 +- src/abg-dwarf-reader.cc | 15 +- src/abg-ir.cc | 103 +++- src/abg-reader.cc | 2 +- src/abg-reporter-priv.cc | 84 ++- .../test-abidiff-exit/test-member-size-report0.txt | 5 +- .../test-abidiff-exit/test-member-size-report1.txt | 5 +- .../test-annotate/test-anonymous-members-0.o.abi | 16 + .../PR25409-librte_bus_dpaa.so.20.0.abi | 656 ++++++++++----------- .../test30-pr18904-rvalueref-report0.txt | 2 +- .../test30-pr18904-rvalueref-report1.txt | 2 +- .../test30-pr18904-rvalueref-report2.txt | 2 +- .../test35-pr18754-no-added-syms-report-0.txt | 2 +- 14 files changed, 539 insertions(+), 384 deletions(-) diff --git a/include/abg-ir.h b/include/abg-ir.h index 97648c0..15b0b40 100644 --- a/include/abg-ir.h +++ b/include/abg-ir.h @@ -2766,6 +2766,9 @@ public: get_pretty_representation(bool internal = false, bool qualified_name = true) const; + string + get_anon_dm_reliable_name(bool qualified = true) const; + virtual bool traverse(ir_node_visitor& v); @@ -3832,6 +3835,12 @@ public: const var_decl_sptr find_data_member(const string&) const; + const var_decl_sptr + find_data_member(const var_decl_sptr&) const; + + const var_decl_sptr + find_anonymous_data_member(const var_decl_sptr&) const; + const data_members& get_non_static_data_members() const; diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc index e4a983b..e1689e5 100644 --- a/src/abg-comparison.cc +++ b/src/abg-comparison.cc @@ -4664,11 +4664,13 @@ class_or_union_diff::ensure_lookup_tables_populated(void) const ++it) { unsigned i = it->index(); - decl_base_sptr d = first_class_or_union()->get_non_static_data_members()[i]; - string name = d->get_name(); + var_decl_sptr data_member = + is_var_decl(first_class_or_union()->get_non_static_data_members()[i]); + string name = data_member->get_anon_dm_reliable_name(); + ABG_ASSERT(priv_->deleted_data_members_.find(name) - == priv_->deleted_data_members_.end()); - priv_->deleted_data_members_[name] = d; + == priv_->deleted_data_members_.end()); + priv_->deleted_data_members_[name] = data_member; } for (vector::const_iterator it = e.insertions().begin(); @@ -4683,8 +4685,8 @@ class_or_union_diff::ensure_lookup_tables_populated(void) const unsigned i = *iit; decl_base_sptr d = second_class_or_union()->get_non_static_data_members()[i]; - var_decl_sptr dm = is_var_decl(d); - string name = dm->get_name(); + var_decl_sptr added_dm = is_var_decl(d); + string name = added_dm->get_anon_dm_reliable_name(); ABG_ASSERT(priv_->inserted_data_members_.find(name) == priv_->inserted_data_members_.end()); string_decl_base_sptr_map::const_iterator j = @@ -4695,7 +4697,7 @@ class_or_union_diff::ensure_lookup_tables_populated(void) const { var_decl_sptr old_dm = is_var_decl(j->second); priv_->subtype_changed_dm_[name]= - compute_diff(old_dm, dm, context()); + compute_diff(old_dm, added_dm, context()); } priv_->deleted_data_members_.erase(j); } @@ -4749,9 +4751,9 @@ class_or_union_diff::ensure_lookup_tables_populated(void) const priv_->deleted_dm_by_offset_.erase(i->first); priv_->inserted_dm_by_offset_.erase(i->first); priv_->deleted_data_members_.erase - (i->second->first_var()->get_name()); + (i->second->first_var()->get_anon_dm_reliable_name()); priv_->inserted_data_members_.erase - (i->second->second_var()->get_name()); + (i->second->second_var()->get_anon_dm_reliable_name()); } } sort_string_data_member_diff_sptr_map(priv_->subtype_changed_dm_, diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index 4bcc652..77af044 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -13995,8 +13995,9 @@ add_or_update_class_type(read_context& ctxt, continue; // If the variable is already a member of this class, - // move on. - if (lookup_var_decl_in_scope(n, result)) + // move on. If it's an anonymous data member, we need + // to handle it differently. We'll do that later below. + if (!n.empty() && lookup_var_decl_in_scope(n, result)) continue; int64_t offset_in_bits = 0; @@ -14023,8 +14024,10 @@ add_or_update_class_type(read_context& ctxt, // The call to build_ir_node_from_die above could have // triggered the adding of a data member named 'n' into // result. So let's check again if the variable is - // already a member of this class. - if (lookup_var_decl_in_scope(n, result)) + // already a member of this class. Here again, if it's + // an anonymous data member, we need to handle it + // differently. We'll do that later below. + if (!n.empty() && lookup_var_decl_in_scope(n, result)) continue; if (!is_static) @@ -14040,6 +14043,10 @@ add_or_update_class_type(read_context& ctxt, die_access_specifier(&child, access); var_decl_sptr dm(new var_decl(n, t, loc, m)); + if (n.empty() && result->find_data_member(dm)) + // dm is an anonymous data member that was already + // present in the current class so let's not add it. + continue; result->add_data_member(dm, access, is_laid_out, is_static, offset_in_bits); ABG_ASSERT(has_scope(dm)); diff --git a/src/abg-ir.cc b/src/abg-ir.cc index 7b1f460..85c27e3 100644 --- a/src/abg-ir.cc +++ b/src/abg-ir.cc @@ -15860,7 +15860,9 @@ var_decl::get_pretty_representation(bool internal, bool qualified_name) const } else { - if (is_anonymous_data_member(this)) + if (/*The current var_decl is to be used as an anonymous data + member. */ + get_name().empty()) { // Display the anonymous data member in a way that // makes sense. @@ -15903,6 +15905,30 @@ var_decl::get_pretty_representation(bool internal, bool qualified_name) const return result; } +/// Get a name that is valid even for an anonymous data member. +/// +/// If the current @ref var_decl is an anonymous data member, then +/// return its pretty representation. As of now, that pretty +/// representation is actually its flat representation as returned by +/// get_class_or_union_flat_representation(). +/// +/// Otherwise, just return the name of the current @ref var_decl. +/// +/// @param qualified if true, return the qualified name. This doesn't +/// have an effet if the current @ref var_decl represents an anonymous +/// data member. +string +var_decl::get_anon_dm_reliable_name(bool qualified) const +{ + string name; + if (is_anonymous_data_member(this)) + name = get_pretty_representation(true, qualified); + else + name = get_name(); + + return name; +} + /// This implements the ir_traversable_base::traverse pure virtual /// function. /// @@ -18495,9 +18521,74 @@ class_or_union::find_data_member(const string& name) const ++i) if ((*i)->get_name() == name) return *i; + + // We haven't found a data member with the name 'name'. Let's look + // closer again, this time in our anonymous data members. + for (data_members::const_iterator i = get_data_members().begin(); + i != get_data_members().end(); + ++i) + if (is_anonymous_data_member(*i)) + { + class_or_union_sptr type = is_class_or_union_type((*i)->get_type()); + ABG_ASSERT(type); + if (var_decl_sptr data_member = type->find_data_member(name)) + return data_member; + } + + return var_decl_sptr(); +} + +/// Find an anonymous data member in the class. +/// +/// @param v the anonymous data member to find. +/// +/// @return the anonymous data member found, or nil if none was found. +const var_decl_sptr +class_or_union::find_anonymous_data_member(const var_decl_sptr& v) const +{ + if (!v->get_name().empty()) + return var_decl_sptr(); + + for (data_members::const_iterator it = get_non_static_data_members().begin(); + it != get_non_static_data_members().end(); + ++it) + { + if (is_anonymous_data_member(*it)) + if ((*it)->get_pretty_representation(true, true) + == v->get_pretty_representation(true, true)) + return *it; + } + return var_decl_sptr(); } +/// Find a given data member. +/// +/// This function takes a @ref var_decl as an argument. If it has a +/// non-empty name, then it tries to find a data member which has the +/// same name as the argument. +/// +/// If it has an empty name, then the @ref var_decl is considered as +/// an anonymous data member. In that case, this function tries to +/// find an anonymous data member which type equals that of the @ref +/// var_decl argument. +/// +/// @param v this carries either the name of the data member we need +/// to look for, or the type of the anonymous data member we are +/// looking for. +const var_decl_sptr +class_or_union::find_data_member(const var_decl_sptr& v) const +{ + if (!v) + return var_decl_sptr(); + + if (v->get_name().empty()) + return find_anonymous_data_member(v); + + return find_data_member(v->get_name()); +} + + /// Get the non-static data memebers of this @ref class_or_union. /// /// @return a vector of the non-static data members of this @ref @@ -22800,15 +22891,7 @@ lookup_data_member(const type_base* type, if (!cou) return 0; - for (class_or_union::data_members::const_iterator i = - cou->get_data_members().begin(); - i != cou->get_data_members().end(); - ++i) - { - if ((*i)->get_name() == dm_name) - return i->get(); - } - return 0; + return cou->find_data_member(dm_name).get(); } /// Get the function parameter designated by its index. diff --git a/src/abg-reader.cc b/src/abg-reader.cc index d1bf604..eb74659 100644 --- a/src/abg-reader.cc +++ b/src/abg-reader.cc @@ -4646,7 +4646,7 @@ build_class_decl(read_context& ctxt, if (var_decl_sptr v = build_var_decl(ctxt, p, /*add_to_cur_scope=*/false)) { - if (decl->find_data_member(v->get_name())) + if (decl->find_data_member(v)) { // We are in updating mode and the current // version of this class already has this data diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc index 4ea591a..df7df88 100644 --- a/src/abg-reporter-priv.cc +++ b/src/abg-reporter-priv.cc @@ -432,6 +432,19 @@ represent(const var_diff_sptr &diff, // Have we reported a size change already? bool size_reported = false; + //---------------------------------------------------------------- + // First we'll try to emit a report about the type change of this + // var_decl_diff. + // + // In the context of that type change report, we need to keep in + // mind that because we want to emit specific (useful) reports about + // anonymous data member changes, we'll try to detect the various + // scenarii that involve anonymous data member changes. + // + // Then, as a fallback method, we'll emit a more generic type change + // report for the other generic type changes. + //---------------------------------------------------------------- + if (is_strict_anonymous_data_member_change) { const string n_pretty_representation = n->get_pretty_representation(); @@ -484,34 +497,53 @@ represent(const var_diff_sptr &diff, begin_with_and = true; emitted = true; } - else if (const diff_sptr d = diff->type_diff()) - { - if (ctxt->get_reporter()->diff_to_be_reported(d.get())) - { - if (local_only) - out << indent << "type '" - << get_pretty_representation(o->get_type()) - << "' of '" << o->get_qualified_name() - << "' changed"; - else - out << indent - << "type of '" << o_pretty_representation << "' changed"; - if (d->currently_reporting()) - out << ", as being reported\n"; - else if (d->reported_once()) - out << ", as reported earlier\n"; - else - { - out << ":\n"; - d->report(out, indent + " "); - } + // + // If we haven't succeeded in emitting a specific type change report + // (mainly related to anonymous data data member changes) then let's + // try to emit a more generic report about the type change. + // + // This is the fallback method outlined in the comment at the + // beginning of this section. + // + if (!emitted) + if (const diff_sptr d = diff->type_diff()) + { + if (ctxt->get_reporter()->diff_to_be_reported(d.get())) + { + if (local_only) + out << indent << "type '" + << get_pretty_representation(o->get_type()) + << "' of '" + << (o_anon ? + string("anonymous data member") + : o->get_qualified_name()) + << "' changed"; + else + out << indent + << "type of '"<< (o_anon ? "anonymous data member ": "") + << o_pretty_representation << "' changed"; + + if (d->currently_reporting()) + out << ", as being reported\n"; + else if (d->reported_once()) + out << ", as reported earlier\n"; + else + { + out << ":\n"; + d->report(out, indent + " "); + } + + begin_with_and = true; + emitted = true; + size_reported = true; + } + } - begin_with_and = true; - emitted = true; - size_reported = true; - } - } + // + // Okay, now we are done with report type changes. Let's report the + // other potential kinds of changes. + // if (!filtering::has_anonymous_data_member_change(diff) && o_name != n_name) { diff --git a/tests/data/test-abidiff-exit/test-member-size-report0.txt b/tests/data/test-abidiff-exit/test-member-size-report0.txt index ff93dd5..c82a5c3 100644 --- a/tests/data/test-abidiff-exit/test-member-size-report0.txt +++ b/tests/data/test-abidiff-exit/test-member-size-report0.txt @@ -22,6 +22,9 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable in pointed to type 'struct U' at test-member-size-v1.cc:19:1: type size changed from 192 to 256 (in bits) 2 data member changes: - anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits) + type of 'anonymous data member struct {S s;}' changed: + type size changed from 128 to 192 (in bits) + 1 data member change: + 'S s' size changed from 128 to 192 (in bits) (by +64 bits) 'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits) diff --git a/tests/data/test-abidiff-exit/test-member-size-report1.txt b/tests/data/test-abidiff-exit/test-member-size-report1.txt index dbad76b..7650628 100644 --- a/tests/data/test-abidiff-exit/test-member-size-report1.txt +++ b/tests/data/test-abidiff-exit/test-member-size-report1.txt @@ -17,5 +17,8 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable 'struct U at test-member-size-v0.cc:18:1' changed: type size changed from 192 to 256 (in bits) there are data member changes: - anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits) + type 'struct {S s;}' of 'anonymous data member' changed: + type size changed from 128 to 192 (in bits) + there are data member changes: + type 'struct S' of 'U::__anonymous_struct__::s' changed, as reported earlier 'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits) diff --git a/tests/data/test-annotate/test-anonymous-members-0.o.abi b/tests/data/test-annotate/test-anonymous-members-0.o.abi index 7334730..83496d0 100644 --- a/tests/data/test-annotate/test-anonymous-members-0.o.abi +++ b/tests/data/test-annotate/test-anonymous-members-0.o.abi @@ -107,6 +107,14 @@ + + + + + + + + @@ -119,6 +127,14 @@ + + + + + + + + diff --git a/tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi b/tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi index cd16cc0..7ab00fd 100644 --- a/tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi +++ b/tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi @@ -1,4 +1,4 @@ - + @@ -1054,55 +1054,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - + - + @@ -1112,13 +1076,13 @@ - + - + @@ -1141,7 +1105,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1149,10 +1141,10 @@ - + - + @@ -1160,6 +1152,14 @@ + + + + + + + + @@ -1243,7 +1243,7 @@ - + @@ -1361,7 +1361,7 @@ - + @@ -1411,33 +1411,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + @@ -1445,31 +1420,37 @@ + + + + + + - + - + - + - + @@ -1483,7 +1464,15 @@ - + + + + + + + + + @@ -1491,7 +1480,18 @@ - + + + + + + + + + + + + @@ -1513,7 +1513,7 @@ - + @@ -1625,25 +1625,14 @@ - - - - - - - - - - - - - + + - + - + @@ -1658,7 +1647,7 @@ - + @@ -1666,24 +1655,27 @@ + + + - + - + - + - + - + @@ -1700,15 +1692,15 @@ - + - + - + @@ -1716,12 +1708,20 @@ - + + + + + + + + + - + @@ -1787,7 +1787,7 @@ - + @@ -1814,7 +1814,7 @@ - + @@ -2021,28 +2021,6 @@ - - - - - - - - - - - - - - - - - - - - - - @@ -2053,18 +2031,24 @@ - + + + + + + + - + - + - + @@ -2075,7 +2059,15 @@ - + + + + + + + + + @@ -2086,6 +2078,14 @@ + + + + + + + + @@ -2110,7 +2110,7 @@ - + @@ -2196,7 +2196,7 @@ - + @@ -2221,33 +2221,22 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + - + - + @@ -2276,74 +2265,36 @@ + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + @@ -2354,7 +2305,10 @@ - + + + + @@ -2365,6 +2319,9 @@ + + + @@ -2375,13 +2332,19 @@ - + + + + - + - + + + + @@ -2393,32 +2356,48 @@ - + - - + + + + + + + + + + + + - + - + - - - - + + - + - - - + + + + + + + + + + + @@ -2432,21 +2411,21 @@ - + - + - + - + @@ -2454,40 +2433,45 @@ - + + + + + + - + - + - + - + - + - + - + - + @@ -2495,7 +2479,7 @@ - + @@ -2509,7 +2493,7 @@ - + @@ -2520,18 +2504,26 @@ - + + + + + + + + + - + - + @@ -2558,25 +2550,25 @@ - + - + - + - + - + @@ -2584,23 +2576,15 @@ - - - - - - - - - - - - + - + + + + @@ -2609,24 +2593,32 @@ - + - + + + + - + + + + + + + - + - - - - + + + @@ -2640,84 +2632,92 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + - + - + - - + @@ -2745,7 +2745,7 @@ - + @@ -2844,8 +2844,8 @@ - - + + @@ -2866,15 +2866,15 @@ - - - - - - - - - + + + + + + + + + @@ -2883,7 +2883,7 @@ - + @@ -3077,8 +3077,8 @@ - - + + @@ -3113,7 +3113,7 @@ - + @@ -3127,7 +3127,7 @@ - + @@ -4648,7 +4648,7 @@ - + @@ -5264,7 +5264,7 @@ - + @@ -5567,7 +5567,7 @@ - + diff --git a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt index 79d4191..d30e8c6 100644 --- a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt +++ b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt @@ -1298,7 +1298,7 @@ Variable symbols changes summary: 0 Removed, 0 Added variable symbol not referen parameter 1 of type 'VarDesc*' has sub-type changes: in pointed to type 'struct VarDesc': type size hasn't changed - 1 data member changes (1 filtered): + 1 data member changes (2 filtered): type of 'union {struct {uint32_t is_static; uint32_t is_static_dstn; uint32_t has_length; uint32_t is_stack_buf; uint32_t sink_addr; uint32_t alloc_disp; uint32_t is_noncont_src; uint32_t is_noncont_dst;}; uint32_t bits;} VarDesc::flags' changed: type name changed from 'VarDesc::__anonymous_union__2' to 'varDescFlags' type size hasn't changed diff --git a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt index 215cfbe..800cc67 100644 --- a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt +++ b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt @@ -1298,7 +1298,7 @@ Variable symbols changes summary: 0 Removed, 0 Added variable symbol not referen parameter 1 of type 'VarDesc*' has sub-type changes: in pointed to type 'struct VarDesc' at offload_common.h:254:1: type size hasn't changed - 1 data member changes (1 filtered): + 1 data member changes (2 filtered): type of 'union {struct {uint32_t is_static; uint32_t is_static_dstn; uint32_t has_length; uint32_t is_stack_buf; uint32_t sink_addr; uint32_t alloc_disp; uint32_t is_noncont_src; uint32_t is_noncont_dst;}; uint32_t bits;} VarDesc::flags' changed: type name changed from 'VarDesc::__anonymous_union__2' to 'varDescFlags' type size hasn't changed diff --git a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt index 09fdb9c..e7bfbe2 100644 --- a/tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt +++ b/tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt @@ -1298,7 +1298,7 @@ Variable symbols changes summary: 0 Removed, 0 Added variable symbol not referen parameter 1 of type 'VarDesc*' has sub-type changes: in pointed to type 'struct VarDesc' at offload_common.h:254:1: type size hasn't changed - 1 data member changes (1 filtered): + 1 data member changes (2 filtered): type of 'union {struct {uint32_t is_static; uint32_t is_static_dstn; uint32_t has_length; uint32_t is_stack_buf; uint32_t sink_addr; uint32_t alloc_disp; uint32_t is_noncont_src; uint32_t is_noncont_dst;}; uint32_t bits;} VarDesc::flags' changed: type name changed from 'VarDesc::__anonymous_union__2' to 'varDescFlags' type size hasn't changed diff --git a/tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt b/tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt index 1f6e3e7..0c11fb6 100644 --- a/tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt +++ b/tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt @@ -214,7 +214,7 @@ Variable symbols changes summary: 0 Removed, 0 Added variable symbol not referen parameter 1 of type 'VarDesc*' has sub-type changes: in pointed to type 'struct VarDesc': type size hasn't changed - 1 data member changes (1 filtered): + 1 data member changes (2 filtered): type of 'union {struct {uint32_t is_static; uint32_t is_static_dstn; uint32_t has_length; uint32_t is_stack_buf; uint32_t sink_addr; uint32_t alloc_disp; uint32_t is_noncont_src; uint32_t is_noncont_dst;}; uint32_t bits;} VarDesc::flags' changed: type name changed from 'VarDesc::__anonymous_union__2' to 'varDescFlags' type size hasn't changed