[2/2] Use pointers not strings in type graph comparison.

Message ID 20200619163924.207852-3-gprocida@google.com
State Committed
Headers
Series Type identity clean-ups |

Commit Message

Giuliano Procida June 19, 2020, 4:39 p.m. UTC
  During structural comparison of types there is the possibilitiy of
infinite recursion as types can have self-references and there can
be more elaborate mutual references between them.

The current comparison algorithm keeps track of currently seen (struct
and function) types by name. This causes earlier caching of names than
is needed and, more significantly, may result in types comparing equal
unexpectedly. This commit switches to storing their addresses instead.

This change affects some tests which show more diffs than previously.

	src/abg-ir.cc: (environment::priv): Change types of
	classes_being_compared_ and fn_types_being_compared_ to be
	simple sets of pointers.
	(function_type::priv::mark_as_being_compared): Just add
	address to set.
	(function_type::priv::unmark_as_being_compared): Just remove
	address from set.
	(function_type::priv::comparison_started): Just look up
	address in set.
	(class_or_union::priv::mark_as_being_compared): Just add
	address to set.
	(class_or_union::priv::unmark_as_being_compared): Just remove
	address from set.
	(class_or_union::priv::comparison_started): Just look up
	address in set.
	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
	Update.
	* tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt:
	Update.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	Update.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt:
	Update.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 src/abg-ir.cc                                 |  21 +-
 .../PR25058-liblttng-ctl-report-1.txt         | 239 +++++-
 ....el7.x86_64-multiple-sym-vers-report-0.txt |   2 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-2.txt | 734 ++++++++++++------
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-3.txt | 162 +++-
 5 files changed, 909 insertions(+), 249 deletions(-)
  

Comments

Dodji Seketeli July 9, 2020, 9:19 a.m. UTC | #1
Hello,

Giuliano Procida <gprocida@google.com> a écrit:

> During structural comparison of types there is the possibilitiy of
> infinite recursion as types can have self-references and there can
> be more elaborate mutual references between them.
>
> The current comparison algorithm keeps track of currently seen (struct
> and function) types by name. This causes earlier caching of names than
> is needed and, more significantly, may result in types comparing equal
> unexpectedly. This commit switches to storing their addresses instead.

I think it might be interesting to understand why the tracking was done
by type names, rather than by address.

First, the tracking was initially done on classes only.  This was at a
time when libabigail didn't have the concept of function types.

In a DWARF representation, a given struct S can appear several times in
a binary because that very same S is defined in several different
translation units.  Thus, before type canonicalization (which happens
at the level of the libabigail IR) there could be several different
representations of the same S.  These representations of S are different
in the sense that they have different addresses in memory.  But they
represent the same S.

So when, inside the same binary (or ABI corpus), we compare two S that
end-up being the same but have different addresses, we can get into
infinite recursion if S has some elaborate enough self-references, as
you pointed out in your preamble.  In that case, using the address of
the representation of S keep track of the currently seen S won't work
because there can be several different addresses representing the same
S.  That is why I used the name of the type to keep that track, rather
than addresses.  I thought the potential drawbacks (in terms of
precision of the compare) was better than risking an infinite loop.

However, I have later introduced type de-duplication at the level of
DWARF directly, before the construction of the IR, at least for DWARF
originating from C compilers.  With that in place, inside a given ABI
corpus, there is now only one internal representation for S despite the
potential multiple copies of S present at the DWARF level.  Now we can
use addresses to keep track of currently seen structs.  Of course, I
haven't re-visited this whole thing since then, so the type name based
tracking stayed.

I introduced function types, I believe, before type de-duplication (I am
not sure on that one, I'll prolly have to double check).  At the time, I
guess I used type name based tracking there two, because I assumed I
could have the same kind of issue.  But now I am not so sure.  Function
types are a different kind of beast and they might not suffer the same
kind of actual duplication as the other real types expressed in DWARF.

Anyway, I think this is a good move.  Thank you for looking into that.

> This change affects some tests which show more diffs than previously.
>
> 	src/abg-ir.cc: (environment::priv): Change types of
> 	classes_being_compared_ and fn_types_being_compared_ to be
> 	simple sets of pointers.
> 	(function_type::priv::mark_as_being_compared): Just add
> 	address to set.
> 	(function_type::priv::unmark_as_being_compared): Just remove
> 	address from set.
> 	(function_type::priv::comparison_started): Just look up
> 	address in set.
> 	(class_or_union::priv::mark_as_being_compared): Just add
> 	address to set.
> 	(class_or_union::priv::unmark_as_being_compared): Just remove
> 	address from set.
> 	(class_or_union::priv::comparison_started): Just look up
> 	address in set.
> 	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
> 	Update.
> 	* tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt:
> 	Update.
> 	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
> 	Update.
> 	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt:
> 	Update.
>
> Signed-off-by: Giuliano Procida <gprocida@google.com>

Applied to the master branch, thanks!

Cheers,
  

Patch

diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index c6712a83..0f30e862 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -2635,8 +2635,8 @@  struct environment::priv
   mutable vector<type_base_sptr> sorted_canonical_types_;
   type_base_sptr		 void_type_;
   type_base_sptr		 variadic_marker_type_;
-  interned_string_set_type	 classes_being_compared_;
-  interned_string_set_type	 fn_types_being_compared_;
+  unordered_set<const class_or_union*>	classes_being_compared_;
+  unordered_set<const function_type*>	fn_types_being_compared_;
   vector<type_base_sptr>	 extra_live_types_;
   interned_string_pool		 string_pool_;
   bool				 canonicalization_is_done_;
@@ -16224,8 +16224,7 @@  struct function_type::priv
   {
     const environment* env = type.get_environment();
     ABG_ASSERT(env);
-    interned_string fn_type_name = type.get_cached_name(/*internal=*/true);
-    env->priv_->fn_types_being_compared_.insert(fn_type_name);
+    env->priv_->fn_types_being_compared_.insert(&type);
   }
 
   /// If a given @ref function_type was marked as being compared, this
@@ -16238,8 +16237,7 @@  struct function_type::priv
   {
     const environment* env = type.get_environment();
     ABG_ASSERT(env);
-    interned_string fn_type_name = type.get_cached_name(/*internal=*/true);
-    env->priv_->fn_types_being_compared_.erase(fn_type_name);
+    env->priv_->fn_types_being_compared_.erase(&type);
   }
 
   /// Tests if a @ref function_type is currently being compared.
@@ -16252,9 +16250,7 @@  struct function_type::priv
   {
     const environment* env = type.get_environment();
     ABG_ASSERT(env);
-    interned_string fn_type_name = type.get_cached_name(/*internal=*/true);
-    interned_string_set_type& c = env->priv_->fn_types_being_compared_;
-    return (c.find(fn_type_name) != c.end());
+    return env->priv_->fn_types_being_compared_.count(&type);
   }
 };// end struc function_type::priv
 
@@ -18041,7 +18037,7 @@  struct class_or_union::priv
   {
     const environment* env = klass.get_environment();
     ABG_ASSERT(env);
-    env->priv_->classes_being_compared_.insert(klass.get_qualified_name());
+    env->priv_->classes_being_compared_.insert(&klass);
   }
 
   /// Mark a class or union as being currently compared using the
@@ -18089,7 +18085,7 @@  struct class_or_union::priv
   {
     const environment* env = klass.get_environment();
     ABG_ASSERT(env);
-    env->priv_->classes_being_compared_.erase(klass.get_qualified_name());
+    env->priv_->classes_being_compared_.erase(&klass);
   }
 
   /// If the instance of class_or_union has been previously marked as
@@ -18115,8 +18111,7 @@  struct class_or_union::priv
   {
     const environment* env = klass.get_environment();
     ABG_ASSERT(env);
-    interned_string_set_type& c = env->priv_->classes_being_compared_;
-    return (c.find(klass.get_qualified_name()) != c.end());
+    return env->priv_->classes_being_compared_.count(&klass);
   }
 
   /// Test if a given instance of class_or_union is being currently
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 44ddc6d6..dc1dff32 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
@@ -1,4 +1,4 @@ 
-Functions changes summary: 0 Removed, 25 Changed, 79 Added functions
+Functions changes summary: 0 Removed, 50 Changed, 79 Added functions
 Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
 
 79 Added functions:
@@ -83,7 +83,39 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
   [A] 'function const char* lttng_userspace_probe_location_tracepoint_get_probe_name(const lttng_userspace_probe_location*)'
   [A] 'function const char* lttng_userspace_probe_location_tracepoint_get_provider_name(const lttng_userspace_probe_location*)'
 
-25 functions with some indirect sub-type change:
+50 functions with some indirect sub-type change:
+
+  [C] 'function void lttng_action_destroy(lttng_action*)' has some indirect sub-type changes:
+    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:
+          type of 'action_serialize_cb lttng_action::serialize' changed:
+            underlying type 'typedef ssize_t (lttng_action*, char*)*' changed:
+              in pointed to type 'function type typedef ssize_t (lttng_action*, char*)':
+                return type changed:
+                  entity changed from 'typedef ssize_t' to compatible type 'int'
+                    type name changed from 'long int' to 'int'
+                    type size changed from 64 to 32 (in bits)
+                parameter 1 of type 'lttng_action*' has sub-type changes:
+                  pointed to type 'struct lttng_action' changed, as being reported
+                parameter 2 of type 'char*' changed:
+                  in pointed to type 'char':
+                    entity changed from 'char' to 'struct lttng_dynamic_buffer'
+                    type size changed from 8 to 192 (in bits)
+          type of 'action_destroy_cb lttng_action::destroy' changed:
+            underlying type 'void (lttng_action*)*' changed:
+              in pointed to type 'function type void (lttng_action*)':
+                parameter 1 of type 'lttng_action*' has sub-type changes:
+                  pointed to type 'struct lttng_action' changed, as being reported
+
+  [C] 'function lttng_action_type lttng_action_get_type(lttng_action*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_action*' has sub-type changes:
+      pointed to type 'struct lttng_action' changed, as reported earlier
+
+  [C] 'function lttng_action* lttng_action_notify_create()' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_action' changed, as reported earlier
 
   [C] 'function int lttng_add_context(lttng_handle*, lttng_event_context*, const char*, const char*)' has some indirect sub-type changes:
     parameter 2 of type 'lttng_event_context*' has sub-type changes:
@@ -107,13 +139,111 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
             to:
               union {lttng_event_perf_counter_ctx perf_counter; struct {char* provider_name; char* ctx_name;} app_ctx; char padding[288];}
 
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_get_channel_name(const lttng_condition*, const char**)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        in unqualified underlying type 'struct lttng_condition':
+          type size hasn't changed
+          5 data member changes:
+            type of 'lttng_condition_type lttng_condition::type' changed:
+              type size hasn't changed
+              3 enumerator insertions:
+                'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE' value '100'
+                'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING' value '103'
+                'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED' value '104'
+            type of 'condition_validate_cb lttng_condition::validate' changed:
+              underlying type 'bool (const lttng_condition*)*' changed:
+                in pointed to type 'function type bool (const lttng_condition*)':
+                  parameter 1 of type 'const lttng_condition*' has sub-type changes:
+                    in pointed to type 'const lttng_condition':
+                      unqualified underlying type 'struct lttng_condition' changed, as being reported
+            type of 'condition_serialize_cb lttng_condition::serialize' changed:
+              underlying type 'typedef ssize_t (const lttng_condition*, char*)*' changed:
+                in pointed to type 'function type typedef ssize_t (const lttng_condition*, char*)':
+                  return type changed:
+                    entity changed from 'typedef ssize_t' to compatible type 'int'
+                      type name changed from 'long int' to 'int'
+                      type size changed from 64 to 32 (in bits)
+                  parameter 1 of type 'const lttng_condition*' has sub-type changes:
+                    in pointed to type 'const lttng_condition':
+                      unqualified underlying type 'struct lttng_condition' changed, as being reported
+                  parameter 2 of type 'char*' changed:
+                    in pointed to type 'char':
+                      entity changed from 'char' to 'struct lttng_dynamic_buffer'
+                      type size changed from 8 to 192 (in bits)
+            type of 'condition_equal_cb lttng_condition::equal' changed:
+              underlying type 'bool (const lttng_condition*, const lttng_condition*)*' changed:
+                in pointed to type 'function type bool (const lttng_condition*, const lttng_condition*)':
+                  parameter 1 of type 'const lttng_condition*' has sub-type changes:
+                    in pointed to type 'const lttng_condition':
+                      unqualified underlying type 'struct lttng_condition' changed, as being reported
+                  parameter 2 of type 'const lttng_condition*' has sub-type changes:
+                    in pointed to type 'const lttng_condition':
+                      unqualified underlying type 'struct lttng_condition' changed, as being reported
+            type of 'condition_destroy_cb lttng_condition::destroy' changed:
+              underlying type 'void (lttng_condition*)*' changed:
+                in pointed to type 'function type void (lttng_condition*)':
+                  parameter 1 of type 'lttng_condition*' has sub-type changes:
+                    pointed to type 'struct lttng_condition' changed, as being reported
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_get_domain_type(const lttng_condition*, lttng_domain_type*)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_get_session_name(const lttng_condition*, const char**)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_get_threshold(const lttng_condition*, uint64_t*)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_get_threshold_ratio(const lttng_condition*, double*)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition* lttng_condition_buffer_usage_high_create()' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition* lttng_condition_buffer_usage_low_create()' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_set_channel_name(lttng_condition*, const char*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_set_domain_type(lttng_condition*, lttng_domain_type)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_set_session_name(lttng_condition*, const char*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_set_threshold(lttng_condition*, uint64_t)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function lttng_condition_status lttng_condition_buffer_usage_set_threshold_ratio(lttng_condition*, double)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
+  [C] 'function void lttng_condition_destroy(lttng_condition*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+
   [C] 'function lttng_condition_type lttng_condition_get_type(const lttng_condition*)' has some indirect sub-type changes:
     return type changed:
-      type size hasn't changed
-      3 enumerator insertions:
-        'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE' value '100'
-        'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING' value '103'
-        'lttng_condition_type::LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED' value '104'
+      enum type 'enum lttng_condition_type' changed, as reported earlier
+    parameter 1 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
 
   [C] 'function int lttng_disable_event_ext(lttng_handle*, lttng_event*, const char*, const char*)' has some indirect sub-type changes:
     parameter 2 of type 'lttng_event*' has sub-type changes:
@@ -137,9 +267,49 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
     parameter 2 of type 'lttng_event*' has sub-type changes:
       pointed to type 'struct lttng_event' changed, as reported earlier
 
+  [C] 'function lttng_evaluation_status lttng_evaluation_buffer_usage_get_usage(const lttng_evaluation*, uint64_t*)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_evaluation*' has sub-type changes:
+      in pointed to type 'const lttng_evaluation':
+        in unqualified underlying type 'struct lttng_evaluation':
+          type size hasn't changed
+          3 data member changes:
+            type of 'lttng_condition_type lttng_evaluation::type' changed, as reported earlier
+            type of 'evaluation_serialize_cb lttng_evaluation::serialize' changed:
+              underlying type 'typedef ssize_t (lttng_evaluation*, char*)*' changed:
+                in pointed to type 'function type typedef ssize_t (lttng_evaluation*, char*)':
+                  return type changed:
+                    entity changed from 'typedef ssize_t' to compatible type 'int'
+                      type name changed from 'long int' to 'int'
+                      type size changed from 64 to 32 (in bits)
+                  parameter 1 of type 'lttng_evaluation*' changed:
+                    in pointed to type 'struct lttng_evaluation':
+                      entity changed from 'struct lttng_evaluation' to 'const lttng_evaluation'
+                      type size hasn't changed
+                  parameter 2 of type 'char*' changed:
+                    in pointed to type 'char':
+                      entity changed from 'char' to 'struct lttng_dynamic_buffer'
+                      type size changed from 8 to 192 (in bits)
+            type of 'evaluation_destroy_cb lttng_evaluation::destroy' changed:
+              underlying type 'void (lttng_evaluation*)*' changed:
+                in pointed to type 'function type void (lttng_evaluation*)':
+                  parameter 1 of type 'lttng_evaluation*' has sub-type changes:
+                    pointed to type 'struct lttng_evaluation' changed, as being reported
+
+  [C] 'function lttng_evaluation_status lttng_evaluation_buffer_usage_get_usage_ratio(const lttng_evaluation*, double*)' has some indirect sub-type changes:
+    parameter 1 of type 'const lttng_evaluation*' has sub-type changes:
+      in pointed to type 'const lttng_evaluation':
+        unqualified underlying type 'struct lttng_evaluation' changed, as reported earlier
+
+  [C] 'function void lttng_evaluation_destroy(lttng_evaluation*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_evaluation*' has sub-type changes:
+      pointed to type 'struct lttng_evaluation' changed, as reported earlier
+
   [C] 'function lttng_condition_type lttng_evaluation_get_type(const lttng_evaluation*)' has some indirect sub-type changes:
     return type changed:
       enum type 'enum lttng_condition_type' changed, as reported earlier
+    parameter 1 of type 'const lttng_evaluation*' has sub-type changes:
+      in pointed to type 'const lttng_evaluation':
+        unqualified underlying type 'struct lttng_evaluation' changed, as reported earlier
 
   [C] 'function int lttng_event_get_exclusion_name(lttng_event*, size_t, const char**)' has some indirect sub-type changes:
     parameter 1 of type 'lttng_event*' has sub-type changes:
@@ -197,27 +367,82 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
           type size changed from 192 to 128 (in bits)
           1 data member deletion:
             'bool lttng_notification::owns_elements', at offset 128 (in bits)
+          2 data member changes:
+            type of 'lttng_condition* lttng_notification::condition' changed:
+              pointed to type 'struct lttng_condition' changed, as reported earlier
+            type of 'lttng_evaluation* lttng_notification::evaluation' changed:
+              pointed to type 'struct lttng_evaluation' changed, as reported earlier
 
   [C] 'function lttng_notification_channel_status lttng_notification_channel_subscribe(lttng_notification_channel*, const lttng_condition*)' has some indirect sub-type changes:
     return type changed:
       enum type 'enum lttng_notification_channel_status' changed, as reported earlier
+    parameter 2 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
 
   [C] 'function lttng_notification_channel_status lttng_notification_channel_unsubscribe(lttng_notification_channel*, const lttng_condition*)' has some indirect sub-type changes:
     return type changed:
       enum type 'enum lttng_notification_channel_status' changed, as reported earlier
+    parameter 2 of type 'const lttng_condition*' has sub-type changes:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
 
   [C] 'function void lttng_notification_destroy(lttng_notification*)' has some indirect sub-type changes:
     parameter 1 of type 'lttng_notification*' has sub-type changes:
       pointed to type 'struct lttng_notification' changed, as reported earlier
 
   [C] 'function const lttng_condition* lttng_notification_get_condition(lttng_notification*)' has some indirect sub-type changes:
+    return type changed:
+      in pointed to type 'const lttng_condition':
+        unqualified underlying type 'struct lttng_condition' changed, as reported earlier
     parameter 1 of type 'lttng_notification*' has sub-type changes:
       pointed to type 'struct lttng_notification' changed, as reported earlier
 
   [C] 'function const lttng_evaluation* lttng_notification_get_evaluation(lttng_notification*)' has some indirect sub-type changes:
+    return type changed:
+      in pointed to type 'const lttng_evaluation':
+        unqualified underlying type 'struct lttng_evaluation' changed, as reported earlier
     parameter 1 of type 'lttng_notification*' has sub-type changes:
       pointed to type 'struct lttng_notification' changed, as reported earlier
 
+  [C] 'function int lttng_register_trigger(lttng_trigger*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_trigger*' has sub-type changes:
+      in pointed to type 'struct lttng_trigger':
+        type size hasn't changed
+        2 data member changes:
+          type of 'lttng_condition* lttng_trigger::condition' changed:
+            pointed to type 'struct lttng_condition' changed, as reported earlier
+          type of 'lttng_action* lttng_trigger::action' changed:
+            pointed to type 'struct lttng_action' changed, as reported earlier
+
+  [C] 'function lttng_trigger* lttng_trigger_create(lttng_condition*, lttng_action*)' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_trigger' changed, as reported earlier
+    parameter 1 of type 'lttng_condition*' has sub-type changes:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+    parameter 2 of type 'lttng_action*' has sub-type changes:
+      pointed to type 'struct lttng_action' changed, as reported earlier
+
+  [C] 'function void lttng_trigger_destroy(lttng_trigger*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_trigger*' has sub-type changes:
+      pointed to type 'struct lttng_trigger' changed, as reported earlier
+
+  [C] 'function lttng_action* lttng_trigger_get_action(lttng_trigger*)' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_action' changed, as reported earlier
+    parameter 1 of type 'lttng_trigger*' has sub-type changes:
+      pointed to type 'struct lttng_trigger' changed, as reported earlier
+
+  [C] 'function lttng_condition* lttng_trigger_get_condition(lttng_trigger*)' has some indirect sub-type changes:
+    return type changed:
+      pointed to type 'struct lttng_condition' changed, as reported earlier
+    parameter 1 of type 'lttng_trigger*' has sub-type changes:
+      pointed to type 'struct lttng_trigger' changed, as reported earlier
+
+  [C] 'function int lttng_unregister_trigger(lttng_trigger*)' has some indirect sub-type changes:
+    parameter 1 of type 'lttng_trigger*' has sub-type changes:
+      pointed to type 'struct lttng_trigger' changed, as reported earlier
+
   [C] 'function filter_parser_ctx* lttng_yyget_extra(yyscan_t)' has some indirect sub-type changes:
     return type changed:
       in pointed to type 'struct filter_parser_ctx':
diff --git a/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt b/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
index 9d1f078d..8ce5aa3c 100644
--- a/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
+++ b/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
@@ -1,5 +1,5 @@ 
 ================ changes of 'libdw-0.170.so'===============
-  Functions changes summary: 0 Removed, 0 Changed (175 filtered out), 4 Added functions
+  Functions changes summary: 0 Removed, 0 Changed (178 filtered out), 4 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   4 Added functions:
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 c64da3be..6fbcc4b7 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
@@ -43,6 +43,477 @@ 
                                   type size changed from 960 to 1024 (in bits)
                                   1 data member insertion:
                                     'dispatcher_handle_any_message Dispatcher::any_handler', at offset 960 (in bits) at dispatcher.h:56:1
+                                  1 data member change:
+                                    type of 'SpiceCoreInterface* Dispatcher::recv_core' changed:
+                                      in pointed to type 'typedef SpiceCoreInterface' at spice-core.h:56:1:
+                                        underlying type 'struct SpiceCoreInterface' at spice.h:82:1 changed:
+                                          type size hasn't changed
+                                          3 data member changes:
+                                            type of 'SpiceWatch* (int, int, typedef SpiceWatchFunc, void*)* SpiceCoreInterface::watch_add' changed:
+                                              in pointed to type 'function type SpiceWatch* (int, int, typedef SpiceWatchFunc, void*)':
+                                                return type changed:
+                                                  in pointed to type 'typedef SpiceWatch' at spice-core.h:68:1:
+                                                    underlying type 'struct SpiceWatch' at red_worker.c:268:1 changed:
+                                                      type size hasn't changed
+                                                      1 data member change:
+                                                        type of 'RedWorker* SpiceWatch::worker' changed:
+                                                          in pointed to type 'struct RedWorker' at red_worker.c:932:1:
+                                                            type size changed from 15520192 to 14876992 (in bits)
+                                                            1 data member deletion:
+                                                              'uint32_t RedWorker::preload_group_id', at offset 15379968 (in bits) at red_worker.c:992:1
+                                                            1 data member insertion:
+                                                              'FILE* RedWorker::record_fd', at offset 14876928 (in bits) at red_worker.c:1037:1
+                                                            37 data member changes (2 filtered):
+                                                              type of 'DisplayChannel* RedWorker::display_channel' changed:
+                                                                in pointed to type 'typedef DisplayChannel' at red_worker.c:434:1:
+                                                                  underlying type 'struct DisplayChannel' at red_worker.c:715:1 changed:
+                                                                    type size hasn't changed
+                                                                    1 data member change:
+                                                                      type of 'CommonChannel DisplayChannel::common' changed:
+                                                                        underlying type 'struct CommonChannel' at red_worker.c:650:1 changed:
+                                                                          type size hasn't changed
+                                                                          2 data member changes:
+                                                                            type of 'RedChannel CommonChannel::base' changed:
+                                                                              underlying type 'struct RedChannel' at red_channel.h:303:1 changed:
+                                                                                type size hasn't changed
+                                                                                3 data member changes:
+                                                                                  type of 'SpiceCoreInterface* RedChannel::core' changed:
+                                                                                    in pointed to type 'typedef SpiceCoreInterface':
+                                                                                      entity changed from 'typedef SpiceCoreInterface' to 'const SpiceCoreInterface'
+                                                                                      type size hasn't changed
+                                                                                  type of 'ChannelCbs RedChannel::channel_cbs' changed:
+                                                                                    underlying type 'struct {channel_configure_socket_proc config_socket; channel_disconnect_proc on_disconnect; channel_send_pipe_item_proc send_item; channel_hold_pipe_item_proc hold_item; channel_release_pipe_item_proc release_item; channel_alloc_msg_recv_buf_proc alloc_recv_buf; channel_release_msg_recv_buf_proc release_recv_buf; channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark; channel_handle_migrate_data_proc handle_migrate_data; channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial;}' at red_channel.h:195:1 changed:
+                                                                                      type size hasn't changed
+                                                                                      10 data member changes:
+                                                                                        type of 'channel_configure_socket_proc config_socket' changed:
+                                                                                          underlying type 'int (RedChannelClient*)*' changed:
+                                                                                            in pointed to type 'function type int (RedChannelClient*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                in pointed to type 'typedef RedChannelClient' at red_channel.h:131:1:
+                                                                                                  underlying type 'struct RedChannelClient' at red_channel.h:247:1 changed:
+                                                                                                    type size hasn't changed
+                                                                                                    3 data member changes (2 filtered):
+                                                                                                      type of 'RedChannel* RedChannelClient::channel' changed:
+                                                                                                        in pointed to type 'typedef RedChannel' at red_channel.h:130:1:
+                                                                                                          underlying type 'struct RedChannel' changed, as being reported
+                                                                                                      type of 'RedClient* RedChannelClient::client' changed:
+                                                                                                        in pointed to type 'typedef RedClient' at red_channel.h:132:1:
+                                                                                                          underlying type 'struct RedClient' at red_channel.h:561:1 changed:
+                                                                                                            type size hasn't changed
+                                                                                                            1 data member change:
+                                                                                                              type of 'MainChannelClient* RedClient::mcc' changed:
+                                                                                                                in pointed to type 'typedef MainChannelClient' at red_channel.h:133:1:
+                                                                                                                  underlying type 'struct MainChannelClient' at main_channel.c:145:1 changed:
+                                                                                                                    type size hasn't changed
+                                                                                                                    1 data member change:
+                                                                                                                      type of 'RedChannelClient MainChannelClient::base' changed:
+                                                                                                                        underlying type 'struct RedChannelClient' changed, as being reported
+                                                                                                      type of 'RedsStream* RedChannelClient::stream' changed:
+                                                                                                        in pointed to type 'typedef RedsStream' at reds_stream.h:31:1:
+                                                                                                          underlying type 'struct RedsStream' at reds.h:68:1 changed:
+                                                                                                            type size changed from 1280 to 256 (in bits)
+                                                                                                            5 data member deletions:
+                                                                                                              'RedsSASL RedsStream::sasl', at offset 256 (in bits) at reds.h:78:1
+                                                                                                              'SpiceChannelEventInfo* RedsStream::info', at offset 1024 (in bits) at reds.h:85:1
+                                                                                                              'typedef ssize_t (RedsStream*, void*, typedef size_t)* RedsStream::read', at offset 1088 (in bits) at reds.h:88:1
+                                                                                                              'typedef ssize_t (RedsStream*, void*, typedef size_t)* RedsStream::write', at offset 1152 (in bits) at reds.h:89:1
+                                                                                                              'typedef ssize_t (RedsStream*, const iovec*, int)* RedsStream::writev', at offset 1216 (in bits) at reds.h:90:1
+                                                                                                            2 data member changes:
+                                                                                                              type of 'SSL* RedsStream::ssl' changed:
+                                                                                                                in pointed to type 'typedef SSL' at reds_stream.h:32:1:
+                                                                                                                  typedef name changed from SSL to RedsStreamPrivate at reds_stream.h:32:1
+                                                                                                                  underlying type 'struct ssl_st' at ssl.h:1065:1 changed:
+                                                                                                                    type name changed from 'ssl_st' to 'RedsStreamPrivate'
+                                                                                                                    type size changed from 5504 to 0 (in bits)
+                                                                                                                    94 data member deletions:
+                                                                                                                      'int ssl_st::version', at offset 0 (in bits) at ssl.h:1070:1
+                                                                                                                      'int ssl_st::type', at offset 32 (in bits) at ssl.h:1071:1
+                                                                                                                      'const SSL_METHOD* ssl_st::method', at offset 64 (in bits) at ssl.h:1073:1
+                                                                                                                      'BIO* ssl_st::rbio', at offset 128 (in bits) at ssl.h:1080:1
+                                                                                                                      'BIO* ssl_st::wbio', at offset 192 (in bits) at ssl.h:1081:1
+                                                                                                                      'BIO* ssl_st::bbio', at offset 256 (in bits) at ssl.h:1082:1
+                                                                                                                      'int ssl_st::rwstate', at offset 320 (in bits) at ssl.h:1093:1
+                                                                                                                      'int ssl_st::in_handshake', at offset 352 (in bits) at ssl.h:1096:1
+                                                                                                                      'int (SSL*)* ssl_st::handshake_func', at offset 384 (in bits) at ssl.h:1097:1
+                                                                                                                      'int ssl_st::server', at offset 448 (in bits) at ssl.h:1107:1
+                                                                                                                      'int ssl_st::new_session', at offset 480 (in bits) at ssl.h:1109:1
+                                                                                                                      'int ssl_st::quiet_shutdown', at offset 512 (in bits) at ssl.h:1113:1
+                                                                                                                      'int ssl_st::shutdown', at offset 544 (in bits) at ssl.h:1114:1
+                                                                                                                      'int ssl_st::state', at offset 576 (in bits) at ssl.h:1116:1
+                                                                                                                      'int ssl_st::rstate', at offset 608 (in bits) at ssl.h:1117:1
+                                                                                                                      'BUF_MEM* ssl_st::init_buf', at offset 640 (in bits) at ssl.h:1119:1
+                                                                                                                      'void* ssl_st::init_msg', at offset 704 (in bits) at ssl.h:1120:1
+                                                                                                                      'int ssl_st::init_num', at offset 768 (in bits) at ssl.h:1121:1
+                                                                                                                      'int ssl_st::init_off', at offset 800 (in bits) at ssl.h:1122:1
+                                                                                                                      'unsigned char* ssl_st::packet', at offset 832 (in bits) at ssl.h:1125:1
+                                                                                                                      'unsigned int ssl_st::packet_length', at offset 896 (in bits) at ssl.h:1126:1
+                                                                                                                      'ssl2_state_st* ssl_st::s2', at offset 960 (in bits) at ssl.h:1128:1
+                                                                                                                      'ssl3_state_st* ssl_st::s3', at offset 1024 (in bits) at ssl.h:1129:1
+                                                                                                                      'dtls1_state_st* ssl_st::d1', at offset 1088 (in bits) at ssl.h:1130:1
+                                                                                                                      'int ssl_st::read_ahead', at offset 1152 (in bits) at ssl.h:1132:1
+                                                                                                                      'void (int, int, int, void*, typedef size_t, SSL*, void*)* ssl_st::msg_callback', at offset 1216 (in bits) at ssl.h:1136:1
+                                                                                                                      'void* ssl_st::msg_callback_arg', at offset 1280 (in bits) at ssl.h:1137:1
+                                                                                                                      'int ssl_st::hit', at offset 1344 (in bits) at ssl.h:1139:1
+                                                                                                                      'X509_VERIFY_PARAM* ssl_st::param', at offset 1408 (in bits) at ssl.h:1141:1
+                                                                                                                      'stack_st_SSL_CIPHER* ssl_st::cipher_list', at offset 1472 (in bits) at ssl.h:1149:1
+                                                                                                                      'stack_st_SSL_CIPHER* ssl_st::cipher_list_by_id', at offset 1536 (in bits) at ssl.h:1150:1
+                                                                                                                      'int ssl_st::mac_flags', at offset 1600 (in bits) at ssl.h:1154:1
+                                                                                                                      'EVP_CIPHER_CTX* ssl_st::enc_read_ctx', at offset 1664 (in bits) at ssl.h:1155:1
+                                                                                                                      'EVP_MD_CTX* ssl_st::read_hash', at offset 1728 (in bits) at ssl.h:1156:1
+                                                                                                                      'COMP_CTX* ssl_st::expand', at offset 1792 (in bits) at ssl.h:1158:1
+                                                                                                                      'EVP_CIPHER_CTX* ssl_st::enc_write_ctx', at offset 1856 (in bits) at ssl.h:1163:1
+                                                                                                                      'EVP_MD_CTX* ssl_st::write_hash', at offset 1920 (in bits) at ssl.h:1164:1
+                                                                                                                      'COMP_CTX* ssl_st::compress', at offset 1984 (in bits) at ssl.h:1166:1
+                                                                                                                      'cert_st* ssl_st::cert', at offset 2048 (in bits) at ssl.h:1175:1
+                                                                                                                      'unsigned int ssl_st::sid_ctx_length', at offset 2112 (in bits) at ssl.h:1179:1
+                                                                                                                      'unsigned char ssl_st::sid_ctx[32]', at offset 2144 (in bits) at ssl.h:1180:1
+                                                                                                                      'SSL_SESSION* ssl_st::session', at offset 2432 (in bits) at ssl.h:1183:1
+                                                                                                                      'GEN_SESSION_CB ssl_st::generate_session_id', at offset 2496 (in bits) at ssl.h:1186:1
+                                                                                                                      'int ssl_st::verify_mode', at offset 2560 (in bits) at ssl.h:1189:1
+                                                                                                                      'int (int, X509_STORE_CTX*)* ssl_st::verify_callback', at offset 2624 (in bits) at ssl.h:1191:1
+                                                                                                                      'void (const SSL*, int, int)* ssl_st::info_callback', at offset 2688 (in bits) at ssl.h:1193:1
+                                                                                                                      'int ssl_st::error', at offset 2752 (in bits) at ssl.h:1195:1
+                                                                                                                      'int ssl_st::error_code', at offset 2784 (in bits) at ssl.h:1196:1
+                                                                                                                      'KSSL_CTX* ssl_st::kssl_ctx', at offset 2816 (in bits) at ssl.h:1199:1
+                                                                                                                      'unsigned int (SSL*, const char*, char*, unsigned int, unsigned char*, unsigned int)* ssl_st::psk_client_callback', at offset 2880 (in bits) at ssl.h:1203:1
+                                                                                                                      'unsigned int (SSL*, const char*, unsigned char*, unsigned int)* ssl_st::psk_server_callback', at offset 2944 (in bits) at ssl.h:1206:1
+                                                                                                                      'SSL_CTX* ssl_st::ctx', at offset 3008 (in bits) at ssl.h:1210:1
+                                                                                                                      'int ssl_st::debug', at offset 3072 (in bits) at ssl.h:1213:1
+                                                                                                                      'long int ssl_st::verify_result', at offset 3136 (in bits) at ssl.h:1216:1
+                                                                                                                      'CRYPTO_EX_DATA ssl_st::ex_data', at offset 3200 (in bits) at ssl.h:1217:1
+                                                                                                                      'stack_st_X509_NAME* ssl_st::client_CA', at offset 3328 (in bits) at ssl.h:1220:1
+                                                                                                                      'int ssl_st::references', at offset 3392 (in bits) at ssl.h:1222:1
+                                                                                                                      'unsigned long int ssl_st::options', at offset 3456 (in bits) at ssl.h:1223:1
+                                                                                                                      'unsigned long int ssl_st::mode', at offset 3520 (in bits) at ssl.h:1224:1
+                                                                                                                      'long int ssl_st::max_cert_list', at offset 3584 (in bits) at ssl.h:1225:1
+                                                                                                                      'int ssl_st::first_packet', at offset 3648 (in bits) at ssl.h:1226:1
+                                                                                                                      'int ssl_st::client_version', at offset 3680 (in bits) at ssl.h:1227:1
+                                                                                                                      'unsigned int ssl_st::max_send_fragment', at offset 3712 (in bits) at ssl.h:1229:1
+                                                                                                                      'void (SSL*, int, int, unsigned char*, int, void*)* ssl_st::tlsext_debug_cb', at offset 3776 (in bits) at ssl.h:1232:1
+                                                                                                                      'void* ssl_st::tlsext_debug_arg', at offset 3840 (in bits) at ssl.h:1235:1
+                                                                                                                      'char* ssl_st::tlsext_hostname', at offset 3904 (in bits) at ssl.h:1236:1
+                                                                                                                      'int ssl_st::servername_done', at offset 3968 (in bits) at ssl.h:1237:1
+                                                                                                                      'int ssl_st::tlsext_status_type', at offset 4000 (in bits) at ssl.h:1244:1
+                                                                                                                      'int ssl_st::tlsext_status_expected', at offset 4032 (in bits) at ssl.h:1246:1
+                                                                                                                      'stack_st_OCSP_RESPID* ssl_st::tlsext_ocsp_ids', at offset 4096 (in bits) at ssl.h:1248:1
+                                                                                                                      'X509_EXTENSIONS* ssl_st::tlsext_ocsp_exts', at offset 4160 (in bits) at ssl.h:1249:1
+                                                                                                                      'unsigned char* ssl_st::tlsext_ocsp_resp', at offset 4224 (in bits) at ssl.h:1251:1
+                                                                                                                      'int ssl_st::tlsext_ocsp_resplen', at offset 4288 (in bits) at ssl.h:1252:1
+                                                                                                                      'int ssl_st::tlsext_ticket_expected', at offset 4320 (in bits) at ssl.h:1255:1
+                                                                                                                      'size_t ssl_st::tlsext_ecpointformatlist_length', at offset 4352 (in bits) at ssl.h:1257:1
+                                                                                                                      'unsigned char* ssl_st::tlsext_ecpointformatlist', at offset 4416 (in bits) at ssl.h:1258:1
+                                                                                                                      'size_t ssl_st::tlsext_ellipticcurvelist_length', at offset 4480 (in bits) at ssl.h:1259:1
+                                                                                                                      'unsigned char* ssl_st::tlsext_ellipticcurvelist', at offset 4544 (in bits) at ssl.h:1260:1
+                                                                                                                      'void* ssl_st::tlsext_opaque_prf_input', at offset 4608 (in bits) at ssl.h:1264:1
+                                                                                                                      'size_t ssl_st::tlsext_opaque_prf_input_len', at offset 4672 (in bits) at ssl.h:1265:1
+                                                                                                                      'TLS_SESSION_TICKET_EXT* ssl_st::tlsext_session_ticket', at offset 4736 (in bits) at ssl.h:1268:1
+                                                                                                                      'tls_session_ticket_ext_cb_fn ssl_st::tls_session_ticket_ext_cb', at offset 4800 (in bits) at ssl.h:1271:1
+                                                                                                                      'void* ssl_st::tls_session_ticket_ext_cb_arg', at offset 4864 (in bits) at ssl.h:1272:1
+                                                                                                                      'tls_session_secret_cb_fn ssl_st::tls_session_secret_cb', at offset 4928 (in bits) at ssl.h:1275:1
+                                                                                                                      'void* ssl_st::tls_session_secret_cb_arg', at offset 4992 (in bits) at ssl.h:1276:1
+                                                                                                                      'SSL_CTX* ssl_st::initial_ctx', at offset 5056 (in bits) at ssl.h:1278:1
+                                                                                                                      'unsigned char* ssl_st::next_proto_negotiated', at offset 5120 (in bits) at ssl.h:1288:1
+                                                                                                                      'unsigned char ssl_st::next_proto_negotiated_len', at offset 5184 (in bits) at ssl.h:1289:1
+                                                                                                                      'stack_st_SRTP_PROTECTION_PROFILE* ssl_st::srtp_profiles', at offset 5248 (in bits) at ssl.h:1294:1
+                                                                                                                      'SRTP_PROTECTION_PROFILE* ssl_st::srtp_profile', at offset 5312 (in bits) at ssl.h:1295:1
+                                                                                                                      'unsigned int ssl_st::tlsext_heartbeat', at offset 5376 (in bits) at ssl.h:1297:1
+                                                                                                                      'unsigned int ssl_st::tlsext_hb_pending', at offset 5408 (in bits) at ssl.h:1302:1
+                                                                                                                      'unsigned int ssl_st::tlsext_hb_seq', at offset 5440 (in bits) at ssl.h:1303:1
+                                                                                                                      'int ssl_st::renegotiate', at offset 5472 (in bits) at ssl.h:1308:1
+                                                                                                              and name of 'RedsStream::ssl' changed to 'RedsStream::priv' at reds_stream.h:42:1
+                                                                                                              type of 'SpiceWatch* RedsStream::watch' changed:
+                                                                                                                in pointed to type 'typedef SpiceWatch' at spice-core.h:68:1:
+                                                                                                                  underlying type 'struct SpiceWatch' changed, as being reported
+                                                                                        type of 'channel_disconnect_proc on_disconnect' changed:
+                                                                                          underlying type 'void (RedChannelClient*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_send_pipe_item_proc send_item' changed:
+                                                                                          underlying type 'void (RedChannelClient*, PipeItem*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*, PipeItem*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_hold_pipe_item_proc hold_item' changed:
+                                                                                          underlying type 'void (RedChannelClient*, PipeItem*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*, PipeItem*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_release_pipe_item_proc release_item' changed:
+                                                                                          underlying type 'void (RedChannelClient*, PipeItem*, int)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*, PipeItem*, int)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_alloc_msg_recv_buf_proc alloc_recv_buf' changed:
+                                                                                          underlying type 'uint8_t* (RedChannelClient*, typedef uint16_t, typedef uint32_t)*' changed:
+                                                                                            in pointed to type 'function type uint8_t* (RedChannelClient*, typedef uint16_t, typedef uint32_t)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_release_msg_recv_buf_proc release_recv_buf' changed:
+                                                                                          underlying type 'void (RedChannelClient*, typedef uint16_t, typedef uint32_t, uint8_t*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*, typedef uint16_t, typedef uint32_t, uint8_t*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark' changed:
+                                                                                          underlying type 'int (RedChannelClient*)*' changed:
+                                                                                            in pointed to type 'function type int (RedChannelClient*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_handle_migrate_data_proc handle_migrate_data' changed:
+                                                                                          underlying type 'int (RedChannelClient*, typedef uint32_t, void*)*' changed:
+                                                                                            in pointed to type 'function type int (RedChannelClient*, typedef uint32_t, void*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial' changed:
+                                                                                          underlying type 'typedef uint64_t (RedChannelClient*, typedef uint32_t, void*)*' changed:
+                                                                                            in pointed to type 'function type typedef uint64_t (RedChannelClient*, typedef uint32_t, void*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                  type of 'ClientCbs RedChannel::client_cbs' changed:
+                                                                                    underlying type 'struct {channel_client_connect_proc connect; channel_client_disconnect_proc disconnect; channel_client_migrate_proc migrate;}' at red_channel.h:213:1 changed:
+                                                                                      type size hasn't changed
+                                                                                      3 data member changes:
+                                                                                        type of 'channel_client_connect_proc connect' changed:
+                                                                                          underlying type 'void (RedChannel*, RedClient*, RedsStream*, int, int, uint32_t*, int, uint32_t*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannel*, RedClient*, RedsStream*, int, int, uint32_t*, int, uint32_t*)':
+                                                                                              parameter 1 of type 'RedChannel*' has sub-type changes:
+                                                                                                in pointed to type 'typedef RedChannel' at red_channel.h:130:1:
+                                                                                                  underlying type 'struct RedChannel' changed, as being reported
+                                                                                              parameter 2 of type 'RedClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                                                                                              parameter 3 of type 'RedsStream*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedsStream' changed at red_channel.h:134:1, as reported earlier
+                                                                                        type of 'channel_client_disconnect_proc disconnect' changed:
+                                                                                          underlying type 'void (RedChannelClient*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                                        type of 'channel_client_migrate_proc migrate' changed:
+                                                                                          underlying type 'void (RedChannelClient*)*' changed:
+                                                                                            in pointed to type 'function type void (RedChannelClient*)':
+                                                                                              parameter 1 of type 'RedChannelClient*' has sub-type changes:
+                                                                                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                                                                            type of 'RedWorker* CommonChannel::worker' changed:
+                                                                              pointed to type 'struct RedWorker' changed, as being reported
+                                                              type of 'CursorChannel* RedWorker::cursor_channel' changed:
+                                                                in pointed to type 'typedef CursorChannel' at red_worker.c:774:1:
+                                                                  underlying type 'struct CursorChannel' at red_worker.c:750:1 changed:
+                                                                    type size hasn't changed
+                                                                    1 data member change:
+                                                                      type of 'CommonChannel CursorChannel::common' changed, as reported earlier
+                                                              type of 'QXLInstance* RedWorker::qxl' changed:
+                                                                in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                                                                  underlying type 'struct QXLInstance' at spice.h:259:1 changed:
+                                                                    type size hasn't changed
+                                                                    1 data member change:
+                                                                      type of 'QXLState* QXLInstance::st' changed:
+                                                                        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:
+                                                                              type of 'RedDispatcher* QXLState::dispatcher' changed:
+                                                                                pointed to type 'struct RedDispatcher' changed, as being reported
+                                                              type of 'RedDispatcher* RedWorker::red_dispatcher' changed:
+                                                                in pointed to type 'typedef RedDispatcher':
+                                                                  entity changed from 'typedef RedDispatcher' to compatible type 'struct RedDispatcher'
+                                                                    details are being reported
+                                                              type of 'SpiceWatch RedWorker::watches[20]' changed:
+                                                                array element type 'struct SpiceWatch' changed: 
+                                                                  details are being reported
+                                                                type size hasn't changed
+                                                              type of 'MonitorsConfig* RedWorker::monitors_config' changed:
+                                                                in pointed to type 'typedef MonitorsConfig' at red_worker.c:361:1:
+                                                                  underlying type 'struct MonitorsConfig' at red_worker.c:344:1 changed:
+                                                                    type size hasn't changed
+                                                                    1 data member change:
+                                                                      type of 'RedWorker* MonitorsConfig::worker' changed:
+                                                                        pointed to type 'struct RedWorker' changed, as being reported
+                                                              type of '_Drawable RedWorker::drawables[1000]' changed:
+                                                                array element type 'typedef _Drawable' changed: 
+                                                                  underlying type 'struct _Drawable' at red_worker.c:874:1 changed:
+                                                                    type size changed from 3200 to 2560 (in bits)
+                                                                    1 data member change:
+                                                                      type of 'union {Drawable drawable; _Drawable* next;} _Drawable::u' changed:
+                                                                        type size changed from 3200 to 2560 (in bits)
+                                                                        2 data member changes:
+                                                                          type of 'Drawable drawable' changed:
+                                                                            underlying type 'struct Drawable' at red_worker.c:838:1 changed:
+                                                                              type size changed from 3200 to 2560 (in bits)
+                                                                              2 data member deletions:
+                                                                                'uint8_t* Drawable::backed_surface_data', at offset 2368 (in bits) at red_worker.c:864:1
+                                                                                'DependItem Drawable::pipe_depend_items[3]', at offset 2432 (in bits) at red_worker.c:865:1
+                                                                              6 data member changes (1 filtered):
+                                                                                type of 'Stream* Drawable::stream' changed:
+                                                                                  in pointed to type 'typedef Stream' at red_worker.c:443:1:
+                                                                                    underlying type 'struct Stream' at red_worker.c:433:1 changed:
+                                                                                      type size changed from 896 to 832 (in bits)
+                                                                                      2 data member deletions:
+                                                                                        'SpiceTimer* Stream::input_fps_timer', at offset 640 (in bits) at red_worker.c:444:1
+                                                                                        'uint64_t Stream::input_fps_timer_start', at offset 768 (in bits) at red_worker.c:446:1
+                                                                                      1 data member insertion:
+                                                                                        'uint64_t Stream::input_fps_start_time', at offset 704 (in bits) at red_worker.c:456:1
+                                                                                      4 data member changes:
+                                                                                        type of 'Drawable* Stream::current' changed:
+                                                                                          in pointed to type 'typedef Drawable' at red_worker.c:432:1:
+                                                                                            underlying type 'struct Drawable' changed, as being reported
+                                                                                        type of 'Stream* Stream::next' changed:
+                                                                                          in pointed to type 'typedef Stream' at red_worker.c:443:1:
+                                                                                            underlying type 'struct Stream' changed, as being reported
+                                                                                        'uint32_t Stream::num_input_frames' offset changed from 704 to 640 (in bits) (by -64 bits)
+                                                                                        'uint32_t Stream::input_fps' offset changed from 832 to 768 (in bits) (by -64 bits)
+                                                                                type of 'Stream* Drawable::sized_stream' changed:
+                                                                                  pointed to type 'typedef Stream' changed at red_worker.c:432:1, as reported earlier
+                                                                                type of 'DependItem Drawable::depend_items[3]' changed:
+                                                                                  array element type 'typedef DependItem' changed: 
+                                                                                    underlying type 'struct DependItem' at red_worker.c:825:1 changed:
+                                                                                      type size hasn't changed
+                                                                                      1 data member change:
+                                                                                        type of 'Drawable* DependItem::drawable' changed:
+                                                                                          in pointed to type 'typedef Drawable' at red_worker.c:432:1:
+                                                                                            underlying type 'struct Drawable' changed, as being reported
+                                                                                  type size hasn't changed
+                                                                                'int Drawable::surface_id' offset changed from 3008 to 2368 (in bits) (by -640 bits)
+                                                                                'int Drawable::surfaces_dest[3]' offset changed from 3040 to 2400 (in bits) (by -640 bits)
+                                                                                'uint32_t Drawable::process_commands_generation' offset changed from 3136 to 2496 (in bits) (by -640 bits)
+                                                                          type of '_Drawable* next' changed:
+                                                                            in pointed to type 'typedef _Drawable' at red_worker.c:865:1:
+                                                                              underlying type 'struct _Drawable' changed, as being reported
+                                                                array type size changed from 3200000 to 2560000
+                                                              type of '_Drawable* RedWorker::free_drawables' changed:
+                                                                pointed to type 'typedef _Drawable' changed at red_worker.c:873:1, as reported earlier
+                                                              and offset changed from 15366720 to 14726720 (in bits) (by -640000 bits)
+                                                              '_CursorItem RedWorker::cursor_items[100]' offset changed from 15366784 to 14726784 (in bits) (by -640000 bits)
+                                                              '_CursorItem* RedWorker::free_cursor_items' offset changed from 15379584 to 14739584 (in bits) (by -640000 bits)
+                                                              'RedMemSlotInfo RedWorker::mem_slots' offset changed from 15379648 to 14739648 (in bits) (by -640000 bits)
+                                                              'ImageCache RedWorker::image_cache' offset changed from 15380032 to 14739968 (in bits) (by -640064 bits)
+                                                              type of 'spice_image_compression_t RedWorker::image_compression' changed:
+                                                                typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
+                                                                underlying type 'enum __anonymous_enum__2' at spice.h:471:1 changed:
+                                                                  type name changed from '__anonymous_enum__2' to 'SpiceImageCompression'
+                                                                  type size hasn't changed
+                                                                  7 enumerator deletions:
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_INVALID' value '0'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_OFF' value '1'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_QUIC' value '4'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_GLZ' value '5'
+                                                                    '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_LZ' value '6'
+                                                                  9 enumerator insertions:
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
+                                                                    'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
+                                                              and offset changed from 15445824 to 14805760 (in bits) (by -640064 bits)
+                                                              'spice_wan_compression_t RedWorker::jpeg_state' offset changed from 15445856 to 14805792 (in bits) (by -640064 bits)
+                                                              'spice_wan_compression_t RedWorker::zlib_glz_state' offset changed from 15445888 to 14805824 (in bits) (by -640064 bits)
+                                                              'uint32_t RedWorker::mouse_mode' offset changed from 15445920 to 14805856 (in bits) (by -640064 bits)
+                                                              'uint32_t RedWorker::streaming_video' offset changed from 15445952 to 14805888 (in bits) (by -640064 bits)
+                                                              type of 'Stream RedWorker::streams_buf[50]' changed:
+                                                                array element type 'typedef Stream' changed: 
+                                                                  underlying type 'struct Stream' changed at red_worker.c:433:1, as reported earlier
+                                                                array type size changed from 44800 to 41600
+                                                              and offset changed from 15446016 to 14805952 (in bits) (by -640064 bits)
+                                                              type of 'Stream* RedWorker::free_streams' changed:
+                                                                pointed to type 'typedef Stream' changed at red_worker.c:432:1, as reported earlier
+                                                              and offset changed from 15490816 to 14847552 (in bits) (by -643264 bits)
+                                                              'Ring RedWorker::streams' offset changed from 15490880 to 14847616 (in bits) (by -643264 bits)
+                                                              'ItemTrace RedWorker::items_trace[8]' offset changed from 15491008 to 14847744 (in bits) (by -643264 bits)
+                                                              'uint32_t RedWorker::next_item_trace' offset changed from 15494080 to 14850816 (in bits) (by -643264 bits)
+                                                              'uint64_t RedWorker::streams_size_total' offset changed from 15494144 to 14850880 (in bits) (by -643264 bits)
+                                                              type of 'QuicData RedWorker::quic_data' changed:
+                                                                underlying type 'struct {QuicUsrContext usr; EncoderData data;}' at red_worker.c:577:1 changed:
+                                                                  type size hasn't changed
+                                                                  1 data member change:
+                                                                    type of 'EncoderData data' changed:
+                                                                      underlying type 'struct {DisplayChannelClient* dcc; RedCompressBuf* bufs_head; RedCompressBuf* bufs_tail; jmp_buf jmp_env; union {struct {SpiceChunks* chunks; int next; int stride; int reverse;} lines_data; struct {RedCompressBuf* next; int size_left;} compressed_data;} u; char message_buf[512];}' at red_worker.c:557:1 changed:
+                                                                        type size hasn't changed
+                                                                        1 data member change:
+                                                                          type of 'DisplayChannelClient* dcc' changed:
+                                                                            in pointed to type 'typedef DisplayChannelClient' at red_worker.c:435:1:
+                                                                              underlying type 'struct DisplayChannelClient' at red_worker.c:672:1 changed:
+                                                                                type size hasn't changed
+                                                                                5 data member changes:
+                                                                                  type of 'CommonChannelClient DisplayChannelClient::common' changed:
+                                                                                    underlying type 'struct CommonChannelClient' at red_worker.c:662:1 changed:
+                                                                                      type size hasn't changed
+                                                                                      2 data member changes:
+                                                                                        type of 'RedChannelClient CommonChannelClient::base' changed, as reported earlier
+                                                                                        type of 'RedWorker* CommonChannelClient::worker' changed:
+                                                                                          pointed to type 'struct RedWorker' changed, as being reported
+                                                                                  type of 'PixmapCache* DisplayChannelClient::pixmap_cache' changed:
+                                                                                    in pointed to type 'typedef PixmapCache' at red_worker.c:527:1:
+                                                                                      underlying type 'struct PixmapCache' at red_worker.c:518:1 changed:
+                                                                                        type size hasn't changed
+                                                                                        1 data member change:
+                                                                                          type of 'RedClient* PixmapCache::client' changed:
+                                                                                            pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                                                                                  type of 'GlzSharedDictionary* DisplayChannelClient::glz_dict' changed:
+                                                                                    in pointed to type 'typedef GlzSharedDictionary' at red_worker.c:663:1:
+                                                                                      underlying type 'struct GlzSharedDictionary' at red_worker.c:638:1 changed:
+                                                                                        type size hasn't changed
+                                                                                        1 data member change:
+                                                                                          type of 'RedClient* GlzSharedDictionary::client' changed:
+                                                                                            pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                                                                                  type of 'GlzData DisplayChannelClient::glz_data' changed:
+                                                                                    underlying type 'struct {GlzEncoderUsrContext usr; EncoderData data;}' at red_worker.c:587:1 changed:
+                                                                                      type size hasn't changed
+                                                                                      1 data member change:
+                                                                                        type of 'EncoderData data' changed:
+                                                                                          underlying type 'struct {DisplayChannelClient* dcc; RedCompressBuf* bufs_head; RedCompressBuf* bufs_tail; jmp_buf jmp_env; union {struct {SpiceChunks* chunks; int next; int stride; int reverse;} lines_data; struct {RedCompressBuf* next; int size_left;} compressed_data;} u; char message_buf[512];}' changed, as being reported
+                                                                                  type of 'StreamAgent DisplayChannelClient::stream_agents[50]' changed:
+                                                                                    array element type 'typedef StreamAgent' changed: 
+                                                                                      underlying type 'struct StreamAgent' at red_worker.c:464:1 changed:
+                                                                                        type size hasn't changed
+                                                                                        2 data member changes:
+                                                                                          type of 'Stream* StreamAgent::stream' changed:
+                                                                                            pointed to type 'typedef Stream' changed at red_worker.c:432:1, as reported earlier
+                                                                                          type of 'DisplayChannelClient* StreamAgent::dcc' changed:
+                                                                                            in pointed to type 'typedef DisplayChannelClient' at red_worker.c:435:1:
+                                                                                              underlying type 'struct DisplayChannelClient' changed, as being reported
+                                                                                    type size hasn't changed
+                                                              and offset changed from 15494208 to 14850944 (in bits) (by -643264 bits)
+                                                              'QuicContext* RedWorker::quic' offset changed from 15500736 to 14857472 (in bits) (by -643264 bits)
+                                                              type of 'LzData RedWorker::lz_data' changed:
+                                                                underlying type 'struct {LzUsrContext usr; EncoderData data;}' at red_worker.c:582:1 changed:
+                                                                  type size hasn't changed
+                                                                  1 data member change:
+                                                                    type of 'EncoderData data' changed, as reported earlier
+                                                              and offset changed from 15500800 to 14857536 (in bits) (by -643264 bits)
+                                                              'LzContext* RedWorker::lz' offset changed from 15507328 to 14864064 (in bits) (by -643264 bits)
+                                                              type of 'JpegData RedWorker::jpeg_data' changed:
+                                                                underlying type 'struct {JpegEncoderUsrContext usr; EncoderData data;}' at red_worker.c:592:1 changed:
+                                                                  type size hasn't changed
+                                                                  1 data member change:
+                                                                    type of 'EncoderData data' changed, as reported earlier
+                                                              and offset changed from 15507392 to 14864128 (in bits) (by -643264 bits)
+                                                              'JpegEncoderContext* RedWorker::jpeg' offset changed from 15513600 to 14870336 (in bits) (by -643264 bits)
+                                                              type of 'ZlibData RedWorker::zlib_data' changed:
+                                                                underlying type 'struct {ZlibEncoderUsrContext usr; EncoderData data;}' at red_worker.c:597:1 changed:
+                                                                  type size hasn't changed
+                                                                  1 data member change:
+                                                                    type of 'EncoderData data' changed, as reported earlier
+                                                              and offset changed from 15513664 to 14870400 (in bits) (by -643264 bits)
+                                                              'ZlibEncoder* RedWorker::zlib' offset changed from 15519872 to 14876608 (in bits) (by -643264 bits)
+                                                              'uint32_t RedWorker::process_commands_generation' offset changed from 15519936 to 14876672 (in bits) (by -643264 bits)
+                                                              'StatNodeRef RedWorker::stat' offset changed from 15519968 to 14876704 (in bits) (by -643264 bits)
+                                                              'uint64_t* RedWorker::wakeup_counter' offset changed from 15520000 to 14876736 (in bits) (by -643264 bits)
+                                                              'uint64_t* RedWorker::command_counter' offset changed from 15520064 to 14876800 (in bits) (by -643264 bits)
+                                                              'int RedWorker::driver_cap_monitors_config' offset changed from 15520128 to 14876864 (in bits) (by -643264 bits)
+                                                              'int RedWorker::set_client_capabilities_pending' offset changed from 15520160 to 14876896 (in bits) (by -643264 bits)
+                                            type of 'void (SpiceWatch*, int)* SpiceCoreInterface::watch_update_mask' changed:
+                                              in pointed to type 'function type void (SpiceWatch*, int)':
+                                                parameter 1 of type 'SpiceWatch*' has sub-type changes:
+                                                  pointed to type 'typedef SpiceWatch' changed at spice.h:61:1, as reported earlier
+                                            type of 'void (SpiceWatch*)* SpiceCoreInterface::watch_remove' changed:
+                                              in pointed to type 'function type void (SpiceWatch*)':
+                                                parameter 1 of type 'SpiceWatch*' has sub-type changes:
+                                                  pointed to type 'typedef SpiceWatch' changed at spice.h:61:1, as reported earlier
                               'pthread_t RedDispatcher::worker_thread' offset changed from 2048 to 2112 (in bits) (by +64 bits)
                               'uint32_t RedDispatcher::pending' offset changed from 2112 to 2176 (in bits) (by +64 bits)
                               'int RedDispatcher::primary_active' offset changed from 2144 to 2208 (in bits) (by +64 bits)
@@ -159,11 +630,15 @@ 
         in pointed to type 'typedef SpiceServer' at spice-server.h:38:1:
           underlying type 'struct RedsState' at reds-private.h:127:1 changed:
             type size hasn't changed
-            2 data member changes (2 filtered):
+            5 data member changes (2 filtered):
+              type of 'SpiceWatch* RedsState::listen_watch' changed:
+                pointed to type 'typedef SpiceWatch' changed at spice.h:61:1, as reported earlier
+              type of 'SpiceWatch* RedsState::secure_listen_watch' changed:
+                pointed to type 'typedef SpiceWatch' changed at spice.h:61:1, as reported earlier
               type of 'VDIPortState RedsState::agent_state' changed:
                 underlying type 'struct VDIPortState' at reds-private.h:46:1 changed:
                   type size hasn't changed
-                  1 data member changes (3 filtered):
+                  2 data member changes (3 filtered):
                     type of 'SpiceCharDeviceState* VDIPortState::base' changed:
                       in pointed to type 'typedef SpiceCharDeviceState' at spice-char.h:34:1:
                         underlying type 'struct SpiceCharDeviceState' at char_device.c:47:1 changed:
@@ -171,7 +646,14 @@ 
                           1 data member insertion:
                             'uint64_t SpiceCharDeviceState::cur_pool_size', at offset 384 (in bits) at char_device.c:57:1
                           12 data member changes:
-                            'SpiceCharDeviceWriteBuffer* SpiceCharDeviceState::cur_write_buf' offset changed from 384 to 448 (in bits) (by +64 bits)
+                            type of 'SpiceCharDeviceWriteBuffer* SpiceCharDeviceState::cur_write_buf' changed:
+                              in pointed to type 'typedef SpiceCharDeviceWriteBuffer' at char_device.h:94:1:
+                                underlying type 'struct SpiceCharDeviceWriteBuffer' at char_device.h:66:1 changed:
+                                  type size hasn't changed
+                                  1 data member change:
+                                    type of 'RedClient* SpiceCharDeviceWriteBuffer::client' changed:
+                                      pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                            and offset changed from 384 to 448 (in bits) (by +64 bits)
                             'uint8_t* SpiceCharDeviceState::cur_write_buf_pos' offset changed from 448 to 512 (in bits) (by +64 bits)
                             'SpiceTimer* SpiceCharDeviceState::write_to_dev_timer' offset changed from 512 to 576 (in bits) (by +64 bits)
                             'uint64_t SpiceCharDeviceState::num_self_tokens' offset changed from 576 to 640 (in bits) (by +64 bits)
@@ -192,217 +674,39 @@ 
                             type of 'SpiceCharDeviceCallbacks SpiceCharDeviceState::cbs' changed:
                               underlying type 'struct SpiceCharDeviceCallbacks' at char_device.h:81:1 changed:
                                 type size hasn't changed
-                                1 data member change:
+                                4 data member changes:
                                   type of 'SpiceCharDeviceMsgToClient* (SpiceCharDeviceInstance*, void*)* SpiceCharDeviceCallbacks::read_one_msg_from_device' changed:
                                     in pointed to type 'function type SpiceCharDeviceMsgToClient* (SpiceCharDeviceInstance*, void*)':
                                       parameter 1 of type 'SpiceCharDeviceInstance*' has sub-type changes:
                                         pointed to type 'typedef SpiceCharDeviceInstance' changed at spice.h:399:1, as reported earlier
+                                  type of 'void (SpiceCharDeviceMsgToClient*, RedClient*, void*)* SpiceCharDeviceCallbacks::send_msg_to_client' changed:
+                                    in pointed to type 'function type void (SpiceCharDeviceMsgToClient*, RedClient*, void*)':
+                                      parameter 2 of type 'RedClient*' has sub-type changes:
+                                        pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                                  type of 'void (RedClient*, typedef uint32_t, void*)* SpiceCharDeviceCallbacks::send_tokens_to_client' changed:
+                                    in pointed to type 'function type void (RedClient*, typedef uint32_t, void*)':
+                                      parameter 1 of type 'RedClient*' has sub-type changes:
+                                        pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
+                                  type of 'void (RedClient*, void*)* SpiceCharDeviceCallbacks::remove_client' changed:
+                                    in pointed to type 'function type void (RedClient*, void*)':
+                                      parameter 1 of type 'RedClient*' has sub-type changes:
+                                        pointed to type 'typedef RedClient' changed at red_channel.h:137:1, as reported earlier
                             and offset changed from 1024 to 1088 (in bits) (by +64 bits)
                             'void* SpiceCharDeviceState::opaque' offset changed from 1472 to 1536 (in bits) (by +64 bits)
+                    type of 'SpiceCharDeviceWriteBuffer* VDIPortState::recv_from_client_buf' changed:
+                      pointed to type 'typedef SpiceCharDeviceWriteBuffer' changed at char_device.h:77:1, as reported earlier
               type of 'MainChannel* RedsState::main_channel' changed:
                 in pointed to type 'typedef MainChannel' at main_channel.h:48:1:
                   underlying type 'struct MainChannel' at main_channel.h:36:1 changed:
                     type size hasn't changed
                     1 data member change:
-                      type of 'RedChannel MainChannel::base' changed:
-                        underlying type 'struct RedChannel' at red_channel.h:303:1 changed:
-                          type size hasn't changed
-                          2 data member changes (1 filtered):
-                            type of 'ChannelCbs RedChannel::channel_cbs' changed:
-                              underlying type 'struct {channel_configure_socket_proc config_socket; channel_disconnect_proc on_disconnect; channel_send_pipe_item_proc send_item; channel_hold_pipe_item_proc hold_item; channel_release_pipe_item_proc release_item; channel_alloc_msg_recv_buf_proc alloc_recv_buf; channel_release_msg_recv_buf_proc release_recv_buf; channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark; channel_handle_migrate_data_proc handle_migrate_data; channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial;}' at red_channel.h:195:1 changed:
-                                type size hasn't changed
-                                10 data member changes:
-                                  type of 'channel_configure_socket_proc config_socket' changed:
-                                    underlying type 'int (RedChannelClient*)*' changed:
-                                      in pointed to type 'function type int (RedChannelClient*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          in pointed to type 'typedef RedChannelClient' at red_channel.h:131:1:
-                                            underlying type 'struct RedChannelClient' at red_channel.h:247:1 changed:
-                                              type size hasn't changed
-                                              2 data member changes (2 filtered):
-                                                type of 'RedChannel* RedChannelClient::channel' changed:
-                                                  in pointed to type 'typedef RedChannel' at red_channel.h:130:1:
-                                                    underlying type 'struct RedChannel' changed, as being reported
-                                                type of 'RedsStream* RedChannelClient::stream' changed:
-                                                  in pointed to type 'typedef RedsStream' at reds_stream.h:31:1:
-                                                    underlying type 'struct RedsStream' at reds.h:68:1 changed:
-                                                      type size changed from 1280 to 256 (in bits)
-                                                      5 data member deletions:
-                                                        'RedsSASL RedsStream::sasl', at offset 256 (in bits) at reds.h:78:1
-                                                        'SpiceChannelEventInfo* RedsStream::info', at offset 1024 (in bits) at reds.h:85:1
-                                                        'typedef ssize_t (RedsStream*, void*, typedef size_t)* RedsStream::read', at offset 1088 (in bits) at reds.h:88:1
-                                                        'typedef ssize_t (RedsStream*, void*, typedef size_t)* RedsStream::write', at offset 1152 (in bits) at reds.h:89:1
-                                                        'typedef ssize_t (RedsStream*, const iovec*, int)* RedsStream::writev', at offset 1216 (in bits) at reds.h:90:1
-                                                      1 data member change:
-                                                        type of 'SSL* RedsStream::ssl' changed:
-                                                          in pointed to type 'typedef SSL' at reds_stream.h:32:1:
-                                                            typedef name changed from SSL to RedsStreamPrivate at reds_stream.h:32:1
-                                                            underlying type 'struct ssl_st' at ssl.h:1065:1 changed:
-                                                              type name changed from 'ssl_st' to 'RedsStreamPrivate'
-                                                              type size changed from 5504 to 0 (in bits)
-                                                              94 data member deletions:
-                                                                'int ssl_st::version', at offset 0 (in bits) at ssl.h:1070:1
-                                                                'int ssl_st::type', at offset 32 (in bits) at ssl.h:1071:1
-                                                                'const SSL_METHOD* ssl_st::method', at offset 64 (in bits) at ssl.h:1073:1
-                                                                'BIO* ssl_st::rbio', at offset 128 (in bits) at ssl.h:1080:1
-                                                                'BIO* ssl_st::wbio', at offset 192 (in bits) at ssl.h:1081:1
-                                                                'BIO* ssl_st::bbio', at offset 256 (in bits) at ssl.h:1082:1
-                                                                'int ssl_st::rwstate', at offset 320 (in bits) at ssl.h:1093:1
-                                                                'int ssl_st::in_handshake', at offset 352 (in bits) at ssl.h:1096:1
-                                                                'int (SSL*)* ssl_st::handshake_func', at offset 384 (in bits) at ssl.h:1097:1
-                                                                'int ssl_st::server', at offset 448 (in bits) at ssl.h:1107:1
-                                                                'int ssl_st::new_session', at offset 480 (in bits) at ssl.h:1109:1
-                                                                'int ssl_st::quiet_shutdown', at offset 512 (in bits) at ssl.h:1113:1
-                                                                'int ssl_st::shutdown', at offset 544 (in bits) at ssl.h:1114:1
-                                                                'int ssl_st::state', at offset 576 (in bits) at ssl.h:1116:1
-                                                                'int ssl_st::rstate', at offset 608 (in bits) at ssl.h:1117:1
-                                                                'BUF_MEM* ssl_st::init_buf', at offset 640 (in bits) at ssl.h:1119:1
-                                                                'void* ssl_st::init_msg', at offset 704 (in bits) at ssl.h:1120:1
-                                                                'int ssl_st::init_num', at offset 768 (in bits) at ssl.h:1121:1
-                                                                'int ssl_st::init_off', at offset 800 (in bits) at ssl.h:1122:1
-                                                                'unsigned char* ssl_st::packet', at offset 832 (in bits) at ssl.h:1125:1
-                                                                'unsigned int ssl_st::packet_length', at offset 896 (in bits) at ssl.h:1126:1
-                                                                'ssl2_state_st* ssl_st::s2', at offset 960 (in bits) at ssl.h:1128:1
-                                                                'ssl3_state_st* ssl_st::s3', at offset 1024 (in bits) at ssl.h:1129:1
-                                                                'dtls1_state_st* ssl_st::d1', at offset 1088 (in bits) at ssl.h:1130:1
-                                                                'int ssl_st::read_ahead', at offset 1152 (in bits) at ssl.h:1132:1
-                                                                'void (int, int, int, void*, typedef size_t, SSL*, void*)* ssl_st::msg_callback', at offset 1216 (in bits) at ssl.h:1136:1
-                                                                'void* ssl_st::msg_callback_arg', at offset 1280 (in bits) at ssl.h:1137:1
-                                                                'int ssl_st::hit', at offset 1344 (in bits) at ssl.h:1139:1
-                                                                'X509_VERIFY_PARAM* ssl_st::param', at offset 1408 (in bits) at ssl.h:1141:1
-                                                                'stack_st_SSL_CIPHER* ssl_st::cipher_list', at offset 1472 (in bits) at ssl.h:1149:1
-                                                                'stack_st_SSL_CIPHER* ssl_st::cipher_list_by_id', at offset 1536 (in bits) at ssl.h:1150:1
-                                                                'int ssl_st::mac_flags', at offset 1600 (in bits) at ssl.h:1154:1
-                                                                'EVP_CIPHER_CTX* ssl_st::enc_read_ctx', at offset 1664 (in bits) at ssl.h:1155:1
-                                                                'EVP_MD_CTX* ssl_st::read_hash', at offset 1728 (in bits) at ssl.h:1156:1
-                                                                'COMP_CTX* ssl_st::expand', at offset 1792 (in bits) at ssl.h:1158:1
-                                                                'EVP_CIPHER_CTX* ssl_st::enc_write_ctx', at offset 1856 (in bits) at ssl.h:1163:1
-                                                                'EVP_MD_CTX* ssl_st::write_hash', at offset 1920 (in bits) at ssl.h:1164:1
-                                                                'COMP_CTX* ssl_st::compress', at offset 1984 (in bits) at ssl.h:1166:1
-                                                                'cert_st* ssl_st::cert', at offset 2048 (in bits) at ssl.h:1175:1
-                                                                'unsigned int ssl_st::sid_ctx_length', at offset 2112 (in bits) at ssl.h:1179:1
-                                                                'unsigned char ssl_st::sid_ctx[32]', at offset 2144 (in bits) at ssl.h:1180:1
-                                                                'SSL_SESSION* ssl_st::session', at offset 2432 (in bits) at ssl.h:1183:1
-                                                                'GEN_SESSION_CB ssl_st::generate_session_id', at offset 2496 (in bits) at ssl.h:1186:1
-                                                                'int ssl_st::verify_mode', at offset 2560 (in bits) at ssl.h:1189:1
-                                                                'int (int, X509_STORE_CTX*)* ssl_st::verify_callback', at offset 2624 (in bits) at ssl.h:1191:1
-                                                                'void (const SSL*, int, int)* ssl_st::info_callback', at offset 2688 (in bits) at ssl.h:1193:1
-                                                                'int ssl_st::error', at offset 2752 (in bits) at ssl.h:1195:1
-                                                                'int ssl_st::error_code', at offset 2784 (in bits) at ssl.h:1196:1
-                                                                'KSSL_CTX* ssl_st::kssl_ctx', at offset 2816 (in bits) at ssl.h:1199:1
-                                                                'unsigned int (SSL*, const char*, char*, unsigned int, unsigned char*, unsigned int)* ssl_st::psk_client_callback', at offset 2880 (in bits) at ssl.h:1203:1
-                                                                'unsigned int (SSL*, const char*, unsigned char*, unsigned int)* ssl_st::psk_server_callback', at offset 2944 (in bits) at ssl.h:1206:1
-                                                                'SSL_CTX* ssl_st::ctx', at offset 3008 (in bits) at ssl.h:1210:1
-                                                                'int ssl_st::debug', at offset 3072 (in bits) at ssl.h:1213:1
-                                                                'long int ssl_st::verify_result', at offset 3136 (in bits) at ssl.h:1216:1
-                                                                'CRYPTO_EX_DATA ssl_st::ex_data', at offset 3200 (in bits) at ssl.h:1217:1
-                                                                'stack_st_X509_NAME* ssl_st::client_CA', at offset 3328 (in bits) at ssl.h:1220:1
-                                                                'int ssl_st::references', at offset 3392 (in bits) at ssl.h:1222:1
-                                                                'unsigned long int ssl_st::options', at offset 3456 (in bits) at ssl.h:1223:1
-                                                                'unsigned long int ssl_st::mode', at offset 3520 (in bits) at ssl.h:1224:1
-                                                                'long int ssl_st::max_cert_list', at offset 3584 (in bits) at ssl.h:1225:1
-                                                                'int ssl_st::first_packet', at offset 3648 (in bits) at ssl.h:1226:1
-                                                                'int ssl_st::client_version', at offset 3680 (in bits) at ssl.h:1227:1
-                                                                'unsigned int ssl_st::max_send_fragment', at offset 3712 (in bits) at ssl.h:1229:1
-                                                                'void (SSL*, int, int, unsigned char*, int, void*)* ssl_st::tlsext_debug_cb', at offset 3776 (in bits) at ssl.h:1232:1
-                                                                'void* ssl_st::tlsext_debug_arg', at offset 3840 (in bits) at ssl.h:1235:1
-                                                                'char* ssl_st::tlsext_hostname', at offset 3904 (in bits) at ssl.h:1236:1
-                                                                'int ssl_st::servername_done', at offset 3968 (in bits) at ssl.h:1237:1
-                                                                'int ssl_st::tlsext_status_type', at offset 4000 (in bits) at ssl.h:1244:1
-                                                                'int ssl_st::tlsext_status_expected', at offset 4032 (in bits) at ssl.h:1246:1
-                                                                'stack_st_OCSP_RESPID* ssl_st::tlsext_ocsp_ids', at offset 4096 (in bits) at ssl.h:1248:1
-                                                                'X509_EXTENSIONS* ssl_st::tlsext_ocsp_exts', at offset 4160 (in bits) at ssl.h:1249:1
-                                                                'unsigned char* ssl_st::tlsext_ocsp_resp', at offset 4224 (in bits) at ssl.h:1251:1
-                                                                'int ssl_st::tlsext_ocsp_resplen', at offset 4288 (in bits) at ssl.h:1252:1
-                                                                'int ssl_st::tlsext_ticket_expected', at offset 4320 (in bits) at ssl.h:1255:1
-                                                                'size_t ssl_st::tlsext_ecpointformatlist_length', at offset 4352 (in bits) at ssl.h:1257:1
-                                                                'unsigned char* ssl_st::tlsext_ecpointformatlist', at offset 4416 (in bits) at ssl.h:1258:1
-                                                                'size_t ssl_st::tlsext_ellipticcurvelist_length', at offset 4480 (in bits) at ssl.h:1259:1
-                                                                'unsigned char* ssl_st::tlsext_ellipticcurvelist', at offset 4544 (in bits) at ssl.h:1260:1
-                                                                'void* ssl_st::tlsext_opaque_prf_input', at offset 4608 (in bits) at ssl.h:1264:1
-                                                                'size_t ssl_st::tlsext_opaque_prf_input_len', at offset 4672 (in bits) at ssl.h:1265:1
-                                                                'TLS_SESSION_TICKET_EXT* ssl_st::tlsext_session_ticket', at offset 4736 (in bits) at ssl.h:1268:1
-                                                                'tls_session_ticket_ext_cb_fn ssl_st::tls_session_ticket_ext_cb', at offset 4800 (in bits) at ssl.h:1271:1
-                                                                'void* ssl_st::tls_session_ticket_ext_cb_arg', at offset 4864 (in bits) at ssl.h:1272:1
-                                                                'tls_session_secret_cb_fn ssl_st::tls_session_secret_cb', at offset 4928 (in bits) at ssl.h:1275:1
-                                                                'void* ssl_st::tls_session_secret_cb_arg', at offset 4992 (in bits) at ssl.h:1276:1
-                                                                'SSL_CTX* ssl_st::initial_ctx', at offset 5056 (in bits) at ssl.h:1278:1
-                                                                'unsigned char* ssl_st::next_proto_negotiated', at offset 5120 (in bits) at ssl.h:1288:1
-                                                                'unsigned char ssl_st::next_proto_negotiated_len', at offset 5184 (in bits) at ssl.h:1289:1
-                                                                'stack_st_SRTP_PROTECTION_PROFILE* ssl_st::srtp_profiles', at offset 5248 (in bits) at ssl.h:1294:1
-                                                                'SRTP_PROTECTION_PROFILE* ssl_st::srtp_profile', at offset 5312 (in bits) at ssl.h:1295:1
-                                                                'unsigned int ssl_st::tlsext_heartbeat', at offset 5376 (in bits) at ssl.h:1297:1
-                                                                'unsigned int ssl_st::tlsext_hb_pending', at offset 5408 (in bits) at ssl.h:1302:1
-                                                                'unsigned int ssl_st::tlsext_hb_seq', at offset 5440 (in bits) at ssl.h:1303:1
-                                                                'int ssl_st::renegotiate', at offset 5472 (in bits) at ssl.h:1308:1
-                                                        and name of 'RedsStream::ssl' changed to 'RedsStream::priv' at reds_stream.h:42:1
-                                  type of 'channel_disconnect_proc on_disconnect' changed:
-                                    underlying type 'void (RedChannelClient*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_send_pipe_item_proc send_item' changed:
-                                    underlying type 'void (RedChannelClient*, PipeItem*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*, PipeItem*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_hold_pipe_item_proc hold_item' changed:
-                                    underlying type 'void (RedChannelClient*, PipeItem*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*, PipeItem*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_release_pipe_item_proc release_item' changed:
-                                    underlying type 'void (RedChannelClient*, PipeItem*, int)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*, PipeItem*, int)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_alloc_msg_recv_buf_proc alloc_recv_buf' changed:
-                                    underlying type 'uint8_t* (RedChannelClient*, typedef uint16_t, typedef uint32_t)*' changed:
-                                      in pointed to type 'function type uint8_t* (RedChannelClient*, typedef uint16_t, typedef uint32_t)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_release_msg_recv_buf_proc release_recv_buf' changed:
-                                    underlying type 'void (RedChannelClient*, typedef uint16_t, typedef uint32_t, uint8_t*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*, typedef uint16_t, typedef uint32_t, uint8_t*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_handle_migrate_flush_mark_proc handle_migrate_flush_mark' changed:
-                                    underlying type 'int (RedChannelClient*)*' changed:
-                                      in pointed to type 'function type int (RedChannelClient*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_handle_migrate_data_proc handle_migrate_data' changed:
-                                    underlying type 'int (RedChannelClient*, typedef uint32_t, void*)*' changed:
-                                      in pointed to type 'function type int (RedChannelClient*, typedef uint32_t, void*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_handle_migrate_data_get_serial_proc handle_migrate_data_get_serial' changed:
-                                    underlying type 'typedef uint64_t (RedChannelClient*, typedef uint32_t, void*)*' changed:
-                                      in pointed to type 'function type typedef uint64_t (RedChannelClient*, typedef uint32_t, void*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                            type of 'ClientCbs RedChannel::client_cbs' changed:
-                              underlying type 'struct {channel_client_connect_proc connect; channel_client_disconnect_proc disconnect; channel_client_migrate_proc migrate;}' at red_channel.h:213:1 changed:
-                                type size hasn't changed
-                                3 data member changes:
-                                  type of 'channel_client_connect_proc connect' changed:
-                                    underlying type 'void (RedChannel*, RedClient*, RedsStream*, int, int, uint32_t*, int, uint32_t*)*' changed:
-                                      in pointed to type 'function type void (RedChannel*, RedClient*, RedsStream*, int, int, uint32_t*, int, uint32_t*)':
-                                        parameter 1 of type 'RedChannel*' has sub-type changes:
-                                          in pointed to type 'typedef RedChannel' at red_channel.h:130:1:
-                                            underlying type 'struct RedChannel' changed, as being reported
-                                        parameter 3 of type 'RedsStream*' has sub-type changes:
-                                          pointed to type 'typedef RedsStream' changed at red_channel.h:134:1, as reported earlier
-                                  type of 'channel_client_disconnect_proc disconnect' changed:
-                                    underlying type 'void (RedChannelClient*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
-                                  type of 'channel_client_migrate_proc migrate' changed:
-                                    underlying type 'void (RedChannelClient*)*' changed:
-                                      in pointed to type 'function type void (RedChannelClient*)':
-                                        parameter 1 of type 'RedChannelClient*' has sub-type changes:
-                                          pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+                      type of 'RedChannel MainChannel::base' changed, as reported earlier
+              type of 'RedsClientMonitorsConfig RedsState::client_monitors_config' changed:
+                underlying type 'struct RedsClientMonitorsConfig' at reds-private.h:120:1 changed:
+                  type size hasn't changed
+                  1 data member change:
+                    type of 'MainChannelClient* RedsClientMonitorsConfig::mcc' changed:
+                      pointed to type 'typedef MainChannelClient' changed at red_channel.h:138:1, as reported earlier
 
     [C] 'function int spice_server_add_interface(SpiceServer*, SpiceBaseInstance*)' at reds.c:3159:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
@@ -427,27 +731,7 @@ 
     [C] 'function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)' at reds.c:3618:1 has some indirect sub-type changes:
       return type changed:
         typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-        underlying type 'enum __anonymous_enum__2' at spice.h:471:1 changed:
-          type name changed from '__anonymous_enum__2' to 'SpiceImageCompression'
-          type size hasn't changed
-          7 enumerator deletions:
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_INVALID' value '0'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_OFF' value '1'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_AUTO_GLZ' value '2'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_AUTO_LZ' value '3'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_QUIC' value '4'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_GLZ' value '5'
-            '__anonymous_enum__2::SPICE_IMAGE_COMPRESS_LZ' value '6'
-          9 enumerator insertions:
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_INVALID' value '0'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_OFF' value '1'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_GLZ' value '2'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_AUTO_LZ' value '3'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_QUIC' value '4'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_GLZ' value '5'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
-            'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
+        underlying type 'enum __anonymous_enum__2' changed at spice.h:471:1, as reported earlier
       parameter 1 of type 'SpiceServer*' has sub-type changes:
         pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
 
@@ -466,6 +750,8 @@ 
     [C] 'function int spice_server_init(SpiceServer*, SpiceCoreInterface*)' at reds.c:3407:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
         pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
+      parameter 2 of type 'SpiceCoreInterface*' has sub-type changes:
+        pointed to type 'typedef SpiceCoreInterface' changed at spice.h:49:1, as reported earlier
 
     [C] 'function int spice_server_is_server_mouse(SpiceServer*)' at reds.c:3698:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
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-3.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
index 2ed87e92..aaf28bfe 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt
@@ -1,6 +1,6 @@ 
 ================ changes of 'libspice-server.so.1.8.0'===============
-Leaf changes summary: 11 artifacts changed (7 filtered out)
-  Changed leaf types summary: 2 (7 filtered out) leaf types changed
+Leaf changes summary: 11 artifacts changed (11 filtered out)
+  Changed leaf types summary: 2 (11 filtered out) leaf types changed
   Removed/Changed/Added functions summary: 1 Removed, 0 Changed, 8 Added functions
   Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
 
@@ -40,13 +40,167 @@  Leaf changes summary: 11 artifacts changed (7 filtered out)
       'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ' value '6'
       'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
       'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
-    2 impacted interfaces:
+    79 impacted interfaces:
+      function void spice_qxl_add_memslot(QXLInstance*, QXLDevMemSlot*)
+      function void spice_qxl_add_memslot_async(QXLInstance*, QXLDevMemSlot*, uint64_t)
+      function void spice_qxl_create_primary_surface(QXLInstance*, uint32_t, QXLDevSurfaceCreate*)
+      function void spice_qxl_create_primary_surface_async(QXLInstance*, uint32_t, QXLDevSurfaceCreate*, uint64_t)
+      function void spice_qxl_del_memslot(QXLInstance*, uint32_t, uint32_t)
+      function void spice_qxl_destroy_primary_surface(QXLInstance*, uint32_t)
+      function void spice_qxl_destroy_primary_surface_async(QXLInstance*, uint32_t, uint64_t)
+      function void spice_qxl_destroy_surface_async(QXLInstance*, uint32_t, uint64_t)
+      function void spice_qxl_destroy_surface_wait(QXLInstance*, uint32_t)
+      function void spice_qxl_destroy_surfaces(QXLInstance*)
+      function void spice_qxl_destroy_surfaces_async(QXLInstance*, uint64_t)
+      function void spice_qxl_driver_unload(QXLInstance*)
+      function void spice_qxl_flush_surfaces_async(QXLInstance*, uint64_t)
+      function void spice_qxl_loadvm_commands(QXLInstance*, QXLCommandExt*, uint32_t)
+      function void spice_qxl_monitors_config_async(QXLInstance*, QXLPHYSICAL, int, uint64_t)
+      function void spice_qxl_oom(QXLInstance*)
+      function void spice_qxl_reset_cursor(QXLInstance*)
+      function void spice_qxl_reset_image_cache(QXLInstance*)
+      function void spice_qxl_reset_memslots(QXLInstance*)
+      function void spice_qxl_set_max_monitors(QXLInstance*, unsigned int)
+      function void spice_qxl_start(QXLInstance*)
+      function void spice_qxl_stop(QXLInstance*)
+      function void spice_qxl_update_area(QXLInstance*, uint32_t, QXLRect*, QXLRect*, uint32_t, uint32_t)
+      function void spice_qxl_update_area_async(QXLInstance*, uint32_t, QXLRect*, uint32_t, uint64_t)
+      function void spice_qxl_wakeup(QXLInstance*)
+      function int spice_server_add_client(SpiceServer*, int, int)
+      function int spice_server_add_interface(SpiceServer*, SpiceBaseInstance*)
+      function int spice_server_add_renderer(SpiceServer*, const char*)
+      function int spice_server_add_ssl_client(SpiceServer*, int, int)
+      function void spice_server_char_device_wakeup(SpiceCharDeviceInstance*)
+      function void spice_server_destroy(SpiceServer*)
       function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)
+      function int spice_server_get_num_clients(SpiceServer*)
+      function int spice_server_get_peer_info(SpiceServer*, sockaddr*, socklen_t*)
+      function int spice_server_get_sock_info(SpiceServer*, sockaddr*, socklen_t*)
+      function int spice_server_init(SpiceServer*, SpiceCoreInterface*)
+      function int spice_server_is_server_mouse(SpiceServer*)
+      function int spice_server_migrate_connect(SpiceServer*, const char*, int, int, const char*)
+      function int spice_server_migrate_end(SpiceServer*, int)
+      function int spice_server_migrate_info(SpiceServer*, const char*, int, int, const char*)
+      function int spice_server_migrate_start(SpiceServer*)
+      function int spice_server_migrate_switch(SpiceServer*)
+      function SpiceServer* spice_server_new()
+      function void spice_server_playback_get_buffer(SpicePlaybackInstance*, uint32_t**, uint32_t*)
+      function void spice_server_playback_put_samples(SpicePlaybackInstance*, uint32_t*)
+      function void spice_server_playback_set_mute(SpicePlaybackInstance*, uint8_t)
+      function void spice_server_playback_set_volume(SpicePlaybackInstance*, uint8_t, uint16_t*)
+      function void spice_server_playback_start(SpicePlaybackInstance*)
+      function void spice_server_playback_stop(SpicePlaybackInstance*)
+      function void spice_server_port_event(SpiceCharDeviceInstance*, uint8_t)
+      function uint32_t spice_server_record_get_samples(SpiceRecordInstance*, uint32_t*, uint32_t)
+      function void spice_server_record_set_mute(SpiceRecordInstance*, uint8_t)
+      function void spice_server_record_set_volume(SpiceRecordInstance*, uint8_t, uint16_t*)
+      function void spice_server_record_start(SpiceRecordInstance*)
+      function void spice_server_record_stop(SpiceRecordInstance*)
+      function void spice_server_set_addr(SpiceServer*, const char*, int)
+      function int spice_server_set_agent_copypaste(SpiceServer*, int)
+      function int spice_server_set_agent_file_xfer(SpiceServer*, int)
+      function int spice_server_set_agent_mouse(SpiceServer*, int)
+      function int spice_server_set_channel_security(SpiceServer*, const char*, int)
+      function int spice_server_set_compat_version(SpiceServer*, spice_compat_version_t)
+      function int spice_server_set_exit_on_disconnect(SpiceServer*, int)
       function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)
+      function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)
+      function int spice_server_set_listen_socket_fd(SpiceServer*, int)
+      function void spice_server_set_name(SpiceServer*, const char*)
+      function int spice_server_set_noauth(SpiceServer*)
+      function int spice_server_set_playback_compression(SpiceServer*, int)
+      function int spice_server_set_port(SpiceServer*, int)
+      function int spice_server_set_sasl(SpiceServer*, int)
+      function int spice_server_set_sasl_appname(SpiceServer*, const char*)
+      function void spice_server_set_seamless_migration(SpiceServer*, int)
+      function int spice_server_set_streaming_video(SpiceServer*, int)
+      function int spice_server_set_ticket(SpiceServer*, const char*, int, int, int)
+      function int spice_server_set_tls(SpiceServer*, int, const char*, const char*, const char*, const char*, const char*, const char*)
+      function void spice_server_set_uuid(SpiceServer*, const uint8_t*)
+      function int spice_server_set_zlib_glz_compression(SpiceServer*, spice_wan_compression_t)
+      function void spice_server_vm_start(SpiceServer*)
+      function void spice_server_vm_stop(SpiceServer*)
   'typedef spice_image_compression_t at spice.h:479:1' changed:
     typedef name changed from spice_image_compression_t to SpiceImageCompression at enums.h:197:1
-    2 impacted interfaces:
+    79 impacted interfaces:
+      function void spice_qxl_add_memslot(QXLInstance*, QXLDevMemSlot*)
+      function void spice_qxl_add_memslot_async(QXLInstance*, QXLDevMemSlot*, uint64_t)
+      function void spice_qxl_create_primary_surface(QXLInstance*, uint32_t, QXLDevSurfaceCreate*)
+      function void spice_qxl_create_primary_surface_async(QXLInstance*, uint32_t, QXLDevSurfaceCreate*, uint64_t)
+      function void spice_qxl_del_memslot(QXLInstance*, uint32_t, uint32_t)
+      function void spice_qxl_destroy_primary_surface(QXLInstance*, uint32_t)
+      function void spice_qxl_destroy_primary_surface_async(QXLInstance*, uint32_t, uint64_t)
+      function void spice_qxl_destroy_surface_async(QXLInstance*, uint32_t, uint64_t)
+      function void spice_qxl_destroy_surface_wait(QXLInstance*, uint32_t)
+      function void spice_qxl_destroy_surfaces(QXLInstance*)
+      function void spice_qxl_destroy_surfaces_async(QXLInstance*, uint64_t)
+      function void spice_qxl_driver_unload(QXLInstance*)
+      function void spice_qxl_flush_surfaces_async(QXLInstance*, uint64_t)
+      function void spice_qxl_loadvm_commands(QXLInstance*, QXLCommandExt*, uint32_t)
+      function void spice_qxl_monitors_config_async(QXLInstance*, QXLPHYSICAL, int, uint64_t)
+      function void spice_qxl_oom(QXLInstance*)
+      function void spice_qxl_reset_cursor(QXLInstance*)
+      function void spice_qxl_reset_image_cache(QXLInstance*)
+      function void spice_qxl_reset_memslots(QXLInstance*)
+      function void spice_qxl_set_max_monitors(QXLInstance*, unsigned int)
+      function void spice_qxl_start(QXLInstance*)
+      function void spice_qxl_stop(QXLInstance*)
+      function void spice_qxl_update_area(QXLInstance*, uint32_t, QXLRect*, QXLRect*, uint32_t, uint32_t)
+      function void spice_qxl_update_area_async(QXLInstance*, uint32_t, QXLRect*, uint32_t, uint64_t)
+      function void spice_qxl_wakeup(QXLInstance*)
+      function int spice_server_add_client(SpiceServer*, int, int)
+      function int spice_server_add_interface(SpiceServer*, SpiceBaseInstance*)
+      function int spice_server_add_renderer(SpiceServer*, const char*)
+      function int spice_server_add_ssl_client(SpiceServer*, int, int)
+      function void spice_server_char_device_wakeup(SpiceCharDeviceInstance*)
+      function void spice_server_destroy(SpiceServer*)
       function spice_image_compression_t spice_server_get_image_compression(SpiceServer*)
+      function int spice_server_get_num_clients(SpiceServer*)
+      function int spice_server_get_peer_info(SpiceServer*, sockaddr*, socklen_t*)
+      function int spice_server_get_sock_info(SpiceServer*, sockaddr*, socklen_t*)
+      function int spice_server_init(SpiceServer*, SpiceCoreInterface*)
+      function int spice_server_is_server_mouse(SpiceServer*)
+      function int spice_server_migrate_connect(SpiceServer*, const char*, int, int, const char*)
+      function int spice_server_migrate_end(SpiceServer*, int)
+      function int spice_server_migrate_info(SpiceServer*, const char*, int, int, const char*)
+      function int spice_server_migrate_start(SpiceServer*)
+      function int spice_server_migrate_switch(SpiceServer*)
+      function SpiceServer* spice_server_new()
+      function void spice_server_playback_get_buffer(SpicePlaybackInstance*, uint32_t**, uint32_t*)
+      function void spice_server_playback_put_samples(SpicePlaybackInstance*, uint32_t*)
+      function void spice_server_playback_set_mute(SpicePlaybackInstance*, uint8_t)
+      function void spice_server_playback_set_volume(SpicePlaybackInstance*, uint8_t, uint16_t*)
+      function void spice_server_playback_start(SpicePlaybackInstance*)
+      function void spice_server_playback_stop(SpicePlaybackInstance*)
+      function void spice_server_port_event(SpiceCharDeviceInstance*, uint8_t)
+      function uint32_t spice_server_record_get_samples(SpiceRecordInstance*, uint32_t*, uint32_t)
+      function void spice_server_record_set_mute(SpiceRecordInstance*, uint8_t)
+      function void spice_server_record_set_volume(SpiceRecordInstance*, uint8_t, uint16_t*)
+      function void spice_server_record_start(SpiceRecordInstance*)
+      function void spice_server_record_stop(SpiceRecordInstance*)
+      function void spice_server_set_addr(SpiceServer*, const char*, int)
+      function int spice_server_set_agent_copypaste(SpiceServer*, int)
+      function int spice_server_set_agent_file_xfer(SpiceServer*, int)
+      function int spice_server_set_agent_mouse(SpiceServer*, int)
+      function int spice_server_set_channel_security(SpiceServer*, const char*, int)
+      function int spice_server_set_compat_version(SpiceServer*, spice_compat_version_t)
+      function int spice_server_set_exit_on_disconnect(SpiceServer*, int)
       function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)
+      function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)
+      function int spice_server_set_listen_socket_fd(SpiceServer*, int)
+      function void spice_server_set_name(SpiceServer*, const char*)
+      function int spice_server_set_noauth(SpiceServer*)
+      function int spice_server_set_playback_compression(SpiceServer*, int)
+      function int spice_server_set_port(SpiceServer*, int)
+      function int spice_server_set_sasl(SpiceServer*, int)
+      function int spice_server_set_sasl_appname(SpiceServer*, const char*)
+      function void spice_server_set_seamless_migration(SpiceServer*, int)
+      function int spice_server_set_streaming_video(SpiceServer*, int)
+      function int spice_server_set_ticket(SpiceServer*, const char*, int, int, int)
+      function int spice_server_set_tls(SpiceServer*, int, const char*, const char*, const char*, const char*, const char*, const char*)
+      function void spice_server_set_uuid(SpiceServer*, const uint8_t*)
+      function int spice_server_set_zlib_glz_compression(SpiceServer*, spice_wan_compression_t)
+      function void spice_server_vm_start(SpiceServer*)
+      function void spice_server_vm_stop(SpiceServer*)
 ================ end of changes of 'libspice-server.so.1.8.0'===============