[1/4] Add XML reader test for incomplete function types.

Message ID 20200505180612.232158-2-gprocida@google.com
State Rejected
Headers
Series Fix incomplete function type bug in abg-reader |

Commit Message

Giuliano Procida May 5, 2020, 6:06 p.m. UTC
  This commit illustrates a bug caused by early caching of type names.

	* tests/data/Makefile.am: Add new test files.
	* tests/data/test-abidiff-exit/test-fun-param-v0.c: New test.
	* tests/data/test-abidiff-exit/test-fun-param-v0.o: Ditto.
	* tests/data/test-abidiff-exit/test-fun-param-v0.abi: Ditto.
	* tests/data/test-abidiff-exit/test-fun-param-v1.c: Ditto.
	* tests/data/test-abidiff-exit/test-fun-param-v1.o: Ditto.
	* tests/data/test-abidiff-exit/test-fun-param-v1.abi: Ditto.
	* tests/data/test-abidiff-exit/test-fun-param-report.txt: New
	test report showing incorrect type "void ()*:.
	* tests/test-abidiff-exit.cc: Run new test case.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 tests/data/Makefile.am                        |   7 +++
 .../test-fun-param-report.txt                 |  15 ++++++
 .../test-abidiff-exit/test-fun-param-v0.abi   |  44 +++++++++++++++++
 .../test-abidiff-exit/test-fun-param-v0.c     |   7 +++
 .../test-abidiff-exit/test-fun-param-v0.o     | Bin 0 -> 2992 bytes
 .../test-abidiff-exit/test-fun-param-v1.abi   |  46 ++++++++++++++++++
 .../test-abidiff-exit/test-fun-param-v1.c     |   7 +++
 .../test-abidiff-exit/test-fun-param-v1.o     | Bin 0 -> 3000 bytes
 tests/test-abidiff-exit.cc                    |   9 ++++
 9 files changed, 135 insertions(+)
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-report.txt
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.abi
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.c
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.o
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.abi
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.c
 create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.o
  

Comments

Giuliano Procida May 13, 2020, 6:39 p.m. UTC | #1
I'd rather not add non-default options for testing as this makes the tests
a little further away from what will usually happen in practice.

I normally have a little one line of script dance to cp the files to /tmp,
cd and compile them there, and copy them back, but I forgot on this
occasion.

Dodji has copied the test cases verbatim, your comments are transportable
to his commit.

Giuliano.

On Tue, 12 May 2020 at 17:22, Matthias Maennich <maennich@google.com> wrote:

> On Tue, May 05, 2020 at 07:06:09PM +0100, Giuliano Procida wrote:
> >This commit illustrates a bug caused by early caching of type names.
> >
> >       * tests/data/Makefile.am: Add new test files.
> >       * tests/data/test-abidiff-exit/test-fun-param-v0.c: New test.
> >       * tests/data/test-abidiff-exit/test-fun-param-v0.o: Ditto.
> >       * tests/data/test-abidiff-exit/test-fun-param-v0.abi: Ditto.
> >       * tests/data/test-abidiff-exit/test-fun-param-v1.c: Ditto.
> >       * tests/data/test-abidiff-exit/test-fun-param-v1.o: Ditto.
> >       * tests/data/test-abidiff-exit/test-fun-param-v1.abi: Ditto.
> >       * tests/data/test-abidiff-exit/test-fun-param-report.txt: New
> >       test report showing incorrect type "void ()*:.
> >       * tests/test-abidiff-exit.cc: Run new test case.
> >
> >Signed-off-by: Giuliano Procida <gprocida@google.com>
> >---
> > tests/data/Makefile.am                        |   7 +++
> > .../test-fun-param-report.txt                 |  15 ++++++
> > .../test-abidiff-exit/test-fun-param-v0.abi   |  44 +++++++++++++++++
> > .../test-abidiff-exit/test-fun-param-v0.c     |   7 +++
> > .../test-abidiff-exit/test-fun-param-v0.o     | Bin 0 -> 2992 bytes
> > .../test-abidiff-exit/test-fun-param-v1.abi   |  46 ++++++++++++++++++
> > .../test-abidiff-exit/test-fun-param-v1.c     |   7 +++
> > .../test-abidiff-exit/test-fun-param-v1.o     | Bin 0 -> 3000 bytes
> > tests/test-abidiff-exit.cc                    |   9 ++++
> > 9 files changed, 135 insertions(+)
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-report.txt
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.abi
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.c
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v0.o
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.abi
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.c
> > create mode 100644 tests/data/test-abidiff-exit/test-fun-param-v1.o
> >
> >diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
> >index a1b9bf64..461d9481 100644
> >--- a/tests/data/Makefile.am
> >+++ b/tests/data/Makefile.am
> >@@ -151,6 +151,13 @@ test-abidiff-exit/test-decl-struct-v0.o \
> > test-abidiff-exit/test-decl-struct-v1.c \
> > test-abidiff-exit/test-decl-struct-v1.o \
> > test-abidiff-exit/test-decl-struct-report.txt \
> >+test-abidiff-exit/test-fun-param-v0.c \
> >+test-abidiff-exit/test-fun-param-v0.o \
> >+test-abidiff-exit/test-fun-param-v0.abi \
> >+test-abidiff-exit/test-fun-param-v1.c \
> >+test-abidiff-exit/test-fun-param-v1.o \
> >+test-abidiff-exit/test-fun-param-v1.abi \
> >+test-abidiff-exit/test-fun-param-report.txt \
> > \
> > test-diff-dwarf/test0-v0.cc           \
> > test-diff-dwarf/test0-v0.o                    \
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-report.txt
> b/tests/data/test-abidiff-exit/test-fun-param-report.txt
> >new file mode 100644
> >index 00000000..6bfbcf0d
> >--- /dev/null
> >+++ b/tests/data/test-abidiff-exit/test-fun-param-report.txt
> >@@ -0,0 +1,15 @@
> >+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
> >+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
> >+
> >+1 function with some indirect sub-type change:
> >+
> >+  [C] 'function void reg(ops*)' at test-fun-param-v1.c:7:1 has some
> indirect sub-type changes:
> >+    parameter 1 of type 'ops*' has sub-type changes:
> >+      in pointed to type 'struct ops' at test-fun-param-v1.c:1:1:
> >+        type size hasn't changed
> >+        1 data member change:
> >+          type of 'void ()* ops::bind_class' changed:
> >+            in pointed to type 'function type void (void*, unsigned int,
> unsigned long int)':
> >+              parameter 4 of type 'void*' was added
> >+              parameter 5 of type 'unsigned long int' was added
> >+
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.abi
> b/tests/data/test-abidiff-exit/test-fun-param-v0.abi
>
> You might want to create those with --no-show-locs or --short-locs and
> --no-comp-dir-path to avoid too much friction when regenerating them at
> some point.
>
> Looks otherwise good to me.
>
> Reviewed-by: Matthias Maennich <maennich@google.com>
>
> Cheers,
> Matthias
>
> >new file mode 100644
> >index 00000000..816f74c8
> >--- /dev/null
> >+++ b/tests/data/test-abidiff-exit/test-fun-param-v0.abi
> >@@ -0,0 +1,44 @@
> >+<abi-corpus path='test-fun-param-v0.o' architecture='elf-amd-x86_64'>
> >+  <elf-function-symbols>
> >+    <elf-symbol name='reg' type='func-type' binding='global-binding'
> visibility='default-visibility' is-defined='yes'/>
> >+  </elf-function-symbols>
> >+  <abi-instr version='1.0' address-size='64' path='test-fun-param-v0.c'
> comp-dir-path='/usr/local/google/home/gprocida/dev/libabigail'
> language='LANG_C99'>
> >+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
> >+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
> >+    <type-decl name='unsigned long int' size-in-bits='64'
> id='type-id-3'/>
> >+    <type-decl name='void' id='type-id-4'/>
> >+    <class-decl name='ops' size-in-bits='192' is-struct='yes'
> visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='1' column='1' id='type-id-5'>
> >+      <data-member access='public' layout-offset-in-bits='0'>
> >+        <var-decl name='foo' type-id='type-id-6' visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='2' column='1'/>
> >+      </data-member>
> >+      <data-member access='public' layout-offset-in-bits='64'>
> >+        <var-decl name='bind_class' type-id='type-id-7'
> visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='3' column='1'/>
> >+      </data-member>
> >+      <data-member access='public' layout-offset-in-bits='128'>
> >+        <var-decl name='bar' type-id='type-id-8' visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='4' column='1'/>
> >+      </data-member>
> >+    </class-decl>
> >+    <pointer-type-def type-id='type-id-9' size-in-bits='64'
> id='type-id-8'/>
> >+    <pointer-type-def type-id='type-id-5' size-in-bits='64'
> id='type-id-10'/>
> >+    <pointer-type-def type-id='type-id-11' size-in-bits='64'
> id='type-id-6'/>
> >+    <pointer-type-def type-id='type-id-12' size-in-bits='64'
> id='type-id-7'/>
> >+    <pointer-type-def type-id='type-id-4' size-in-bits='64'
> id='type-id-13'/>
> >+    <function-decl name='reg' mangled-name='reg'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='7' column='1' visibility='default' binding='global' size-in-bits='64'
> elf-symbol-id='reg'>
> >+      <parameter type-id='type-id-10' name='o'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c'
> line='7' column='1'/>
> >+      <return type-id='type-id-4'/>
> >+    </function-decl>
> >+    <function-type size-in-bits='64' id='type-id-9'>
> >+      <parameter type-id='type-id-1'/>
> >+      <return type-id='type-id-1'/>
> >+    </function-type>
> >+    <function-type size-in-bits='64' id='type-id-11'>
> >+      <return type-id='type-id-4'/>
> >+    </function-type>
> >+    <function-type size-in-bits='64' id='type-id-12'>
> >+      <parameter type-id='type-id-13'/>
> >+      <parameter type-id='type-id-2'/>
> >+      <parameter type-id='type-id-3'/>
> >+      <return type-id='type-id-4'/>
> >+    </function-type>
> >+  </abi-instr>
> >+</abi-corpus>
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.c
> b/tests/data/test-abidiff-exit/test-fun-param-v0.c
> >new file mode 100644
> >index 00000000..aa1198c9
> >--- /dev/null
> >+++ b/tests/data/test-abidiff-exit/test-fun-param-v0.c
> >@@ -0,0 +1,7 @@
> >+struct ops {
> >+  void(*foo)(void);
> >+  void(*bind_class)(void *, unsigned int, unsigned long);
> >+  int(*bar)(int);
> >+};
> >+
> >+void reg(struct ops* o) { (void)o; }
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.o
> b/tests/data/test-abidiff-exit/test-fun-param-v0.o
> >new file mode 100644
> >index
> 0000000000000000000000000000000000000000..64218730b3fa188f61752ebbc917f49a75a92785
> >GIT binary patch
> >literal 2992
> >zcmbtW&2QsW5T6(4!>OBW+E7R+5=LTG7GWnXXlWO92^6|5yINI9dqkC;IF3bPSGH5S
> >zAU*^LSPp2BkPs3l_J+ir0~f?U!2yW_LPDID+e#c@#(ppByt)?{HSf**X6DVu`*7cV
> >z`Py!QF%ZPyGTfI03UIf4pYJ7X51OzHH}-D*zIW^Gd$(Wv=~sk{iAqgYSWNiLpk??%
> >za1=p{G1W#;83qBcLbXo@$r4PdeuliN*j5OvsD6t=14`w@yz&mIlHon#KE?s6>O!$X
> >z%z~OsWz|DLyMqJ$R2pEhSn~WB%IX&=)I!GvR+$wh(qmu$g4#M}RC$oN!sjFOFpvYb
> >z#Lm~7no?h_FR|rH;~~^GnWAdiCG9zFOJhwerUr_diu=t?T(pQlJqwgpV66>MJ_nk%
> >zj~<m3w$>(BwFD$rNr8ntj?-lfhGme&ev@n#IjUj-CVRduVy(3)qh9OF7n7yxrA!uu
> >z7UupGl|n@Tx@Jg}oq-Z|7e@u2#F4ST>opvcV}e`DAa<hI7*2iT$O^5AaojbNt%Fh<
> >zs%Z>#Yn7JXFDU3Y^&`*qoq<lh9|yjx&mo;@6n4fz-x_z^AaKV{XB14Fj(ZdaeQ#iO
> >z2F`J3?Aey>xt2GEE7x!6JL}KtTjqwju5WZVy7>3BZcO5-?`*q{?}T0-MJw!&wof)M
> >z8W*3@4OcgYR&>+vkHWwYrjarA-|+l_5nJ}yiNHqwus^n<D8IBTJ3E*3Cth-F&+^m2
> >z#>VCaDTSnK4<sY@=*?Gwoiy0$Vnw};J$nRk`Vl1^f1%#^sIXHj@1j8p=Z<ufityJz
> >zc}nbU9*ny-+k-j1f|@*1__dXF3e4`toJxV@hRtClC{R6xrFi}sQ=oQ+Js$ZSQsC5+
> >z0xM{@oaw_XQr;1z3(rYZwt%wWNhKl>PSso|5NRo$K;YkTnc@=({Lxedyx$4Y4rO=a
> >z0>{ZdyYG7$oZ^1N<qssBi}0z0i%x#eaXGH2k>ZxbA~-kBu-`fZ*Evo#W$OYnx;eqy
> >zgmWCG^GI;9a}t9&uwn~L8?TrdI%CTmIQG;%^!#Cfx`elEJ9Lic)cCykE?&^A%h>ZB
> >z;esK+><5#HgHMa;2eD(~`(Q+|)qkBkIitfNK2i=({C`fX=uf>B{S?dfI5RtcT$XR>
> >zV~7(b-^8ojUY=zCH8h}e^I!ef(N|uRVv6{`k&q$TmcAnNh3;i+h`pD7`Qa|d>0A*c
> >z&NzL6h_>-3uSvMc!5>J-kZgN^IvFGLKRMXV_!2AIQk{AE|G_VX@TdIgm6P)y<gAGh
> >zJj^e{D<ot{j(>={y!b7CphTZ2KD`5S{3FC@O_3+E2@QDs9|gc?5ns%2A)e=do*yVW
> >zUs)1<V*U`7g3sDrlMf_U%C=u||GBpVu><bEnOzilQNMucAGf^zb#wYhUlHLi`bzo8
> >vv1#p3c>DvNFunKmrpo@bCwZm*Oi3Y$cR!U*_lnld^WWq7-w}>{mizZFd^q39
> >
> >literal 0
> >HcmV?d00001
> >
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.abi
> b/tests/data/test-abidiff-exit/test-fun-param-v1.abi
> >new file mode 100644
> >index 00000000..dcc91d19
> >--- /dev/null
> >+++ b/tests/data/test-abidiff-exit/test-fun-param-v1.abi
> >@@ -0,0 +1,46 @@
> >+<abi-corpus path='test-fun-param-v1.o' architecture='elf-amd-x86_64'>
> >+  <elf-function-symbols>
> >+    <elf-symbol name='reg' type='func-type' binding='global-binding'
> visibility='default-visibility' is-defined='yes'/>
> >+  </elf-function-symbols>
> >+  <abi-instr version='1.0' address-size='64' path='test-fun-param-v1.c'
> comp-dir-path='/usr/local/google/home/gprocida/dev/libabigail'
> language='LANG_C99'>
> >+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
> >+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
> >+    <type-decl name='unsigned long int' size-in-bits='64'
> id='type-id-3'/>
> >+    <type-decl name='void' id='type-id-4'/>
> >+    <class-decl name='ops' size-in-bits='192' is-struct='yes'
> visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='1' column='1' id='type-id-5'>
> >+      <data-member access='public' layout-offset-in-bits='0'>
> >+        <var-decl name='foo' type-id='type-id-6' visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='2' column='1'/>
> >+      </data-member>
> >+      <data-member access='public' layout-offset-in-bits='64'>
> >+        <var-decl name='bind_class' type-id='type-id-7'
> visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='3' column='1'/>
> >+      </data-member>
> >+      <data-member access='public' layout-offset-in-bits='128'>
> >+        <var-decl name='bar' type-id='type-id-8' visibility='default'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='4' column='1'/>
> >+      </data-member>
> >+    </class-decl>
> >+    <pointer-type-def type-id='type-id-9' size-in-bits='64'
> id='type-id-8'/>
> >+    <pointer-type-def type-id='type-id-5' size-in-bits='64'
> id='type-id-10'/>
> >+    <pointer-type-def type-id='type-id-11' size-in-bits='64'
> id='type-id-6'/>
> >+    <pointer-type-def type-id='type-id-12' size-in-bits='64'
> id='type-id-7'/>
> >+    <pointer-type-def type-id='type-id-4' size-in-bits='64'
> id='type-id-13'/>
> >+    <function-decl name='reg' mangled-name='reg'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='7' column='1' visibility='default' binding='global' size-in-bits='64'
> elf-symbol-id='reg'>
> >+      <parameter type-id='type-id-10' name='o'
> filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c'
> line='7' column='1'/>
> >+      <return type-id='type-id-4'/>
> >+    </function-decl>
> >+    <function-type size-in-bits='64' id='type-id-9'>
> >+      <parameter type-id='type-id-1'/>
> >+      <return type-id='type-id-1'/>
> >+    </function-type>
> >+    <function-type size-in-bits='64' id='type-id-11'>
> >+      <return type-id='type-id-4'/>
> >+    </function-type>
> >+    <function-type size-in-bits='64' id='type-id-12'>
> >+      <parameter type-id='type-id-13'/>
> >+      <parameter type-id='type-id-2'/>
> >+      <parameter type-id='type-id-3'/>
> >+      <parameter type-id='type-id-13'/>
> >+      <parameter type-id='type-id-3'/>
> >+      <return type-id='type-id-4'/>
> >+    </function-type>
> >+  </abi-instr>
> >+</abi-corpus>
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.c
> b/tests/data/test-abidiff-exit/test-fun-param-v1.c
> >new file mode 100644
> >index 00000000..e47f49cc
> >--- /dev/null
> >+++ b/tests/data/test-abidiff-exit/test-fun-param-v1.c
> >@@ -0,0 +1,7 @@
> >+struct ops {
> >+  void(*foo)(void);
> >+  void(*bind_class)(void *, unsigned int, unsigned long, void *,
> unsigned long);
> >+  int(*bar)(int);
> >+};
> >+
> >+void reg(struct ops* o) { (void) o; }
> >diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.o
> b/tests/data/test-abidiff-exit/test-fun-param-v1.o
> >new file mode 100644
> >index
> 0000000000000000000000000000000000000000..c84e4f0fe209d872c2309acefceba2cce51a998f
> >GIT binary patch
> >literal 3000
> >zcmbtV-D@LN6hAkUk4dMAX=Amef+MWd6=%{`S<{uS(Q3EVWhugnFH&Zb$z(8@DKnGW
> >zRYVXGR}i`&s31P*vu{57qW&YkxZs1Zf)5KmxaUmn&EDKjU-XdNd(Q8ibI-^9m=9mQ
> >zwp(Bf1TnY*4<vyC+$%reI~m)7CM?2@y<5NU-TL6(>D#~lfp9TX>DdbN87~cn#22EY
> >z1eO`oT?Dm$6agz#yJV0p!L;gE$m^Qx#K4OBk0>;tRL;yRpOPvYJ|ph-R3r|n`dqO>
> >z%$%N0Wj#Q__yGs{>omZ8u@r<Ul=W{>sKuTStTHW8B+9<IgW5XgR(XWD!tDWiSjYie
> >zU{BVYhE`v#FR;Z*<5AQ$nWh`YW#a{7%V13`s|K1r5%-&IT(pQlT?R@^u(kqFeh3U>
> >zA3Z8dY;A>H^%9U=B?T680jDb%49g&k{U+JWb5zFyZ1&=ch_$vt8FiMwd^uaHUXrpX
> >zEMxA^P$^UdpsPfpYzfNPT^u!d8b`+dsn>AK4h(KGgVak>t3M8{BPVu7*71g&Z6cIb
> >zpgM_xZp)>Gj|v+4jl(4HL$7C2?}t(7n=?pjoW!kR)OCg}KZ^XJ*BV44ujL=bQ8(y0
> >zt)6$>8V0W82EG#v;p+7p=FZ0R=9ax_Z<w3wo9p;{*0e_HIP|uCFZAM|i=q>E2iqs@
> >zOV*|5Ov^W|zLVSxyMs6iqj6%5!*_$QXQhri^b&B9KkN>jB*`!B>dww(^Ql)nH*ms9
> >zU~98|QAq(yei;8m?7cUDoiy0$d__OSjy;AL{fV-Ezf^C0QrM}LchO)1=Z<uvityLJ
> >zc}nbT9*lc7-GLdshMGLm`1MtF8cc7-j7o#-e$8McXiz<aP4N5^ra|o-dpz(tq`{e|
> >z1(wimQR>4qQr-cj>&{73Hixp{NhKl>PSso|5NTmDfxxrJ1Tl(FB=E;4BH-=Lh;~Tc
> >zjf)&7dwJjYB%I=Y$K}rzoQv><f{RZ6!f`dOsFC89#3DF1&avM*2RAuRHOX~>o!lJZ
> >zUBWqyC-XpXsdtis-E&e0Y!@$>9eYE^?s@LmKMcZtgu0A(TsQWPXVmz(gg#zR*<~1n
> >zo^ZhsV0WX@$is)l4x`kw@pZ70)aky%oxH(eAD<|XC;mUDRrIIcihhdaI-HrFKQ5~`
> >z^a;cXQ*Ywy++Lkj|1~tAbMs&QH_%sIlVXbaf07`PYD?b``cii!n~dd$>MqCWT#=nP
> >z<MjO@+Qz@SCgE)k{zQUAs_g;lRE*63=HR;IORQ>3b>`)Nm*+41DSvw9)ckunYa#>}
> >z_+@yF1c}u6hp5YoZ}I~r`b6>R9Z=&RAx3M8Jdw>P<nezN0G~yCF~5&^o_~uUC^}y<
> >z2|qD^j7q`Fc5kW&k}Fl)uetxs+kx0y+`la^ioB>_!1V6r^{<`NKl+LYf6-UUM~zKu
> >spYr$zJYjn8=}lGrX;1P>{f&}B67T**I@>E+H_!io=l{KM<g?np`#%ohBme*a
> >
> >literal 0
> >HcmV?d00001
> >
> >diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
> >index 5afc15bc..4d9c1943 100644
> >--- a/tests/test-abidiff-exit.cc
> >+++ b/tests/test-abidiff-exit.cc
> >@@ -203,6 +203,15 @@ InOutSpec in_out_specs[] =
> >     "data/test-abidiff-exit/test-decl-struct-report.txt",
> >     "output/test-abidiff-exit/test-decl-struct-report.txt"
> >   },
> >+  {
> >+    "data/test-abidiff-exit/test-fun-param-v0.abi",
> >+    "data/test-abidiff-exit/test-fun-param-v1.abi",
> >+    "",
> >+    "",
> >+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
> >+    "data/test-abidiff-exit/test-fun-param-report.txt",
> >+    "output/test-abidiff-exit/test-fun-param-report.txt"
> >+  },
> >   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
> > };
> >
> >--
> >2.26.2.526.g744177e7f7-goog
> >
>
  

Patch

diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index a1b9bf64..461d9481 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -151,6 +151,13 @@  test-abidiff-exit/test-decl-struct-v0.o \
 test-abidiff-exit/test-decl-struct-v1.c \
 test-abidiff-exit/test-decl-struct-v1.o \
 test-abidiff-exit/test-decl-struct-report.txt \
+test-abidiff-exit/test-fun-param-v0.c \
+test-abidiff-exit/test-fun-param-v0.o \
+test-abidiff-exit/test-fun-param-v0.abi \
+test-abidiff-exit/test-fun-param-v1.c \
+test-abidiff-exit/test-fun-param-v1.o \
+test-abidiff-exit/test-fun-param-v1.abi \
+test-abidiff-exit/test-fun-param-report.txt \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/test-fun-param-report.txt b/tests/data/test-abidiff-exit/test-fun-param-report.txt
new file mode 100644
index 00000000..6bfbcf0d
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-fun-param-report.txt
@@ -0,0 +1,15 @@ 
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C] 'function void reg(ops*)' at test-fun-param-v1.c:7:1 has some indirect sub-type changes:
+    parameter 1 of type 'ops*' has sub-type changes:
+      in pointed to type 'struct ops' at test-fun-param-v1.c:1:1:
+        type size hasn't changed
+        1 data member change:
+          type of 'void ()* ops::bind_class' changed:
+            in pointed to type 'function type void (void*, unsigned int, unsigned long int)':
+              parameter 4 of type 'void*' was added
+              parameter 5 of type 'unsigned long int' was added
+
diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.abi b/tests/data/test-abidiff-exit/test-fun-param-v0.abi
new file mode 100644
index 00000000..816f74c8
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-fun-param-v0.abi
@@ -0,0 +1,44 @@ 
+<abi-corpus path='test-fun-param-v0.o' architecture='elf-amd-x86_64'>
+  <elf-function-symbols>
+    <elf-symbol name='reg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test-fun-param-v0.c' comp-dir-path='/usr/local/google/home/gprocida/dev/libabigail' language='LANG_C99'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <type-decl name='void' id='type-id-4'/>
+    <class-decl name='ops' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='1' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='foo' type-id='type-id-6' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='2' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='bind_class' type-id='type-id-7' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='3' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='bar' type-id='type-id-8' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='4' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-8'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-10'/>
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-6'/>
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-7'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-13'/>
+    <function-decl name='reg' mangled-name='reg' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reg'>
+      <parameter type-id='type-id-10' name='o' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v0.c' line='7' column='1'/>
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <function-type size-in-bits='64' id='type-id-9'>
+      <parameter type-id='type-id-1'/>
+      <return type-id='type-id-1'/>
+    </function-type>
+    <function-type size-in-bits='64' id='type-id-11'>
+      <return type-id='type-id-4'/>
+    </function-type>
+    <function-type size-in-bits='64' id='type-id-12'>
+      <parameter type-id='type-id-13'/>
+      <parameter type-id='type-id-2'/>
+      <parameter type-id='type-id-3'/>
+      <return type-id='type-id-4'/>
+    </function-type>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.c b/tests/data/test-abidiff-exit/test-fun-param-v0.c
new file mode 100644
index 00000000..aa1198c9
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-fun-param-v0.c
@@ -0,0 +1,7 @@ 
+struct ops {
+  void(*foo)(void);
+  void(*bind_class)(void *, unsigned int, unsigned long);
+  int(*bar)(int);
+};
+
+void reg(struct ops* o) { (void)o; }
diff --git a/tests/data/test-abidiff-exit/test-fun-param-v0.o b/tests/data/test-abidiff-exit/test-fun-param-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..64218730b3fa188f61752ebbc917f49a75a92785
GIT binary patch
literal 2992
zcmbtW&2QsW5T6(4!>OBW+E7R+5=LTG7GWnXXlWO92^6|5yINI9dqkC;IF3bPSGH5S
zAU*^LSPp2BkPs3l_J+ir0~f?U!2yW_LPDID+e#c@#(ppByt)?{HSf**X6DVu`*7cV
z`Py!QF%ZPyGTfI03UIf4pYJ7X51OzHH}-D*zIW^Gd$(Wv=~sk{iAqgYSWNiLpk??%
za1=p{G1W#;83qBcLbXo@$r4PdeuliN*j5OvsD6t=14`w@yz&mIlHon#KE?s6>O!$X
z%z~OsWz|DLyMqJ$R2pEhSn~WB%IX&=)I!GvR+$wh(qmu$g4#M}RC$oN!sjFOFpvYb
z#Lm~7no?h_FR|rH;~~^GnWAdiCG9zFOJhwerUr_diu=t?T(pQlJqwgpV66>MJ_nk%
zj~<m3w$>(BwFD$rNr8ntj?-lfhGme&ev@n#IjUj-CVRduVy(3)qh9OF7n7yxrA!uu
z7UupGl|n@Tx@Jg}oq-Z|7e@u2#F4ST>opvcV}e`DAa<hI7*2iT$O^5AaojbNt%Fh<
zs%Z>#Yn7JXFDU3Y^&`*qoq<lh9|yjx&mo;@6n4fz-x_z^AaKV{XB14Fj(ZdaeQ#iO
z2F`J3?Aey>xt2GEE7x!6JL}KtTjqwju5WZVy7>3BZcO5-?`*q{?}T0-MJw!&wof)M
z8W*3@4OcgYR&>+vkHWwYrjarA-|+l_5nJ}yiNHqwus^n<D8IBTJ3E*3Cth-F&+^m2
z#>VCaDTSnK4<sY@=*?Gwoiy0$Vnw};J$nRk`Vl1^f1%#^sIXHj@1j8p=Z<ufityJz
zc}nbU9*ny-+k-j1f|@*1__dXF3e4`toJxV@hRtClC{R6xrFi}sQ=oQ+Js$ZSQsC5+
z0xM{@oaw_XQr;1z3(rYZwt%wWNhKl>PSso|5NRo$K;YkTnc@=({Lxedyx$4Y4rO=a
z0>{ZdyYG7$oZ^1N<qssBi}0z0i%x#eaXGH2k>ZxbA~-kBu-`fZ*Evo#W$OYnx;eqy
zgmWCG^GI;9a}t9&uwn~L8?TrdI%CTmIQG;%^!#Cfx`elEJ9Lic)cCykE?&^A%h>ZB
z;esK+><5#HgHMa;2eD(~`(Q+|)qkBkIitfNK2i=({C`fX=uf>B{S?dfI5RtcT$XR>
zV~7(b-^8ojUY=zCH8h}e^I!ef(N|uRVv6{`k&q$TmcAnNh3;i+h`pD7`Qa|d>0A*c
z&NzL6h_>-3uSvMc!5>J-kZgN^IvFGLKRMXV_!2AIQk{AE|G_VX@TdIgm6P)y<gAGh
zJj^e{D<ot{j(>={y!b7CphTZ2KD`5S{3FC@O_3+E2@QDs9|gc?5ns%2A)e=do*yVW
zUs)1<V*U`7g3sDrlMf_U%C=u||GBpVu><bEnOzilQNMucAGf^zb#wYhUlHLi`bzo8
vv1#p3c>DvNFunKmrpo@bCwZm*Oi3Y$cR!U*_lnld^WWq7-w}>{mizZFd^q39

literal 0
HcmV?d00001

diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.abi b/tests/data/test-abidiff-exit/test-fun-param-v1.abi
new file mode 100644
index 00000000..dcc91d19
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-fun-param-v1.abi
@@ -0,0 +1,46 @@ 
+<abi-corpus path='test-fun-param-v1.o' architecture='elf-amd-x86_64'>
+  <elf-function-symbols>
+    <elf-symbol name='reg' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test-fun-param-v1.c' comp-dir-path='/usr/local/google/home/gprocida/dev/libabigail' language='LANG_C99'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <type-decl name='void' id='type-id-4'/>
+    <class-decl name='ops' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='1' column='1' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='foo' type-id='type-id-6' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='2' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='bind_class' type-id='type-id-7' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='3' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='bar' type-id='type-id-8' visibility='default' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='4' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-8'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-10'/>
+    <pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-6'/>
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' id='type-id-7'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-13'/>
+    <function-decl name='reg' mangled-name='reg' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='7' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='reg'>
+      <parameter type-id='type-id-10' name='o' filepath='/usr/local/google/home/gprocida/dev/libabigail/test-fun-param-v1.c' line='7' column='1'/>
+      <return type-id='type-id-4'/>
+    </function-decl>
+    <function-type size-in-bits='64' id='type-id-9'>
+      <parameter type-id='type-id-1'/>
+      <return type-id='type-id-1'/>
+    </function-type>
+    <function-type size-in-bits='64' id='type-id-11'>
+      <return type-id='type-id-4'/>
+    </function-type>
+    <function-type size-in-bits='64' id='type-id-12'>
+      <parameter type-id='type-id-13'/>
+      <parameter type-id='type-id-2'/>
+      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-13'/>
+      <parameter type-id='type-id-3'/>
+      <return type-id='type-id-4'/>
+    </function-type>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.c b/tests/data/test-abidiff-exit/test-fun-param-v1.c
new file mode 100644
index 00000000..e47f49cc
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-fun-param-v1.c
@@ -0,0 +1,7 @@ 
+struct ops {
+  void(*foo)(void);
+  void(*bind_class)(void *, unsigned int, unsigned long, void *, unsigned long);
+  int(*bar)(int);
+};
+
+void reg(struct ops* o) { (void) o; }
diff --git a/tests/data/test-abidiff-exit/test-fun-param-v1.o b/tests/data/test-abidiff-exit/test-fun-param-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..c84e4f0fe209d872c2309acefceba2cce51a998f
GIT binary patch
literal 3000
zcmbtV-D@LN6hAkUk4dMAX=Amef+MWd6=%{`S<{uS(Q3EVWhugnFH&Zb$z(8@DKnGW
zRYVXGR}i`&s31P*vu{57qW&YkxZs1Zf)5KmxaUmn&EDKjU-XdNd(Q8ibI-^9m=9mQ
zwp(Bf1TnY*4<vyC+$%reI~m)7CM?2@y<5NU-TL6(>D#~lfp9TX>DdbN87~cn#22EY
z1eO`oT?Dm$6agz#yJV0p!L;gE$m^Qx#K4OBk0>;tRL;yRpOPvYJ|ph-R3r|n`dqO>
z%$%N0Wj#Q__yGs{>omZ8u@r<Ul=W{>sKuTStTHW8B+9<IgW5XgR(XWD!tDWiSjYie
zU{BVYhE`v#FR;Z*<5AQ$nWh`YW#a{7%V13`s|K1r5%-&IT(pQlT?R@^u(kqFeh3U>
zA3Z8dY;A>H^%9U=B?T680jDb%49g&k{U+JWb5zFyZ1&=ch_$vt8FiMwd^uaHUXrpX
zEMxA^P$^UdpsPfpYzfNPT^u!d8b`+dsn>AK4h(KGgVak>t3M8{BPVu7*71g&Z6cIb
zpgM_xZp)>Gj|v+4jl(4HL$7C2?}t(7n=?pjoW!kR)OCg}KZ^XJ*BV44ujL=bQ8(y0
zt)6$>8V0W82EG#v;p+7p=FZ0R=9ax_Z<w3wo9p;{*0e_HIP|uCFZAM|i=q>E2iqs@
zOV*|5Ov^W|zLVSxyMs6iqj6%5!*_$QXQhri^b&B9KkN>jB*`!B>dww(^Ql)nH*ms9
zU~98|QAq(yei;8m?7cUDoiy0$d__OSjy;AL{fV-Ezf^C0QrM}LchO)1=Z<uvityLJ
zc}nbT9*lc7-GLdshMGLm`1MtF8cc7-j7o#-e$8McXiz<aP4N5^ra|o-dpz(tq`{e|
z1(wimQR>4qQr-cj>&{73Hixp{NhKl>PSso|5NTmDfxxrJ1Tl(FB=E;4BH-=Lh;~Tc
zjf)&7dwJjYB%I=Y$K}rzoQv><f{RZ6!f`dOsFC89#3DF1&avM*2RAuRHOX~>o!lJZ
zUBWqyC-XpXsdtis-E&e0Y!@$>9eYE^?s@LmKMcZtgu0A(TsQWPXVmz(gg#zR*<~1n
zo^ZhsV0WX@$is)l4x`kw@pZ70)aky%oxH(eAD<|XC;mUDRrIIcihhdaI-HrFKQ5~`
z^a;cXQ*Ywy++Lkj|1~tAbMs&QH_%sIlVXbaf07`PYD?b``cii!n~dd$>MqCWT#=nP
z<MjO@+Qz@SCgE)k{zQUAs_g;lRE*63=HR;IORQ>3b>`)Nm*+41DSvw9)ckunYa#>}
z_+@yF1c}u6hp5YoZ}I~r`b6>R9Z=&RAx3M8Jdw>P<nezN0G~yCF~5&^o_~uUC^}y<
z2|qD^j7q`Fc5kW&k}Fl)uetxs+kx0y+`la^ioB>_!1V6r^{<`NKl+LYf6-UUM~zKu
spYr$zJYjn8=}lGrX;1P>{f&}B67T**I@>E+H_!io=l{KM<g?np`#%ohBme*a

literal 0
HcmV?d00001

diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index 5afc15bc..4d9c1943 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -203,6 +203,15 @@  InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-decl-struct-report.txt",
     "output/test-abidiff-exit/test-decl-struct-report.txt"
   },
+  {
+    "data/test-abidiff-exit/test-fun-param-v0.abi",
+    "data/test-abidiff-exit/test-fun-param-v1.abi",
+    "",
+    "",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-fun-param-report.txt",
+    "output/test-abidiff-exit/test-fun-param-report.txt"
+  },
   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };