public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
From: Matthias Maennich <maennich@google.com>
To: Giuliano Procida <gprocida@google.com>
Cc: libabigail@sourceware.org, dodji@seketeli.org, kernel-team@android.com
Subject: Re: [PATCH 2/2] abidiff: Fix anonymous member size change reports.
Date: Mon, 6 Apr 2020 18:08:31 +0200	[thread overview]
Message-ID: <20200406160831.GB189388@google.com> (raw)
In-Reply-To: <20200403215356.186742-2-gprocida@google.com>

On Fri, Apr 03, 2020 at 10:53:55PM +0100, Android Kernel Team wrote:
>Data members have names (unless anonymous), types, sizes and
>offsets (if a member of a class or struct). It is the responsibility
>of the represent function to detail all differences of a changed
>member. The size of a member is the same as the size of its type.
>
>A recent change to the function focused on cleaning up the formatting
>logic and added a catch-all case to the end of it in case no diff
>information had been emitted by then.
>
>This catch-all triggered for anonymous structs and union diffs under
>certain circumstances when these anonymous members had changed in
>size.
>
>This patch ensures size change information for a member is emitted
>exactly once (unless the type change has been or is being reported
>already). It also ensures anonymous members are identified
>appropriately and includes a test case would otherwise reach the
>catch-all case in both default and --leaf-changes-only modes.
>
>	* src/abg-reporter-priv.cc (represent): In the var_diff_sptr
>	overload, factor out some expressions as local variables, rely
>	on diff_to_be_reported to decide whether to emit a change,
>	fold together local/non-local change reporting using
>	local_changes to preserve current name formatting differences,
>	keep track explicitly of whether size information has been
>	emitted and ensure it happens if needed, make offset and size
>	change reporting for anonymous data members more meaningful.
>	* tests/test-abidiff-exit.cc: Run new test cases.
>	* tests/data/Makefile.am: Add new test files.
>	* tests/data/test-abidiff-exit/test-member-size-v0.cc: New
>	test.
>	* tests/data/test-abidiff-exit/test-member-size-v0.o: Ditto.
>	* tests/data/test-abidiff-exit/test-member-size-v1.cc: Ditto.
>	* tests/data/test-abidiff-exit/test-member-size-v1.o: Ditto.
>	* tests/data/test-abidiff-exit/test-member-size-report0.txt:
>	New test, default mode.
>	* tests/data/test-abidiff-exit/test-member-size-report1.txt:
>	New test, --leaf-changes-only mode.
>	* tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt:
>	Eliminate duplicate reporting of member sizes.
>	* tests/data/test-abidiff-exit/test-leaf-peeling-report.txt:
>	Ditto.
>	* tests/data/test-abidiff-exit/test-leaf1-report.txt: Ditto.
>	* tests/data/test-abidiff-exit/test-no-stray-comma-report.txt:
>	Ditto.
>	* tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt:
>	Add size report for anonymous data member.
>	* tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt:
>	Ditto.
>	* tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt:
>	Add missing size change report.
>	* tests/data/test-diff-suppr/test36-leaf-report-0.txt: Remove
>	size change report for previously reported type.
>	* tests/data/test-diff-suppr/test46-PR25128-report-1.txt:
>	Eliminate duplicate reporting of member size change.
>	* tests/data/test-diff-suppr/test46-PR25128-report-2.txt:
>	Ditto.
>

This broke one test case on my machine, that needs trivial adjusting:

test-leaf-peeling-report-indirect.txt:

   | @@ -9,7 +9,6 @@
   |      type 'int' of 'foo::z' changed:
   |        type name changed from 'int' to 'long int'
   |        type size changed from 32 to 64 (in bits)
   | -    and size changed from 32 to 64 (in bits) (by +32 bits)
   |
   |  'struct ops1 at test-leaf-peeling-v0.cc:5:1' changed:
   |    type size hasn't changed
   | FAIL runtestabidiffexit (exit status: 1)


>Signed-off-by: Giuliano Procida <gprocida@google.com>
>---
> src/abg-reporter-priv.cc                      |  98 +++++++-----------
> tests/data/Makefile.am                        |   6 ++
> .../test-leaf-cxx-members-report.txt          |   4 +-
> .../test-leaf-peeling-report.txt              |   1 -
> .../test-abidiff-exit/test-leaf1-report.txt   |   1 -
> .../test-member-size-report0.txt              |  27 +++++
> .../test-member-size-report1.txt              |  21 ++++
> .../test-abidiff-exit/test-member-size-v0.cc  |  26 +++++
> .../test-abidiff-exit/test-member-size-v0.o   | Bin 0 -> 3184 bytes
> .../test-abidiff-exit/test-member-size-v1.cc  |  27 +++++
> .../test-abidiff-exit/test-member-size-v1.o   | Bin 0 -> 3192 bytes
> .../test-no-stray-comma-report.txt            |   1 -
> .../test45-anon-dm-change-report-0.txt        |   1 +
> .../test44-anonymous-data-member-report-0.txt |   1 +
> ...-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt |   2 +-
> .../test-diff-suppr/test36-leaf-report-0.txt  |   1 -
> .../test46-PR25128-report-1.txt               |   1 -
> .../test46-PR25128-report-2.txt               |   1 -
> tests/test-abidiff-exit.cc                    |  18 ++++
> 19 files changed, 167 insertions(+), 70 deletions(-)
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-report0.txt
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-report1.txt
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-v0.cc
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-v0.o
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-v1.cc
> create mode 100644 tests/data/test-abidiff-exit/test-member-size-v1.o
>
>diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc
>index 323de503..72181367 100644
>--- a/src/abg-reporter-priv.cc
>+++ b/src/abg-reporter-priv.cc
>@@ -411,16 +411,26 @@ represent(const var_diff_sptr	&diff,
>
>   var_decl_sptr o = diff->first_var();
>   var_decl_sptr n = diff->second_var();
>+  string name1 = o->get_qualified_name();
>+  string name2 = n->get_qualified_name();
>+  uint64_t size1 = get_var_size_in_bits(o);
>+  uint64_t size2 = get_var_size_in_bits(n);
>+  uint64_t offset1 = get_data_member_offset(o);
>+  uint64_t offset2 = get_data_member_offset(n);

Those are only used const, hence can be made const.
Also, further down, offset1 feels like to much of an abbreviation.

>
>   // Has the main diff text been output?
>   bool emitted = false;
>   // Are we continuing on a new line? (implies emitted)
>   bool begin_with_and = false;
>-  string name1 = o->get_qualified_name();
>-  string name2 = n->get_qualified_name();
>-  string pretty_representation = o->get_pretty_representation();
>+  // Have we reported a size change already?
>+  bool size_reported = false;
>+  // Are we reporting a change to an anonymous member?
>   bool is_strict_anonymous_data_member_change = false;
>
>+  string pretty_representation = o->get_pretty_representation();
>+  bool show_size_offset_changes = ctxt->get_allowed_category()
>+				  & SIZE_OR_OFFSET_CHANGE_CATEGORY;
>+
>   if (is_anonymous_data_member(o) && is_anonymous_data_member(n))
>     {
>       is_strict_anonymous_data_member_change = true;
>@@ -430,8 +440,7 @@ represent(const var_diff_sptr	&diff,
>       if (tr1 != tr2)
> 	{
> 	  show_offset_or_size(indent + "anonymous data member at offset",
>-			      get_data_member_offset(o),
>-			      *ctxt, out);
>+			      offset1, *ctxt, out);
>
> 	  out << " changed from:\n"
> 	      << indent << "  " << tr1 << "\n"
>@@ -460,7 +469,6 @@ represent(const var_diff_sptr	&diff,
> 	  begin_with_and = true;
> 	  emitted = true;
> 	}
>-      // TODO: else ...?
>     }
>   else if (filtering::has_anonymous_data_member_change(diff))
>     {
>@@ -472,9 +480,7 @@ represent(const var_diff_sptr	&diff,
> 	    + o->get_pretty_representation()
> 	    + " at offset";
>
>-	  show_offset_or_size(indent + repr,
>-			      get_data_member_offset(o),
>-			      *ctxt, out);
>+	  show_offset_or_size(indent + repr, offset1, *ctxt, out);
> 	  out << " became data member '"
> 	      << n->get_pretty_representation()
> 	      << "'\n";
>@@ -486,9 +492,7 @@ represent(const var_diff_sptr	&diff,
> 	    + o->get_pretty_representation()
> 	    + " at offset";
>
>-	  show_offset_or_size(indent + repr,
>-			      get_data_member_offset(o),
>-			      *ctxt, out);
>+	  show_offset_or_size(indent + repr, offset1, *ctxt, out);
> 	  out << " became anonymous data member '"
> 	      << n->get_pretty_representation()
> 	      << "'\n";
>@@ -499,11 +503,15 @@ represent(const var_diff_sptr	&diff,
>     }
>   else if (diff_sptr d = diff->type_diff())
>     {
>-      if (local_only && d->has_local_changes())
>+      if (ctxt->get_reporter()->diff_to_be_reported(d.get()))
> 	{
>-	  out << indent << "type '" << get_pretty_representation(o->get_type())
>-	      << "' of '" << o->get_qualified_name()
>-	      << "' changed";
>+	  if (local_only)
>+	    out << indent << "type '" << get_pretty_representation(o->get_type())
>+		<< "' of '" << o->get_qualified_name()
>+		<< "' changed";
>+	  else
>+	    out << indent
>+		<< "type of '" << pretty_representation << "' changed";
>
> 	  if (d->currently_reporting())
> 	    {
>@@ -521,30 +529,7 @@ represent(const var_diff_sptr	&diff,
>
> 	  begin_with_and = true;
> 	  emitted = true;
>-	}
>-      else
>-	{
>-	  if (ctxt->get_reporter()->diff_to_be_reported(d.get()))
>-	    {
>-	      out << indent
>-		  << "type of '" << pretty_representation << "' changed";
>-	      if (d->currently_reporting())
>-		{
>-		  out << ", as being reported\n";
>-		}
>-	      else if (d->reported_once())
>-		{
>-		  out << ", as reported earlier\n";
>-		}
>-	      else
>-		{
>-		  out << ":\n";
>-		  d->report(out, indent + "  ");
>-		}
>-
>-	      begin_with_and = true;
>-	      emitted = true;
>-	    }
>+	  size_reported = true;
> 	}
>     }
>
>@@ -589,9 +574,9 @@ represent(const var_diff_sptr	&diff,
> 	out << "now becomes laid out";
>       emitted = true;
>     }
>-  if ((ctxt->get_allowed_category() & SIZE_OR_OFFSET_CHANGE_CATEGORY))
>+  if (show_size_offset_changes)
>     {
>-      if (get_data_member_offset(o) != get_data_member_offset(n))
>+      if (offset1 != offset2)
> 	{
> 	  if (begin_with_and)
> 	    {
>@@ -600,26 +585,20 @@ represent(const var_diff_sptr	&diff,
> 	    }
> 	  else if (!emitted)
> 	    {
>+	      out << indent;
> 	      if (is_strict_anonymous_data_member_change)
>-		out << indent;
>-	      else
>-		out << indent << "'" << pretty_representation << "' ";
>+		out << "anonymous data member ";
>+	      out << "'" << pretty_representation << "' ";
> 	    }
> 	  else
> 	    out << ", ";
>
>-	  show_numerical_change("offset",
>-				get_data_member_offset(o),
>-				get_data_member_offset(n),
>-				*ctxt, out);
>+	  show_numerical_change("offset", offset1, offset2, *ctxt, out);
> 	  maybe_show_relative_offset_change(diff, *ctxt, out);
>-
> 	  emitted = true;
> 	}
>-      if (// If we are not displaying only local changes, we must
>-	  // have indicated the type size change already.
>-	  local_only
>-	  && (get_var_size_in_bits(o) != get_var_size_in_bits(n)))
>+
>+      if (!size_reported && size1 != size2)
> 	{
> 	  if (begin_with_and)
> 	    {
>@@ -628,18 +607,15 @@ represent(const var_diff_sptr	&diff,
> 	    }
> 	  else if (!emitted)
> 	    {
>+	      out << indent;
> 	      if (is_strict_anonymous_data_member_change)
>-		out << indent;
>-	      else
>-		out << indent << "'" << pretty_representation << "' ";
>+		out << "anonymous data member ";
>+	      out << "'" << pretty_representation << "' ";
> 	    }
> 	  else
> 	    out << ", ";
>
>-	  show_numerical_change("size",
>-				get_var_size_in_bits(o),
>-				get_var_size_in_bits(n),
>-				*ctxt, out);
>+	  show_numerical_change("size", size1, size2, *ctxt, out);
> 	  maybe_show_relative_size_change(diff, *ctxt, out);
> 	  emitted = true;
> 	}
>diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
>index bb0fd83b..64e36b1a 100644
>--- a/tests/data/Makefile.am
>+++ b/tests/data/Makefile.am
>@@ -140,6 +140,12 @@ test-abidiff-exit/test-leaf-cxx-members-v0.o \
> test-abidiff-exit/test-leaf-cxx-members-v1.cc \
> test-abidiff-exit/test-leaf-cxx-members-v1.o \
> test-abidiff-exit/test-leaf-cxx-members-report.txt \
>+test-abidiff-exit/test-member-size-v0.cc \
>+test-abidiff-exit/test-member-size-v0.o \
>+test-abidiff-exit/test-member-size-v1.cc \
>+test-abidiff-exit/test-member-size-v1.o \
>+test-abidiff-exit/test-member-size-report0.txt \
>+test-abidiff-exit/test-member-size-report1.txt \
> \
> test-diff-dwarf/test0-v0.cc		\
> test-diff-dwarf/test0-v0.o			\
>diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
>index 082db83e..eae74a3b 100644
>--- a/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
>+++ b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
>@@ -35,8 +35,8 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>     type 'int' of 'ops::deleted_var' changed:
>       type name changed from 'int' to 'long int'
>       type size changed from 32 to 64 (in bits)
>-    and name of 'ops::deleted_var' changed to 'ops::added_var' at test-leaf-cxx-members-v1.cc:2:1, size changed from 32 to 64 (in bits) (by +32 bits)
>+    and name of 'ops::deleted_var' changed to 'ops::added_var' at test-leaf-cxx-members-v1.cc:2:1
>     type 'int' of 'ops::changed_var' changed:
>       type name changed from 'int' to 'long int'
>       type size changed from 32 to 64 (in bits)
>-    and offset changed from 96 to 128 (in bits) (by +32 bits), size changed from 32 to 64 (in bits) (by +32 bits)
>+    and offset changed from 96 to 128 (in bits) (by +32 bits)
>diff --git a/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt b/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
>index bd5f36f8..7ab4dd6e 100644
>--- a/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
>+++ b/tests/data/test-abidiff-exit/test-leaf-peeling-report.txt
>@@ -9,7 +9,6 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>     type 'int' of 'foo::z' changed:
>       type name changed from 'int' to 'long int'
>       type size changed from 32 to 64 (in bits)
>-    and size changed from 32 to 64 (in bits) (by +32 bits)

As above, the same patch needs to be applied to
test-leaf-peeling-report-indirect.txt.

>
> 'struct ops1 at test-leaf-peeling-v0.cc:5:1' changed:
>   type size hasn't changed
>diff --git a/tests/data/test-abidiff-exit/test-leaf1-report.txt b/tests/data/test-abidiff-exit/test-leaf1-report.txt
>index 9af6ccaa..aea08b81 100644
>--- a/tests/data/test-abidiff-exit/test-leaf1-report.txt
>+++ b/tests/data/test-abidiff-exit/test-leaf1-report.txt
>@@ -40,4 +40,3 @@ Removed/Changed/Added variables summary: 1 Removed, 1 Changed, 1 Added variable
>     type 'int' of 'changed::foo' changed:
>       type name changed from 'int' to 'long int'
>       type size changed from 32 to 64 (in bits)
>-    and size changed from 32 to 64 (in bits) (by +32 bits)
>diff --git a/tests/data/test-abidiff-exit/test-member-size-report0.txt b/tests/data/test-abidiff-exit/test-member-size-report0.txt
>new file mode 100644
>index 00000000..ff93dd50
>--- /dev/null
>+++ b/tests/data/test-abidiff-exit/test-member-size-report0.txt
>@@ -0,0 +1,27 @@
>+Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
>+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>+
>+2 functions with some indirect sub-type change:
>+
>+  [C] 'function void reg1(S*, T*, T*)' at test-member-size-v1.cc:26:1 has some indirect sub-type changes:
>+    parameter 1 of type 'S*' has sub-type changes:
>+      in pointed to type 'struct S' at test-member-size-v1.cc:3:1:
>+        type size changed from 128 to 192 (in bits)
>+        1 data member insertion:
>+          'int S::y', at offset 128 (in bits) at test-member-size-v1.cc:6:1
>+        no data member change (1 filtered);
>+    parameter 2 of type 'T*' has sub-type changes:
>+      in pointed to type 'struct T' at test-member-size-v1.cc:14:1:
>+        type size changed from 192 to 256 (in bits)
>+        2 data member changes:
>+          'S T::s' size changed from 128 to 192 (in bits) (by +64 bits)
>+          'int T::a' offset changed from 128 to 192 (in bits) (by +64 bits)
>+
>+  [C] 'function void reg2(U*)' at test-member-size-v1.cc:27:1 has some indirect sub-type changes:
>+    parameter 1 of type 'U*' has sub-type changes:
>+      in pointed to type 'struct U' at test-member-size-v1.cc:19:1:
>+        type size changed from 192 to 256 (in bits)
>+        2 data member changes:
>+          anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits)
>+          'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits)
>+
>diff --git a/tests/data/test-abidiff-exit/test-member-size-report1.txt b/tests/data/test-abidiff-exit/test-member-size-report1.txt
>new file mode 100644
>index 00000000..dbad76be
>--- /dev/null
>+++ b/tests/data/test-abidiff-exit/test-member-size-report1.txt
>@@ -0,0 +1,21 @@
>+Leaf changes summary: 3 artifacts changed
>+Changed leaf types summary: 3 leaf types changed
>+Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
>+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>+
>+'struct S at test-member-size-v0.cc:3:1' changed:
>+  type size changed from 128 to 192 (in bits)
>+  1 data member insertion:
>+    'int S::y', at offset 128 (in bits) at test-member-size-v1.cc:6:1
>+
>+'struct T at test-member-size-v0.cc:13:1' changed:
>+  type size changed from 192 to 256 (in bits)
>+  there are data member changes:
>+    type 'struct S' of 'T::s' changed, as reported earlier
>+    'int T::a' offset changed from 128 to 192 (in bits) (by +64 bits)
>+
>+'struct U at test-member-size-v0.cc:18:1' changed:
>+  type size changed from 192 to 256 (in bits)
>+  there are data member changes:
>+    anonymous data member 'struct {S s;}' size changed from 128 to 192 (in bits) (by +64 bits)
>+    'int U::r' offset changed from 128 to 192 (in bits) (by +64 bits)
>diff --git a/tests/data/test-abidiff-exit/test-member-size-v0.cc b/tests/data/test-abidiff-exit/test-member-size-v0.cc
>new file mode 100644
>index 00000000..f974a37f
>--- /dev/null
>+++ b/tests/data/test-abidiff-exit/test-member-size-v0.cc
>@@ -0,0 +1,26 @@
>+struct M;
>+
>+struct S {
>+  int x;
>+  M * m;
>+};
>+
>+struct M {
>+  int a;
>+  S * s;
>+};
>+
>+struct T {
>+  S s;
>+  int a;
>+};
>+
>+struct U {
>+  struct {
>+    S s;
>+  };
>+  int r;
>+};
>+
>+void reg1(S*, T*, T*) { }
>+void reg2(U*) { }
>diff --git a/tests/data/test-abidiff-exit/test-member-size-v0.o b/tests/data/test-abidiff-exit/test-member-size-v0.o
>new file mode 100644
>index 0000000000000000000000000000000000000000..e020bef77d57d601420f969061707bbf1486ac99
>GIT binary patch
>literal 3184
>zcmbtWL2MgU5S{P!#_PCtoVcY4LC91fsLC!`E2`o`ifKxds<Z@BqY4SqwX=yW;&rs%
>z6t@VFPzA~@m5>058xj(?a^Q}H#JR_E;{Xyz;Dp2hX8!(hHs8(#M)J=5H}hux|2zM$
>zKYaO>ODQ3MMZkGD7%>WPKXYK$q*;R!OhJ8R@7I;R_y1bi+x>lIum0QqTR$*_<}#*A
>z%V<j`jqQU>@OZ*btwB*3)~g5^eGuskSzvTPn3+CW7NpZ=JBT246$34cFvA0pRe?Pa
>z<Cza+plQ8<+O%wZrmn-Z$Xj1iG=>yR0wr-m5{r<kW5ks85aF?+D2@N9LXT%;C}h5s
>zj1a^lieV8T9vvgal2eBG(!jN5>5;nE!bwo&m@spQP#O>}5`kupge(nG_iieE0~6e(
>zKrtzvDwJ|YVYV<SrZUBo7*)dU%H_`Gp3hZt0@E3JFsyiZxwL>2N<Rs?-1(e=<;@8+
>zFJsVHNhCR$JjAh<BVL>_3Nby9MQYQZU6`T7Srda&(>RT1X_hpfcuCTtNAg7uKr~*%
>zp8>RwLi}CG<5M;pu2Deb_aeLFcN%_Z_u6-S`_`P(Y)ZCy60&g_;!g{6=1+5C(VYA!
>zWnhXUi0g08hyGS&)vW_+mmU>(F6!(+>~UA!wN>}}T4f!Uuhq*-XU@3u<*HM0+;U~k
>zt-9`9wQP5y-N0Ym@&i9?H*x5N&DLUn;jDdjzHD!m?M<(DJ7~7TZqVKB*}K8J?O?->
>zyvDZQ16W>KI#+(?qTgtHL7drktEaUZa)HO?6L;ax>md3?F?%dy?c=UIhB*C5aN_}9
>zDil9XE#=3qVE_)v_X6Q4vg6o)DfY*n;U}iXllaF!!ybA+<Q*16y=mQJAY+sm>a6QN
>z0}l25z->U{QW>B$pKM}uU>fm?4*+EukRQSbFraV*eryP*-kwVAgWP+>PAi<pe9Dh%
>z-l0xQG$j?~ofuEpg!7CDr`2B|5M?q}z_=R12@R)nNiq{Fxst&FLX6fyLV4t6Bu4;0
>zDb4wxR^y*F9IqQGzbH)|L-~1M##IY(o>MArQo~(^pHMjGQShPtF&RW%RJI<^XF<oy
>zDxT(;+=rTm^Zdc--R|HqMjeH*Zm|{l{Ro^5FY>@?^m^cg{<i0A_>JAI^>(n?MW3|2
>zMkDlZ9ddi27i{6pkfdz41D`2a0-R>I)A8}U<^<iyckpVmdy&_CN0I#2`ex{Ld^Pd^
>zsb-N+d&Pao>1xW*?{SJv$`d#sOuqr%P6j1xolpHm{r6w_)IWMoD#!J&XijY?zhCq(
>zq(-EK?5JidD+2W!#qn98`+;N;e|k>Bzfs^PG)RaZyNW&?qwqP^q;m-_nR@IM#7513
>zU%gP~)BNdn)#tx4A}2y{Q`N82AR&7Fb@Yv@|Glcu`$YBW9@FdZAVxWPo@h$>PSyXM
>z0j0S<>-P{J#lNZ=itjH@!#vh^6`%dABfTM&gLxeH1sa5@=`sv`#lJB?VuRPu@TX{u
>z+P{Y*-XDFvn9ut<sy5|*pz62Ogz39MUqziy?_|_c7gYbxqdzJ7`YG=yzD3Q3@>Q$`
>HPo4iS_W$I+
>
>literal 0
>HcmV?d00001
>
>diff --git a/tests/data/test-abidiff-exit/test-member-size-v1.cc b/tests/data/test-abidiff-exit/test-member-size-v1.cc
>new file mode 100644
>index 00000000..b3bd5988
>--- /dev/null
>+++ b/tests/data/test-abidiff-exit/test-member-size-v1.cc
>@@ -0,0 +1,27 @@
>+struct M;
>+
>+struct S {
>+  int x;
>+  M * m;
>+  int y;
>+};
>+
>+struct M {
>+  int a;
>+  S * s;
>+};
>+
>+struct T {
>+  S s;
>+  int a;
>+};
>+
>+struct U {
>+  struct {
>+    S s;
>+  };
>+  int r;
>+};
>+
>+void reg1(S*, T*, T*) { }
>+void reg2(U*) { }

While these are only test cases, I would like for them to have a bit
more descriptive names or a comment for each of them to make it easier
to read the test case.

Other than those little nits, this is a very nice patch:


Reviewed-by: Matthias Maennich <maennich@google.com>
Tested-by: Matthias Maennich <maennich@google.com>

Cheers,
Matthias

>diff --git a/tests/data/test-abidiff-exit/test-member-size-v1.o b/tests/data/test-abidiff-exit/test-member-size-v1.o
>new file mode 100644
>index 0000000000000000000000000000000000000000..eaec9ebead662bc23c00130c537133a5be5c2019
>GIT binary patch
>literal 3192
>zcmbtW&u<%55T57F#_Me3IB}ySq(VjlK~;9iMp4zYq?iWUR6q$$jiO2r*3QPZ8gHug
>zx;RCs2oT68S_z3FapNyQ;?M&JBraUJaYO<nBo6#IA#s42w{Psti*tdIyfg2c`DWgG
>zJMXRUJpbawj1a&g;5-aQi~>B!4(zft%TR<VsI2vVUhBR6*IKXh`&zH^%iY($VF=Bu
>zm}*2uTQX^44>G~SDLb<Pv%;{hBV=?zjAY3IqXojuzK51&?1LDUXaPn>%w`xv<|QbI
>zoJDTK2Qj8NZ4h?0M;tIMAGK*Y_{>~`lE_<MP&9^2m;_2<K@w*nQ^AO$^&`Tgv*P&J
>zcPex`D?=gsm1IO9W)#CBK+KPlVzHGWKFi~>bM(mEYv3fPazc3M0HN3?yi5d|ITCU-
>z$lQBF=}k=V5e14#@mRiS8~OSCq?pPUW-zLVJ7?Qx?Q{0BEij!i4u+KsFBi|?ghn0(
>z+dgj_Sl*mK^D+jF7Dbwq9fu^=a>X-qMn0j3vPgOMlM8c{IA>x|W)`RMB+ZiMlPpPE
>z^hm$cK8VIE_%nd^QHa0u<M@<)hieoN2kqEt1+8ijIql}{z`5nQwVGs`GmuNl5PwdX
>zbAOr>E9T_883R)sL5zaB2V2*dP%o}~6(9{y#jTqP^wzzNb?@57;uc)GQYo#TI^`{u
>zmfc0yD=jW~%bvHeTyk1*Ck$5VK^R2M8V>!a)>!GDIqjTYDmnF%v*Wk-!&)QS3->y0
>zrxU)}47Z)wukHqIfJ>{ZXG>2!7gU>mm}GXm<&#<sfa7wFxCOVbg6I~+{IRTc7q{dD
>z;`AfIT?cqJU-%%iIzD;@18_*brwK=q?Z*C#i9hiieqw4ok$?Pi*h4Reyobe5uUYpP
>z$QUMuI`g{EfCEk6cN>tpT>2=@Czl!xOe0zG08o|z<A*Q;49FjWA3KCoV^5{_LGC?b
>zCl$_PKH^7pZqj?HHcK@l73G~6OWB0;j0mUIUmy@=GEu;|8p5=O)1f4pOO#wm|MVb6
>z>mZ>#@+OiafS;7+{Ew^guNuxh`J2M2V<<oG%d~1C&VzT8loJ~6DZHd`&ZFQ1`(rYQ
>zx}a=5p3j1gmsC8>F})9E4d?lT+um>C8AcsPiEgkJ2i+LlZ9n$Gt+w0XM!~M{ZU@y)
>zeXAMn?4eKEezh6}w+^`d$PepyEu<;C%`jjJmH@Z5*J=g$QFFt+IB@Y^a@w(9yP-%y
>zV{0e!TY;MR|5WqHr@i7n<aA|a=$AOfrsWYF5T@S%ucw1jw$7*iqW=4@eCi)PCza#+
>zuWC+hC_i5GZ=_75lyp_IabHruQ5>HYx*teZ@Tcb_{7VIXNQ0E<vFqs5F$zDYnsgz>
>zB~y=m0kL88zpq{>^J)HcyXy1b9+DFwxS{G-Xpj=U{ucU%)&Ex2=Y693bdTxvZz4uH
>zd7fxW`C8S#&w$cgpY>aa594pDhT{8+(=d<q`-;zg)_3%VR1W5G+^1*|rl!j<yrcM=
>zeIzk>{S1GM#<2bSVaWTVuNU)qUx(GE+~2GE4K-o<ZqQdz=hHhGw$!rf|0VRNMPEPV
>R9mX$Ev!Q&RsQy#u{|i5f=e7U<
>
>literal 0
>HcmV?d00001
>
>diff --git a/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt b/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
>index 1583a40b..52c48b3d 100644
>--- a/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
>+++ b/tests/data/test-abidiff-exit/test-no-stray-comma-report.txt
>@@ -10,4 +10,3 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>       type name changed from 'int[1]' to 'int[2]'
>       array type size changed from 32 to 64
>       array type subrange 1 changed length from 1 to 2
>-    and size changed from 32 to 64 (in bits) (by +32 bits)
>diff --git a/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt b/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
>index 12af287b..2f8f31d0 100644
>--- a/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
>+++ b/tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt
>@@ -13,6 +13,7 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>           'char S1::m1' offset changed from 64 to 40 (in bits) (by -24 bits)
>         1 data member change:
>           anonymous data member struct {int m0; char m01;} at offset 0 (in bits) became data member 'int S1::m0'
>+          and size changed from 64 to 32 (in bits) (by -32 bits)
>
>   [C] 'function void foo(S0&)' has some indirect sub-type changes:
>     parameter 1 of type 'S0&' has sub-type changes:
>diff --git a/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt b/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
>index b8bb951c..ed68b550 100644
>--- a/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
>+++ b/tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt
>@@ -12,5 +12,6 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>             struct {int b; float c;}
>           to:
>             struct {int b; float c; char e;}
>+          and size changed from 64 to 96 (in bits) (by +32 bits)
>           'int S2::d' offset changed from 96 to 128 (in bits) (by +32 bits)
>
>diff --git a/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt b/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
>index b1611303..2a679d60 100644
>--- a/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
>+++ b/tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt
>@@ -78,7 +78,7 @@
>                       type name changed from 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl' to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl'
>                       type size changed from 128 to 192 (in bits)
>                       1 data member change:
>-                        name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node'
>+                        name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_List_impl::_M_node', size changed from 128 to 192 (in bits) (by +64 bits)
>                     and name of 'std::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl' changed to 'std::__cxx11::_List_base<sigc::slot_base, std::allocator<sigc::slot_base> >::_M_impl'
>
> ================ end of changes of 'libsigc-2.0.so.0.0.0'===============
>diff --git a/tests/data/test-diff-suppr/test36-leaf-report-0.txt b/tests/data/test-diff-suppr/test36-leaf-report-0.txt
>index 9caa9428..fcbb9232 100644
>--- a/tests/data/test-diff-suppr/test36-leaf-report-0.txt
>+++ b/tests/data/test-diff-suppr/test36-leaf-report-0.txt
>@@ -16,7 +16,6 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>   type size changed from 64 to 96 (in bits)
>   there are data member changes:
>     type 'struct leaf1' of 'leaf2::member0' changed, as reported earlier
>-    and size changed from 32 to 64 (in bits) (by +32 bits)
>     'char leaf2::member1' offset changed from 32 to 64 (in bits) (by +32 bits)
>   3 impacted interfaces:
>     function void interface1(struct_type*)
>diff --git a/tests/data/test-diff-suppr/test46-PR25128-report-1.txt b/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
>index 36439ce7..acff860c 100644
>--- a/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
>+++ b/tests/data/test-diff-suppr/test46-PR25128-report-1.txt
>@@ -13,5 +13,4 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>     type 'unsigned long int' of 'root_domain::max_cpu_capacity' changed:
>       entity changed from 'unsigned long int' to 'struct max_cpu_capacity' at sched.h:722:1
>       type size changed from 64 to 192 (in bits)
>-    and size changed from 64 to 192 (in bits) (by +128 bits)
>     'perf_domain* root_domain::pd' offset changed from 14528 to 14656 (in bits) (by +128 bits)
>diff --git a/tests/data/test-diff-suppr/test46-PR25128-report-2.txt b/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
>index 67dbf58f..79827103 100644
>--- a/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
>+++ b/tests/data/test-diff-suppr/test46-PR25128-report-2.txt
>@@ -9,5 +9,4 @@ Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
>     type 'unsigned long int' of 'root_domain::max_cpu_capacity' changed:
>       entity changed from 'unsigned long int' to 'struct max_cpu_capacity' at sched.h:722:1
>       type size changed from 64 to 192 (in bits)
>-    and size changed from 64 to 192 (in bits) (by +128 bits)
>     'perf_domain* root_domain::pd' offset changed from 14528 to 14656 (in bits) (by +128 bits)
>diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
>index 17523afa..97981a69 100644
>--- a/tests/test-abidiff-exit.cc
>+++ b/tests/test-abidiff-exit.cc
>@@ -177,6 +177,24 @@ InOutSpec in_out_specs[] =
>     "data/test-abidiff-exit/test-leaf-cxx-members-report.txt",
>     "output/test-abidiff-exit/test-leaf-cxx-members-report.txt"
>   },
>+  {
>+    "data/test-abidiff-exit/test-member-size-v0.o",
>+    "data/test-abidiff-exit/test-member-size-v1.o",
>+    "",
>+    "",
>+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
>+    "data/test-abidiff-exit/test-member-size-report0.txt",
>+    "output/test-abidiff-exit/test-member-size-report0.txt"
>+  },
>+  {
>+    "data/test-abidiff-exit/test-member-size-v0.o",
>+    "data/test-abidiff-exit/test-member-size-v1.o",
>+    "",
>+    "--leaf-changes-only",
>+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
>+    "data/test-abidiff-exit/test-member-size-report1.txt",
>+    "output/test-abidiff-exit/test-member-size-report1.txt"
>+  },
>   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
> };
>
>-- 
>2.26.0.292.g33ef6b2f38-goog
>
>

  reply	other threads:[~2020-04-06 16:08 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-03 21:53 [PATCH 1/2] abidiff: More compact references to prior diffs Giuliano Procida
2020-04-03 21:53 ` [PATCH 2/2] abidiff: Fix anonymous member size change reports Giuliano Procida
2020-04-06 16:08   ` Matthias Maennich [this message]
2020-04-07 13:55     ` Dodji Seketeli
2020-04-07 21:31       ` Giuliano Procida
2020-04-07 21:45     ` Giuliano Procida
2020-04-06 15:29 ` [PATCH 1/2] abidiff: More compact references to prior diffs Matthias Maennich
2020-04-07 13:47 ` Dodji Seketeli
2020-04-07 21:32   ` Giuliano Procida
2020-04-07 21:33 ` [PATCH v2 " Giuliano Procida
2020-04-07 21:33   ` [PATCH v2 2/2] abidiff: Fix anonymous member size change reports Giuliano Procida
2020-04-14 10:42     ` Dodji Seketeli
2020-04-14 10:42   ` [PATCH v2 1/2] abidiff: More compact references to prior diffs Dodji Seketeli

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=20200406160831.GB189388@google.com \
    --to=maennich@google.com \
    --cc=dodji@seketeli.org \
    --cc=gprocida@google.com \
    --cc=kernel-team@android.com \
    --cc=libabigail@sourceware.org \
    /path/to/YOUR_REPLY

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

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