Commit Graph

2858 Commits

Author SHA1 Message Date
Dodji Seketeli
8f28696353 doc/website/mainpage.txt: Update for 2.5 release
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 16:33:41 +02:00
Dodji Seketeli
55d1968cb7 ChangeLog: Update for 2.5 release
* ChangeLog: Update for 2.5 release by running the "make
	update-changelog" command.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 12:18:06 +02:00
Dodji Seketeli
87fcc57816 NEWS: Update for 2.5 release
* NEWS: Update for the 2.5 release with the command git
	shortlog libabigail-2.4..HEAD.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 12:17:30 +02:00
Dodji Seketeli
74c4f1e0b6 configure: Add option to disable abidb
While looking at packaging libabigail for EPEL8, it turned out abidb
requires python 3.9 for the type hints on function definitions.  Yet,
EPEL8 has an older python.

This patch adds a --disable-abidb option to configure to handle EPEL8.

	* configure.ac: Add a --disable-abidb option to configure to
	disable the abidb tool and related tests.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 12:15:51 +02:00
Dodji Seketeli
53547cdbf6 tests/runtestabidb?.sh.in: Fix git initialization
* tests/runtestabidb[1-2].sh.in: Initialize email & user name
          for the local git repository.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-17 16:31:57 +02:00
Dodji Seketeli
dbae53ec30 Bug 31646: Fix type suppression tactics for webkit2gtk3
By default, using abidw --abidiff on the binary
/usr/lib64/libwebkit2gtk-4.0.so.37 on the ppc64le platform takes more
than 50GB of RAM and ooms on my system.  That is why a number of
suppression specifications have been put in place in the
default.abignore file that is installed by default on the system.
With that suppression specification however, abidw --abidiff hits an
assert and crashes.

That is because the suppression specification rule below is too eager
and thus removes parameters from some function's signature, in the
final internal representation:

    [suppress_type]
      soname_regexp = libwebkit2?gtk-.*\\.so.*
      name_regexp = (^std::.*|WebCore::.*|WebKit::.*)
      drop = true

An example of function signature that got changed (in the IR) because
of this suppression specification is:

This function signature:

    WebKitAuthenticationScheme
    webkit_authentication_request_get_scheme(WebKitAuthenticationRequest*)

becomes (after applying the suppression specification above):

    void
    webkit_authentication_request_get_scheme()

Woops.  That is not good.

To address that problem, this patch changes that suppression
specification to make libabigail transform those types into opaque
types.  An opaque struct, class or enum is essentially a
declaration-only type of the same kind and name.

So the suppression specification above becomes:

    [suppress_type]
      # Drop all standard c++ types on the floor like before.
      soname_regexp = libwebkit2?gtk-.*\\.so.*
      name_regexp = ^std::.*
      drop = true

    [suppress_type]
      # Transform all C++ types in the WebCore and WebKit namespaces into
      # opaque types.  These are essentially internal types of libwebkit2
      # anyway.  This greatly reduces the size of the in-memory working set.
      label = libabigail::OPAQUE_TYPE_LABEL
      soname_regexp = libwebkit2?gtk-.*\\.so.*
      name_regexp = (WebCore::.*|WebKit::.*)
      drop = true

Notice the introduction of the new special label
"libabigail::OPAQUE_TYPE_LABEL".  This new special label is what makes
the suppression engine of libabigail transform a type (that matches
that suppression specification) into an opaque type, rather than
dropping it on the floor.

The patch then adapts the code of the suppression engine to detect
this special label for the purpose of transforming types into opaque
types.  The patch normalizes the use of the term "opaque type" instead
of "private type" that was used previously in the code.

The patch fixes a bug in the code of get_opaque_version_of_type that
prevents this function from working on types with no location
information.

While working on this, I have noticed that the abipkgdiff has a bug
that was making it ignore suppression specifications provided via the
--suppression option.  The patch fixes that.

I have noticed that abipkgdiff --self-check completely ignores all
suppression specifications provided either via --suppression or
indirectly via devel packages.  The patch fixes that.

Last but not least, fedabipkgdiff --self-compare completely ignores
suppression specifications too!  The patch fixes that as well.

With all those fixes, the system now takes around 7GB of RAM and ~ 30
minutes to complete the analysis of the webkit2gtk3 package, using a
non-optimized libabigail build.

The command I use is:

    $ time tools/fedabipkgdiff --debug --self-compare --abipkgdiff build/tools/abipkgdiff --suppressions default.abignore -a --from fc39 webkit2gtk3

    [...]

    [DEBUG] Result from run_abipkgdiff: 0, in: 0:29:00.088735
    [DEBUG] Result from self_compare_rpms_from_distro: 0, in: 0:29:20.721748

    real	29m20,846s
    user	29m4,561s
    sys	        2m41,611s
    $

The culprit package was webkit2gtk3-2.40.1-1.fc36.ppc64le.rpm.

To reproduce the issue on that package, I do:

    $ time ~/git/libabigail/rhbz2273891/build/tools/abipkgdiff --self-check --suppr ~/git/libabigail/rhbz2273891/default.abignore --d1 webkit2gtk3-debuginfo-2.40.1-1.fc36.ppc64le.rpm --devel1 webkit2gtk3-devel-2.40.1-1.fc36.ppc64le.rpm webkit2gtk3-2.40.1-1.fc36.ppc64le.rpm

    ==== SELF CHECK SUCCEEDED for 'libwebkit2gtk-4.0.so.37.63.2' ====
    ==== SELF CHECK SUCCEEDED for 'WebKitWebDriver' ====
    ==== SELF CHECK SUCCEEDED for 'WebKitNetworkProcess' ====
    ==== SELF CHECK SUCCEEDED for 'WebKitWebProcess' ====

    real	8m25,895s
    user	8m46,433s
    sys	        0m15,683s
    $

	* default.abignore: Split the libwebkit2gtk suppression
	specification for types whose names match the regexp
	^std::.*|WebCore::.*|WebKit::.* into two.  One that drops type
	with names being ^std::.* and another one that turns type being
	WebCore::.*|WebKit::.* into opaque types.
	* doc/manuals/libabigail-concepts.rst: Add documentation for the
	new special label libabigail::OPAQUE_TYPE_LABEL that transforms
	types matching a [suppress_type] into opaque types.
	* include/abg-suppression.h (is_opaque_type_suppr_spec): Renamed
	is_private_type_suppr_spec into this.
	(get_opaque_types_suppr_spec_label): Renamed
	get_private_types_suppr_spec_label.
	* src/abg-comparison.cc (diff::is_suppressed): Adjust.
	* src/abg-dwarf-reader.cc (type_is_suppressed): Adjust. Change the
	name of the type_is_private parameter into type_is_opaque.
	(get_opaque_version_of_type): Do not return early if the type has
	no associated location.  What was I thinking.
	(build_ir_node_from_die): For enums, struct and classes adjust
	call to type_is_suppressed.
	* src/abg-suppression.cc (type_suppression::suppresses_diff):
	Adjust to using is_opaque_type_suppr_spec and
	get_opaque_version_of_type in lieu of is_private_type_suppr_spec
	and get_private_types_suppr_spec_label.
	(get_opaque_types_suppr_spec_label): Rename
	get_private_types_suppr_spec_label into this.  Also, rename the
	name of the special label that specifies opaque types from
	"Artificial private types suppression specification" to
	"libabigail::OPAQUE_TYPE_LABEL".
	(is_opaque_type_suppr_spec): Rename is_private_type_suppr_spec
	into this.
	(is_type_suppressed): Rename the "type_is_private" parameter into
	"type_is_opaque".
	* src/abg-tools-utils.cc (handle_file_entry): Adjust to using
	get_opaque_types_suppr_spec_label rather than
	get_private_types_suppr_spec_label.
	* tools/abipkgdiff.cc (compare): Use the supprs variable where all
	the suppression specifications got accumulated, not just the
	priv_types_supprs1.
	(compare_to_self): Add a suppression specifications variable for
	private types.  Add those private types specs to the user-provided
	ones.
	* tools/fedabipkgdiff (abipkgdiff): In the self comparison mode,
	take into account devel packages and suppression specifications.
	Pass those to the abipkgdiff tool's invocation.
	* tests/data/test-diff-suppr/PR31646/test-PR31646-result-[1-3].txt:
	New reference test output files.
	* tests/data/test-diff-suppr/PR31646/test-PR31646-v{0,1}.cc:
	Source code of binary inputs below.
	* tests/data/test-diff-suppr/PR31646/test-PR31646-v{0,1}.o: Binary
	input files.
	* tests/data/test-diff-suppr/PR31646/test-PR31646.2.abignore:
	Suppression specification file.
	* tests/data/test-diff-suppr/PR31646/test-PR31646.abignore:
	Likewise.
	* tests/data/Makefile.am: Add the new test material above to
	source distribution.
	* tests/test-diff-suppr.cc (in_out_specs): Add the new test input
	to this harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-16 17:46:19 +02:00
Dodji Seketeli
a82958b3f5 Bug 29160 - support fn symbol aliasing a var symbol
In binaries originating from OCaml on s390x or ppcle platforms, it can
happen that a function symbol aliases a variable symbol.

By default, the ABIXML reader doesn't expect that.  It expects that
all aliases of a symbol are symbols of the same kind as their target.

This patch relaxes that constraint from the ABIXML reader.  It teaches
read_symbol_db_from_input how to resolve unresolved function (resp.
variable) symbol aliases to variable (resp. function) symbols.

	* src/abg-reader.cc (typedef string_strings_map_type): Define new
	typedef.
	(resolve_symbol_aliases): Define new function.
	(build_elf_symbol_db): Add two new parameters to carry unresolved
	function and variable symbol aliases.  When a symbol alias can't
	resolve to any of the symbols of its kind (function or variable)
	then stage the alias away in the set of unresolved aliases.  That
	set is then going to be resolved later.
	(read_symbol_db_from_input): Add two new parameters to carry
	unresolved function and variable symbol aliases.  Pass them down
	to build_elf_symbol_db.
	(reader::read_corpus): Adjust the invocation of
	read_symbol_db_from_input to get the sets of unresolved function &
	variable symbol aliases.  Invoke the new resolve_symbol_aliases
	the unresolved function & variable aliases.
	* tests/data/test-diff-pkg/PR29610/guestfs-tools-1.51.6-2.el9.s390x-self-check-report.txt:
	New test reference output.
	* tests/data/test-diff-pkg/PR29610/guestfs-tools-1.51.6-2.el9.s390x.rpm:
	New binary test input.
	* tests/data/test-diff-pkg/PR29610/guestfs-tools-debuginfo-1.51.6-2.el9.s390x.rpm:
	Likewise.
	* tests/data/Makefile.am: Add this new test material to source
	distribution.
	* tests/test-diff-pkg.cc (in_out_specs): Add the new test input to
	this test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-04 17:12:55 +02:00
Dodji Seketeli
29719218ee Bug 31513 - Fix fallout of initial patch
As Jianfeng Fan pointed out in a comment at
https://sourceware.org/bugzilla/show_bug.cgi?id=31513#c14, there is a
thinko in commit
https://sourceware.org/git/?p=libabigail.git;a=commit;h=338394f5454990c715b52bb4bc2ed47b39d6528b.

has_subtype_changes forgets to reset the s_member when f_member is
reset.  Both variables should be reset in tandem, just like what is
done in has_offset_changes.

Fixed thus.

	* src/abg-comp-filter.cc (has_subtype_changes): Reset s_member in
	the loop, just like f_member.
	* tests/data/test-abidiff-exit/PR31513/non-regr/report1.txt: Adjust.
	* tests/data/test-abidiff-exit/PR31513/non-regr/report2.txt: Adjust.
	* tests/test-abidiff-exit.cc (in_out_specs): Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-03 18:17:31 +02:00
Dodji Seketeli
f821c2be3f comparison: Fix erroneous detection of deleted anonymous data members
It has been reported over IRC by Robin Jarry that in some cases,
abidiff would wrongly consider anonymous data members as being
deleted.  These are cases where the anonymous data members were moved
into other anonymous data members without incurring any size or offset
change.

This patch reduces (and hopefully eliminates) false positives in
detecting anonymous data members deletion by considering the leaf data
members of the anonymous data members.

It considers that if all leaf data members contained in the previous
anonymous data members are still present in the new version of the
type, then no data member deletion occurred, basically.

The non-regression test added to this patch contains two binaries that
Robin Jarry sent me.  They were built for the source code before and
after the patch he submitted at
http://patches.dpdk.org/project/dpdk/patch/20240327091440.1166119-2-rjarry@redhat.com/.

Note that I have also added a synthetic reproducer example I came up
with after understanding the issue at hand.

	* src/abg-comparison.cc
	(class_or_union_diff::ensure_lookup_tables_populated): If leaf
	data members of an anonymous data member are still present in the
	new version of the class, then the anonymous data member cannot be
	considered as being removed from the second version of the class.
	* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/report0.txt:
	Reference test output.
	* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/test0-v{0,1}.c:
	Source code of the binary input below.
	* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/test0-v{0,1}.o:
	New binary test input.
	* tests/data/test-abidiff-exit/non-del-anon-dm/reported/binaries-origin.txt:
	File mentioning the origin of the reported binary.
	* tests/data/test-abidiff-exit/non-del-anon-dm/reported/librte_graph.so.24.{0,1}:
	Binary test input.
	* tests/data/test-abidiff-exit/non-del-anon-dm/reported/report0.txt:
	Reference test output.
	* tests/data/Makefile.am: Add the test material above to source
	distribution.
	* tests/test-abidiff-exit.cc (in_out_specs): Add test material
	above to this harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 18:12:26 +01:00
Dodji Seketeli
338394f545 Bug 31513 - abidiff considers data members moved to base class as harmful
Consider the 'struct type' below and its use in the file
example-v0.cc:

    //----> example-v0.cc: <------
    struct type
    {
      int m0;
    };

    int
    use(type& t)
    {
      return t.m0;
    }
    //---->8<-----

Now, consider a second version of that program where the data member
of the 'struct type' is moved into a base class:

    //----> example-v1.cc: <------
    struct base
    {
      int m0;
    };

    struct type : public base
    {
    };

    int
    use(type& t)
    {
      return t.m0;
    }
    //---->8<------

The first and second version of 'struct type' are ABI compatible
because neither the size of 'struct type' nor the offset of the data
member m0 has changed.

But then look at what abidiff says:

    $ abidiff example-v0.o example-v1.o || echo "exit code: $?"
    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 int use(type&)' at example-v0.cc:7:1 has some indirect sub-type changes:
	parameter 1 of type 'type&' has sub-type changes:
	  in referenced type 'struct type' at example-v1.cc:6:1:
	    type size hasn't changed
	    1 base class insertion:
	      struct base at example-v1.cc:1:1
	    1 data member deletion:
	      'int m0', at offset 0 (in bits) at example-v0.cc:3:1

    exit code: 4
    $

abidiff considers that the mere addition of a base class constitutes a
potential ABI incompatibility.

Also, abidiff fails to see that although the data member m0 was
removed from 'struct type' itself, it was moved into its new base
type.  In practice, the data member m0 is still a member of 'struct
type', by definition of class type inheritance.

Thus, the exit code of abidiff is ABIDIFF_ABI_CHANGE which value is 4.

This patch fixes this problem.

First of all, here is what abidiff now says with this patch:

    $ abidiff example-v0.o example-v1.o && echo "return code: $?"
    Functions changes summary: 0 Removed, 0 Changed (1 filtered out), 0 Added function
    Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

    return code: 0
    $

In other words, abidiff now recognizes the changes as being ABI
compatible and filters them out by default.

Furthermore, here are the changes that abidiff sees when asked to
avoid filtering these (now considered harmless) changes:

    $ abidiff --harmless example-v0.o example-v1.o && echo "return code: $?"
    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 int use(type&)' at example-v0.cc:7:1 has some indirect sub-type changes:
	parameter 1 of type 'type&' has sub-type changes:
	  in referenced type 'struct type' at example-v1.cc:6:1:
	    type size hasn't changed
	    1 base class insertion:
	      struct base at example-v1.cc:1:1

    $

We can see that abidiff no longer considers that the data member m0
was deleted.

At its core, this patch teaches
class_diff::ensure_lookup_tables_populated to detect data members
being moved to base classes.  That detection prevents the code base to
consider those data members as being removed from the class.

Now that the moved data members are not considered as removed, the
patch goes further to consider data member moves to base classes that
are not accompanied with any size or offset change as being harmless,
and thus, to be filtered out by default.

To that end, the patch teaches categorize_harmful_diff_node that an
added base classes is not necessarily a harmful change if it is not
accompanied with a size or offset change.  Rather, an added base
classes (or any change to a class) not accompanied with a size or
offset change is now categorized into
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.  Note that the previous
HARMLESS_UNION_CHANGE_CATEGORY was renamed into
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.

Incidentally, a removal of a base class or any change accompanied with
an offset change is always categorized as harmful change.

The patch also adds several non-regression tests.

	* include/abg-comparison.h (typedef string_decl_base_sptr_map):
	Move this typedef to include/abg-fwd.h:
	(HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY): Inside the enum
	diff_category, rename the enumerator
	HARMLESS_UNION_CHANGE_CATEGORY into this.
	(EVERYTHING_CATEGORY): Adjust this enum to refer to
	HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY, no more HARMLESS_UNION_CHANGE_CATEGORY
	* include/abg-fwd.h (typedef string_decl_base_sptr_map): Move this
	typedef here from abg-comparison.h
	(collect_non_anonymous_data_members): Declare new function.
	* src/abg-comp-filter.cc (has_offset_changes)
	(type_has_offset_changes, has_offset_changes)
	(has_subtype_changes, class_diff_has_only_harmless_changes):
	Define new static functions.
	(base_classes_removed): Rename base_classes_added_or_removed into
	this and update comment.
	(categorize_harmless_diff_node): Changes that were categorized as
	HARMLESS_UNION_CHANGE_CATEGORY is now categorized as
	HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.  Also, a diff that
	satisfies either union_diff_has_harmless_changes or
	class_diff_has_only_harmless_changes is categorized as
	HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.
	(categorize_harmful_diff_node): Adjust to invoke
	base_classes_removed instead of base_classes_added_or_removed.  An
	added base class doesn't necessarily qualifies as a harmful change
	anymore.  Rather, a diff node that carries an offset change as
	detected by type_has_offset_changes is categorized as
	SIZE_OR_OFFSET_CHANGE_CATEGORY.
	* src/abg-comparison.cc (get_default_harmless_categories_bitmap):
	Adjust to use
	abigail::comparison::HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY
	rather than abigail::comparison::HARMLESS_UNION_CHANGE_CATEGORY.
	(operator<<(ostream& o, diff_category c)): Likewise.
	(class_diff::ensure_lookup_tables_populated): Detect data members
	that are moved into base classes to avoid considering those data
	members as being removed from the class.
	* src/abg-default-reporter.cc (default_reporter::report): Adjust
	to use HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY rather than
	HARMLESS_UNION_CHANGE_CATEGORY.
	* src/abg-ir.cc (collect_non_anonymous_data_members): Define
	function overloads.
	* tests/data/test-abidiff-exit/PR31513/non-regr/libtest[1-4]-v{0,1}.so:
	New binary test input files.
	* tests/data/test-abidiff-exit/PR31513/non-regr/report[1-4.txt:
	New reference output files.
	* tests/data/test-abidiff-exit/PR31513/non-regr/test[1-4]-v{0,1}.cc:
	Source code of the binary input files above.
	* tests/data/test-abidiff-exit/PR31513/reported/PR31513-reported-report-{1,2}.txt:
	New reference output files.
	* tests/data/test-abidiff-exit/PR31513/reported/libloremipsum_gcc{7,11}.so:
	New binary test input files.
	* tests/data/test-abidiff-exit/PR31513/reported/libstdcpp.suppr:
	New test suppression file.
	* tests/data/Makefile.am: Add new test files above to source
	distribution.
	* tests/test-abidiff-exit.cc (in_out_specs): Add the new input
	test files to this test harness.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 17:36:09 +01:00
Dodji Seketeli
a917072c12 abidiff: Fix indentation of help string
* tools/abidiff.cc (display_usage): Fix indentation of help string

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 16:52:00 +01:00
Dodji Seketeli
46c2a68ccf suppression: Fix indentation
* src/abg-suppression.cc
	(function_suppression::suppresses_function_symbol): Fix
	indentation.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 16:52:00 +01:00
Dodji Seketeli
1ef4be0c26 comparison: Fix typo
* src/abg-comparison.cc
	(class_or_union_diff::ensure_lookup_tables_populated): Fix a
	comment typo.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 16:51:30 +01:00
Dodji Seketeli
fd878f215c ir: Fix Emacs C++ mode header
* src/abg-ir.cc: Fix the Emacs C++ mode header.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-29 16:51:22 +01:00
Frank Ch. Eigler
a16f326e73
abidb: drop the TODO items from the python script
Instead they've moved over to sourceware bugzilla.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
2024-03-22 14:17:29 -04:00
Frank Ch. Eigler
09338a2590 abidb: Introduce a tool to manage the ABI of a Linux distribution
This patch introduces a new tool named abidb.  It manages a Git
repository of the Application Binary Interfaces of a set of shared
libraries.  Those ABIs are stored in the Git repository in the form of
ABIXML files.

The tool then supports the verification of the ABI compatibility of a
given binary against the stored ABIs of shared libraries.

	* configure.ac: Condition building abidb on the presence of python
	and the required modules.
	* doc/manuals/Makefile.am: Add the abidb.rst documentation to
	source distribution.  Distribute the abidb.1 manpage file as well.
	* doc/manuals/abidb.rst: New documentation file.
	* doc/manuals/conf.py: Configure the generation of the abidb.1
	manage from the abidb.rst file above.
	* doc/manuals/libabigail-tools.rst: Add a reference to the new
	abidb tool.
	* tests/Makefile.am: Register runabidb1.sh and runabidb2.sh as
	tests for abidb.  Register runabidb1.sh.in and runabidb2.sh.in as
	input files for autoconf generated runabidb1.sh and runabidb2.sh.
	* tests/data/Makefile.am: Add abidb2client.c, abidb2so.c and
	abidb2soBAD.c to source distribution.
	* tests/data/abidb2client.c: New source file for test input binaries.
	* tests/data/abidb2so.c: Likewise.
	* tests/data/abidb2soBAD.c: Likewise.
	* tests/runtestabidb1.sh.in: New test script input for autoconf generation.
	* tests/runtestabidb2.sh.in: Likewise.
	* tools/Makefile.am: Add the new abidb tool to the set of tools.
	* tools/abidb: The New Tool, ladies and gentlemen!

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-22 17:18:17 +01:00
Dodji Seketeli
3b1cf8e032 abicompat: Fix exit code in weak mode
It turns out the tool is almost always returning ABIDIFF_OK in weak
mode.  Oops.  Fixed thus.  Also, update the test-abicompat.cc to test
for expected exit codes to catch this kind of regressions in the
future.

	* tools/abicompat.cc (perform_compat_check_in_weak_mode): Do not
	override the status code when doing the comparison in the reverse
	direction.
	(compare_expected_against_provided_functions)
	(compare_expected_against_provided_variables): Set the status code
	close to the detected diff.  In the future, this might help us
	provide finer grained status.
	* tests/test-abicompat.cc (InOutSpec::status): Add a new data
	member to represent the expected exit code.
	(in_out_specs): Adjust the array of tests.
	(main): If the actual exit code is different from the expected
	one, then the test failed so let's report it.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-15 20:22:17 +01:00
Dodji Seketeli
15f2ff5d6c Emit & read undefined interfaces to & from ABIXML
This patch teaches the ABIXML writer to emit information about
undefined interfaces.  It also teaches the ABIXML reader to read
information about undefined interfaces.

It introduces two new ABIXML elements:
'undefined-elf-function-symbols' and 'undefined-elf-variable-symbols'
to represent undefined function and variable symbols.

Then, in the 'abi-instr' element functions and variables that
reference undefined elf symbols now have an 'elf-symbol-id' attribute
referencing the undefined symbol listed in the new
'undefined-elf-variable-symbols' or 'undefined-elf-function-symbols'
element.

The patch introduces tests that perform compatibility checks done on
ABIXML files.

	* include/abg-writer.h (set_write_undefined_symbols): Declare new
	function.
	(set_common_options): Use the new set_write_undefined_symbols in
	this function template.
	* src/abg-dwarf-reader.cc (reader::{get_die_language, die_is_in_c,
	die_is_in_cplus_plus, die_is_in_c_or_cplusplus}): Move these
	member functions into ...
	(get_die_language, die_is_in_c, die_is_in_cplus_plus)
	(die_is_in_c_or_cplusplus): ... these static non-member functions.
	(fn_die_equal_by_linkage_name): Adjust and remove the now useless
	reader parameter.
	(compare_dies, get_scope_die, function_is_suppressed)
	(variable_is_suppressed): Adjust.
	(build_translation_unit_and_add_to_ir): When we are asked to load
	undefined symbol, make sure to also analyze top-level class types
	and if we are in C++, also analyze top-level unions and structs as
	these might also have some undefined interfaces.
	* src/abg-reader.cc (build_elf_symbol_db): Let's not construct and
	return the symbol DB anymore.  Rather, let's let the caller
	construct it, so we can just update it with the input gathered.
	(read_symbol_db_from_input): Support getting undefined function
	and variable symbols from the new undefined-elf-function-symbols
	and undefined-elf-variable-symbols elements.  Note that undefined
	and defined function symbols go into the same symbol DB whereas
	undefined and defined variable symbols go into another symbol DB.
	Now, we suppose that the variable & symbol DBs are allocated by
	the caller.  We pass it down to build_elf_symbol_db that populates
	it.  Maybe we should rename build_elf_symbol_db into
	populate_elf_symbol_db.
	(reader::read_corpus): Allocate the function
	and variable symbol DB and let read_symbol_db_from_input populate
	it.  Sort functions and variables after reading the whole ABIXML.
	* src/abg-writer.cc (write_context::write_context): Define new
	data member.
	(write_context::write_context): Initialize it.
	(write_context::{get,set}::write_undefined_symbols): Define
	accessors.
	(set_write_undefined_symbols): Define a new function.
	(write_context::decl_is_emitted): Add a new overload.
	(write_elf_symbol_reference): Add a writer context and a corpus
	parameter.  If the symbol is not in the corpus or if the symbol is
	undefined and we were not asked to emit undefined symbols then do
	not emit any reference to it.
	(write_translation_unit): Emit the undefined functions and
	variables that belong to the current translation unit, along with
	their reference to the undefined ELF symbol they are associated
	to.
	(write_var_decl, write_function_decl): Let
	write_elf_symbol_reference decide whether it should emit the
	reference to ELF symbol or not, as it now know how to make that
	decision.
	(write_corpus): Write the undefined function & variable ELF symbol
	data bases.  These in the new 'undefined-elf-function-symbols' and
	'undefined-elf-variable-symbols' elements.
	* tools/abidw.cc (options::load_undefined_interfaces): Define new
	data member.
	(options:options): Initialize it.
	(display_usage): Add a help string for the
	--no-load-undefined-interfaces option.
	(parse_command_line): Parse the --no-load-undefined-interfaces
	option.
	(set_generic_options): Set the
	fe_iface::option_type::load_undefined_interfaces option.
	* doc/manuals/abidw.rst: Document the new
	--no-load-undefined-interfaces of abidw.
	* tests/data/test-abicompat/test10/libtest10-with-exported-symbols.so:
	New binary input file.
	* tests/data/test-abicompat/test10/libtest10-with-incompatible-exported-symbols.so:
	New binary input file.
	* tests/data/test-abicompat/test10/libtest10-with-incompatible-exported-symbols.so.abi:
	New abixml input file.
	* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols:
	New binary input file.
	* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols.abi:
	New abixml input file.
	* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols.cc:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-fn-changed-report-0.txt:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-fn-changed-report-1.txt:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-fn-changed-report-2.txt:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-fn-changed-report-3.txt:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-fn-changed-report-4.txt:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-with-exported-symbols.cc:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-with-exported-symbols.h:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-with-incompatible-exported-symbols.cc:
	New source file for binary test input
	* tests/data/test-abicompat/test10/test10-with-incompatible-exported-symbols.h:
	New source file for binary test input.
	* tests/data/Makefile.am: Add new test input files to source
	distribution.
	* tests/test-abicompat.cc (in_out_specs): Add the new test inputs
	to this test harness.
	* tests/test-annotate.cc (main): Use the new
	--no-load-undefined-interfaces option of abidw to keep the old
	behavior.
	* tests/test-read-common.cc (test_task::serialize_corpus): Do not
	emit undefined symbols.
	* tests/test-read-dwarf.cc (test_task_dwarf::perform): Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-14 16:27:14 +01:00
Dodji Seketeli
897ecc9a49 Add support for undefined symbols in the BTF reader
This patch teaches the BTF reader how to construct an IR for undefined
interfaces.  The patch also updates the abicompat tool for BTF
support.

	* doc/manuals/abicompat.rst: Update documentation for the --btf
	option of abicompat.
	* include/abg-elf-reader.h
	(elf::reader::{function,variable}_symbol_is_undefined): Declare
	new member functions.
	* src/abg-btf-reader.cc
	(reader::read_debug_info_into_corpus): Sort functions &
	variables after canonicalization.
	(reader::build_ir_node_from_btf_type): Always call
	fe_iface::add_{fn,var}_to_exported_or_undefined_decls with the
	decl that was constructed.
	(reader::build_function_decl): Support setting an undefined symbol
	to the function decl.
	(reader::build_var_decl): Likewise, support setting undefined
	symbol the variable decl.
	* src/abg-elf-reader.cc
	((elf::reader::{function,variable}_symbol_is_undefined): Declare
	new member functions.): Define new member functions.
	* src/abg-symtab-reader.cc
	(symtab::{function,variable}_symbol_is_undefined): Return the
	undefined symbol that was found.
	* src/abg-symtab-reader.h
	(symtab::{function,variable}_symbol_is_undefined): Return an
	undefined symbol rather than just a boolean value.
	* tools/abicompat.cc: Add support for BTF here.
	(options::use_btf): Define new data member ...
	(options::options): ... and initialize it.
	(display_usage): Add a help string for the --btf option.
	(parse_command_line): Parse the --btf option.
	* tests/data/test-abicompat/test7-fn-changed-report-0.1.txt: New
	reference test output file.
	* tests/data/test-abicompat/test7-fn-changed-report-2.1.txt:
	Likewise.
	* tests/data/test-abicompat/libtest7-fn-changed-libapp-btf-v0.so:
	New binary input file.
	* tests/data/test-abicompat/libtest7-fn-changed-libapp-btf-v1.so:
	Likewise.
	* tests/data/test-abicompat/test7-fn-changed-app.btf: Likewise.
	* tests/data/Makefile.am: Add the new test material to source
	distribution.
	* tests/test-abicompat.cc (in_out_specs): Add the new test input
	to the test harness.
	* tests/data/test-abicompat/test7-fn-changed-app.c: Adjust.
	* tests/data/test-abicompat/test7-fn-changed-libapp-v0.c:
	Likewise.
	* tests/data/test-abicompat/test7-fn-changed-libapp-v1.c: Likewise

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-14 16:27:07 +01:00
Dodji Seketeli
99bc4aa6b4 Factorize elf-reader::{variable,function}_symbol_is_exported into symtab
Move the code of elf-reader::{variable,function}_symbol_is_exported into
symtab::{variable,function}_symbol_is_exported (where it belongs) and
make the former use the later.

	* src/abg-elf-reader.cc (reader::function_symbol_is_exported): Use
	the new symtab::function_symbol_is_exported.
	(reader::variable_symbol_is_exported): Use the new
	symtab::variable_symbol_is_exported.
	* src/abg-symtab-reader.cc
	(symtab::{function,variable}_symbol_is_exported): Factorize
	elf::reader::{function,variable}_symbol_is_exported into this.
	* src/abg-symtab-reader.h
	(symtab::{function,variable}_symbol_is_exported): Declare new
	member functions.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-14 16:27:00 +01:00
Dodji Seketeli
610d87c29b Represent undefined corpus interfaces to analyze app compatibility
In the text below, the term interface means the "declaration of either
a function or a global variable".

To analyze the compatibility between an application and a dependent
library, one has essentially to analyze the interfaces of the
application that have undefined symbols (aka undefined interfaces from
the application) and see how they relate to the same interfaces coming
from the library but with symbols that are defined and exported from
the library (aka defined/exported interfaces from the library).

An interface that is undefined in the application and defined in the
library is an interface that the application consumes from the
library.

In other words an undefined interface from an application is an
interface that the application expects and an interface that is
exported by a library is an interface that the library provides.

If comparing the expected interface against the provided interface
yields a meaningful difference, then that might mean there is an
incompatibility between the application and the library on that
interface.

This patch uses this scheme to re-implement the weak mode of ABI
compatibility between an application and a library.

The patch adds the concept of undefined functions and variables to the
ABI corpus.  Then it teaches the DWARF reader how to construct the IR
for these undefined interfaces.  Then it revisits the weak mode of
operation of abicompat to make it compare the interfaces expected from
the application against the corresponding interfaces provided by
library.  The patch also teaches the weak mode abicompat how to detect
incompatibilities between the interfaces that plugin expects and the
interfaces provided by the application.

This patch makes the CTF front-end construct undefined interfaces.  A
subsequent patch is needed to construct undefined interfaces from the
BTF front-end however.

	* include/abg-corpus.h (corpus::{lookup_variable,
	get_undefined_functions, get_undefined_variables}): Declare new
	member functions.
	(corpus::exported_decls_builder::maybe_add_{fn,var}_to_exported_fns):
	Make this return a boolean.
	* include/abg-fe-iface.h (fe_iface::options_type): Add a new
	load_undefined_interfaces enumerator.
	(fe_iface::add_fn_to_exported_or_undefined_decls): Rename
	maybe_add_fn_to_exported_decls into this.
	(fe_iface::add_var_to_exported_or_undefined_decls): Rename
	maybe_add_var_to_exported_decls into this.
	* src/abg-btf-reader.cc (reader::build_ir_node_from_btf_type):
	Adjust call to maybe_add_fn_to_exported_decls as
	add_fn_to_exported_or_undefined_decls.  Similarly, adjust call to
	maybe_add_var_to_exported_decls as
	add_var_to_exported_or_undefined_decls.
	* src/abg-corpus-priv.h (corpus::priv::undefined_{fns,vars}): Add
	new member variables.
	* src/abg-corpus.cc
	(corpus::exported_decls_builder::maybe_add_{fn,var}_to_exported_fns):
	Return a bool iff the decl was added to the set of exported decls.
	(corpus::{lookup_variable, get_undefined_functions,
	get_undefined_variables}): Define new member functions.
	(corpus::sort_{functions,variables}): Sort the undefined decls
	too.
	* (corpus::lookup_{function,variable}_symbol): Lookup the symbol
	also among undefined symbols, not just among defined symbols.
	* src/abg-ctf-reader.cc (reader::process_ctf_archive): Adjust call
	to maybe_add_fn_to_exported_decls as
	add_fn_to_exported_or_undefined_decls.  Similarly, adjust call to
	maybe_add_var_to_exported_decls as
	add_var_to_exported_or_undefined_decls. Also, sort functions &
	variables in the corpus.
	* src/abg-dwarf-reader.cc (die_name_and_linkage_name): Define new
	static function.
	(reader::fixup_functions_with_no_symbols): Adjust call to
	maybe_add_fn_to_exported_decls as
	add_fn_to_exported_or_undefined_decls.
	(reader::{is_decl_die_with_undefined_symbol,
	load_undefined_interfaces}): Define new member functions.
	(build_translation_unit_and_add_to_ir): Analyze DIEs of interfaces
	that have undefined symbols if we were asked to load undefined
	interfaces.
	(variable_is_suppressed): Add a boolean parameter to tell if the
	var is decl-only.  Use that decl-only flag to determine if the
	variable is suppressed.  A non-member decl-only variable won't be
	suppressed if we were asked to load undefined interfaces.
	(build_or_get_var_decl_if_not_suppressed): Add a boolean parameter
	to tell if the var is decl-only.
	(potential_member_fn_should_be_dropped): A potential non-virtual
	member function with no symbol is now dropped on the floor
	regardless of it has a mangled name or not.
	(build_var_decl): If the var has an undefined symbol, then set
	that symbol.
	(build_function_decl): If the function has an undefined symbol,
	then set that symbol.
	(build_ir_node_from_die): Add a var or function with undefined
	symbol to the set of undefined vars or functions of the current
	corpus.
	* src/abg-fe-iface.cc
	(fe_iface::add_fn_to_exported_or_undefined_decls): Renamed
	fe_iface::maybe_add_fn_to_exported_decls into this.  If the
	function has an undefined symbol then add the function to the set
	of undefined functions.
	(fe_iface::add_var_to_exported_or_undefined_decls): Renamed
	fe_iface::maybe_add_var_to_exported_decls into this.  If the
	variable has an undefined symbol then add the variable to the set
	of undefined variables.
	* src/abg-ir.cc (elf_symbol::is_variable): Undefined symbol with
	type STT_NOTYPE are actually for undefined variables.
	(maybe_adjust_canonical_type): It's here, after type
	canonicalization that a member function is added to either the set
	of defined & exported functions, or to the set of functions with
	undefined symbols.
	* src/abg-reader.cc (build_function_decl, build_class_decl)
	(build_union_decl, handle_var_decl): Adjust.
	* src/abg-symtab-reader.cc
	(symtab::{lookup_undefined_function_symbol,
	lookup_undefined_variable_symbol, function_symbol_is_undefined,
	variable_symbol_is_undefined,
	collect_undefined_fns_and_vars_linkage_names}): Define new member
	functions.
	(symtab::symtab): Initialize the new
	cached_undefined_symbol_names_ data member.
	* src/abg-symtab-reader.h
	(symtab::{lookup_undefined_function_symbol,
	lookup_undefined_variable_symbol, function_symbol_is_undefined,
	variable_symbol_is_undefined,
	collect_undefined_fns_and_vars_linkage_names}): Declare new member
	functions.
	(symtab::{undefined_variable_linkage_names_,
	cached_undefined_symbol_names_}): Define new data members.
	(symtab::load_): Consider undefined symbol of type STT_NOTYPE as
	being undefined global variables.  It's what I am seeing in ELF
	binaries.
	* src/abg-symtab-reader.h
	(symtab::{lookup_undefined_function_symbol,
	lookup_undefined_variable_symbol, function_symbol_is_undefined,
	variable_symbol_is_undefined}): Declare new member functions.
	(symtab::{undefined_function_linkage_names_,
	undefined_variable_linkage_names_}): Define new member variables.
	* src/abg-writer.cc (write_var_decl, write_function_decl): Emit a
	reference to a symbol only when the symbol is defined.
	* tools/abicompat.cc (report_function_changes)
	(report_variable_changes)
	(compare_expected_against_provided_functions)
	(compare_expected_against_provided_variables): Define new static
	functions.
	(perform_compat_check_in_weak_mode): Use the new static functions
	above. Compare interfaces expected by the application corpus
	against interfaces provided by the library.  Report the changes.
	Do that in the reverse direction as well.
	(read_corpus): Instruct the corpus reader to load the set of
	undefined interfaces too.
	* tests/data/test-abicompat/test6-var-changed-app: Remove file.
	* tests/data/test-abicompat/test6-var-changed-app.cc: Likewise.
	* tests/data/test-abicompat/libtest6-undefined-var.so: Add new
	binary input file.
	* tests/data/test-abicompat/test6-undefined-var.cc: Add sourcefile
	for the binary input file above.
	* tests/data/test-abicompat/test6-var-changed-report-2.txt: New
	reference output file.
	* tests/data/Makefile.am: Update the list of distributed files
	accordingly.
	* tests/data/test-abicompat/libtest5-fn-changed-libapp-v0.so:
	Adjust.
	* tests/data/test-abicompat/libtest5-fn-changed-libapp-v1.so:
	Likewise.
	* tests/data/test-abicompat/libtest6-var-changed-libapp-v0.so:
	Likewise.
	* tests/data/test-abicompat/libtest6-var-changed-libapp-v1.so:
	Likewise.
	* tests/data/test-abicompat/libtest7-fn-changed-libapp-v0.so:
	Likewise.
	* tests/data/test-abicompat/libtest7-fn-changed-libapp-v1.so:
	Likewise.
	* tests/data/test-abicompat/libtest8-fn-changed-libapp-v0.so:
	Likewise.
	* tests/data/test-abicompat/libtest8-fn-changed-libapp-v1.so:
	Likewise.
	* tests/data/test-abicompat/libtest9-fn-changed-v0.so: Likewise.
	* tests/data/test-abicompat/libtest9-fn-changed-v1.so: Likewise.
	* tests/data/test-abicompat/test5-fn-changed-app: Likewise.
	* tests/data/test-abicompat/test6-var-changed-libapp-v0.cc:
	Likewise.
	* tests/data/test-abicompat/test6-var-changed-libapp-v1.cc:
	Likewise.
	* tests/data/test-abicompat/test6-var-changed-report-0.txt:
	Likewise.
	* tests/data/test-abicompat/test6-var-changed-report-1.txt:
	Likewise.
	* tests/data/test-abicompat/test7-fn-changed-app: Likewise.
	* tests/data/test-abicompat/test7-fn-changed-report-1.txt:
	Likewise.
	* tests/data/test-abicompat/test7-fn-changed-report-2.txt:
	Likewise.
	* tests/data/test-abicompat/test8-fn-changed-app: Likewise.
	* tests/data/test-abicompat/test8-fn-changed-libapp-v1.c:
	Likewise.
	* tests/data/test-abicompat/test9-fn-changed-app: Likewise.
	* tests/data/test-abicompat/test9-fn-changed-app.cc: Likewise.
	* tests/data/test-annotate/libtest23.so.abi: Likewise.
	* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Likewise.
	* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
	* tests/data/test-annotate/test1.abi: Likewise.
	* tests/data/test-annotate/test14-pr18893.so.ab: Likewise.i
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-annotate/test2.so.abi: Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
	* tests/data/test-annotate/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-diff-pkg/dbus-glib-0.104-3.fc23.x86_64--dbus-glib-0.104-3.fc23.armv7hl-report-0.txt:
	Likewise.
	* tests/data/test-diff-pkg/libICE-1.0.6-1.el6.x86_64.rpm--libICE-1.0.9-2.el7.x86_64.rpm-report-0.txt:
	Likewise.
	* tests/data/test-fedabipkgdiff/test0-from-fc20-to-fc23-dbus-glib-report-0.txt:
	Likewise.
	* tests/data/test-fedabipkgdiff/test2-dbus-glib-0.100.2-2.fc20--dbus-glib-0.106-1.fc23-report-0.txt:
	Likewise.
	* tests/data/test-fedabipkgdiff/test3-dbus-glib-0.100.2-2.fc20.i686--dbus-glib-0.106-1.fc23.i686-report-0.txt:
	Likewise.
	* tests/data/test-fedabipkgdiff/vte291-0.39.1-1.fc22.x86_64--vte291-0.39.90-1.fc22.x86_64-report-0.txt:
	Likewise.
	* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
	* tests/data/test-read-dwarf/PR26261/PR26261-exe.abi: Likewise.
	* tests/data/test-read-dwarf/libtest23.so.abi: Likewise.
	* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi: Likewise.
	* tests/data/test-read-dwarf/test-libaaudio.so.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
	* tests/data/test-read-dwarf/test1.abi: Likewise.
	* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
	* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
	* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
	* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
	* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test2.so.abi: Likewise.
	* tests/data/test-read-dwarf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi:
	Likewise.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
	* tests/test-abicompat.cc (in_out_specs): Adjust.
	* tests/test-read-ctf.cc (test_task_ctf::perform): Do not load
	undefined interfaces, by default.
	* tests/test-symtab.cc (Symtab::SimpleSymtabs)
	(Symtab::SymtabWithWhitelist, Symtab::AliasedFunctionSymbols):
	Adjust the expected undefined variable symbols counts.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-14 16:26:54 +01:00
Dodji Seketeli
290f5a94fa tools-utils.cc: Fix potential crash when testing for CTF debug info
When looking at something else, I stumbled upon a crash when testing
for the presence of CTF debug info.

	* src/abg-tools-utils.cc (file_has_ctf_debug_info): Do not crash
	on empty debug info paths.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-14 16:01:09 +01:00
Dodji Seketeli
11f37bf6b1 abidw: Add a -o short option for --out-file
* doc/manuals/abidw.rst: Document the -o option.
	* tools/abidw.cc (display_usage): Update doc string for the
	--out-file|-o option.
	(parse_command): Support the -o short option.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-08 15:38:01 +01:00
Dodji Seketeli
c68bcc6dbf dwarf-reader: Support creating functions from DW_TAG_inlined_subroutine
Update the assert in build_function_decl to work on
DW_TAG_inlined_subroutine DIEs.

	* src/abg-dwarf-reader.cc (build_function_decl): Loosen the assert
	to accept DW_TAG_inlined_subroutine DIEs.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-08 15:38:01 +01:00
Dodji Seketeli
908f56e1b5 ir,dwarf-reader: Peel const-qualifier from const this pointers
In DWARF, it appears that the this pointer of a concrete instance of
method is sometimes represented as a const pointer, whereas the this
pointer of the abstract instance (or interface) of that same method
has the this pointer represented as a non-const pointer.  That
difference often causes some spurious const-ness change reports on the
this pointer when doing comparisons.

This patch thus trims of the const-qualifier off of the this pointer
of methods.

	* include/abg-fwd.h (is_const_qualified_type)
	(peel_const_qualified_type): Declare ...
	* src/abg-ir.cc (is_const_qualified_type)
	(peel_const_qualified_type): ... new functions.
	* src/abg-dwarf-reader.cc (build_function_type): Trim the const
	qualifier off of the this pointer representation if present.
	* tests/data/test-annotate/test1.abi: Adjust.
	* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-annotate/test2.so.abi: Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test6.so.abi: Likewise.
	* tests/data/test-annotate/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
	Likewise.
	* tests/data/test-diff-dwarf/test0-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test28-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test29-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test30-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test31-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test36-ppc64-aliases-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test5-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test8-report.txt: Likewise.
	* tests/data/test-diff-filter/test0-report.txt: Likewise.
	* tests/data/test-diff-filter/test01-report.txt: Likewise.
	* tests/data/test-diff-filter/test10-report.txt: Likewise.
	* tests/data/test-diff-filter/test13-report.txt: Likewise.
	* tests/data/test-diff-filter/test2-report.txt: Likewise.
	* tests/data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt:
	Likewise.
	* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test41-report-0.txt: Likewise.
	* tests/data/test-diff-filter/test9-report.txt: Likewise.
	* 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:
	Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
	Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-10.txt: Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-12.txt: Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-14.txt: Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-16.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-4.txt: Likewise.
	* tests/data/test-diff-suppr/test31-report-1.txt: Likewise.
	* tests/data/test-read-dwarf/test1.abi: Likewise.
	* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
	* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
	* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
	* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
	* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test2.so.abi: Likewise.
	* tests/data/test-read-dwarf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test6.so.abi: Likewise.
	* tests/data/test-read-dwarf/test6.so.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-06 14:02:55 +01:00
Dodji Seketeli
06fa2fd968 comparison: Better sort function difference report
Looking at the result of builds on various platforms, it appears that
the order of the method change reports in the
test29-vtable-changes-report-0.txt of runtestdiffdwarf was not stable
across all platforms. debian-armhf was exhibiting this change in
output, for instance:

    --- /var/lib/buildbot/workers/wildebeest/libabigail-try-debian-armhf/build/tests/data/test-diff-dwarf/test29-vtable-changes-report-0.txt
	2024-03-04 08:56:42.307366590 +0000
    +++ /var/lib/buildbot/workers/wildebeest/libabigail-try-debian-armhf/build/tests/output/test-diff-dwarf/test29-vtable-changes-report-0.txt
	2024-03-04 09:20:22.146334907 +0000
    @@ -19,13 +19,13 @@
		 implicit parameter 0 of type 'S* const' has sub-type
	changes:
		   in unqualified underlying type 'S*':
		     pointed to type 'struct S' changed, as being reported
    +          'method virtual S::~S(int)' has some sub-type changes:
    +            implicit parameter 0 of type 'S*' has sub-type changes:
    +              pointed to type 'struct S' changed, as being reported
	       'method virtual S::~S()' has some sub-type changes:
		 implicit parameter 0 of type 'S* const' has sub-type
	changes:
		   in unqualified underlying type 'S*':
		     pointed to type 'struct S' changed, as being reported
    -          'method virtual S::~S(int)' has some sub-type changes:
    -            implicit parameter 0 of type 'S*' has sub-type changes:
    -              pointed to type 'struct S' changed, as being reported
	       'method virtual void S::fn0()' has some sub-type changes:
		 implicit parameter 0 of type 'S*' has sub-type changes:
		   pointed to type 'struct S' changed, as being reported

Better handling the sorting of function changes should hopefully fix
this issue.

	* src/abg-comparison-priv.h (is_less_than): Declare new helper
	function.
	(function_decl_diff_comp::operator(const function_decl_diff&,
	                                   const function_decl_diff&)):
	Use it here.
	(virtual_member_function_diff_comp::operator(const function_decl_diff&,
	                                             const function_decl_diff&)):
	Likewise.
	* tests/data/test-abidiff/test-PR18791-report0.txt: Adjust.
	* tests/data/test-diff-dwarf/test29-vtable-changes-report-0.txt:
	Adjust.
	* tests/data/test-diff-dwarf/test30-vtable-changes-report-0.txt:
	Adjust.
	* tests/data/test-diff-dwarf/test31-vtable-changes-report-0.txt:
	Adjust.
	* tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-04 13:34:24 +01:00
Dodji Seketeli
dd34ee8687 ir,dwarf-reader: Better handle inline-ness setting or detection
The DWARF reader mistakenly considers that if the value of
DW_AT_inline attribute is set to DW_INL_declared_inlined, that means
the function we are looking at was declared inline.  Rather, that
means the function was declared inlined *and* was inlined by the
compiler.  To have a better coverage of functions that were declared
inline, we need to consider functions which DW_AT_inline attribute is
set to DW_INL_declared_inlined or DW_INL_declared_not_inlined.  This
patches fixes that.

I noticed that we were missing concrete instances of inlined functions
as we were taking into account DW_TAG_inlined_subroutine DIEs.  This
patch fixes that.

I noticed that finish_member_function_reading (which is called for
virtual member functions that don't have associated an associated elf
symbol in the current translation unit) wasn't taking into account the
inline declaration of virtual member functions.  This patch fixes that.

Last but not least, this patch stops considering the change of
inline-ness declaration of functions as being an ABI change.  Whenever
that inline-ness declaration change happens alongside a meaningful ABI
change, libabigail will report it, but that alone is not an ABI
change.

All in all, these change fix the fall-out (caught by the CI) from the
previous patch:
	3ccfe465 dwarf-reader: Fix DIE origin handling & scope getting

	* include/abg-ir.h (function_decl::is_declared_inline): Add a
	setter overload.
	* src/abg-dwarf-reader.cc (die_is_declared_inline): Take into the
	account values DW_INL_declared_inlined and
	DW_INL_declared_not_inlined of DW_AT_inline attribute.  Not just
	DW_INL_declared_inlined.
	(finish_member_function_reading): Set the inline-ness declaration
	here.
	(build_ir_node_from_die): Handle DW_TAG_inlined_subroutine just as
	DW_TAG_subprogram.
	* src/abg-ir.cc (function_decl::is_declared_inline): Add a setter
	overload.
	* tests/data/test-annotate/test1.abi: Adjust.
	* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt:
	Likewise.
	* tests/data/test-diff-filter/test41-report-0.txt: Likewise.
	* tests/data/test-read-dwarf/test1.abi: Likewise.
	* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
	* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
	* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
	* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
	* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-04 09:49:02 +01:00
Dodji Seketeli
fabfb912d5 tests/data/test-diff-pkg: Update dpkg related reference output
The previous patch needed the update of a lot of reference tests.  I
didn't have dpkg installed on my development box so I missed updating
dpkg-related reference output.

	* 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:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-02 16:30:23 +01:00
Dodji Seketeli
3ccfe46541 dwarf-reader: Fix DIE origin handling & scope getting
While looking at something else, I noticed that a number of times the
code to create the IR for function-decl was adding the function to the
wrong scope, especially for DIEs that had a chain of
DW_AT_abstract_origin *and* DW_AT_specification attributes.

Suppose we are looking at a DIE D that has a DW_AT_abstract_origin
attribute pointing to a DIE D'.  D' itself has a DW_AT_specification
that points to D''.  The scope of the function should be represented
by the scope DIE of D'', not the scope DIE of D'.  Unfortunately
build_ir_node_from_die was sometimes using the scope of D'.

This patch fixes that by introducing a new die_origin_die function
that returns the ultimate origin of a DIE.  In the case above, the
ultimate origin of D is D''.  die_origin_die is thus used by
get_scope_die and get_scope_for_die to get the correct scope of a DIE.
The code of build_ir_node_from_die that handles DW_TAG_subprogram DIEs
is thus simplified as get_scope_for_die now does the heavy lifting of
handling DW_AT_abstract_origin and DW_AT_specification.

The result is a simpler and easier to maintain build_ir_node_from_die
and hopefully a more correct one.  A lot of the ABIXML and the type
denomination in change reports of the test suite have been updated to
reflect the more accurate representation.

	* src/abg-dwarf-reader.cc (die_origin_die): New static function.
	(get_scope_die, get_scope_for_die): Use the new die_origin_die
	above.
	(build_ir_node_from_die): Don't handle DW_AT_abstract_origin and
	DW_AT_specification here.  In general, do not handle getting the
	scope.  Rather, just rely on get_scope_for_die.
	* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Adjust.
	* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
	* tests/data/test-annotate/test1.abi: Likewise.
	* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-annotate/test2.so.abi: Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test6.so.abi: Likewise.
	* tests/data/test-annotate/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
	Likewise.
	* tests/data/test-diff-dwarf/test0-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test28-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test29-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test30-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test31-vtable-changes-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test36-ppc64-aliases-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt:
	Likewise.
	* tests/data/test-diff-dwarf/test5-report.txt: Likewise.
	* tests/data/test-diff-dwarf/test8-report.txt: Likewise.
	* tests/data/test-diff-filter/test0-report.txt: Likewise.
	* tests/data/test-diff-filter/test01-report.txt: Likewise.
	* tests/data/test-diff-filter/test10-report.txt: Likewise.
	* tests/data/test-diff-filter/test13-report.txt: Likewise.
	* tests/data/test-diff-filter/test2-report.txt: Likewise.
	* tests/data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
	Likewise.
	* tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt:
	Likewise.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt:
	Likewise.
	* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test41-report-0.txt: Likewise.
	* tests/data/test-diff-filter/test9-report.txt: Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
	Likewise.
	* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-1.txt: Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-10.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-12.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-14.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-16.txt:
	Likewise.
	* tests/data/test-diff-suppr/test24-soname-report-4.txt: Likewise.
	* tests/data/test-diff-suppr/test31-report-1.txt: Likewise.
	* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
	* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi: Likewise.
	* tests/data/test-read-dwarf/test-libaaudio.so.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
	* tests/data/test-read-dwarf/test1.abi: Likewise.
	* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
	* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
	* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
	* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
	* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test2.so.abi: Likewise.
	* tests/data/test-read-dwarf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test6.so.abi: Likewise.
	* tests/data/test-read-dwarf/test6.so.hash.abi: Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi:
	Likewise.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:22:49 +01:00
Dodji Seketeli
202820ea7a dwarf-reader, ir: Add member fns to exported corpus fns after c14n
There are cases where a member function C::f has a defined & exported
ELF symbol in a translation unit TU-2, whereas it has no associated
symbol in another translation unit TU-1.

The class C from TU-1 and the class C from TU-2 have the same
canonical type because they are equivalent.  Now, suppose it's C from
TU-2 that is the canonical type; that means the canonical type of C
from TU-1 is C from TU-2.

Today, the only types that are emitted in an ABIXML file are canonical
types.  So if we want the C::f which has a publicly defined & exported
elf symbol to be emitted in the ABIXML file, then the C::f that is
defined & exported in the ABI corpus should be the C::f from the
canonical class type C i.e, the C::f from TU-2.

In other words, the exported C::f should be the member function of the
canonical type class C.

That means that determining which C::f to export in the ABI corpus
should be done *after* type canonicalization.

Today however, determining which C::f to export is done during the
construction of the IR, in the DWARF reader.  That leads to
cases where the exported C::f is the one that has no defined &
exported ELF symbol.  As virtual member functions (in particular) are
involved in class type comparison, that could lead to spurious type
changes left and right.  Oops.

This patch implements the export of member functions after type
canonicalization in the DWARF reader.  Note that CTF and BTF readers
are not impacted as they only support the C language which doesn't
have member functions.

	* src/abg-dwarf-reader.cc
	(reader::fixup_functions_with_no_symbols): Do not export the
	virtual member function here.
	(build_ir_node_from_die): For DW_TAG_subprogram DIEs, likewise.
	* src/abg-ir.cc (maybe_adjust_canonical_type): Walk the member
	functions of the canonical type and export them in the ABI corpus
	if they have a defined and exported elf symbol.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:20:22 +01:00
Dodji Seketeli
bdce453d8c ir: Use linkage name to sort virtual function members
There is some instability in the abixml output whenever two virtual
member functions have the same vtable offset and different mangling
name.  This patch takes the mangling into account.

	* src/abg-ir.cc (virtual_member_function_less_than::operator()):
	Take the linkage name into account during sorting before taking
	into account the presence of elf symbols.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Adjust.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:20:07 +01:00
Dodji Seketeli
f17027fc74 abicompat: Port this to the multi-front-end architecture
I forgot to port abicompat to the multi-front-end architecture that
was put in place a while ago.  Namely, all the other tools now use
abigail::tools_utils::create_best_elf_based_reader to create the best
elf-based reader depending on if they are given DWARF, BTF or CTF
debug information.

This patch make abicompat use
abigail::tools_utils::create_best_elf_based_reader too.

	* tools/abicompat.cc (read_corpus): Use
	abigail::tools_utils::create_best_elf_based_reader to create the
	right reader depending on the debug information at hand.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:19:41 +01:00
Dodji Seketeli
4b39942467 ir,corpus,comparison: Const-iffy the access to corpus interfaces
In preparation to subsequent patches that perform manipulations of the
corpus interfaces, it appears that we need to add const access to
those corpus interfaces.

	* include/abg-comparison.h (typedef string_function_ptr_map): Make
	this typedef use a const function_decl*, not just a
	function_decl*.
	(typedef string_var_ptr_map): Make this typedef use a const
	var_decl*, not just a var_decl*.
	* include/abg-corpus.h (typedef corpus::functions): Make this
	typedef be a vector<const function_decl*>, not just a
	vector<function_decl*>.
	(corpus::exported_decls_builder::fn_id_maps_to_several_fns):
	Adjust declaration to const function_decl*.
	* include/abg-fwd.h (typedef istring_var_decl_ptr_map_type)
	(typedef istring_function_decl_ptr_map_type): Move these typedefs to
	abg-ir.h.
	(get_function_id_or_pretty_representation): Use const function_decl*.
	* include/abg-ir.h (typedef istring_var_decl_ptr_map_type)
	(typedef istring_function_decl_ptr_map_type): Move these here from
	abg-fwd.h.  Also make these use const var_decl* and const.
	function_decl.
	* src/abg-comparison-priv.h (sort_string_function_ptr_map)
	(sort_string_var_ptr_map): Use vector<const function_decl*> and
	vector<const var_decl*> rather than their non-const variants.
	* src/abg-comparison.cc (sort_string_function_ptr_map)
	(sort_string_var_ptr_map): Likewise.
	(corpus_diff::priv::{ensure_lookup_tables_populated,
	apply_supprs_to_added_removed_fns_vars_unreachable_types}):
	Adjust.
	* src/abg-corpus-priv.h (corpus::priv::{fns,vars}): Make these
	data members use vector<const function_decl*> and vector<const
	var_decl*> types.
	* src/abg-corpus.cc
	(corpus::exported_decls_builder::fn_id_maps_to_several_fns)
	(corpus::maybe_drop_some_exported_decls): Adjust.
	(corpus_group::priv::{fns,vars}): Make these data members use
	vector<const function_decl*> and vector<const var_decl*> types.
	* src/abg-default-reporter.cc (default_reporter::report): In the
	overload for const corpus_diff&, adjust.
	* src/abg-ir.cc (get_function_id_or_pretty_representation):
	Adjust.
	* src/abg-leaf-reporter.cc (leaf_reporter::report): In the
	overload for const corpus_diff&, adjust.
	* tools/abicompat.cc (perform_compat_check_in_normal_mode):
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:19:05 +01:00
Dodji Seketeli
d533d15afa ir: Fix indentation
* src/abg-ir.cc (function_decl::clone): Fix indentation.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:18:57 +01:00
Dodji Seketeli
c77b68a801 test-abicomat.cc: Don't show details about PASSing tests.
While looking at something else, I noticed that this test was emitting
details about the tests that PASS, cluttering the output a lot.  Fixed
thus.

	* tests/test-abicompat.cc (main): Don,'t emit details for PASSed
	tests.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:18:34 +01:00
Dodji Seketeli
79b5391a51 test-alt-dwarf-file.cc: Fix test result accounting
The first test to fail was causing all subsequent tests to appear as
failing as well.  Fixed thus.

	* tests/test-alt-dwarf-file.cc (main): Re-set the is_ok variable
	to true in the loop.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-03-01 14:18:18 +01:00
Dodji Seketeli
6432acb1d9 ir,{btf,ctf,dwarf}-reader: Rename {subrange_type,array_type_def}::is_infinite.
Rename subrange_type::is_infinite into subrange_type::is_non_finite
for better legibility.

	* include/abg-ir.h
	({array_type_def,subrange_type}::is_non_finite): Rename
	{array_type_def,subrange_type}::is_infinite into this.
	* src/abg-btf-reader.cc (reader::build_array_type): Add a missing
	call to subrange_type::is_non_finite.
	* src/abg-comp-filter.cc
	(is_var_1_dim_unknown_size_array_change):Rename
	subrange_type::is_infinite into subrange_type::is_non_finite.
	* src/abg-ctf-reader.cc (build_array_ctf_range): Likewise.
	* src/abg-dwarf-reader.cc (build_subrange_type): Likewise.
	* src/abg-ir.cc (clone_array, has_flexible_array_data_member)
	(array_type_def::subrange_type::as_string): Likewise.
	({array_type_def,subrange_type}::is_non_finite): Rename
	{array_type_def,subrange_type}::is_infinite into this.
	* src/abg-reader.cc (build_subrange_type): Rename
	subrange_type::is_infinite into subrange_type::is_non_finite.
	* src/abg-reporter-priv.cc (report_size_and_alignment_changes):
	Likewise.
	* src/abg-writer.cc (write_array_size_and_alignment): Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-16 16:00:14 +01:00
Dodji Seketeli
88a6e27348 btr-reader: Fix wording typo
* src/abg-btf-reader.cc (reader::build_array_type): It's
	lower_bound, not lower_boud.  Duh.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-15 18:00:39 +01:00
Dodji Seketeli
3ef420673b PR25409-librte_bus_dpaa.so.20.0.abi: Update to 2.3
The PR25409-librte_bus_dpaa.so.20.0.abi test input file was modified
at least because of the patch to fix zero-length arrays IR for
https://sourceware.org/bugzilla/show_bug.cgi?id=31377.

That modification came after the introduction of the pointer-to-member
type feature, which bumped the ABIXML version to 2.3.  So,
PR25409-librte_bus_dpaa.so.20.0.abi should see its ABIXML version
change to 2.3 too.  This patch makes that adjustment.

The reason why the patch to fix zero-length arrays IR hasn't bumped
the ABIXML version to 2.3 has to do with easing the potential
back-porting into the libabigail-2.4-branch.

	* tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
	Bump ABIXML version to 2.3.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-15 17:48:49 +01:00
Dodji Seketeli
3cc1c3423c dwarf-reader: Bug 31377 - Fix the IR for zero length arrays
Before C99, the zero-length array GCC extension described at
https://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Zero-Length.html would be
represented in DWARF by a DW_TAG_subrange_type DIE with a DW_AT_count
attribute set to zero.

Since the C99 standard, standardized flexible arrays are now the way
to go.  They are represented in DWARF by a DW_TAG_subrange_type that
has no DW_AT_lower_bound, no DW_AT_upper_bound and no DW_AT_count
attribute.

Both zero-length and flexible arrays represent in essence the same
thing.  So they should be represented by the same libabigail IR.
Instead, the libabigail IR represents them slightly differently.  The
former has the upper_bound of the subrange set to -1 while the latter
has it set to zero.  Both have the 'is_infinite' property set to true,
meaning that the subrange has an unknown (flexible) number of
elements.

Because the upper_bound of the two sub-ranges are different, the
equals overload for array_type_def::subrange_type returns false,
(wrongly) indicating that the two sub-ranges are different.

In practice, that leads to abidiff emitting spurious changes between
the two types below which should normally represent the same thing:

    int foo[0]; // gcc zero-length extension
    int foo[]; // c99 flexible array

This patch makes the DWARF reader set the upper_bound of the sub-range
type to zero for zero-length arrays, just like what is done for
flexible arrays.  The "is-infinite" property of the sub-range type is
set to true to flag the type as being for a flexible array.

This fixes the issue described above.

	* src/abg-dwarf-reader.cc (build_subrange_type): In the absence of
	DW_AT_upper_bound and DW_AT_lower_bound, make DW_AT_count being
	zero the same as if no DW_AT_count is present.
	* src/abg-reader.cc (build_subrange_type): Add a comment about how
	things were in the past (before this patch) and document the fact
	that we want to stay compatible with ABIXML from before this
	patch.
	* tests/data/test-abidiff-exit/PR31377/flex/include/rte_pipeline.h:
	New header file input for this test.
	* tests/data/test-abidiff-exit/PR31377/flex/lib64/librte_pipeline.so.24.1:
	New binary input for this test.
	* tests/data/test-abidiff-exit/PR31377/reference/include/rte_pipeline.h:
	New header file input for this test.
	* tests/data/test-abidiff-exit/PR31377/reference/lib64/librte_pipeline.so.24.0:
	New binary input for this test.
	* tests/data/test-abidiff-exit/PR31377/test-PR31377-report-1.txt:
	New reference test output.
	* tests/data/Makefile.am: Add the
	* tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
	Adjust.
	* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
	* tests/test-abidiff-exit.cc

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-15 17:29:23 +01:00
Dodji Seketeli
3f2afc7a71 dwarf-reader,corpus: Use interned string to lookup corpus interfaces by ID.
This patch speeds up the lookup of a function or variable using the
function/variable ID.  This patch is in preparation of many more
function lookup made during ABIXML emitting by patches coming up in
the future.

	* include/abg-corpus.h (corpus::lookup_functions): Take an
	interned_string instead of an std::string.  Add an overload for
	const char* string too, for debugging purposes.
	* src/abg-corpus-priv.h (istr_fn_ptr_set_map_type)
	(istr_var_ptr_map_type): Define new typedefs.
	(corpus::exported_decls_builder::priv::{id_fns_map_,
	id_var_map_}): Use the new istr_fn_ptr_set_map_type and
	istr_var_ptr_map_type types for these data members.
	(corpus::exported_decls_builder::priv::{id_fns_map, id_var_map,
	add_fn_to_id_fns_map, var_id_is_in_id_var_map, add_var_to_map,
	add_var_to_exported}): Adjust.
	(corpus::priv::lookup_functions): Declare new member function.
	* src/abg-corpus.cc
	(corpus::exported_decls_builder::maybe_add_var_to_exported_vars): Adjust.
	(corpus::priv::lookup_functions): Define new member function.  The
	code here comes from the code that was in
	corpus::lookup_functions.  This is a factorization of
	corpus::lookup_functions.
	(corpus::lookup_functions): Take an interned_string instead of the
	previous.  Factorize the code that was here into the new
	corpus::priv::lookup_functions.
	* src/abg-dwarf-reader.cc
	(reader::symbol_already_belongs_to_a_function): Adjust the call to
	corpus::lookup_functions to use an interned_string.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:49:25 +01:00
Dodji Seketeli
3d0e01a859 ir: Cache internal name for several types
Profiling showed that computing function type names while sorting
types prior to type hashing was taking a lot of time.  Caching
function, reference, pointers and qualified type names reduces that
time a lot.

This is what this patch does, in prevision for the up coming type
hashing patch.

	* src/abg-ir.cc ({qualified_type_def, pointer_type_def,
	reference_type_def}::get_qualified_name): Cache the internal
	qualified type name for non-canonicalized types.
	(function_type::get_cached_name): Cache the internal function type
	name.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:44:03 +01:00
Dodji Seketeli
6ba168688e ir: Introduce a missing IR kind for subrange types
Array subranges were introduced to support the Ada language.  In doing
so, I forgot to define an  enum type_or_decl_kind enumerator for the
array_type_def::subrange_type IR node.  This patch fixes that.

	* include/abg-ir.h (type_or_decl_kind::SUBRANGE_TYPE): Add a new
	enumerator to enum type_or_decl_kind::type_or_decl_kind.
	* src/abg-ir.cc (array_type_def::subrange_type::subrange_type):
	Use the new type_or_decl_kind::SUBRANGE_TYPE to flag the IR node
	representing array_type_def::subrange_type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:39:36 +01:00
Dodji Seketeli
91762ba16b writer: Don't forget data members when emitting referenced types
When emitting a type referenced type in the ABIXML,
write_decl_in_scope just emits markup for the opening (and closing)
tags for the scopes up until the actual referenced type.  Then the
referenced type is emitted.

But then if the referenced type is a member type of a class A, for
instance, the other data members of that class are not emitted.  That
can cause the data members of A to be missing.  Oops.

To fix that, if a scope of the referenced type is itself a type,
write_decl_in_scope now emits the full type.

	* src/abg-writer.cc (write_decl_in_scope): If the scope of the
	decl to write is a type that was not yet emitted, then emit it in
	full.  Otherwise, just do things as we were doing previously.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:34:59 +01:00
Dodji Seketeli
d50fcf10b8 writer: Avoid emitting a canonical type twice
I noticed while looking at ABIXML files that sometimes, a (canonical)
type would be emitted twice.  This patch fixes it.  Let's hope it
doesn't impact ABIXML emitting performance too much.

	* src/abg-writer.cc (write_canonical_types_of_scope): Don't emit a
	canonical type if it's already been emitted.
	* tests/data/test-annotate/test13-pr18894.so.abi: Adjust.
	* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
	* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
	* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
	* tests/data/test-read-dwarf/test13-pr18894.so.abi: Likewise.
	* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
	* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
	* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:29:51 +01:00
Dodji Seketeli
e76438540b dwarf-reader: Fix detection of C language DIEs
If a DIE comes from C, then for that type, namespace support is
disabled.  In this case, we mistakenly look at the language of the
current translation unit DIE rather than the language of the DIE
itself.  So we mistakenly find that the DIE comes from C when it
actually can come from C++.  And we thus mistakenly disable
namespaces.

Fixed thus.

	* src/abg-dwarf-reader.cc (build_ir_node_from_die): Use
	reader::die_is_in_c rather than looking at the language of the
	current translation unit.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:22:36 +01:00
Dodji Seketeli
28c17a4239 dwarf-reader: Avoid duplicating union members
The DWARF from some C++ binaries represents unions in a "piece wise"
fashion.  When dealing with those unions, we need to avoid adding the
same member twice, just like what we do for classes.

	* src/abg-dwarf-reader.cc (add_or_update_union_type): Do not add
	an union member that already exists in the union.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:11:57 +01:00
Dodji Seketeli
a13e387f23 ir: Avoid duplicates when reading member functions
As the same class can be read several times, let's avoid having
duplicates of a given virtual member function.

	* src/abg-ir.cc (fixup_virtual_member_function): Check if a
	virtual member function with the same linkage name exists already
	before adding it in.
	* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Adjust.
	* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Adjust.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Adjust.
	* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Adjust.
	* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
	Adjust.
	* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
	Adjust.
	* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
	Adjust.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:07:28 +01:00
Dodji Seketeli
7e913a08b6 ir: Fix wording of several comments
* src/abg-ir.cc: (get_decl_name_for_comparison)
	(class_or_union::add_data_member) Fix comment wording.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:06:05 +01:00
Dodji Seketeli
537bb3f1a3 abidw: Fix indentation
* tools/abidw.cc (load_corpus_and_write_abixml): Fix indentation.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-02-12 17:03:49 +01:00