[00/13] Support negative suppression specifications

Message ID 87356nrnmq.fsf@redhat.com
Headers
Series Support negative suppression specifications |

Message

Dodji Seketeli March 2, 2023, 6:53 p.m. UTC
  Hello,

The core of this patch is to beef up the suppression specification
language so that we can express something like this:

    [allow_type] #1
      label = first-suppr
      type_kind = struct
      has_data_member_regexp = ^__reserved_padding #2

    [suppress_type]
      label = second-suppr
      type_kind = struct
      has_data_member_inserted_between =
	{
	    offset_of_first_data_member_regexp(^__reserved_padding), #3
	    offset_of_last_data_member_regexp(^__reserved_padding), #4
	}


In #1, the [allow_type] directive suppresses all type changes that do
NOT match this directive.  I call this a "negative type suppression
specification".  In #2, the "has_data_member_regexp" property matches
a type which has a data member which name matches the regular
expression value of this property.

In #3, the offset_of_first_data_member_regexp() function-like expression
evaluates to the offset of the first data member which name matches
the regular expression in argument.

In #4, the offset_of_last_data_member_regexp() function-like
expression evaluates to the offset of the last data member which name
matches the regular expression in argument.

The patch set not only implements the features #1 to #4 but also
includes some performance work to improve the speed of the analysis of
big binaries with lots diff nodes.

Dodji Seketeli (13):
  ini: Fix parsing list property values
  suppr: Support has_data_member and has_data_member_regexp properties
  suppression: Factorize out is_data_member_offset_in_range
  suppression: Support the has_size_change property for suppress_type
  suppression: Support offset_of_{first,last}_data_member_regexp offset selectors
  comparison, suppression: Support [allow_type] directive
  Misc white space fixes
  abidiff: Add extensive logging
  tools-utils: Support kernel stablelist
  comp-filter: Don't re-visit node while applying filters to diff nodes
  comparison: Add a mode to not apply filters on interface sub-graphs
  comparison: When marking leaf nodes don't do unnecessary impact analysis
  comp-filter: Speed up harmless/harmful categorization

 doc/manuals/abidiff.rst                       |  12 +
 doc/manuals/kmidiff.rst                       |  11 +
 doc/manuals/libabigail-concepts.rst           | 158 ++++-
 include/abg-comparison.h                      |  86 ++-
 include/abg-corpus.h                          |   6 +
 include/abg-fwd.h                             |  48 ++
 include/abg-suppression.h                     | 110 +++-
 src/abg-comp-filter.cc                        |  27 +-
 src/abg-comparison-priv.h                     |  23 +-
 src/abg-comparison.cc                         | 581 ++++++++++++++++--
 src/abg-corpus-priv.h                         |   4 +-
 src/abg-corpus.cc                             |  14 +
 src/abg-ctf-reader.cc                         |   1 +
 src/abg-default-reporter.cc                   | 352 ++++++-----
 src/abg-elf-helpers.cc                        |   1 +
 src/abg-ini.cc                                |   1 +
 src/abg-ir.cc                                 | 102 ++-
 src/abg-reader.cc                             |  22 +
 src/abg-suppression-priv.h                    |  43 +-
 src/abg-suppression.cc                        | 479 ++++++++++++---
 src/abg-tools-utils.cc                        |   3 +-
 tests/data/Makefile.am                        |  80 +++
 .../test-allow-type-array-suppr.txt           |   7 +
 .../test-allow-type-array-v0--v1-report-1.txt |  23 +
 .../test-allow-type-array-v0--v1-report-2.txt |   3 +
 .../test-allow-type-array-v0--v2-report-1.txt |  20 +
 .../test-allow-type-array-v0--v2-report-2.txt |  15 +
 .../test-allow-type-array-v0--v3-report-1.txt |  23 +
 .../test-allow-type-array-v0--v3-report-2.txt |   3 +
 .../test-allow-type-array-v0.c                |  18 +
 .../test-allow-type-array-v0.o                | Bin 0 -> 3392 bytes
 .../test-allow-type-array-v1.c                |  20 +
 .../test-allow-type-array-v1.o                | Bin 0 -> 3448 bytes
 .../test-allow-type-array-v2.c                |  20 +
 .../test-allow-type-array-v2.o                | Bin 0 -> 3456 bytes
 .../test-allow-type-array-v3.c                |  20 +
 .../test-allow-type-array-v3.o                | Bin 0 -> 3456 bytes
 .../test-allow-type-region-suppr.txt          |  11 +
 ...test-allow-type-region-v0--v1-report-1.txt |  20 +
 ...test-allow-type-region-v0--v1-report-2.txt |   3 +
 ...test-allow-type-region-v0--v2-report-1.txt |  21 +
 ...test-allow-type-region-v0--v2-report-2.txt |  16 +
 ...test-allow-type-region-v0--v3-report-1.txt |  23 +
 ...test-allow-type-region-v0--v3-report-2.txt |  18 +
 ...test-allow-type-region-v0--v4-report-1.txt |  28 +
 ...test-allow-type-region-v0--v4-report-2.txt |   3 +
 ...test-allow-type-region-v0--v5-report-1.txt |  30 +
 ...test-allow-type-region-v0--v5-report-2.txt |  25 +
 .../test-allow-type-region-v0.c               |  22 +
 .../test-allow-type-region-v0.o               | Bin 0 -> 3576 bytes
 .../test-allow-type-region-v1.c               |  23 +
 .../test-allow-type-region-v1.o               | Bin 0 -> 3632 bytes
 .../test-allow-type-region-v2.c               |  23 +
 .../test-allow-type-region-v2.o               | Bin 0 -> 3632 bytes
 .../test-allow-type-region-v3.c               |  24 +
 .../test-allow-type-region-v3.o               | Bin 0 -> 3688 bytes
 .../test-allow-type-region-v4.c               |  23 +
 .../test-allow-type-region-v4.o               | Bin 0 -> 3640 bytes
 .../test-allow-type-region-v5.c               |  24 +
 .../test-allow-type-region-v5.o               | Bin 0 -> 3696 bytes
 .../test-allow-type-suppr1.txt                |   7 +
 .../test-allow-type-suppr2.txt                |   7 +
 .../test-diff-suppr/has-data-member-1.suppr   |   3 +
 .../test-diff-suppr/has-data-member-2.suppr   |   3 +
 .../test-diff-suppr/has-data-member-3.suppr   |   3 +
 .../test-diff-suppr/has-data-member-4.suppr   |   3 +
 .../test-diff-suppr/has-data-member-5.suppr   |   3 +
 .../test-diff-suppr/has-data-member-6.suppr   |   3 +
 .../test-diff-suppr/has-data-member-7.suppr   |   3 +
 ...ata-member-inserted-between-1-report-1.txt |   3 +
 ...ata-member-inserted-between-1-report-2.txt |  13 +
 ...ata-member-inserted-between-1-report-3.txt |  12 +
 ...ata-member-inserted-between-1-report-4.txt |  11 +
 ...st-has-data-member-inserted-between-1-v0.c |  10 +
 ...st-has-data-member-inserted-between-1-v0.o | Bin 0 -> 3088 bytes
 ...st-has-data-member-inserted-between-1-v1.c |  10 +
 ...st-has-data-member-inserted-between-1-v1.o | Bin 0 -> 3088 bytes
 ...st-has-data-member-inserted-between-1-v2.c |  11 +
 ...st-has-data-member-inserted-between-1-v2.o | Bin 0 -> 3152 bytes
 ...st-has-data-member-inserted-between-1-v3.c |  11 +
 ...st-has-data-member-inserted-between-1-v3.o | Bin 0 -> 3152 bytes
 ...st-has-data-member-inserted-between-1-v4.c |  10 +
 ...st-has-data-member-inserted-between-1-v4.o | Bin 0 -> 3152 bytes
 ...t-has-data-member-inserted-between-1.suppr |   7 +
 .../test-has-data-member-output-1.txt         |  19 +
 .../test-has-data-member-output-2.txt         |  12 +
 .../test-has-data-member-v0.cc                |  22 +
 .../test-diff-suppr/test-has-data-member-v0.o | Bin 0 -> 3608 bytes
 .../test-has-data-member-v1.cc                |  24 +
 .../test-diff-suppr/test-has-data-member-v1.o | Bin 0 -> 3728 bytes
 .../test11-add-data-member-0.1.suppr          |   3 +
 .../test11-add-data-member-0.suppr            |   1 +
 .../test11-add-data-member-1.1.suppr          |   3 +
 .../test11-add-data-member-1.suppr            |   1 +
 .../test11-add-data-member-2.1.suppr          |   3 +
 .../test11-add-data-member-2.suppr            |   1 +
 .../test11-add-data-member-3.1.suppr          |   3 +
 .../test11-add-data-member-3.suppr            |   1 +
 .../test11-add-data-member-4.1.suppr          |   3 +
 .../test11-add-data-member-4.suppr            |   1 +
 .../test11-add-data-member-report-1.1.txt     |  13 +
 .../test12-add-data-member-0.1.suppr          |   3 +
 .../test12-add-data-member-0.suppr            |   1 +
 .../test12-add-data-member-report-1.1.txt     |  13 +
 .../test13-suppr-through-pointer-0.1.suppr    |   4 +
 .../test13-suppr-through-pointer-0.suppr      |   1 +
 ...est13-suppr-through-pointer-report-1.1.txt |  16 +
 .../test35-leaf-report-0.1.txt                |  18 +
 .../data/test-diff-suppr/test35-leaf.1.suppr  |   8 +
 tests/data/test-diff-suppr/test35-leaf.suppr  |   1 +
 tests/test-abidiff-exit.cc                    | 187 ++++++
 tests/test-diff-suppr.cc                      | 202 +++++-
 tools/abidiff.cc                              | 189 +++++-
 tools/kmidiff.cc                              |   8 +
 114 files changed, 3176 insertions(+), 391 deletions(-)
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-suppr.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v1-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v1-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v2-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v2-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v3-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0--v3-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v0.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v1.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v1.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v2.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v2.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v3.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-array-v3.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-suppr.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v1-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v1-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v2-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v2-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v3-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v3-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v4-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v4-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v5-report-1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0--v5-report-2.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v0.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v1.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v1.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v2.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v2.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v3.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v3.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v4.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v4.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v5.c
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-region-v5.o
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-suppr1.txt
 create mode 100644 tests/data/test-abidiff-exit/test-allow-type-suppr2.txt
 create mode 100644 tests/data/test-diff-suppr/has-data-member-1.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-2.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-3.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-4.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-5.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-6.suppr
 create mode 100644 tests/data/test-diff-suppr/has-data-member-7.suppr
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-report-1.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-report-2.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-report-3.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-report-4.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v0.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v0.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v1.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v1.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v2.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v2.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v3.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v3.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v4.c
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1-v4.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-inserted-between-1.suppr
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-output-1.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-output-2.txt
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-v0.cc
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-v0.o
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-v1.cc
 create mode 100644 tests/data/test-diff-suppr/test-has-data-member-v1.o
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-0.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-1.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-2.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-3.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-4.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test11-add-data-member-report-1.1.txt
 create mode 100644 tests/data/test-diff-suppr/test12-add-data-member-0.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test12-add-data-member-report-1.1.txt
 create mode 100644 tests/data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr
 create mode 100644 tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt
 create mode 100644 tests/data/test-diff-suppr/test35-leaf-report-0.1.txt
 create mode 100644 tests/data/test-diff-suppr/test35-leaf.1.suppr