public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
From: Dodji Seketeli <dodji@redhat.com>
To: libabigail@sourceware.org
Cc: dodji@redhat.com
Subject: [PATCH 3/4] Fix IR comparison result caching and canonical type propagation tracking
Date: Tue, 20 Sep 2022 13:30:25 +0200	[thread overview]
Message-ID: <87czbq5lm6.fsf@redhat.com> (raw)
In-Reply-To: <87tu525ngh.fsf@seketeli.org> (Dodji Seketeli's message of "Tue, 20 Sep 2022 12:50:38 +0200")

Hello,

Caching the result of IR comparison cannot happen on IR nodes that are
being compared in the context of type canonicalization if one of the
nodes is the target of canonical type propagation.  This is especially
true if the recursive IR node which comparison "temporarily" did yield
true (to avoid an infinite loop) at least until the comparison of the
rest of the sub-tree of the recursive type is done.  In that case, we
should not cache the result the comparison as it might change later.

The patch adds a way to track recursive types so that we know when not
to cache their comparison result.

As we now have a facility to track recursive types during canonical
type propagation (rather than just types that depend on recursive
types) we can be a bit more precise when confirming or cancelling
types that have been subject to canonical type propagation.

Also the patch cleans up the detection of comparison cycle to make it
more typesafe so that the macro
RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED can be used for class_decl
and union_decl, not just class_or_union.  It makes the code more
readable/maintainable is the equals overload for class_decl and
union_decl all have their proper call to
RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED.  The same is true for
mark_types_as_being_compared.

Doing that cleans up the detection of recursive types as well as the
types that depends on those recursive types.

	* src/abg-ir-priv.h (environment::priv::recursive_types_): Define
	new data member.
	(environment::priv::cache_type_comparison_result): Cache results
	only non-recursive and not dependant types, or when the result is
	"false".  In all these cases, the result, once cached, will not
	change.
	(environment::priv::mark_dependant_types_compared_until): Mark
	types as recursive at the same time others are marked as
	dependant.
	(environment::priv::{is_recursive_type, set_is_not_recursive}):
	Define new member functions.
	(environment::priv::{confirm_ct_propagation,
	cancel_ct_propagation}): Confirming canonical type propagation
	should happen for recursive types as well as their dependant
	types.
	* src/abg-ir.cc (return_comparison_result): Keep up with the
	book-keeping at all time when type canonicalization process is
	on-going.  Whenever we expect types that depends on recursive
	types, expect recursive types too, obviously.
	(type_base::get_canonical_type_for): Do not erase the comparison
	result cache between the canonicalization of two different types.
	(is_comparison_cycle_detected)
	(mark_types_as_being_compared, unmark_types_as_being_compared):
	Define new overloads for class_decl;
	(equals): In the overloads for class_decl and union_decl, use
	RETURN_COMPARISON_RESULT and mark_types_as_being_compared without
	casting it to class_or_union.
	* tests/data/test-abidiff/test-PR18791-report0.txt: Adjust.
	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
	Adjust.
	* tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	Adjust.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ir-priv.h                             |  46 +++-
 src/abg-ir.cc                                 |  96 ++++++--
 .../test-abidiff/test-PR18791-report0.txt     | 225 +++---------------
 .../PR25058-liblttng-ctl-report-1.txt         |   7 +-
 .../nss-3.23.0-1.0.fc23.x86_64-report-0.txt   |   6 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-2.txt |  82 ++++++-
 ...bb-4.3-3.20141204.fc23.x86_64-report-0.txt |  47 +---
 ...bb-4.3-3.20141204.fc23.x86_64-report-1.txt |  13 +-
 8 files changed, 251 insertions(+), 271 deletions(-)

diff --git a/src/abg-ir-priv.h b/src/abg-ir-priv.h
index 21734b25..b6f9354e 100644
--- a/src/abg-ir-priv.h
+++ b/src/abg-ir-priv.h
@@ -419,6 +419,7 @@ struct environment::priv
   // the canonical type propagation is cancelled, the canonical types
   // must be cleared.
   pointer_set		types_with_non_confirmed_propagated_ct_;
+  pointer_set		recursive_types_;
 #ifdef WITH_DEBUG_SELF_COMPARISON
   // This is used for debugging purposes.
   // When abidw is used with the option --debug-abidiff, some
@@ -518,11 +519,19 @@ struct environment::priv
   void
   cache_type_comparison_result(T& first, T& second, bool r)
   {
-    if (allow_type_comparison_results_caching())
-      type_comparison_results_cache_.emplace
-	(std::make_pair(reinterpret_cast<uint64_t>(&first),
-			reinterpret_cast<uint64_t>(&second)),
-	 r);
+    if (allow_type_comparison_results_caching()
+	&& (r == false
+	    ||
+	    (!is_recursive_type(&first)
+	     && !is_recursive_type(&second)
+	     && !is_type(&first)->priv_->depends_on_recursive_type()
+	     && !is_type(&second)->priv_->depends_on_recursive_type())))
+      {
+	type_comparison_results_cache_.emplace
+	  (std::make_pair(reinterpret_cast<uint64_t>(&first),
+			  reinterpret_cast<uint64_t>(&second)),
+	   r);
+      }
   }
 
   /// Retrieve the result of comparing two sub-types from the cache,
@@ -749,9 +758,30 @@ struct environment::priv
     result |=
       mark_dependant_types(right,
 			   right_type_comp_operands_);
+    recursive_types_.insert(reinterpret_cast<uintptr_t>(right));
     return result;
   }
 
+  /// Test if a type is a recursive one.
+  ///
+  /// @param t the type to consider.
+  ///
+  /// @return true iff @p t is recursive.
+  bool
+  is_recursive_type(const type_base* t)
+  {
+    return (recursive_types_.find(reinterpret_cast<uintptr_t>(t))
+	    != recursive_types_.end());
+  }
+
+
+  /// Unflag a type as being recursive
+  ///
+  /// @param t the type to unflag
+  void
+  set_is_not_recursive(const type_base* t)
+  {recursive_types_.erase(reinterpret_cast<uintptr_t>(t));}
+
   /// Propagate the canonical type of a type to another one.
   ///
   /// @param src the type to propagate the canonical type from.
@@ -786,7 +816,8 @@ struct environment::priv
     for (auto i : types_with_non_confirmed_propagated_ct_)
       {
 	type_base *t = reinterpret_cast<type_base*>(i);
-	ABG_ASSERT(t->priv_->depends_on_recursive_type());
+	ABG_ASSERT(t->get_environment()->priv_->is_recursive_type(t)
+		   || t->priv_->depends_on_recursive_type());
 	t->priv_->set_does_not_depend_on_recursive_type(dependant_type);
 	if (!t->priv_->depends_on_recursive_type())
 	  to_remove.insert(i);
@@ -858,7 +889,8 @@ struct environment::priv
     for (auto i : to_remove)
       {
 	type_base *t = reinterpret_cast<type_base*>(i);
-	ABG_ASSERT(t->priv_->depends_on_recursive_type());
+	ABG_ASSERT(t->get_environment()->priv_->is_recursive_type(t)
+		   || t->priv_->depends_on_recursive_type());
 	type_base_sptr canonical = t->priv_->canonical_type.lock();
 	if (canonical)
 	  {
diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 42442791..905d1b43 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -382,7 +382,9 @@ bool
 mark_dependant_types_compared_until(const type_base &r)
 {
   const environment * env = r.get_environment();
-  return env->priv_->mark_dependant_types_compared_until(&r);
+  if (env->do_on_the_fly_canonicalization())
+    return env->priv_->mark_dependant_types_compared_until(&r);
+  return false;
 }
 
 /// @brief the location of a token represented in its simplest form.
@@ -920,6 +922,22 @@ is_comparison_cycle_detected(T& l, T& r)
   return result ;
 }
 
+/// Detect if a recursive comparison cycle is detected while
+/// structurally comparing two @ref class_decl types.
+///
+/// @param l the left-hand-side operand of the current comparison.
+///
+/// @param r the right-hand-side operand of the current comparison.
+///
+/// @return true iff a comparison cycle is detected.
+template<>
+bool
+is_comparison_cycle_detected(const class_decl& l, const class_decl& r)
+{
+  return is_comparison_cycle_detected(static_cast<const class_or_union&>(l),
+				      static_cast<const class_or_union&>(r));
+}
+
 /// This macro is to be used while comparing composite types that
 /// might recursively refer to themselves.  Comparing two such types
 /// might get us into a cyle.
@@ -968,6 +986,22 @@ mark_types_as_being_compared(T& l, T&r)
   push_composite_type_comparison_operands(l, r);
 }
 
+/// Mark a pair of @ref class_decl types as being compared.
+///
+/// This is helpful to later detect recursive cycles in the comparison
+/// stack.
+///
+/// @param l the left-hand-side operand of the comparison.
+///
+/// @parm r the right-hand-side operand of the comparison.
+template<>
+void
+mark_types_as_being_compared(const class_decl& l, const class_decl &r)
+{
+  return mark_types_as_being_compared(static_cast<const class_or_union&>(l),
+				      static_cast<const class_or_union&>(r));
+}
+
 /// Mark a pair of types as being not compared anymore.
 ///
 /// This is helpful to later detect recursive cycles in the comparison
@@ -987,6 +1021,26 @@ unmark_types_as_being_compared(T& l, T&r)
   pop_composite_type_comparison_operands(l, r);
 }
 
+/// Mark a pair of @ref class_decl types as being not compared
+/// anymore.
+///
+/// This is helpful to later detect recursive cycles in the comparison
+/// stack.
+///
+/// Note that the types must have been passed to
+/// mark_types_as_being_compared prior to calling this function.
+///
+/// @param l the left-hand-side operand of the comparison.
+///
+/// @parm r the right-hand-side operand of the comparison.
+template<>
+void
+unmark_types_as_being_compared(const class_decl& l, const class_decl &r)
+{
+  return unmark_types_as_being_compared(static_cast<const class_or_union&>(l),
+					static_cast<const class_or_union&>(r));
+}
+
 /// Return the result of the comparison of two (sub) types.
 ///
 /// The function does the necessary book keeping before returning the
@@ -1020,7 +1074,7 @@ return_comparison_result(T& l, T& r, bool value,
   unmark_types_as_being_compared(l, r);
 
   const environment* env = l.get_environment();
-  if (propagate_canonical_type && env->do_on_the_fly_canonicalization())
+  if (env->do_on_the_fly_canonicalization())
     // We are instructed to perform the "canonical type propagation"
     // optimization, making 'r' to possibly get the canonical type of
     // 'l' if it has one.  This mostly means that we are currently
@@ -1028,8 +1082,8 @@ return_comparison_result(T& l, T& r, bool value,
     // the 'r' argument.
     {
       if (value == true
-	  && is_type(&r)->priv_->depends_on_recursive_type()
-	  && !env->priv_->right_type_comp_operands_.empty()
+	  && (is_type(&r)->priv_->depends_on_recursive_type()
+	      || env->priv_->is_recursive_type(&r))
 	  && is_type(&r)->priv_->canonical_type_propagated())
 	{
 	  // Track the object 'r' for which the propagated canonical
@@ -1048,10 +1102,12 @@ return_comparison_result(T& l, T& r, bool value,
 	  // sub-types that were compared during the comparison of
 	  // 'r'.
 	  env->priv_->confirm_ct_propagation(&r);
-	  if (is_type(&r)->priv_->depends_on_recursive_type())
+	  if (is_type(&r)->priv_->depends_on_recursive_type()
+	      || env->priv_->is_recursive_type(&r))
 	    {
 	      is_type(&r)->priv_->set_does_not_depend_on_recursive_type();
 	      env->priv_->remove_from_types_with_non_confirmed_propagated_ct(&r);
+	      env->priv_->set_is_not_recursive(&r);
 	    }
 	}
       else if (value == false)
@@ -1062,7 +1118,8 @@ return_comparison_result(T& l, T& r, bool value,
 	  // should see their tentatively propagated canonical type
 	  // cancelled.
 	  env->priv_->cancel_ct_propagation(&r);
-	  if (is_type(&r)->priv_->depends_on_recursive_type())
+	  if (is_type(&r)->priv_->depends_on_recursive_type()
+	      || env->priv_->is_recursive_type(&r))
 	    {
 	      // The right-hand-side operand cannot carry any tentative
 	      // canonical type at this point.
@@ -14051,10 +14108,10 @@ compare_types_during_canonicalization(const type_base_sptr& canonical_type,
   if (env->debug_type_canonicalization_is_on())
     {
       bool canonical_equality = false, structural_equality = false;
-      env->priv_->use_canonical_type_comparison_ = true;
-      canonical_equality = canonical_type == candidate_type;
       env->priv_->use_canonical_type_comparison_ = false;
       structural_equality = canonical_type == candidate_type;
+      env->priv_->use_canonical_type_comparison_ = true;
+      canonical_equality = canonical_type == candidate_type;
       if (canonical_equality != structural_equality)
 	{
 	  std::cerr << "structural & canonical equality different for type: "
@@ -14208,7 +14265,6 @@ type_base::get_canonical_type_for(type_base_sptr t)
 	  // the decl-only-class-being-equal-to-a-matching-definition
 	  // flags.
 	  env->priv_->allow_type_comparison_results_caching(false);
-	  env->priv_->clear_type_comparison_results_cache();
 	  env->do_on_the_fly_canonicalization(false);
 	  env->decl_only_class_equals_definition
 	    (saved_decl_only_class_equals_definition);
@@ -23626,8 +23682,7 @@ equals(const class_decl& l, const class_decl& r, change_kind* k)
 		      static_cast<const class_or_union&>(r),
 		      k));
 
-  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(static_cast<const class_or_union&>(l),
-					   static_cast<const class_or_union&>(r));
+  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r);
 
   bool had_canonical_type = !!r.get_naked_canonical_type();
   bool result = true;
@@ -23640,13 +23695,9 @@ equals(const class_decl& l, const class_decl& r, change_kind* k)
 	ABG_RETURN(result);
     }
 
-  mark_types_as_being_compared(static_cast<const class_or_union&>(l),
-			       static_cast<const class_or_union&>(r));
+  mark_types_as_being_compared(l, r);
 
-#define RETURN(value)							 \
-  return return_comparison_result(static_cast<const class_or_union&>(l), \
-				  static_cast<const class_or_union&>(r), \
-				  value);
+#define RETURN(value) return return_comparison_result(l, r, value);
 
   // If comparing the class_or_union 'part' of the type led to
   // canonical type propagation, then cancel that because it's too
@@ -24768,10 +24819,19 @@ union_decl::~union_decl()
 bool
 equals(const union_decl& l, const union_decl& r, change_kind* k)
 {
+
+  RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r);
+
+#define RETURN(value)				\
+  return return_comparison_result(l, r, value);
+
   bool result = equals(static_cast<const class_or_union&>(l),
 		       static_cast<const class_or_union&>(r),
 		       k);
-  ABG_RETURN(result);
+
+  mark_types_as_being_compared(l, r);
+
+  RETURN(result);
 }
 
 /// Copy a method of a @ref union_decl into a new @ref
diff --git a/tests/data/test-abidiff/test-PR18791-report0.txt b/tests/data/test-abidiff/test-PR18791-report0.txt
index 367929c7..9cefdfc2 100644
--- a/tests/data/test-abidiff/test-PR18791-report0.txt
+++ b/tests/data/test-abidiff/test-PR18791-report0.txt
@@ -1,4 +1,4 @@
-Functions changes summary: 1 Removed, 60 Changed, 1 Added functions
+Functions changes summary: 1 Removed, 36 Changed, 1 Added functions
 Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
 1 Removed function:
@@ -9,113 +9,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   [A] 'method void std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_clear()'
 
-60 functions with some indirect sub-type change:
-
-  [C] 'method bool sigc::connection::block(bool)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      in pointed to type 'struct sigc::connection':
-        type size hasn't changed
-        1 data member change:
-          type of 'sigc::slot_base* slot_' changed:
-            in pointed to type 'class sigc::slot_base':
-              type size hasn't changed
-              1 data member change:
-                type of 'sigc::slot_base::rep_type* rep_' changed:
-                  in pointed to type 'typedef sigc::slot_base::rep_type':
-                    underlying type 'struct sigc::internal::slot_rep' changed:
-                      type size hasn't changed
-                      1 base class change:
-                        'struct sigc::trackable' changed:
-                          type size hasn't changed
-                          1 data member change:
-                            type of 'sigc::internal::trackable_callback_list* callback_list_' changed:
-                              in pointed to type 'struct sigc::internal::trackable_callback_list':
-                                type size changed from 192 to 256 (in bits)
-                                2 data member changes:
-                                  type of 'sigc::internal::trackable_callback_list::callback_list callbacks_' changed:
-                                    underlying type 'class std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
-                                      type name changed from 'std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
-                                      type size changed from 128 to 192 (in bits)
-                                      1 base class change:
-                                        'class std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
-                                          type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
-                                          type size changed from 128 to 192 (in bits)
-                                          1 data member change:
-                                            type of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl _M_impl' changed:
-                                              type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl'
-                                              type size changed from 128 to 192 (in bits)
-                                              1 data member change:
-                                                type of 'std::__detail::_List_node_base _M_node' changed:
-                                                  type name changed from 'std::__detail::_List_node_base' to 'std::_List_node<long unsigned int>'
-                                                  type size changed from 128 to 192 (in bits)
-                                                  1 base class insertion:
-                                                    struct std::__detail::_List_node_base
-                                                  2 data member deletions:
-                                                    'std::__detail::_List_node_base* _M_next', at offset 0 (in bits)
-                                                    'std::__detail::_List_node_base* _M_prev', at offset 64 (in bits)
-                                                  1 data member insertion:
-                                                    'unsigned long int _M_data', at offset 128 (in bits)
-                                                and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node'
-                                            and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl'
-                                  'bool clearing_' offset changed from 128 to 192 (in bits) (by +64 bits)
-
-  [C] 'method bool sigc::connection::blocked()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::connection*' has sub-type changes:
-      in pointed to type 'const sigc::connection':
-        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method sigc::connection::connection(const sigc::connection&)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-    parameter 1 of type 'const sigc::connection&' has sub-type changes:
-      in referenced type 'const sigc::connection':
-        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method sigc::connection::connection()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method sigc::connection::connection(sigc::slot_base&)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-    parameter 1 of type 'sigc::slot_base&' has sub-type changes:
-      referenced type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method void sigc::connection::disconnect()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method bool sigc::connection::empty()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::connection*' has sub-type changes:
-      in pointed to type 'const sigc::connection':
-        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method bool sigc::connection::operator bool()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method sigc::connection& sigc::connection::operator=(const sigc::connection&)' has some indirect sub-type changes:
-    return type changed:
-      referenced type 'struct sigc::connection' changed, as reported earlier
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-    parameter 1 of type 'const sigc::connection&' has sub-type changes:
-      in referenced type 'const sigc::connection':
-        unqualified underlying type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method void sigc::connection::set_slot(sigc::slot_base*)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-    parameter 1 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method bool sigc::connection::unblock()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
-
-  [C] 'method sigc::connection::~connection(int)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::connection*' has sub-type changes:
-      pointed to type 'struct sigc::connection' changed, as reported earlier
+36 functions with some indirect sub-type change:
 
   [C] 'method void sigc::internal::signal_impl::block(bool)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
@@ -134,7 +28,16 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
                     type name changed from 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl' to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl'
                     type size changed from 128 to 192 (in bits)
                     1 data member change:
-                      type of 'std::__detail::_List_node_base _M_node' changed, as reported earlier
+                      type of 'std::__detail::_List_node_base _M_node' changed:
+                        type name changed from 'std::__detail::_List_node_base' to 'std::_List_node<long unsigned int>'
+                        type size changed from 128 to 192 (in bits)
+                        1 base class insertion:
+                          struct std::__detail::_List_node_base
+                        2 data member deletions:
+                          'std::__detail::_List_node_base* _M_next', at offset 0 (in bits)
+                          'std::__detail::_List_node_base* _M_prev', at offset 64 (in bits)
+                        1 data member insertion:
+                          'unsigned long int _M_data', at offset 128 (in bits)
                       and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node'
                   and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl'
 
@@ -150,9 +53,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   [C] 'method sigc::internal::signal_impl::iterator_type sigc::internal::signal_impl::connect(const sigc::slot_base&)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
-    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::internal::signal_impl::iterator_type sigc::internal::signal_impl::erase(sigc::internal::signal_impl::iterator_type)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
@@ -161,9 +61,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   [C] 'method sigc::internal::signal_impl::iterator_type sigc::internal::signal_impl::insert(sigc::internal::signal_impl::iterator_type, const sigc::slot_base&)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
-    parameter 2 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::internal::signal_impl::signal_impl()' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::signal_impl*' has sub-type changes:
@@ -183,12 +80,31 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
       pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
 
   [C] 'method void sigc::internal::slot_rep::disconnect()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::internal::slot_rep*' has sub-type changes:
-      pointed to type 'struct sigc::internal::slot_rep' changed, as reported earlier
+    implicit parameter 0 of type 'sigc::internal::slot_rep*' changed:
+      in pointed to type 'struct sigc::internal::slot_rep':
 
   [C] 'method void sigc::internal::trackable_callback_list::add_callback(void*)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::trackable_callback_list*' has sub-type changes:
-      pointed to type 'struct sigc::internal::trackable_callback_list' changed, as reported earlier
+      in pointed to type 'struct sigc::internal::trackable_callback_list':
+        type size changed from 192 to 256 (in bits)
+        2 data member changes:
+          type of 'sigc::internal::trackable_callback_list::callback_list callbacks_' changed:
+            underlying type 'class std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
+              type name changed from 'std::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::list<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
+              type size changed from 128 to 192 (in bits)
+              1 base class change:
+                'class std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' changed:
+                  type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >'
+                  type size changed from 128 to 192 (in bits)
+                  1 data member change:
+                    type of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl _M_impl' changed:
+                      type name changed from 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl' to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl'
+                      type size changed from 128 to 192 (in bits)
+                      1 data member change:
+                        type of 'std::__detail::_List_node_base _M_node' changed, as reported earlier
+                        and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_List_impl::_M_node'
+                    and name of 'std::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::internal::trackable_callback, std::allocator<sigc::internal::trackable_callback> >::_M_impl'
+          'bool clearing_' offset changed from 128 to 192 (in bits) (by +64 bits)
 
   [C] 'method void sigc::internal::trackable_callback_list::clear()' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::internal::trackable_callback_list*' has sub-type changes:
@@ -208,7 +124,10 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
         type size hasn't changed
         1 base class change:
           'struct sigc::trackable' changed:
-            details were reported earlier
+            type size hasn't changed
+            1 data member change:
+              type of 'sigc::internal::trackable_callback_list* callback_list_' changed:
+                pointed to type 'struct sigc::internal::trackable_callback_list' changed, as reported earlier
         1 data member change:
           type of 'sigc::internal::signal_impl* impl_' changed:
             pointed to type 'struct sigc::internal::signal_impl' changed, as reported earlier
@@ -225,9 +144,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   [C] 'method sigc::signal_base::iterator_type sigc::signal_base::connect(const sigc::slot_base&)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
-    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::signal_base::iterator_type sigc::signal_base::erase(sigc::signal_base::iterator_type)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
@@ -243,9 +159,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   [C] 'method sigc::signal_base::iterator_type sigc::signal_base::insert(sigc::signal_base::iterator_type, const sigc::slot_base&)' has some indirect sub-type changes:
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
-    parameter 2 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
 
   [C] 'method sigc::signal_base& sigc::signal_base::operator=(const sigc::signal_base&)' has some indirect sub-type changes:
     return type changed:
@@ -280,68 +193,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
     implicit parameter 0 of type 'sigc::signal_base*' has sub-type changes:
       pointed to type 'struct sigc::signal_base' changed, as reported earlier
 
-  [C] 'method void sigc::slot_base::add_destroy_notify_callback(void*)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
-      in pointed to type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method bool sigc::slot_base::block(bool)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method void sigc::slot_base::disconnect()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method bool sigc::slot_base::operator bool()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
-      in pointed to type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method sigc::slot_base& sigc::slot_base::operator=(const sigc::slot_base&)' has some indirect sub-type changes:
-    return type changed:
-      referenced type 'class sigc::slot_base' changed, as reported earlier
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method void sigc::slot_base::remove_destroy_notify_callback(void*)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
-      in pointed to type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method void sigc::slot_base::set_parent(void*)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'const sigc::slot_base*' has sub-type changes:
-      in pointed to type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method sigc::slot_base::slot_base(sigc::slot_base::rep_type*)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-    parameter 1 of type 'sigc::slot_base::rep_type*' has sub-type changes:
-      pointed to type 'typedef sigc::slot_base::rep_type' changed, as reported earlier
-
-  [C] 'method sigc::slot_base::slot_base()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method sigc::slot_base::slot_base(const sigc::slot_base&)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-    parameter 1 of type 'const sigc::slot_base&' has sub-type changes:
-      in referenced type 'const sigc::slot_base':
-        unqualified underlying type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method bool sigc::slot_base::unblock()' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
-  [C] 'method sigc::slot_base::~slot_base(int)' has some indirect sub-type changes:
-    implicit parameter 0 of type 'sigc::slot_base*' has sub-type changes:
-      pointed to type 'class sigc::slot_base' changed, as reported earlier
-
   [C] 'method void sigc::trackable::add_destroy_notify_callback(void*)' has some indirect sub-type changes:
     implicit parameter 0 of type 'const sigc::trackable*' has sub-type changes:
       in pointed to type 'const sigc::trackable':
diff --git a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
index 02879fcb..328ce804 100644
--- a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
+++ b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
@@ -89,7 +89,12 @@ Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
     parameter 1 of type 'lttng_action*' has sub-type changes:
       in pointed to type 'struct lttng_action':
         type size hasn't changed
-        2 data member changes:
+        3 data member changes:
+          type of 'action_validate_cb validate' changed:
+            underlying type 'bool (lttng_action*)*' changed:
+              in pointed to type 'function type bool (lttng_action*)':
+                parameter 1 of type 'lttng_action*' has sub-type changes:
+                  pointed to type 'struct lttng_action' changed, as being reported
           type of 'action_serialize_cb serialize' changed:
             underlying type 'typedef ssize_t (lttng_action*, char*)*' changed:
               in pointed to type 'function type typedef ssize_t (lttng_action*, char*)':
diff --git a/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt b/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
index 546942fe..57b11a8a 100644
--- a/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt
@@ -68,7 +68,7 @@
 ================ end of changes of 'libssl3.so'===============
 
 ================ changes of 'libsmime3.so'===============
-  Functions changes summary: 0 Removed, 1 Changed (127 filtered out), 0 Added functions
+  Functions changes summary: 0 Removed, 1 Changed (146 filtered out), 0 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   1 function with some indirect sub-type change:
@@ -82,12 +82,12 @@
               type of 'NSSCMSContent content' changed:
                 underlying type 'union NSSCMSContentUnion' at cmst.h:118:1 changed:
                   type size hasn't changed
-                  1 data member changes (3 filtered):
+                  1 data member changes (4 filtered):
                     type of 'NSSCMSEncryptedData* encryptedData' changed:
                       in pointed to type 'typedef NSSCMSEncryptedData' at cmst.h:65:1:
                         underlying type 'struct NSSCMSEncryptedDataStr' at cmst.h:468:1 changed:
                           type size hasn't changed
-                          1 data member changes (1 filtered):
+                          1 data member changes (2 filtered):
                             type of 'NSSCMSAttribute** unprotectedAttr' changed:
                               in pointed to type 'NSSCMSAttribute*':
                                 in pointed to type 'typedef NSSCMSAttribute' at cmst.h:69:1:
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
index 290ad869..c0e8a3e1 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
@@ -29,7 +29,87 @@
                 in pointed to type 'typedef QXLState' at spice-qxl.h:35:1:
                   underlying type 'struct QXLState' at reds.h:93:1 changed:
                     type size hasn't changed
-                    1 data member change:
+                    2 data member changes:
+                      type of 'QXLInterface* qif' changed:
+                        in pointed to type 'typedef QXLInterface' at spice-qxl.h:33:1:
+                          underlying type 'struct QXLInterface' at spice.h:230:1 changed:
+                            type size hasn't changed
+                            15 data member changes:
+                              type of 'void (QXLInstance*, QXLWorker*)* attache_worker' changed:
+                                in pointed to type 'function type void (QXLInstance*, QXLWorker*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, int)* set_compression_level' changed:
+                                in pointed to type 'function type void (QXLInstance*, int)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, typedef uint32_t)* set_mm_time' changed:
+                                in pointed to type 'function type void (QXLInstance*, typedef uint32_t)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, QXLDevInitInfo*)* get_init_info' changed:
+                                in pointed to type 'function type void (QXLInstance*, QXLDevInitInfo*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*, QXLCommandExt*)* get_command' changed:
+                                in pointed to type 'function type int (QXLInstance*, QXLCommandExt*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*)* req_cmd_notification' changed:
+                                in pointed to type 'function type int (QXLInstance*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, struct QXLReleaseInfoExt)* release_resource' changed:
+                                in pointed to type 'function type void (QXLInstance*, struct QXLReleaseInfoExt)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*, QXLCommandExt*)* get_cursor_command' changed:
+                                in pointed to type 'function type int (QXLInstance*, QXLCommandExt*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*)* req_cursor_notification' changed:
+                                in pointed to type 'function type int (QXLInstance*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, typedef uint32_t)* notify_update' changed:
+                                in pointed to type 'function type void (QXLInstance*, typedef uint32_t)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*)* flush_resources' changed:
+                                in pointed to type 'function type int (QXLInstance*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, typedef uint64_t)* async_complete' changed:
+                                in pointed to type 'function type void (QXLInstance*, typedef uint64_t)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, typedef uint32_t, QXLRect*, typedef uint32_t)* update_area_complete' changed:
+                                in pointed to type 'function type void (QXLInstance*, typedef uint32_t, QXLRect*, typedef uint32_t)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'void (QXLInstance*, typedef uint8_t, uint8_t*)* set_client_capabilities' changed:
+                                in pointed to type 'function type void (QXLInstance*, typedef uint8_t, uint8_t*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
+                              type of 'int (QXLInstance*, VDAgentMonitorsConfig*)* client_monitors_config' changed:
+                                in pointed to type 'function type int (QXLInstance*, VDAgentMonitorsConfig*)':
+                                  parameter 1 of type 'QXLInstance*' has sub-type changes:
+                                    in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                      underlying type 'struct QXLInstance' changed, as being reported
                       type of 'RedDispatcher* dispatcher' changed:
                         in pointed to type 'struct RedDispatcher' at red_dispatcher.c:55:1:
                           type size changed from 3264 to 3328 (in bits)
diff --git a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
index 51341ddb..afe77511 100644
--- a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
@@ -1,5 +1,5 @@
 ================ changes of 'libtbb.so.2'===============
-  Functions changes summary: 0 Removed, 10 Changed (92 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 8 Changed (67 filtered out), 17 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   Function symbols changes summary: 0 Removed, 0 Added function symbol not referenced by debug info
   Variable symbols changes summary: 3 Removed, 0 Added variable symbols not referenced by debug info
@@ -24,26 +24,7 @@
     [A] 'method void tbb::internal::concurrent_queue_base_v8::move_content(tbb::internal::concurrent_queue_base_v8&)'    {_ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_}
     [A] 'method void tbb::task_group_context::capture_fp_settings()'    {_ZN3tbb18task_group_context19capture_fp_settingsEv}
 
-  10 functions with some indirect sub-type change:
-
-    [C] 'method void tbb::filter::set_end_of_input()' at pipeline.cpp:700:1 has some indirect sub-type changes:
-      implicit parameter 0 of type 'tbb::filter*' has sub-type changes:
-        in pointed to type 'class tbb::filter' at pipeline.h:65:1:
-          type size hasn't changed
-          1 member function deletion:
-            'method virtual tbb::filter::~filter(int)' at pipeline.cpp:698:1
-          1 member function insertion:
-            'method virtual tbb::filter::~filter(int)' at pipeline.cpp:688:1
-          no member function changes (4 filtered);
-          1 data member changes (4 filtered):
-            type of 'tbb::internal::input_buffer* my_input_buffer' changed:
-              in pointed to type 'class tbb::internal::input_buffer' at pipeline.cpp:52:1:
-                type size hasn't changed
-                1 data member change:
-                  type of 'tbb::spin_mutex array_mutex' changed:
-                    type size hasn't changed
-                    1 base class insertion:
-                      class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
+  8 functions with some indirect sub-type change:
 
     [C] 'method tbb::task& tbb::internal::allocate_root_with_context_proxy::allocate(std::size_t) const' at task.h:135:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'const tbb::internal::allocate_root_with_context_proxy*' has sub-type changes:
@@ -70,16 +51,7 @@
                             2 data member insertions:
                               'volatile intptr_t* my_ref_top_priority', at offset 576 (in bits) at scheduler.h:96:1
                               'volatile uintptr_t* my_ref_reload_epoch', at offset 640 (in bits) at scheduler.h:99:1
-                            3 data member changes:
-                              type of 'tbb::internal::arena_slot* my_arena_slot' changed:
-                                in pointed to type 'struct tbb::internal::arena_slot' at scheduler_common.h:316:1:
-                                  type size hasn't changed
-                                  2 base class deletions:
-                                    struct tbb::internal::padded<tbb::internal::arena_slot_line1> at tbb_stddef.h:261:1
-                                    struct tbb::internal::padded<tbb::internal::arena_slot_line2> at tbb_stddef.h:261:1
-                                  2 base class insertions:
-                                    struct tbb::internal::padded<tbb::internal::arena_slot_line1, 128ul> at tbb_stddef.h:251:1
-                                    struct tbb::internal::padded<tbb::internal::arena_slot_line2, 128ul> at tbb_stddef.h:251:1
+                            2 data member changes (2 filtered):
                               type of 'tbb::internal::arena* my_arena' changed:
                                 in pointed to type 'class tbb::internal::arena' at arena.h:160:1:
                                   type size hasn't changed
@@ -87,7 +59,6 @@
                                     struct tbb::internal::padded<tbb::internal::arena_base> at tbb_stddef.h:261:1
                                   1 base class insertion:
                                     struct tbb::internal::padded<tbb::internal::arena_base, 128ul> at tbb_stddef.h:251:1
-                                  no data member change (1 filtered);
                               type of 'tbb::internal::mail_inbox my_inbox' changed:
                                 type size hasn't changed
                                 1 data member change:
@@ -180,7 +151,7 @@
             type of 'tbb::internal::concurrent_queue_rep* my_rep' changed:
               in pointed to type 'class tbb::internal::concurrent_queue_rep' at concurrent_queue.cpp:129:1:
                 type size hasn't changed
-                1 data member changes (2 filtered):
+                1 data member changes (1 filtered):
                   type of 'tbb::internal::concurrent_monitor items_avail' changed:
                     type size hasn't changed
                     1 data member change:
@@ -221,7 +192,6 @@
           type size hasn't changed
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
-          no data member change (1 filtered);
 
     [C] 'method void tbb::queuing_rw_mutex::internal_construct()' at queuing_rw_mutex.h:146:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::queuing_rw_mutex*' has sub-type changes:
@@ -229,7 +199,6 @@
           type size hasn't changed
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
-          no data member change (1 filtered);
 
     [C] 'method void tbb::recursive_mutex::internal_construct()' at recursive_mutex.h:224:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::recursive_mutex*' has sub-type changes:
@@ -238,14 +207,6 @@
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method tbb::thread_bound_filter::result_type tbb::thread_bound_filter::process_item()' at pipeline.cpp:712:1 has some indirect sub-type changes:
-      implicit parameter 0 of type 'tbb::thread_bound_filter*' has sub-type changes:
-        in pointed to type 'class tbb::thread_bound_filter' at pipeline.h:197:1:
-          type size hasn't changed
-          1 base class change:
-            'class tbb::filter' at pipeline.h:74:1 changed:
-              details were reported earlier
-
   3 Removed variable symbols not referenced by debug info:
 
     [D] _ZTVN3rml16versioned_objectE
diff --git a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
index a2247eb8..a8611476 100644
--- a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
+++ b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt
@@ -1,5 +1,5 @@
 ================ changes of 'libtbb.so.2'===============
-  Functions changes summary: 0 Removed, 8 Changed (94 filtered out), 17 Added functions
+  Functions changes summary: 0 Removed, 7 Changed (68 filtered out), 17 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
   Function symbols changes summary: 0 Removed, 0 Added function symbol not referenced by debug info
   Variable symbols changes summary: 3 Removed, 0 Added variable symbols not referenced by debug info
@@ -24,7 +24,7 @@
     [A] 'method void tbb::internal::concurrent_queue_base_v8::move_content(tbb::internal::concurrent_queue_base_v8&)'    {_ZN3tbb8internal24concurrent_queue_base_v812move_contentERS1_}
     [A] 'method void tbb::task_group_context::capture_fp_settings()'    {_ZN3tbb18task_group_context19capture_fp_settingsEv}
 
-  8 functions with some indirect sub-type change:
+  7 functions with some indirect sub-type change:
 
     [C] 'method tbb::task& tbb::internal::allocate_root_with_context_proxy::allocate(std::size_t) const' at task.h:135:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'const tbb::internal::allocate_root_with_context_proxy*' has sub-type changes:
@@ -64,7 +64,6 @@
           type size hasn't changed
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
-          no data member change (1 filtered);
 
     [C] 'method void tbb::queuing_rw_mutex::internal_construct()' at queuing_rw_mutex.h:146:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::queuing_rw_mutex*' has sub-type changes:
@@ -72,7 +71,6 @@
           type size hasn't changed
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
-          no data member change (1 filtered);
 
     [C] 'method void tbb::recursive_mutex::internal_construct()' at recursive_mutex.h:224:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::recursive_mutex*' has sub-type changes:
@@ -81,13 +79,6 @@
           1 base class insertion:
             class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
 
-    [C] 'method void tbb::spin_mutex::internal_construct()' at spin_mutex.h:138:1 has some indirect sub-type changes:
-      implicit parameter 0 of type 'tbb::spin_mutex*' has sub-type changes:
-        in pointed to type 'class tbb::spin_mutex' at spin_mutex.h:40:1:
-          type size hasn't changed
-          1 base class insertion:
-            class tbb::internal::mutex_copy_deprecated_and_disabled at tbb_stddef.h:334:1
-
     [C] 'method void tbb::spin_rw_mutex_v3::internal_acquire_reader()' at spin_rw_mutex.h:53:1 has some indirect sub-type changes:
       implicit parameter 0 of type 'tbb::spin_rw_mutex_v3*' has sub-type changes:
         in pointed to type 'class tbb::spin_rw_mutex_v3' at spin_rw_mutex.h:42:1:
-- 
2.37.2



-- 
		Dodji


  parent reply	other threads:[~2022-09-20 11:30 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-20 10:50 [PATCH 0/4, applied] Speed up type DIEs canonicalization Dodji Seketeli
2022-09-20 11:27 ` [PATCH 1/4, applied] dwarf-reader: Revamp the canonical type DIE propagation algorithm Dodji Seketeli
2022-09-20 11:29 ` [PATCH 2/4, applied] Allow restricting analyzed decls to exported symbols Dodji Seketeli
2022-09-20 11:30 ` Dodji Seketeli [this message]
2022-09-20 11:37 ` [PATCH 4/4, applied] ir, writer: Go back to canonicalizing typedefs in the IR Dodji Seketeli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87czbq5lm6.fsf@redhat.com \
    --to=dodji@redhat.com \
    --cc=libabigail@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).