Commit Graph

2740 Commits

Author SHA1 Message Date
Dodji Seketeli
9d14151e15 ir: Fix a potential crash in canonicalize_types
I noticed crashes in canonicalize_types when it deals with nullptr
types.  Fixed thus.

	* src/abg-ir-priv.h (canonicalize_types): Avoid crashing when
	de-referencing an iterator to a nullptr type.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-07-16 11:04:06 +02:00
Ross Burton
076985bbe9 configure.ac: improve fts checks
The current code checks explicitly for musl and if so uses pkg-config to
find fts-standalone. This is suboptimal because musl may not be the only
libc to need a standalone fts implementation, and fts-standalone is an
old gentoo-specific name[1] so libabigail won't build on any other system
against musl.

Instead, use AC_SEARCH_LIBS to look for fts_open in libc then libfts. Do
this before the check for behaviour just in case someone has a standalone
and broken implementation.  I assume that the standalone fts is installed
on the standard search path, which should be a fair assumption.

As we're not using pkg-config anymore the required link flags are now in
LIBS, so remove all instances of FTS_CFLAGS and FTS_LIBS.

[1] https://gitweb.gentoo.org/repo/gentoo.git/commit/sys-libs/fts-standalone?id=a403fe6c61d1aaeecd58d521f3def2f6d3513449

	* configure.ac: Use AC_SEARCH_LIBS to look for fts_open in libc
	and in libfts if necessary.  Remove the use of FTS_LIBS which is
	now unnecessary.
	* src/Makefile.am: Do not use FTF_LIBS as it's now unnecessary.
	* tools/Makefile.am: Likewise.

Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-07-12 17:40:25 +02:00
Dodji Seketeli
e769a204dc btf-reader: Add missing data members reset to reader::initialize
btf::reader::initialize forgets to reset a few data members used
during binary type information loading.  This resetting is key to get
the reader ready for being re-used to load a new binary, like a kernel
module.  Otherwise, the working set just keeps growing unnecessarily.

	* src/abg-btf-reader.cc (btf::reader::initialize): Clear
	types_to_canonicalize_, btf_type_id_to_artifacts_ and cur_tu_.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 18:46:35 +02:00
Dodji Seketeli
dc11165cfb dwarf-reader: Fix reader::initialize to clear per corpus data
After cleaning up re-initialization sequence of the the CTF reader ,
Claudiu Ianculescu suggested that I look into the DWARF reader's
initialization sequence as well.  Lo and behold, the
dwarf::reader::read_debug_info_into_corpus calls
reader::clear_per_corpus_data while reader::initialize does not.

This patch moves the call to reader::clear_per_corpus_data into
reader::initialize.  It makes the code consistent with what we are now
doing in the CTF reader.

	* src/abg-dwarf-reader.cc (reader::initialize):  Call
	clear_per_corpus_data.
	(reader::read_debug_info_into_corpus): Remove the call to
	clear_per_corpus_data from here.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 18:45:22 +02:00
Dodji Seketeli
1add2fea50 ir: Cache the pretty representation used during pre-canonicalization type sorting
Profiling showed that during pre-canonicalization types sorting (which
uses type_topo_comp and decl_topo_comp sorting functors) we spend a
lot of time computing the pretty representation of types and decls
invoked from type_topo_comp::operator() and
decl_topo_comp::operator().

This patch thus uses type_base::get_cached_pretty_representation and
introduces a new similar decl_base::get_cached_pretty_representation
to cache the pretty representation of types and decls and re-use that
representation instead of computing it over and over.

Together with the previous patch of this series, the time spent to
analyze a Linux Kernel tree went from ~ 55 minutes to around 1m15s
using a non-optimized build of libabigail.

	* include/abg-ir.h (decl_base::get_cached_pretty_representation):
	Declare new member function.
	* src/abg-ir-priv.h ({type,decl}_topo_comp::operator()): Use
	{type,decl}_base::get_cached_pretty_representation instead of
	get_pretty_representation.:
	* src/abg-ir.cc (decl_base::priv::{internal_cached_repr_,
	cached_repr}): Define new data members.
	(decl_base::get_cached_pretty_representation):
	Define new member function.
	(type_base::get_cached_pretty_representation): Cache pretty
	representation even for non-canonicalized types.  Fix comments.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 18:43:53 +02:00
Dodji Seketeli
666555665c ctf-reader: Fix re-initialization of the CTF reader
When analyzing a Linux Kernel tree made of vmlinux and loadable module
binaries, the same (CTF) binary reader is re-used to load every single
binaries in a loop.  That can be seen, for instance, by reading the
code of load_vmlinux_corpus in abg-tools-utils.cc.

As part of that process, abigail::ctf::reader::initialize is invoked
prior to using the reader to read type information from each binary.

But then, looking at things a bit closer, I realized that
ctf::reader::initialize is failing to reset the reader::ctfa data
member.  That leads to a memory leak that was making things grow
out of proportion.

Also, the resetting code fails to actually clear out the map of types
that are to be sorted and canonicalized.  That leads to unnecessarily
sorting huge amounts of types.

The patch address the two points above.

Apart from the obvious gain in code integrity, this patch
significantly reduces the time taken to analyze a Linux Kernel tree.
Please note that the subsequent patch coming after this one will
reduce that time even further.

	* src/abg-ctf-reader.cc (reader::reader): Initialize ctfa,
	ctf_sect, symtab_sect and strtab_sect data members.
	(reader::initialize): In the overload taking no argument, make
	sure to free the ctfa data member before setting it to nullptr.
	In the overload that takes arguments, make sure to invoke
	reader::initialize() to really free the data used.  Also, improve
	the comments.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 18:38:35 +02:00
Claudiu Zissulescu
544bddf594 ctf-reader: Add time logging to CTF reader
Log the time spent while reading the CTF archive and canonicalizing it.

    * src/abg-ctf-reader.cc (do_log()): Getter of the do_log flag.
    (read_corpus()): Add time logging.

Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 14:29:16 +02:00
Claudiu Zissulescu
23e7c68afc ctf-reader: Optimize calling sorting function for functions and variables.
Sorting the functions and variables is done twice. First in the
process_ctf_archive() and second in read_corpus().  However, we need
to call them only once when we do the canonicalization of all types
and functions.  Thus, move canonicalization of types in read_corpus()
and perfom only once sorting the functions and types.

	* abg-ctf-reader.cc (process_ctf_archive()): Move
	canonicalize_all_types(), sort_functions() and sort_variables()...
	(read_corpus()): ...here, just after calling process_ctf_archive().

Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-21 14:28:26 +02:00
Romain Geissler
2b2fa6ff14 leaf-reporter: Fix build with gcc 4.9.
* src/abg-leaf-reporter.cc (leaf_reporter::report): In the
	overload for corpus_diff, avoid using auto type deduction in
	for-each loop.

Signed-off-by: Romain Geissler <romain.geissler@amadeus.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-06-19 11:43:49 +02:00
Dodji Seketeli
19a4ae130d btf-reader: Fix re-use of the BTF reader for several binaries in a row
When analyzing a Linux Kernel tree, the BTF reader needs to be reset
after each binary (vmlinux or module) read.  It turns out the reset
was not being done properly.  Fixed thus.  Also, I noticed that
reader::read_debug_info_into_corpus would not return an empty corpus
when no BTF information was found in the binary.  Fixed as well.

	* src/abg-btf-reader.cc (reader::initialize): Free the btf handle
	first thing as part of the re-initialization.
	(reader::~reader): Once the BTF handle has been freed, set it to
	nil to show that it's been deleted.
	(reader::read_debug_info_into_corpus): If no BTF handle could be
	retrieved then it means no BTF data was found on the binary.
	Thus, return an empty corpus.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-31 17:56:41 +02:00
Dodji Seketeli
416df074a8 abidw: make the --lt option support --btf
When building the ABI for a Linux kernel that has BTF and DWARF debug
info, the --btf option doesn't select the BTF debug info if DWARF is
also present.

Fixed thus.

	* tools/abidw.cc (load_kernel_corpus_group_and_write_abixml):
	Support --btf.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-31 17:56:41 +02:00
Dodji Seketeli
574d7a41c0 tools-utils.cc: Support collecting kernel binary paths build from sources
When 'abidw --lt /some/dir' runs with /some/dir being a linux kernel
tree built from source (as opposed to coming from a distribution),
get_binary_paths_from_kernel_dist misbehaves because it expects to
find modules somewhere under/lib/modules.  This patch makes it support
linux kernel trees built from source by looking for modules all over
the place, wherever they might be.

	* src/abg-tools-utils.cc (get_binary_paths_from_kernel_dist): Look
	for kernel modules under the root directory by default.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-31 17:56:41 +02:00
Dodji Seketeli
83e3eaf81e Bug 31793 - tools-utils: Avoid endless loop in is_regular_file for directories
When is_regular_file is given a directory, it loops endlessly.  Oops.

Fixed thus.

	* src/abg-tools-utils.cc (is_regular_file): Loop on symbolic links
	only.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-31 17:56:17 +02:00
Dodji Seketeli
c12f0fc077 {btf,dwarf,ctf,abixml}-reader: Fix size of subrange type
While looking at something else, it appeared that the process of
setting the size of the array_type_def::subrange_type is wrong for all
front-ends.

For this patch, I went back to read the DWARF 5 specification at
"5.13/ Subrange Type Entries".

Basically, the size of the subrange type as described by the
DW_TAG_subrange_type DIE is set either:

    * by the size of the base type designated by the DW_AT_type
      attribute.

    * or by the DW_AT_byte_size or DW_AT_bit_size attribute that might
      be present on the DIE.

That is different from the length property carried by the subrange
type.

The patch updates the four front-rends (DWARF, BTF, CTF and ABIXML) to
fix the setting process of the size of the subrange type and adjusts
the testsuite accordingly.

	* src/abg-btf-reader.cc (reader::build_array_type): The size of
	the subrange is not defined specifically.  Let's set it to the
	default address size of the translation unit.
	* src/abg-ctf-reader.cc (build_array_ctf_range): If no basis type
	was found, then set the size of the subrange type to the default
	address size of the translation unit.
	* src/abg-dwarf-reader.cc (build_subrange_type): Consider the
	DW_AT_byte_size and DW_AT_bit_size attribute of
	DW_TAG_subrange_type if present.  Otherwise, if the basis type is
	present, its size as the size of the subrange type.  Otherwise,
	use the default address size of the translation unit as the size
	of the subrange type.
	* src/abg-ir.cc (array_type_def::subrange_type::subrange_type): If
	the underlying (basis) type is present, then use its size as the
	size of the subrange type.  Otherwise the size is zero.
	(array_type_def::subrange_type::set_underlying_type): Update the
	size of the subrange when setting a new underlying (basis) type.
	* src/abg-reader.cc (build_subrange_type): Read and set the size
	of the subrange.
	* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt:
	Adjust.
	* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt:
	Likewise.
	* tests/data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-1.txt:
	Likewise.
	* tests/data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-2.txt:
	Likewise.
	* tests/data/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64--2.24.2-30.fc30.x86_64-report-0.txt:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-15 16:33:43 +02:00
Dodji Seketeli
b1e8e15bec configure: Fix detection of BTF header to enable the BTF front-end
Cestmir Kalina reported that running configure with --enable-btf with
no BTF header present on the system wrongly leads to the BTF
front-end of libabigail being enabled, and later leads to
compilation/installation errors.

This patch fixes that by ensuring that the ENABLE_BTF variable set by
the --enable-btf option handling code is not reused later during
actual btf.h header file detection code.

	* configure.ac: Use a new HAS_BTF_HEADERS to store the detection
	status for the btf.h header.  Emit a better notice message when
	the BTF header file is found.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Tested-by: Cestmir Kalina <ckalina@redhat.com>
2024-05-15 15:21:01 +02:00
Dodji Seketeli
ca2319b973 btf-reader: Ignore BTF nodes that ought to be ignored
For now, the BTF nodes BTF_KIND_DECL_TAG, BTF_KIND_DATASEC, and
BTF_KIND_UNKN are ignored by libabigail, in practice.  We should thus
not abort when we encounter them.  Fixed thus.  Many thanks to Cestmir
Kalina for reporting this.

	* src/abg-btf-reader.cc (build_ir_node_from_btf_type): Ignore and
	return nil for node of kind BTF_KIND_DECL_TAG, BTF_KIND_DATASEC,
	and BTF_KIND_UNKN.  For all other nodes, abort.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>

	# Veuillez saisir le message de validation pour vos
	modifications. Les lignes # commençant par '#' seront ignorées, et
	un message vide abandonne la validation.  # # Sur la branche
	master # Votre branche est à jour avec 'origin/master'.  # #
	Modifications qui seront validées : # modifié :
	src/abg-btf-reader.cc # # Fichiers non suivis: #
	doc/api/libabigail.doxy.bak # patches/ # prtests/ # #
	------------------------ >8 ------------------------ # Ne touchez
	pas à la ligne ci-dessus.  # Tout ce qui suit sera éliminé.
diff --git a/src/abg-btf-reader.cc b/src/abg-btf-reader.cc
index f22e92bf..67206bb4 100644
--- a/src/abg-btf-reader.cc
+++ b/src/abg-btf-reader.cc
@@ -486,12 +486,16 @@ public:

 #ifdef WITH_BTF_KIND_TYPE_TAG
 	  case BTF_KIND_TYPE_TAG/* Type Tag */:
+	    break;
 #endif
 #ifdef WITH_BTF_KIND_DECL_TAG
 	  case BTF_KIND_DECL_TAG/* Decl Tag */:
+	    break;
 #endif
 	  case BTF_KIND_DATASEC/* Section */:
+	    break;
 	  case BTF_KIND_UNKN/* Unknown	*/:
+	    break;
 	  default:
 	    ABG_ASSERT_NOT_REACHED;
 	    break;

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-10 14:05:08 +02:00
Dodji Seketeli
86967a1dbb dwarf-reader,ir: Unify type sorting & sort types before c14n
This fixes the temporary breakage I have introduced by committing too
soon the patch below that should have been committed after the type
hashing patch:

    d26bd3d2 dwarf-reader,ir: Merge member fns of classes

Oops.

That patch introduces some instability in the ABIXML output due to the
fact that sorting of function types in particular is not deterministic
enough.  I believe that because the sorting is using the internal
pretty representation of function types, it can introduce instability
in the sorting of two types that are equivalent modulo one typedef,
because the internal pretty representation strips typedefs off of
function return and parameter types.  This patch fixes that by using
the type_topo_comp operator used in the IR for sorting types, instead
of having a different sorting routine in the ABIXML writer.  Another
instability is due to the fact that method types where there is no
parameter beside the implicit "this" parameter and that are different
due to const-ness of the enclosing class could not be told apart.  The
patch fixes that as well.

The patch also sorts types before canonicalizing them in the ABIXML
reader, so that type canonicalization happens in the same order (in
DWARF and ABIXML) to minimize changes in canonicalization results
between DWARF and ABIXML.  This should hopefully help minimize
self-comparison errors.

Note that sorting types (based on their pretty representation) before
canonicalizing them might incur some (temporary) slowness that I
believe should be handled by the coming type hashing patch set.  If we
see that the slowness is not bearable, we might remove that sorting at
some point.  For now, let's keep it for testing purposes.

	* src/abg-ctf-reader.cc (reader::canonicalize_all_types): Use a
	temporary vector as input for ir::canonicalize_types because it
	needs an ordered container as it now sorts types before
	canonicalizing them.
	* src/abg-dwarf-reader.cc (reader::types_to_canonicalize): Add a
	non-const overload for this accessor.
	* src/abg-ir-priv.h (compare_using_locations)
	(is_ptr_ref_or_qual_type): Add a declaration for these functions
	defined in abg-ir.cc.
	(struct decl_topo_comp, struct type_topo_comp): Move these here,
	from abg-ir.cc.
	(canonicalize_types): Sort the types before canonicalizing them.
	* src/abg-ir.cc (compare_using_locations): Turn this from static
	to non-static, now that it's declared in abg-ir-priv.h.
	(struct decl_topo_comp, struct type_topo_comp): Move these into
	abg-ir-priv.h.
	* src/abg-reader.cc: Include abg-ir-priv.h.
	(reader::perform_late_type_canonicalizing): Use
	ir::canonicalize_types, rather than canonicalizing types one by
	one.
	* src/abg-writer.cc: Include abg-ir-priv.h.
	(struct type_topo_comp): Remove.
	(write_context::sort_types): Use type_topo_comp from abg-ir-priv.h
	instead of type_topo_comp that was removed.
	* 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/PR22015-libboost_iostreams.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
	* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.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/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.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
	* tests/data/test-read-write/test28-without-std-fns-ref.xml:
	Likewise.
	* tests/data/test-read-write/test28-without-std-vars-ref.xml:
	Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-09 18:32:06 +02:00
Dodji Seketeli
b2993f7d70 elf-reader: Avoid crashing when looking at non-existing variable symbol
* src/abg-elf-reader.cc (reader::variable_symbol_is_exported): Do
	not crash when the symbol we are looking at is non-present.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-09 18:02:27 +02:00
Dodji Seketeli
f0affd05c6 Suppress patch file that was wrongly added to the repository
I have wrongly added a patch to the source repository.  Oops.  Remove it.

	* patches/0001-WIP-Emit-read-undefined-interfaces-to-from-ABIXML.patch:
	Remove from the repository.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-06 19:02:19 +02:00
Dodji Seketeli
b5b4e23dc7 test-read-common: Fix error message
The error message in test_task::run_abidw in test-read-common.cc is
wrong.  Fixed thus.  Also, emit the error message directly to the standard
error as the error is detected.

	* tests/test-read-common.cc (test_task::run_abidw): Fix error
	message and emit it to stderr directly.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-06 19:00:14 +02:00
Dodji Seketeli
d26bd3d246 dwarf-reader,ir: Merge member fns of classes
When looking at something else, I realized that in DWARF, two classes
C and C' of the same name and coming from the same corpus might not
have the same member functions that are defined.  This is probably
because for a given translation unit, some compilers emit debug info
only for the member functions that are used somehow.

So, depending on which of C or C' is the canonical class in the end,
we will not necessarily have the same member functions emitted in
ABIXML.  That is annoying.  So there was a kludge in
maybe_adjust_canonical_type to ensure that the canonical type has all
the member functions of the types belonging to same class of
equivalence.

This patch adds a pass before type canonicalization in the DWARF
reader to ensure that all classes of the same name in a given corpus
have the same member functions.  The patch thus removes the now
unnecessary kludge from maybe_adjust_canonical_type and asserts the
impossibility of the member function discrepancy.

	* src/abg-dwarf-reader.cc (reader::{copy_missing_member_functions,
	contains_anonymous_class, merge_member_functions_of_classes,
	merge_member_functions_in_classes_of_same_names}): Define new
	member functions.
	(reader::read_debug_info_into_corpus): Call the reader::new
	merge_member_functions_in_classes_of_same_names.
	* src/abg-ir.cc (maybe_adjust_canonical_type): When looking at the
	canonical type C of a type T, if they both come from the same
	corpus, assert that C has all the member functions of T.  This
	because the DWARF reader now ensures that all types have the same
	name in a given corpus have the same member functions.
	* tests/data/test-annotate/test14-pr18893.so.abi: Adjust.
	* tests/data/test-annotate/test15-pr18892.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-read-dwarf/test-libandroid.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/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.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-06 18:59:31 +02:00
Dodji Seketeli
fb92e0a322 dwarf-reader,ir: Improve detection of method types & implicit parms
There is a confusion in the DWARF reader about static member functions
and non-static member functions.  With recent versions of DWARF, a
member function with the DW_AT_object_pointer attribute is known to
have a this-pointer and thus designates a non-static member function.
DWARF emitted by gcc 4.4.x and previous compiler didn't emit the
DW_AT_object_pointer so we need to look at the first parameter of the
member function, make sure it's artificial and pointers to a pointer
to the same class as the class of the current member function.

This patch avoids to confuse static and non-static member functions by
telling apart types of static member functions, non-static member
function and non member functions. This fixes the representation of
several method types and function declaration signatures across the
test suite.

	* include/abg-ir.h (method_type::get_is_for_static_method): Add
	new method.
	* src/abg-dwarf-reader.cc (fn_die_first_parameter_die)
	(member_fn_die_has_this_pointer, die_peel_typedef): Define new
	static functions.
	(die_this_pointer_is_const): Make this support DIEs representing
	const pointers.
	(die_function_type_is_method_type): Use the new
	member_fn_die_has_this_pointer function rather than (wrongly) open
	coding its functionality.  If the (member) function DIE has no
	this pointer DIE and if the function is at class scope, then we
	are looking a static member function.
	(finish_member_function_reading): Use the new
	method::get_is_for_static_method method rather than open-coding
	its functionality.
	* src/abg-ir.cc (method_type::get_is_for_static_method): Define
	new method.
	(type_topo_comp::operator()): In this comparison
	operator for types, if two method types have the same string
	representation then if one method type is for a static method,
	then make the non-static method type come first.
	(function_type::get_first_non_implicit_parm): The first parameter
	of a function can only carry the "this pointer" if it's
	artificial.
	* tests/data/test-abidiff-exit/PR31513/reported/PR31513-reported-report-1.txt:
	Adjust.
	* tests/data/test-abidiff/test-struct1-report.txt: Likewise.
	* tests/data/test-abidiff/test-struct1-v0.cc.bi: Likewise.
	* tests/data/test-abidiff/test-struct1-v1.cc.bi: Likewise.
	* tests/data/test-annotate/test14-pr18893.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-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
	Likewise.
	* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
	Likewise.
	* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.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/test35-pr18754-no-added-syms-report-1.txt:
	Likewise.
	* tests/data/test-diff-filter/test41-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/test-libandroid.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/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/test9-pr18818-clang.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-06 18:32:41 +02:00
Dodji Seketeli
27bc7bca31 writer: Fix control of emitting parm names in function types
Emitting parameter names in function types should be controlled by the
set_write_parameter_names function.  It turns out it is not.  Fixed
thus and adjust testannotate and testreadwarf to avoid emitting
parameter names altogether.  This removes some rare randomness in the
tests output.

	* src/abg-writer.cc (write_function_type): Control emitting of
	parameter names with the write_context::get_write_parameter_names
	property.
	* tests/test-annotate.cc (main): Do not emit function parameter
	names.
	* tests/test-read-dwarf.cc (main): Likewise.
	* tests/data/test-annotate/libtest23.so.abi: Adjust.
	* 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/test0.abi: Likewise.
	* tests/data/test-annotate/test1.abi: Likewise.
	* tests/data/test-annotate/test13-pr18894.so.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/test21-pr19092.so.abi: Likewise.
	* tests/data/test-annotate/test4.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-read-dwarf/PR22015-libboost_iostreams.so.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
	* tests/data/test-read-dwarf/PR24378-fn-is-not-scope.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
	* tests/data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi:
	Likewise.
	* tests/data/test-read-dwarf/PR26261/PR26261-exe.abi: Likewise.
	* tests/data/test-read-dwarf/PR27700/test-PR27700.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-PR26568-1.o.abi: Likewise.
	* tests/data/test-read-dwarf/test-PR26568-2.o.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/test0.abi: Likewise.
	* tests/data/test-read-dwarf/test0.hash.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/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/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/test4.so.abi: Likewise.
	* tests/data/test-read-dwarf/test4.so.hash.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-05-06 18:31:42 +02:00
Dodji Seketeli
29c11a4c22 ir: Make IR node visitor aware of non-canonicalized types
is_non_canonicalized_type is the function that decides which type
should be canonicalized or not.  So, code that expects a type to be
canonicalized should comply with the rule of
is_non_canonicalized_type, aka The Rule.  It turns out, the IR node
visitor code fails to comply with The Rule.  Fixed thus.  Note that
with this commit, the program build/tests/testirwalker now works fine
on itself.  Many thanks to Cestmir Kalina who noticed and reported the
issue.

	* src/abg-ir.cc (ir_node_visitor::{mark_type_node_as_visited,
	type_node_has_been_visited}): Invoke is_non_canonicalized_type to
	know if we should expect a type to have a canonical type or not.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-03 23:16:55 +02:00
Dodji Seketeli
7957373bca ir,writer: Fix function type naming & fn type annotation in ABIXML
While looking at something else, it occurred to me that function type
annotation in ABIXML (as emitted by abidw --annotate) is wrong,
especially when it comes to pointer to member function types.  Now
that we support pointer to member function types naming, just using
ir::get_type_name in the annotate function should be enough to do the
trick.  And this is what this patch does.

Also, I realized that get_function_type_name was wrongly invoking
get_pretty_representation on the return type of the function type,
instead of just emitting its type name.  This patch fixes that as
well.

	* src/abg-ir.cc (get_function_type_name, get_method_type_name):
	Use get_type_name in lieu of get_pretty_representation.
	* src/abg-writer.cc (annotate): In the overload for function_type,
	use get_function_name instead of open coding function type
	representations.
	* tests/data/test-annotate/test-pointer-to-member-1.o.annotated.abi: Adjust.
	* tests/data/test-annotate/test13-pr18894.so.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/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise.
	* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt: Likewise.
	* tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt: Likewise.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	Likewise.
	* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
	* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
	* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-05-02 10:59:43 +02:00
Sam James
5935ee2761 tests/runtestabidb?.sh.in: Use bash shebang
'function x() { ... }' is a bashism, but /bin/sh may be another shell,
like dash. Just use an explicit /bin/bash shebang as the file relies on
a few other bashisms like 'type'.

    * tests/runtestabidb[1-2].sh.in: Use bash shebang.

Signed-off-by: Sam James <sam@gentoo.org>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-30 13:14:38 +02:00
Dodji Seketeli
f09a9fe835 fedabipkgdiff: Cleanup output of ABI comparison
The output of fedabipkgidiff doesn't clearly say when two
(sub)packages have no ABI change.

This patch fixes that.  The patch also trims unnecessary white spaces
from the output of fedabipkgdiff.  As a result, the patch adjusts the
expected reference output files.

	* tools/fedabipkgdiff: Adjust copyright year
	(abipkgdiff): Strip out trailing spaces from the stdout
	string.  Emit a clear message when no ABI change was found.
	* tests/data/test-fedabipkgdiff/test0-from-fc20-to-fc23-dbus-glib-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test1-from-fc20-to-dbus-glib-0.106-1.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test2-dbus-glib-0.100.2-2.fc20--dbus-glib-0.106-1.fc23-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test3-dbus-glib-0.100.2-2.fc20.i686--dbus-glib-0.106-1.fc23.i686-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test4-glib-0.100.2-2.fc20.x86_64.rpm-glib-0.106-1.fc23.x86_64.rpm-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test5-same-dir-dbus-glib-0.100.2-2.fc20.x86_64--dbus-glib-0.106-1.fc23.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test6-nss-util-3.12.6-1.fc14.x86_64--nss-util-3.24.0-2.0.fc25.x86_64-report-0.txt:
	Adjust.
	* tests/data/test-fedabipkgdiff/test7-self-compare-from-fc23-dbus-glib-report-0.txt:
	Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-29 17:04:22 +02:00
Frank Ch. Eigler
784b61f00a configure,abidb: Make the libarchive python module optional for abidb
Some distributions don't have the libarchive python module packaged.

This patch makes that module optional and enables abidb to function
without it, as it's only necessary for the support of the '--archive'
command line option of the abidb program.

	* configure.ac: Detect the libarchive python module as an optional
	dependency for the abidb program.  So far, only the git python
	module remains a hard dependency.
	* tools/abidb (main): Do not support the '--archive' command line
	option if the libarchive python module is not present.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-26 16:12:51 +02:00
Dodji Seketeli
0fb03efa85 Update Copyright for year 2024
* update-copyright.sh: Update the date in this script.  Running
	the script then yields the changes below.
	* include/abg-btf-reader.h: Update copyright year as a result of
	running update-copyright.sh above.
	* include/abg-comp-filter.h: Likewise.
	* include/abg-comparison.h: Likewise.
	* include/abg-config.h: Likewise.
	* include/abg-corpus.h: Likewise.
	* include/abg-ctf-reader.h: Likewise.
	* include/abg-cxx-compat.h: Likewise.
	* include/abg-diff-utils.h: Likewise.
	* include/abg-dwarf-reader.h: Likewise.
	* include/abg-elf-based-reader.h: Likewise.
	* include/abg-elf-reader.h: Likewise.
	* include/abg-fe-iface.h: Likewise.
	* include/abg-fwd.h: Likewise.
	* include/abg-hash.h: Likewise.
	* include/abg-ini.h: Likewise.
	* include/abg-interned-str.h: Likewise.
	* include/abg-ir.h: Likewise.
	* include/abg-libxml-utils.h: Likewise.
	* include/abg-reader.h: Likewise.
	* include/abg-regex.h: Likewise.
	* include/abg-reporter.h: Likewise.
	* include/abg-sptr-utils.h: Likewise.
	* include/abg-suppression.h: Likewise.
	* include/abg-tools-utils.h: Likewise.
	* include/abg-traverse.h: Likewise.
	* include/abg-viz-common.h: Likewise.
	* include/abg-viz-dot.h: Likewise.
	* include/abg-viz-svg.h: Likewise.
	* include/abg-workers.h: Likewise.
	* include/abg-writer.h: Likewise.
	* src/abg-btf-reader.cc: Likewise.
	* src/abg-comp-filter.cc: Likewise.
	* src/abg-comparison-priv.h: Likewise.
	* src/abg-comparison.cc: Likewise.
	* src/abg-config.cc: Likewise.
	* src/abg-corpus-priv.h: Likewise.
	* src/abg-corpus.cc: Likewise.
	* src/abg-ctf-reader.cc: Likewise.
	* src/abg-default-reporter.cc: Likewise.
	* src/abg-diff-utils.cc: Likewise.
	* src/abg-dwarf-reader.cc: Likewise.
	* src/abg-elf-based-reader.cc: Likewise.
	* src/abg-elf-helpers.cc: Likewise.
	* src/abg-elf-helpers.h: Likewise.
	* src/abg-elf-reader.cc: Likewise.
	* src/abg-fe-iface.cc: Likewise.
	* src/abg-hash.cc: Likewise.
	* src/abg-ini.cc: Likewise.
	* src/abg-internal.h: Likewise.
	* src/abg-ir-priv.h: Likewise.
	* src/abg-ir.cc: Likewise.
	* src/abg-leaf-reporter.cc: Likewise.
	* src/abg-libxml-utils.cc: Likewise.
	* src/abg-reader.cc: Likewise.
	* src/abg-regex.cc: Likewise.
	* src/abg-reporter-priv.cc: Likewise.
	* src/abg-reporter-priv.h: Likewise.
	* src/abg-suppression-priv.h: Likewise.
	* src/abg-suppression.cc: Likewise.
	* src/abg-symtab-reader.cc: Likewise.
	* src/abg-symtab-reader.h: Likewise.
	* src/abg-tools-utils.cc: Likewise.
	* src/abg-traverse.cc: Likewise.
	* src/abg-viz-common.cc: Likewise.
	* src/abg-viz-dot.cc: Likewise.
	* src/abg-viz-svg.cc: Likewise.
	* src/abg-workers.cc: Likewise.
	* src/abg-writer.cc: Likewise.
	* tests/print-diff-tree.cc: Likewise.
	* tests/test-abicompat.cc: Likewise.
	* tests/test-abidiff-exit.cc: Likewise.
	* tests/test-abidiff.cc: Likewise.
	* tests/test-alt-dwarf-file.cc: Likewise.
	* tests/test-core-diff.cc: Likewise.
	* tests/test-cxx-compat.cc: Likewise.
	* tests/test-diff-dwarf-abixml.cc: Likewise.
	* tests/test-diff-dwarf.cc: Likewise.
	* tests/test-diff-filter.cc: Likewise.
	* tests/test-diff-pkg.cc: Likewise.
	* tests/test-diff-suppr.cc: Likewise.
	* tests/test-diff2.cc: Likewise.
	* tests/test-dot.cc: Likewise.
	* tests/test-elf-helpers.cc: Likewise.
	* tests/test-ini.cc: Likewise.
	* tests/test-ir-walker.cc: Likewise.
	* tests/test-kmi-whitelist.cc: Likewise.
	* tests/test-lookup-syms.cc: Likewise.
	* tests/test-read-btf.cc: Likewise.
	* tests/test-read-ctf.cc: Likewise.
	* tests/test-read-dwarf.cc: Likewise.
	* tests/test-read-write.cc: Likewise.
	* tests/test-svg.cc: Likewise.
	* tests/test-symtab-reader.cc: Likewise.
	* tests/test-symtab.cc: Likewise.
	* tests/test-tools-utils.cc: Likewise.
	* tests/test-types-stability.cc: Likewise.
	* tests/test-utils.cc: Likewise.
	* tests/test-utils.h: Likewise.
	* tools/abicompat.cc: Likewise.
	* tools/abidiff.cc: Likewise.
	* tools/abidw.cc: Likewise.
	* tools/abilint.cc: Likewise.
	* tools/abipkgdiff.cc: Likewise.
	* tools/abisym.cc: Likewise.
	* tools/binilint.cc: Likewise.
	* tools/fedabipkgdiff: Likewise.
	* tools/kmidiff.cc: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-26 15:29:50 +02:00
Dodji Seketeli
8051154fce configure.ac: Update version to 2.6
configure.ac: Update to 2.6 version.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-22 15:50:12 +02:00
Dodji Seketeli
2ce2199cbc {ctf,btf}-reader: Document the namespace for nicer apidoc
The apidoc is not generating any documentation for the libabigail::btf
and libabigail::ctf namespaces.

It turns out I need to add some doxygen comment to the these namespaces
in the source code.  Fixed thus.

	* include/abg-btf-reader.h (namespace btf): Add doxygen comment.
	Just adding it to the *.cc won't cut it, I am not sure why.
	* include/abg-ctf-reader.h (namespace ctf): Likewise.
	* src/abg-btf-reader.cc (namespace btf): Add doxygen comment.
	* src/abg-ctf-reader.cc (namespace ctf): Add doxygen commit.
	(create_reader, reset_reader): Fix doxygen comments.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 17:53:52 +02:00
Dodji Seketeli
d823861a9a doc/api/libabigail.doxy: Update to newer version.
When doing "make doc", doxygen issues a lot of warning due to the the
configuration file using old property values.

This patch updates the doxygen configuration file for the apidoc using
doxygen -u.

	* doc/api/libabigail.doxy: Update using doxygen -u.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2024-04-18 17:52:22 +02:00
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