[1/5] Fix interaction of --redundant and --leaf-changes-only options.

Message ID 20200312063036.29419-2-gprocida@google.com
State Committed
Headers
Series More whitespace and leaf-changes-only fixes |

Commit Message

Giuliano Procida March 12, 2020, 6:30 a.m. UTC
  The --redundant (meaning show-redundant-changes) option is supposed to
be implied by --leaf-changes-only and this is currently implemented by
making diff_context's --leaf-changes-only setter also duplicate the
behaviour of its --redundant setter.

In both abidiff and abipkgdiff, the diff_context setters are called
unconditionally, but the relative order of the calls for these two
options is different in each case, resulting in two different issues.

In abidiff, the --redundant setter is called second, undoing the
intended side-effect of any --leaf-changes-only flag. So --redundant
is not actually turned on in --leaf-changes-only mode unless requested
explicitly.

In abipkgdiff, the leaf-changes-only setter is called second, undoing
(in non-leaf mode) the effect of any --redundant flag. So --redundant
has no effect in default reporting mode.

The fix is move to move the "--leaf-changes-only implies --redundant"
logic from the setter to the set_diff_context_from_opts functions.
This patch also documents the implied behaviour in the usage strings.

	* src/abg-comparison.cc (diff_context::show_leaf_changes_only):
	Remove "--leaf-changes-only implies --redundant" logic.
	* tools/abidiff.cc (display_usage): Mention that
	--leaf-changes-only implies --redundant.
	(set_diff_context_from_opts): Make --leaf-changes-only imply
	--redundant; document this behaviour in a comment.
	* tools/abipkgdiff.cc: Ditto.
	* tests/data/Makefile.am: Add new test case files.
	* tests/data/test-abidiff-exit/test-leaf3-report.txt: Add new
	test case, to show --leaf-changes-only implies --redundant.
	* tests/data/test-abidiff-exit/test-leaf3-v0.c: Ditto.
	* tests/data/test-abidiff-exit/test-leaf3-v0.o: Ditto.
	* tests/data/test-abidiff-exit/test-leaf3-v1.c: Ditto.
	* tests/data/test-abidiff-exit/test-leaf3-v1.o: Ditto.
	* tests/test-abidiff-exit.cc: Run new test case.
	* tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt:
	Update abipkgdiff report with --redundant output.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt:
	Ditto.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	Ditto.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 src/abg-comparison.cc                         |  13 -
 tests/data/Makefile.am                        |   5 +
 .../test-abidiff-exit/test-leaf3-report.txt   |  29 +
 tests/data/test-abidiff-exit/test-leaf3-v0.c  |  19 +
 tests/data/test-abidiff-exit/test-leaf3-v0.o  | Bin 0 -> 3320 bytes
 tests/data/test-abidiff-exit/test-leaf3-v1.c  |  20 +
 tests/data/test-abidiff-exit/test-leaf3-v1.o  | Bin 0 -> 3384 bytes
 ...4--libcdio-0.94-2.fc26.x86_64-report.1.txt |   8 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-1.txt |   3 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-2.txt | 496 +++++++++++++++++-
 tests/test-abidiff-exit.cc                    |   9 +
 tools/abidiff.cc                              |  16 +-
 tools/abipkgdiff.cc                           |   6 +-
 13 files changed, 587 insertions(+), 37 deletions(-)
 create mode 100644 tests/data/test-abidiff-exit/test-leaf3-report.txt
 create mode 100644 tests/data/test-abidiff-exit/test-leaf3-v0.c
 create mode 100644 tests/data/test-abidiff-exit/test-leaf3-v0.o
 create mode 100644 tests/data/test-abidiff-exit/test-leaf3-v1.c
 create mode 100644 tests/data/test-abidiff-exit/test-leaf3-v1.o
  

Comments

Dodji Seketeli March 13, 2020, 5:30 p.m. UTC | #1
Hello Giuliano,

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

[...]

>
> 	* src/abg-comparison.cc (diff_context::show_leaf_changes_only):
> 	Remove "--leaf-changes-only implies --redundant" logic.
> 	* tools/abidiff.cc (display_usage): Mention that
> 	--leaf-changes-only implies --redundant.
> 	(set_diff_context_from_opts): Make --leaf-changes-only imply
> 	--redundant; document this behaviour in a comment.
> 	* tools/abipkgdiff.cc: Ditto.
> 	* tests/data/Makefile.am: Add new test case files.
> 	* tests/data/test-abidiff-exit/test-leaf3-report.txt: Add new
> 	test case, to show --leaf-changes-only implies --redundant.
> 	* tests/data/test-abidiff-exit/test-leaf3-v0.c: Ditto.
> 	* tests/data/test-abidiff-exit/test-leaf3-v0.o: Ditto.
> 	* tests/data/test-abidiff-exit/test-leaf3-v1.c: Ditto.
> 	* tests/data/test-abidiff-exit/test-leaf3-v1.o: Ditto.
> 	* tests/test-abidiff-exit.cc: Run new test case.
> 	* tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt:
> 	Update abipkgdiff report with --redundant output.
> 	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt:
> 	Ditto.
> 	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
> 	Ditto.

Looks good to me, applied to master.

Thanks!
  

Patch

diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index b99cfa7d..48a2d22e 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -1521,20 +1521,7 @@  diff_context::show_leaf_changes_only(bool f)
   // created.  Once it's been created, we are supposed to live with
   // it.
   ABG_ASSERT(priv_->reporter_ == 0);
-
   priv_->leaf_changes_only_ = f;
-  // So when we are showing only leaf changes, we want to show
-  // redundant changes because of this: Suppose several functions have
-  // their return type changed from void* to int*.  We want them all
-  // to be reported.  In that case the change is not redundant.  As
-  // far as user-defined type changes (like struct/class) they are
-  // already put inside a map which makes them be non-redundant, so we
-  // don't have to worry about that case.
-  //
-  // TODO: maybe that in this case we should avoid firing the
-  // redundancy analysis pass altogether.  That could help save a
-  // couple of CPU cycle here and there!
-  priv_->show_redundant_changes_ = f;
 }
 
 /// Get the flag that indicates if the diff using this context should
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 5dab8685..bf76ca2e 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -120,6 +120,11 @@  test-abidiff-exit/test-leaf1-v0.o \
 test-abidiff-exit/test-leaf1-v1.cc \
 test-abidiff-exit/test-leaf1-v1.o \
 test-abidiff-exit/test-leaf1-report.txt \
+test-abidiff-exit/test-leaf3-v0.c \
+test-abidiff-exit/test-leaf3-v0.o \
+test-abidiff-exit/test-leaf3-v1.c \
+test-abidiff-exit/test-leaf3-v1.o \
+test-abidiff-exit/test-leaf3-report.txt \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/test-leaf3-report.txt b/tests/data/test-abidiff-exit/test-leaf3-report.txt
new file mode 100644
index 00000000..d02c71a7
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf3-report.txt
@@ -0,0 +1,29 @@ 
+Leaf changes summary: 4 artifacts changed
+Changed leaf types summary: 0 leaf type changed
+Removed/Changed/Added functions summary: 0 Removed, 4 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+4 functions with some sub-type change:
+
+  [C] 'function void fn1(sto1)' at test-leaf3-v1.c:10:1 has some sub-type changes:
+    parameter 1 of type 'struct sto1' changed:
+    type name changed from 'sto1' to 'stn1'
+    type size hasn't changed
+
+
+  [C] 'function void fn2(sto2)' at test-leaf3-v1.c:13:1 has some sub-type changes:
+    parameter 1 of type 'struct sto2' changed:
+    type name changed from 'sto2' to 'stn2'
+    type size changed from 64 to 128 (in bits)
+    1 data member insertion:
+      'double stn2::y', at offset 64 (in bits) at test-leaf3-v1.c:7:1
+
+  [C] 'function void fn3(sto1*)' at test-leaf3-v1.c:16:1 has some sub-type changes:
+    parameter 1 of type 'sto1*' changed:
+    pointer type changed from: 'sto1*' to: 'stn1*'
+
+  [C] 'function void fn4(sto2*)' at test-leaf3-v1.c:19:1 has some sub-type changes:
+    parameter 1 of type 'sto2*' changed:
+    pointer type changed from: 'sto2*' to: 'stn2*'
+
+
diff --git a/tests/data/test-abidiff-exit/test-leaf3-v0.c b/tests/data/test-abidiff-exit/test-leaf3-v0.c
new file mode 100644
index 00000000..1d9c6266
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf3-v0.c
@@ -0,0 +1,19 @@ 
+struct sto1 {
+  int x;
+};
+
+struct sto2 {
+  long x;
+};
+
+void fn1(struct sto1 s) {
+}
+
+void fn2(struct sto2 s) {
+}
+
+void fn3(struct sto1* s) {
+}
+
+void fn4(struct sto2* s) {
+}
diff --git a/tests/data/test-abidiff-exit/test-leaf3-v0.o b/tests/data/test-abidiff-exit/test-leaf3-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..1e74a51b929f63ba77041febe2b2aa064e41cc78
GIT binary patch
literal 3320
zcmbtWTW=dx5T4`p#%r877ef;#AZ@wyqOgnYgf=N87(&xlK!p&M`aqSgo%Kbv*Ok34
zDNum~LgX!xkSJ2#c;K}!`~n{N1^fUc9^nnCMKH5_X1zYyyue64XXg86=FGXSKfnC$
zc1j3f5wHm(i&20zW29FDwF(88gBw@(f7^fX<lxrNq+Q*A@Yjjz^O!dsgc`vJlcS8G
zwj2Xeq^E^2wz1dtK%_FHA(qzLo(}<U2;FE%ej?BSbVDb%iH5fdVs3(Tl3dt<IQky7
z%mBH0(o%;lFpT$5!-y3S(+Ls3$cX8A(!vNUjHrN^Oo;efMogZf%oLGrcx4dT$oDD4
zNyHJ=l08NFQimM`X2nbSLQcys<!8lQW@aAog3$80+@;)Wx%HeV;Cf7fW`yRo!WvF3
z{UYRYn>h_PNtbFKXJm^vitKo{Na?Bz-@R3&6d661BDDZuOk;{`$Yf85!UA8WBJqdb
zLCeiDD@y+%+8Ug}R*1*>DQtt2hPyAocL%=Jah=ABb+2UCgGjvy*)Ttvi@F%<#Z6s&
zsV|P&l!jRbey<GJRE}lo^t`4?=i?Q>dl#-;zhQ2bFPiIi#V(tbQhB{xE>%pc>kmD5
zqv?8Xzg<Vu>DOBudutc03#+EpG_8g+xbM|l{hrqw4y>W~aogLqe5clN2LM;Lwl10H
z-gawk#|txC<%{Q)G2rQ7LO9V+J^-;dBbFvJ#sN<JS;Xl_5}biI^D|$kwx%X7qXS~Z
zy-p+wZY%)v+avxX!ck7*KMUzZUQ)+8x{+!4^Pgh`0=VQ!Fyhf>jqw^XNutT?uW}kh
z*J6y)ATwsOp+T0_v0jUA`527VOpOE5(f}_>f@pB;X@Xhwn~SXj-`{5>&UUaTh!rJH
zJPG5^p-y>B0#O)0c9QA6Xm}O;t>AAp^u{|a6&jCqg1BPBX?4yKh(dLfFwS*yU5vjF
zx&?KUN;@9k-Sd(s|M=y%V|aX5t}A%(C?nQZ@I`44WzXZ9(*9Awx$a*Toad#>qsn=t
zTeMc>$F&eQBOO%#S5LrAiPPG|*QcuBT+eL<=lZ`;a8ue~5AJvIslndwhkc7R-`(@U
z-gSHj?Al-ecHiwd_O4qSHh0=yqla9eJGENhy*EZXeaCC!>lF{_v^|$Ya0syLy>8dV
zx6}4|zH8&-X$^d*en$qmt(`{S>AGC#|Ld19oYp*khACr}8kFU*i(0v@k$oC9!qk`M
zPUJDJsPSi!rgQvX<I5PU=A;pM{4)xvn8Bx%{tQ(qC?=2O;armebUw+C?;L)q1KGe<
z%}K<e1djr*QKS04kCcj$w<QmCX%rf0s_#39Ce{DD+)$3E`so!{>)%C8&501)lH=bb
zBPOcv4suE3FUU^@uM>?=?~*$HUBoCS*NJK%Kgsd=8_GD3&;6%JB*mBIfui#j7mnlp
zD<oNu``uIzq$E{e`tM4ZEH_HQ@ed;;RCxXje~U`e`jzDR-Ik8De)N^(cwX0}u_@#a
sS^q;>FnxdM>#N4oo+M568+rauBOe!;E`lg;Qv89e|A)vkRMhx?0pT#>z5oCK

literal 0
HcmV?d00001

diff --git a/tests/data/test-abidiff-exit/test-leaf3-v1.c b/tests/data/test-abidiff-exit/test-leaf3-v1.c
new file mode 100644
index 00000000..fe182cd8
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf3-v1.c
@@ -0,0 +1,20 @@ 
+struct stn1 {
+  int x;
+};
+
+struct stn2 {
+  long x;
+  double y;
+};
+
+void fn1(struct stn1 s) {
+}
+
+void fn2(struct stn2 s) {
+}
+
+void fn3(struct stn1* s) {
+}
+
+void fn4(struct stn2* s) {
+}
diff --git a/tests/data/test-abidiff-exit/test-leaf3-v1.o b/tests/data/test-abidiff-exit/test-leaf3-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..f7db3a0cd5c0d44e14a1d00e7503a07e50a7e1cd
GIT binary patch
literal 3384
zcmbtW&u<%55T57F#+$fyoEVyz0CFTsTf}bTG&D&e!4Q(VDpXaa2oRuT?W_|EdmZd`
z>re`nia@zF5)wtqjUxxRa&7+sPKXOfPF&zt2_%?#`^H|s7!EK}_RW0X{Ccx*pYzGu
z>+3NgfJMLx^ejdJI#y3FNVNbNn1GGq!7m55|Gf9!L(+-|k1EBnj~^5d)_yA<Y&`11
zw>5PhYYfRWmaKN7mp#-LB0!AvAt9`FT#XKhSe!J(hRmuTfaKG{v_4S$u++fV2N56b
zAZUSUnG|7Kvg&Zfp9hf{CWs^vE+CG+K`q`wZj!Xv;VxL#8>nH#c@XIV5kISl^dxCv
zgdIlAfk<{ECJ`eMM`O5Us*yZNnPZ1rFjDdJAV#~sqtcUn$#3)|<%=EG5EvJyQkjI2
znof<2iFg{5#xlZ4B@!1CFD8}}B7+l3f?<W`<;)^(ZRi<DBvujzzCu%}Dcq4GUe2=P
z=`5uyOnv!kmQuvcNQ&4L4sZ-pTt;T(AEL0q=c!5Ac;u|09etIOR*yGvHQ-r%3h_rO
ziBEYBaX113uNBxe&#j!dZ{(e_j4-n>66UAC5n+n9nO!l3wQN3t%iZu9Gcb`J-U|FV
zs5ShZ9G#c#M!Qt=;9OAO17z}W>FP#qHNTKsa^{?TZf-Wel+Vx3<?MRU_PymD&-a?u
zGMa9)yt~|4ykK9L&)GXUyW+O?{qk<J;WyeXyY1hs`rCHkV)7QirPbAoxihbMrK;<P
zneF_-S*-><Cbx!L{_r}8PFhT#h+Fq?1WzJPe<boWypl?P7F$gYub~5C#Jxl$iac4&
zU+?knhIDwknP2bmAN>ojsACI#twZqpU&japaPos-#JjJpk2jDRB!;>gbk2b82hv9w
z5bv|uFkpn$zSZb{?|m?Klk5kSWdMFI1H^!1*A|SU-$Y~%{3SoGaJJ<;LoBQC8C*&D
zCVC2W%0nL&3FF7U47xcgc)IC+qFYS~Pm1cXP84@cI8Emqfhg2B3FDy!Kz)-iekwF&
z-=xwTkG|criYNc*HQ+>Ws{5R>uWEQ&*@1?0AGb98X=Q(|R_=%A_PvJloPX7D>X&4a
z5}<IN(CW>Q{Nyi*BDi1O{{_YCcuwIov*_Fk8qWP}Y50t??`Syh7o6699j_o<gJ!ty
zvKDxq0Gw?%aKS0HTHrLjn(J(PrS{Hd)vq*=le$|fHN6{swA*z39lX_|A+@USaR`<G
zr`)L5J-lBXzY%y2UaEF0aLezjAa8fG(sb*dYW#mL(-=>)jh<~vS)d1s{-Z;_QK2~!
zrr$s}qfQZBk3WqZo$vn|pT}4|Cza#+iyEn!@?M~SWeOA&k)PDzyru%^e3Bo3i}+hE
zWf`A(P9nZl;F0v|J#^n|Na+}PUr~p8wihZj-S-NjgZe+Cu5ym2{t43i-$qQ&i4fdU
z_1_^QBD(J;a)au>rRwvXs6O3Sdi_1bC@1%cs+1p9{ksgPmFx3L_t>ELx7C57^A#12
z<MmS{S&#bN(GR2|b>FX4ylS_bg5&RZkx=3NGyDZAgXXuV=C`FBX@2zU$?-f_>PN3l
uAybqT<-Tf|ewXN1S&yf8GH9#csq;UBd{p%PQ{F-GKdAn{js~Ny$NvoiB<>FY

literal 0
HcmV?d00001

diff --git a/tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt b/tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt
index d73fae52..23b12adf 100644
--- a/tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt
+++ b/tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt
@@ -1,8 +1,8 @@ 
 ================ changes of 'libcdio.so.16.0.0'===============
-  Functions changes summary: 0 Removed, 1 Changed (1 filtered out), 0 Added functions
+  Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
-  1 function with some indirect sub-type change:
+  2 functions with some indirect sub-type change:
 
     [C] 'function discmode_t mmc_get_dvd_struct_physical(const CdIo_t*, cdio_dvd_struct_t*)' at mmc.c:949:1 has some indirect sub-type changes:
       parameter 2 of type 'cdio_dvd_struct_t*' has sub-type changes:
@@ -37,6 +37,10 @@ 
 
 
 
+    [C] 'function discmode_t mmc_get_dvd_struct_physical_private(void*, mmc_run_cmd_fn_t, cdio_dvd_struct_t*)' at mmc.c:450:1 has some indirect sub-type changes:
+      parameter 3 of type 'cdio_dvd_struct_t*' has sub-type changes:
+        pointed to type 'typedef cdio_dvd_struct_t' changed at dvd.h:130:1, as reported earlier
+
 
 ================ end of changes of 'libcdio.so.16.0.0'===============
 
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-1.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
index bf081f52..7b86b964 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-1.txt
@@ -50,8 +50,7 @@ 
     [C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:3602:1 has some indirect sub-type changes:
       parameter 2 of type 'typedef spice_image_compression_t' 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:
-          enum type 'enum __anonymous_enum__2' changed at spice.h:471:1, as reported earlier
+        underlying type 'enum __anonymous_enum__2' changed at spice.h:471:1, as reported earlier
 
 
 ================ end of changes of 'libspice-server.so.1.8.0'===============
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 b4104bda..3d20caf1 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
@@ -1,5 +1,5 @@ 
 ================ changes of 'libspice-server.so.1.8.0'===============
-  Functions changes summary: 1 Removed, 6 Changed (73 filtered out), 8 Added functions
+  Functions changes summary: 1 Removed, 79 Changed, 8 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   1 Removed function:
@@ -17,7 +17,7 @@ 
     'function void spice_server_set_playback_rate(SpicePlaybackInstance*, uint32_t)'    {spice_server_set_playback_rate@@SPICE_SERVER_0.12.5}
     'function void spice_server_set_record_rate(SpiceRecordInstance*, uint32_t)'    {spice_server_set_record_rate@@SPICE_SERVER_0.12.5}
 
-  6 functions with some indirect sub-type change:
+  79 functions with some indirect sub-type change:
 
     [C] 'function void spice_qxl_add_memslot(QXLInstance*, QXLDevMemSlot*)' at red_dispatcher.c:879:1 has some indirect sub-type changes:
       parameter 1 of type 'QXLInstance*' has sub-type changes:
@@ -34,7 +34,11 @@ 
                       in pointed to type 'typedef RedDispatcher' at red_worker.h:87:1:
                         underlying type 'struct RedDispatcher' at red_dispatcher.c:53:1 changed:
                           type size changed from 3264 to 3328 (in bits)
-                          12 data member changes (1 filtered):
+                          13 data member changes:
+                           type of 'QXLInstance* RedDispatcher::qxl' changed:
+                             in pointed to type 'typedef QXLInstance' at spice-qxl.h:34:1:
+                               underlying type 'struct QXLInstance' changed; details are being reported
+
                            type of 'Dispatcher RedDispatcher::dispatcher' changed:
                              underlying type 'struct Dispatcher' at dispatcher.h:22:1 changed:
                                type size changed from 960 to 1024 (in bits)
@@ -47,7 +51,10 @@ 
                            'int RedDispatcher::x_res' offset changed from 2176 to 2240 (in bits) (by +64 bits)
                            'int RedDispatcher::y_res' offset changed from 2208 to 2272 (in bits) (by +64 bits)
                            'int RedDispatcher::use_hardware_cursor' offset changed from 2240 to 2304 (in bits) (by +64 bits)
-                           'RedDispatcher* RedDispatcher::next' offset changed from 2304 to 2368 (in bits) (by +64 bits)
+                           type of 'RedDispatcher* RedDispatcher::next' changed:
+                             in pointed to type 'typedef RedDispatcher' at red_worker.h:87:1:
+                               underlying type 'struct RedDispatcher' changed; details are being reported
+                           and offset changed from 2304 to 2368 (in bits) (by +64 bits)
                            'Ring RedDispatcher::async_commands' offset changed from 2368 to 2432 (in bits) (by +64 bits)
                            'pthread_mutex_t RedDispatcher::async_lock' offset changed from 2496 to 2560 (in bits) (by +64 bits)
                            'QXLDevSurfaceCreate RedDispatcher::surface_create' offset changed from 2816 to 2880 (in bits) (by +64 bits)
@@ -55,6 +62,102 @@ 
 
 
 
+    [C] 'function void spice_qxl_add_memslot_async(QXLInstance*, QXLDevMemSlot*, uint64_t)' at red_dispatcher.c:948:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_create_primary_surface(QXLInstance*, uint32_t, QXLDevSurfaceCreate*)' at red_dispatcher.c:909:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_create_primary_surface_async(QXLInstance*, uint32_t, QXLDevSurfaceCreate*, uint64_t)' at red_dispatcher.c:966:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_del_memslot(QXLInstance*, uint32_t, uint32_t)' at red_dispatcher.c:885:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_primary_surface(QXLInstance*, uint32_t)' at red_dispatcher.c:903:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_primary_surface_async(QXLInstance*, uint32_t, uint64_t)' at red_dispatcher.c:960:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_surface_async(QXLInstance*, uint32_t, uint64_t)' at red_dispatcher.c:973:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_surface_wait(QXLInstance*, uint32_t)' at red_dispatcher.c:928:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_surfaces(QXLInstance*)' at red_dispatcher.c:897:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_destroy_surfaces_async(QXLInstance*, uint64_t)' at red_dispatcher.c:954:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_driver_unload(QXLInstance*)' at red_dispatcher.c:998:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_flush_surfaces_async(QXLInstance*, uint64_t)' at red_dispatcher.c:979:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_loadvm_commands(QXLInstance*, QXLCommandExt*, uint32_t)' at red_dispatcher.c:934:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_monitors_config_async(QXLInstance*, QXLPHYSICAL, int, uint64_t)' at red_dispatcher.c:985:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_oom(QXLInstance*)' at red_dispatcher.c:852:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_reset_cursor(QXLInstance*)' at red_dispatcher.c:922:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_reset_image_cache(QXLInstance*)' at red_dispatcher.c:916:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_reset_memslots(QXLInstance*)' at red_dispatcher.c:891:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_set_max_monitors(QXLInstance*, unsigned int)' at red_dispatcher.c:992:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_start(QXLInstance*)' at red_dispatcher.c:858:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_stop(QXLInstance*)' at red_dispatcher.c:864:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_update_area(QXLInstance*, uint32_t, QXLRect*, QXLRect*, uint32_t, uint32_t)' at red_dispatcher.c:870:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_update_area_async(QXLInstance*, uint32_t, QXLRect*, uint32_t, uint64_t)' at red_dispatcher.c:940:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
+    [C] 'function void spice_qxl_wakeup(QXLInstance*)' at red_dispatcher.c:846:1 has some indirect sub-type changes:
+      parameter 1 of type 'QXLInstance*' has sub-type changes:
+        pointed to type 'typedef QXLInstance' changed at spice.h:103:1, as reported earlier
+
     [C] 'function int spice_server_add_client(SpiceServer*, int, int)' at reds.c:2391:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceServer*' has sub-type changes:
         in pointed to type 'typedef SpiceServer' at spice-server.h:38:1:
@@ -79,10 +182,28 @@ 
                          'Ring SpiceCharDeviceState::clients' offset changed from 640 to 704 (in bits) (by +64 bits)
                          'uint32_t SpiceCharDeviceState::num_clients' offset changed from 768 to 832 (in bits) (by +64 bits)
                          'uint64_t SpiceCharDeviceState::client_tokens_interval' offset changed from 832 to 896 (in bits) (by +64 bits)
-                         'SpiceCharDeviceInstance* SpiceCharDeviceState::sin' offset changed from 896 to 960 (in bits) (by +64 bits)
+                         type of 'SpiceCharDeviceInstance* SpiceCharDeviceState::sin' changed:
+                           in pointed to type 'typedef SpiceCharDeviceInstance' at spice-char.h:33:1:
+                             underlying type 'struct SpiceCharDeviceInstance' at spice.h:416:1 changed:
+                               type size hasn't changed
+                               1 data member change:
+                                type of 'SpiceCharDeviceState* SpiceCharDeviceInstance::st' changed:
+                                  in pointed to type 'typedef SpiceCharDeviceState' at spice-char.h:34:1:
+                                    underlying type 'struct SpiceCharDeviceState' changed; details are being reported
+
+                         and offset changed from 896 to 960 (in bits) (by +64 bits)
                          'int SpiceCharDeviceState::during_read_from_device' offset changed from 960 to 1024 (in bits) (by +64 bits)
                          'int SpiceCharDeviceState::during_write_to_device' offset changed from 992 to 1056 (in bits) (by +64 bits)
-                         'SpiceCharDeviceCallbacks SpiceCharDeviceState::cbs' offset changed from 1024 to 1088 (in bits) (by +64 bits)
+                         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:
+                              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
+
+                         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)
 
                  no data member changes (3 filtered);
@@ -95,19 +216,23 @@ 
                     type of 'RedChannel MainChannel::base' changed:
                       underlying type 'struct RedChannel' at red_channel.h:303:1 changed:
                         type size hasn't changed
-                        1 data member changes (2 filtered):
+                        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
-                             1 data member changes (9 filtered):
-                              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)':
+                             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
-                                          1 data member changes (3 filtered):
+                                          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; details are 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:
@@ -322,11 +447,111 @@ 
                                                   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; details are 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
+
 
 
 
             no data member change (1 filtered);
 
+    [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:
+        pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
+
+    [C] 'function int spice_server_add_renderer(SpiceServer*, const char*)' at reds.c:3704: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
+
+    [C] 'function int spice_server_add_ssl_client(SpiceServer*, int, int)' at reds.c:2408: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
+
+    [C] 'function void spice_server_char_device_wakeup(SpiceCharDeviceInstance*)' at reds.c:3024:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceCharDeviceInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceCharDeviceInstance' changed at spice.h:399:1, as reported earlier
+
+    [C] 'function void spice_server_destroy(SpiceServer*)' at reds.c:3419: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
+
     [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
@@ -354,6 +579,52 @@ 
             'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_LZ4' value '7'
             'SpiceImageCompression::SPICE_IMAGE_COMPRESSION_ENUM_END' value '8'
 
+      parameter 1 of type 'SpiceServer*' has sub-type changes:
+        pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
+
+    [C] 'function int spice_server_get_num_clients(SpiceServer*)' at reds.c:845: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
+
+    [C] 'function int spice_server_get_peer_info(SpiceServer*, sockaddr*, socklen_t*)' at reds.c:3689: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
+
+    [C] 'function int spice_server_get_sock_info(SpiceServer*, sockaddr*, socklen_t*)' at reds.c:3680: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
+
+    [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
+
+    [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:
+        pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
+
+    [C] 'function int spice_server_migrate_connect(SpiceServer*, const char*, int, int, const char*)' at reds.c:3791: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
+
+    [C] 'function int spice_server_migrate_end(SpiceServer*, int)' at reds.c:3866: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
+
+    [C] 'function int spice_server_migrate_info(SpiceServer*, const char*, int, int, const char*)' at reds.c:3842: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
+
+    [C] 'function int spice_server_migrate_start(SpiceServer*)' at reds.c:3856: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
+
+    [C] 'function int spice_server_migrate_switch(SpiceServer*)' at reds.c:3899: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
+
+    [C] 'function SpiceServer* spice_server_new()' at reds.c:3398:1 has some indirect sub-type changes:
+      return type changed:
+        pointed to type 'typedef SpiceServer' changed at spice.h:440:1, as reported earlier
 
     [C] 'function void spice_server_playback_get_buffer(SpicePlaybackInstance*, uint32_t**, uint32_t*)' at snd_worker.c:1081:1 has some indirect sub-type changes:
       parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
@@ -367,9 +638,86 @@ 
                    type size changed from 512 to 576 (in bits)
                    1 data member insertion:
                      'uint32_t SpicePlaybackState::frequency', at offset 512 (in bits) at snd_worker.c:159:1
-                   no data member changes (2 filtered);
+                   2 data member changes:
+                    type of 'SndWorker SpicePlaybackState::worker' changed:
+                      type size hasn't changed
+                      3 data member changes:
+                       type of 'RedChannel* SndWorker::base_channel' changed:
+                         pointed to type 'typedef RedChannel' changed at red_channel.h:135:1, as reported earlier
+
+                       type of 'SndChannel* SndWorker::connection' changed:
+                         in pointed to type 'typedef SndChannel' at snd_worker.c:74:1:
+                           underlying type 'struct SndChannel' at snd_worker.c:89:1 changed:
+                             type size hasn't changed
+                             6 data member changes:
+                              type of 'RedsStream* SndChannel::stream' changed:
+                                pointed to type 'typedef RedsStream' changed at red_channel.h:134:1, as reported earlier
+
+                              type of 'SndWorker* SndChannel::worker' changed:
+                                in pointed to type 'typedef SndWorker' at snd_worker.c:80:1:
+                                  underlying type 'struct SndWorker' changed; details are being reported
+
+                              type of 'RedChannelClient* SndChannel::channel_client' changed:
+                                pointed to type 'typedef RedChannelClient' changed at red_channel.h:136:1, as reported earlier
+
+                              type of 'snd_channel_handle_message_proc SndChannel::handle_message' changed:
+                                underlying type 'int (SndChannel*, typedef size_t, typedef uint32_t, void*)*' changed:
+                                  in pointed to type 'function type int (SndChannel*, typedef size_t, typedef uint32_t, void*)':
+                                    parameter 1 of type 'SndChannel*' has sub-type changes:
+                                      in pointed to type 'typedef SndChannel' at snd_worker.c:74:1:
+                                        underlying type 'struct SndChannel' changed; details are being reported
+
+                              type of 'snd_channel_on_message_done_proc SndChannel::on_message_done' changed:
+                                underlying type 'void (SndChannel*)*' changed:
+                                  in pointed to type 'function type void (SndChannel*)':
+                                    parameter 1 of type 'SndChannel*' has sub-type changes:
+                                      in pointed to type 'typedef SndChannel' at snd_worker.c:74:1:
+                                        underlying type 'struct SndChannel' changed; details are being reported
+
+                              type of 'snd_channel_cleanup_channel_proc SndChannel::cleanup' changed:
+                                underlying type 'void (SndChannel*)*' changed:
+                                  in pointed to type 'function type void (SndChannel*)':
+                                    parameter 1 of type 'SndChannel*' has sub-type changes:
+                                      in pointed to type 'typedef SndChannel' at snd_worker.c:74:1:
+                                        underlying type 'struct SndChannel' changed; details are being reported
+
+                             no data member change (1 filtered);
+
+                       type of 'SndWorker* SndWorker::next' changed:
+                         in pointed to type 'typedef SndWorker' at snd_worker.c:80:1:
+                           underlying type 'struct SndWorker' changed; details are being reported
 
 
+                    type of 'SpicePlaybackInstance* SpicePlaybackState::sin' changed:
+                      in pointed to type 'typedef SpicePlaybackInstance' at spice-audio.h:33:1:
+                        underlying type 'struct SpicePlaybackInstance' changed; details are being reported
+
+
+
+    [C] 'function void spice_server_playback_put_samples(SpicePlaybackInstance*, uint32_t*)' at snd_worker.c:1100:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
+        pointed to type 'typedef SpicePlaybackInstance' changed at spice.h:335:1, as reported earlier
+
+    [C] 'function void spice_server_playback_set_mute(SpicePlaybackInstance*, uint8_t)' at snd_worker.c:1021:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
+        pointed to type 'typedef SpicePlaybackInstance' changed at spice.h:335:1, as reported earlier
+
+    [C] 'function void spice_server_playback_set_volume(SpicePlaybackInstance*, uint8_t, uint16_t*)' at snd_worker.c:1003:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
+        pointed to type 'typedef SpicePlaybackInstance' changed at spice.h:335:1, as reported earlier
+
+    [C] 'function void spice_server_playback_start(SpicePlaybackInstance*)' at snd_worker.c:1035:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
+        pointed to type 'typedef SpicePlaybackInstance' changed at spice.h:335:1, as reported earlier
+
+    [C] 'function void spice_server_playback_stop(SpicePlaybackInstance*)' at snd_worker.c:1054:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpicePlaybackInstance*' has sub-type changes:
+        pointed to type 'typedef SpicePlaybackInstance' changed at spice.h:335:1, as reported earlier
+
+    [C] 'function void spice_server_port_event(SpiceCharDeviceInstance*, uint8_t)' at spicevmc.c:574:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceCharDeviceInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceCharDeviceInstance' changed at spice.h:399:1, as reported earlier
+
     [C] 'function uint32_t spice_server_record_get_samples(SpiceRecordInstance*, uint32_t*, uint32_t)' at snd_worker.c:1331:1 has some indirect sub-type changes:
       parameter 1 of type 'SpiceRecordInstance*' has sub-type changes:
         in pointed to type 'typedef SpiceRecordInstance' at spice-audio.h:67:1:
@@ -382,14 +730,130 @@ 
                    type size changed from 512 to 576 (in bits)
                    1 data member insertion:
                      'uint32_t SpiceRecordState::frequency', at offset 512 (in bits) at snd_worker.c:166:1
-                   no data member changes (2 filtered);
+                   2 data member changes:
+                    type of 'SndWorker SpiceRecordState::worker' changed:
+                      details were reported earlier
+
+                    type of 'SpiceRecordInstance* SpiceRecordState::sin' changed:
+                      in pointed to type 'typedef SpiceRecordInstance' at spice-audio.h:67:1:
+                        underlying type 'struct SpiceRecordInstance' changed; details are being reported
+
+
+
+    [C] 'function void spice_server_record_set_mute(SpiceRecordInstance*, uint8_t)' at snd_worker.c:1279:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceRecordInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceRecordInstance' changed at spice.h:369:1, as reported earlier
+
+    [C] 'function void spice_server_record_set_volume(SpiceRecordInstance*, uint8_t, uint16_t*)' at snd_worker.c:1261:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceRecordInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceRecordInstance' changed at spice.h:369:1, as reported earlier
 
+    [C] 'function void spice_server_record_start(SpiceRecordInstance*)' at snd_worker.c:1293:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceRecordInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceRecordInstance' changed at spice.h:369:1, as reported earlier
+
+    [C] 'function void spice_server_record_stop(SpiceRecordInstance*)' at snd_worker.c:1313:1 has some indirect sub-type changes:
+      parameter 1 of type 'SpiceRecordInstance*' has sub-type changes:
+        pointed to type 'typedef SpiceRecordInstance' changed at spice.h:369:1, as reported earlier
+
+    [C] 'function void spice_server_set_addr(SpiceServer*, const char*, int)' at reds.c:3455: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
+
+    [C] 'function int spice_server_set_agent_copypaste(SpiceServer*, int)' at reds.c:3747: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
+
+    [C] 'function int spice_server_set_agent_file_xfer(SpiceServer*, int)' at reds.c:3756: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
+
+    [C] 'function int spice_server_set_agent_mouse(SpiceServer*, int)' at reds.c:3739: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
+
+    [C] 'function int spice_server_set_channel_security(SpiceServer*, const char*, int)' at reds.c:3648: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
+
+    [C] 'function int spice_server_set_compat_version(SpiceServer*, spice_compat_version_t)' at reds.c:3430: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
+
+    [C] 'function int spice_server_set_exit_on_disconnect(SpiceServer*, int)' at reds.c:3479: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
 
     [C] 'function int spice_server_set_image_compression(SpiceServer*, spice_image_compression_t)' at reds.c:3602: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 'typedef spice_image_compression_t' 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:
-          enum type 'enum __anonymous_enum__2' changed at spice.h:471:1, as reported earlier
+        underlying type 'enum __anonymous_enum__2' changed at spice.h:471:1, as reported earlier
+
+    [C] 'function int spice_server_set_jpeg_compression(SpiceServer*, spice_wan_compression_t)' at reds.c:3624: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
+
+    [C] 'function int spice_server_set_listen_socket_fd(SpiceServer*, int)' at reds.c:3472: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
+
+    [C] 'function void spice_server_set_name(SpiceServer*, const char*)' at reds.c:3517: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
+
+    [C] 'function int spice_server_set_noauth(SpiceServer*)' at reds.c:3486: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
+
+    [C] 'function int spice_server_set_playback_compression(SpiceServer*, int)' at reds.c:3732: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
+
+    [C] 'function int spice_server_set_port(SpiceServer*, int)' at reds.c:3445: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
+
+    [C] 'function int spice_server_set_sasl(SpiceServer*, int)' at reds.c:3494: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
+
+    [C] 'function int spice_server_set_sasl_appname(SpiceServer*, const char*)' at reds.c:3505: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
+
+    [C] 'function void spice_server_set_seamless_migration(SpiceServer*, int)' at reds.c:3941: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
+
+    [C] 'function int spice_server_set_streaming_video(SpiceServer*, int)' at reds.c:3720: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
+
+    [C] 'function int spice_server_set_ticket(SpiceServer*, const char*, int, int, int)' at reds.c:3529: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
+
+    [C] 'function int spice_server_set_tls(SpiceServer*, int, const char*, const char*, const char*, const char*, const char*, const char*)' at reds.c:3564: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
+
+    [C] 'function void spice_server_set_uuid(SpiceServer*, const uint8_t*)' at reds.c:3523: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
+
+    [C] 'function int spice_server_set_zlib_glz_compression(SpiceServer*, spice_wan_compression_t)' at reds.c:3636: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
+
+    [C] 'function void spice_server_vm_start(SpiceServer*)' at reds.c:3911: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
+
+    [C] 'function void spice_server_vm_stop(SpiceServer*)' at reds.c:3926: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
 
 
 ================ end of changes of 'libspice-server.so.1.8.0'===============
diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index cb87f63f..45258a9f 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -139,6 +139,15 @@  InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-leaf1-report.txt",
     "output/test-abidiff-exit/test-leaf1-report.txt"
   },
+  {
+    "data/test-abidiff-exit/test-leaf3-v0.o",
+    "data/test-abidiff-exit/test-leaf3-v1.o",
+    "",
+    "--leaf-changes-only",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-leaf3-report.txt",
+    "output/test-abidiff-exit/test-leaf3-report.txt"
+  },
   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };
 
diff --git a/tools/abidiff.cc b/tools/abidiff.cc
index f83a7e54..bbe2f4f2 100644
--- a/tools/abidiff.cc
+++ b/tools/abidiff.cc
@@ -198,7 +198,7 @@  display_usage(const string& prog_name, ostream& out)
     << " --no-corpus-path  do not take the path to the corpora into account\n"
     << " --fail-no-debug-info  bail out if no debug info was found\n"
     << " --leaf-changes-only|-l  only show leaf changes, "
-    "so no change impact analysis\n"
+    "so no change impact analysis (implies --redundant)\n"
     << " --deleted-fns  display deleted public functions\n"
     << " --changed-fns  display changed public functions\n"
     << " --added-fns  display added public functions\n"
@@ -649,7 +649,19 @@  set_diff_context_from_opts(diff_context_sptr ctxt,
   ctxt->show_added_vars(opts.show_all_vars || opts.show_added_vars);
   ctxt->show_linkage_names(opts.show_linkage_names);
   ctxt->show_locs(opts.show_locs);
-  ctxt->show_redundant_changes(opts.show_redundant_changes);
+  // So when we are showing only leaf changes, we want to show
+  // redundant changes because of this: Suppose several functions have
+  // their return type changed from void* to int*.  We want them all
+  // to be reported.  In that case the change is not redundant.  As
+  // far as user-defined type changes (like struct/class) they are
+  // already put inside a map which makes them be non-redundant, so we
+  // don't have to worry about that case.
+  //
+  // TODO: maybe that in this case we should avoid firing the
+  // redundancy analysis pass altogether.  That could help save a
+  // couple of CPU cycle here and there!
+  ctxt->show_redundant_changes(opts.show_redundant_changes
+                               || opts.leaf_changes_only);
   ctxt->show_symbols_unreferenced_by_debug_info
     (opts.show_symbols_not_referenced_by_debug_info);
   ctxt->show_added_symbols_unreferenced_by_debug_info
diff --git a/tools/abipkgdiff.cc b/tools/abipkgdiff.cc
index 87950020..83fdc2b6 100644
--- a/tools/abipkgdiff.cc
+++ b/tools/abipkgdiff.cc
@@ -849,7 +849,7 @@  display_usage(const string& prog_name, ostream& out)
     << " --private-dso                  compare DSOs that are private "
     "to the package as well\n"
     << " --leaf-changes-only|-l  only show leaf changes, "
-    "so no change impact analysis\n"
+    "so no change impact analysis (implies --redundant)\n"
     << " --impacted-interfaces|-i when in leaf mode, show "
     "interfaces impacted by ABI changes\n"
     << " --full-impact|-f  when comparing kernel packages, show the "
@@ -1173,7 +1173,9 @@  set_diff_context_from_opts(diff_context_sptr ctxt,
 {
   ctxt->default_output_stream(&cout);
   ctxt->error_output_stream(&cerr);
-  ctxt->show_redundant_changes(opts.show_redundant_changes);
+  // See comment in abidiff.cc's set_diff_context_from_opts.
+  ctxt->show_redundant_changes(opts.show_redundant_changes
+                               || opts.leaf_changes_only);
   ctxt->show_leaf_changes_only(opts.leaf_changes_only);
   ctxt->show_impacted_interfaces(opts.show_impacted_interfaces);
   ctxt->show_unreachable_types(opts.show_all_types);