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().
Dodji Seketeli [Fri, 31 May 2024 13:29:48 +0000 (15:29 +0200)]
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.
Dodji Seketeli [Fri, 31 May 2024 12:03:23 +0000 (14:03 +0200)]
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.
Dodji Seketeli [Fri, 31 May 2024 11:56:52 +0000 (13:56 +0200)]
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.
Dodji Seketeli [Wed, 15 May 2024 10:40:18 +0000 (12:40 +0200)]
{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.
Dodji Seketeli [Wed, 15 May 2024 11:33:20 +0000 (13:33 +0200)]
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.
Dodji Seketeli [Fri, 10 May 2024 11:52:22 +0000 (13:52 +0200)]
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;
Dodji Seketeli [Tue, 7 May 2024 01:06:24 +0000 (03:06 +0200)]
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.
Dodji Seketeli [Tue, 26 Mar 2024 15:20:18 +0000 (16:20 +0100)]
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.
Dodji Seketeli [Tue, 26 Mar 2024 23:43:15 +0000 (00:43 +0100)]
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.
Dodji Seketeli [Fri, 3 May 2024 21:05:26 +0000 (23:05 +0200)]
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.
Dodji Seketeli [Tue, 26 Mar 2024 22:44:54 +0000 (23:44 +0100)]
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.
Dodji Seketeli [Fri, 3 May 2024 13:12:37 +0000 (15:12 +0200)]
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.
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.
Sam James [Fri, 19 Apr 2024 02:23:11 +0000 (03:23 +0100)]
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>
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.
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.
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.
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:
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.
==== 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.
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.
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.
Dodji Seketeli [Fri, 29 Mar 2024 11:22:06 +0000 (12:22 +0100)]
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.
Dodji Seketeli [Thu, 28 Mar 2024 16:39:38 +0000 (17:39 +0100)]
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.
[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:
[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.
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>
Dodji Seketeli [Fri, 15 Mar 2024 16:03:14 +0000 (17:03 +0100)]
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.
Dodji Seketeli [Fri, 8 Mar 2024 14:31:44 +0000 (15:31 +0100)]
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.
Dodji Seketeli [Tue, 12 Mar 2024 16:17:16 +0000 (17:17 +0100)]
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
Dodji Seketeli [Tue, 12 Mar 2024 15:01:30 +0000 (16:01 +0100)]
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.
Dodji Seketeli [Wed, 21 Feb 2024 09:54:57 +0000 (10:54 +0100)]
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.
Dodji Seketeli [Fri, 8 Mar 2024 10:34:40 +0000 (11:34 +0100)]
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.
Dodji Seketeli [Tue, 5 Mar 2024 15:52:44 +0000 (16:52 +0100)]
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.
Dodji Seketeli [Mon, 4 Mar 2024 09:44:16 +0000 (10:44 +0100)]
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.
Dodji Seketeli [Mon, 4 Mar 2024 08:34:51 +0000 (09:34 +0100)]
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.
Dodji Seketeli [Sat, 2 Mar 2024 15:30:23 +0000 (16:30 +0100)]
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.
Dodji Seketeli [Wed, 28 Feb 2024 10:14:11 +0000 (11:14 +0100)]
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.
Dodji Seketeli [Tue, 27 Feb 2024 15:45:28 +0000 (16:45 +0100)]
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.
Dodji Seketeli [Tue, 27 Feb 2024 16:56:28 +0000 (17:56 +0100)]
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.
Dodji Seketeli [Wed, 21 Feb 2024 09:11:01 +0000 (10:11 +0100)]
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.
Dodji Seketeli [Tue, 20 Feb 2024 16:05:48 +0000 (17:05 +0100)]
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.
Dodji Seketeli [Thu, 15 Feb 2024 16:48:49 +0000 (17:48 +0100)]
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.
Dodji Seketeli [Thu, 15 Feb 2024 14:18:05 +0000 (15:18 +0100)]
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
Dodji Seketeli [Fri, 12 Jan 2024 11:53:41 +0000 (12:53 +0100)]
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.
Dodji Seketeli [Thu, 1 Feb 2024 13:49:14 +0000 (14:49 +0100)]
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.
Dodji Seketeli [Thu, 8 Feb 2024 16:30:38 +0000 (17:30 +0100)]
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.
Dodji Seketeli [Thu, 8 Feb 2024 17:06:13 +0000 (18:06 +0100)]
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.
Dodji Seketeli [Sat, 6 Jan 2024 13:39:46 +0000 (14:39 +0100)]
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.
Dodji Seketeli [Fri, 12 Jan 2024 11:58:24 +0000 (12:58 +0100)]
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.
Dodji Seketeli [Fri, 12 Jan 2024 11:57:24 +0000 (12:57 +0100)]
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.
Dodji Seketeli [Fri, 22 Dec 2023 10:36:47 +0000 (11:36 +0100)]
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.
Dodji Seketeli [Fri, 26 Jan 2024 11:41:53 +0000 (12:41 +0100)]
Remove python3-mock dependency and use unittest.mock instead
As explained in
https://fedoraproject.org/wiki/Changes/RemovePythonMockUsage,
python-mock is now deprecated. We ought to use mock from the python
standard library instead.
Maxwell G submitted a patch to libabigail's Fedora package in Rawhide
at https://src.fedoraproject.org/fork/gotmax23/rpms/libabigail/c/405c5046d84fc6977c75cd42a381f7eb30b3efa7.
I am applying this patch inspired from his work here.
* configure.ac: Do not require python-mock anymore.
* tests/mockfedabipkgdiff.in: Use unittest.mock, not mock from
python-mock.
Dodji Seketeli [Thu, 25 Jan 2024 11:06:57 +0000 (12:06 +0100)]
Bug 31279 - Acknowledge that opaque types are always decl-only
When handling a decl-only base class, add_or_update_class_type asserts
that we need to try to resolve the decl-only base class to its
definition. That makes sense in most cases.
However, in cases where the base class is actually an opaque class
resulting from the use of the --header-dir{1,2} option of abidiff, the
opaque type is by definition a decl-only class artificially created
from a fully defined class.
When the opaque class is anonymous (later named by a typedef),
maybe_schedule_declaration_only_class_for_resolution schedules a
decl-only class named by the empty string for resolution to its
definition. Later when add_or_update_class_type handles the decl-only
base class (now named by a typedef),
reader::is_decl_only_class_scheduled_for_resolution looks for the
typedef name; as the class scheduled for resolution by
maybe_schedule_declaration_only_class_for_resolution was then
anonymous, reader::is_decl_only_class_scheduled_for_resolution returns
false and the assert in add_or_update_class_type fails. It's the
problem reported in this issue. Oops.
When the opaqued decl-only type is anonymous,
maybe_schedule_declaration_only_{class,enum}_for_resolution must NOT
schedule it for resolution to its definition because the scheduled
types for resolution are designated by name. This patch now enforces
that.
It just doesn't make sense to schedule an anonymous type for
resolution to its definition. When the type is later named by a
typedef however, then it's scheduled for resolution to its definition,
as it's no more anonymous at that point. The patch enforces that as
well.
The patch ends up making sure that add_or_update_class_type does /not/
assert that an /anonymous/ decl-only base class is scheduled for
resolution to its definition.
These changes should fix the problem reported at
https://sourceware.org/bugzilla/show_bug.cgi?id=31279.
* src/abg-dwarf-reader.cc
(reader::maybe_schedule_declaration_only_{class,enum}_for_resolution):
Do not schedule anonymous decl-only types for resolution to their
definition.
(build_typedef_type): When an anonymous decl-only type has just
been named by a typedef, schedule it for resolution to its
definition.
(add_or_update_class_type): Do not assert that /anonymous/
decl-only types are scheduled for resolution to their definition.
Dodji Seketeli [Mon, 15 Jan 2024 10:10:42 +0000 (11:10 +0100)]
Bug 31236 - Fix removing a member declaration from its scope
In some C++ binaries, DWARF can represent a member variable using a
global variable /definition/ DIE not having a reference attribute
pointing back to the member variable declaration DIE. The only way we
know that the global variable is a definition DIE for a member
variable is because its linkage name demangles to
"foo::bar::var_name", with foo::bar being a class name.
So, for each translation unit, when the DWARF reader reads a global
variable DIE, it builds a variable IR node for it and stashes it on
the side.
Then, when the translation unit is built, the DWARF reader looks at
all the stashed global variables, detects those that are actually
member variables and adds them to their class. But then, before
adding a (former global) variable to its class, the reader has first
to remove it from its global scope. This removal is done by the
function remove_decl_from_scope, which calls
scope_decl::remove_member_decl.
The issue here is that remove_decl_from_scope forgets to unset the
translation unit property of the global variable.
Then, in the particular case of this problem report, when
scope_decl::add_member_decl is called to add the variable to its
class, it detects that the variable belongs to /another/ translation
unit and (rightfully) aborts. Ooops.
This patch fixes the issue by making remove_decl_from_scope remove the
variable from its translation unit too, not just from its scope. The
patch actually delegates the scope & translation unit resetting to
scope_decl::remove_member_decl because it appears to me that this is
where these ought to be handled.
To ensure that the issue is fixed, one needs to unpack the package
webkit2gtk3-2.40.5-1.el9_3.1.x86_64.rpm and run abidw on the binary
$prefix/usr/lib64/libwebkit2gtk-4.0.so.37 like:
Given the size of the library, this takes three hours and a half as
well as ~50GB of ram to complete on my system using a non-optimized
debug build of libabigail. We definitely need to invest in more speed
optimizations to handle webkit. That would be for another day, I
guess.
* src/abg-ir.cc (scope_decl::remove_member_decl): Reset the
translation unit and the scope of the removed decl.
(remove_decl_from_scope): Do not reset the scope of the removed
decl here as it's now done above.
Mark Wielaard [Fri, 29 Dec 2023 00:40:50 +0000 (01:40 +0100)]
Recognize EM_RISCV in e_machine_to_string
Check that EM_RISCV is defined in elf.h and if it is then recognize
it in e_machine_to_string, producing "elf-riscv".
* configure.ac: Defining HAVE_EM_RISCV_MACRO if EM_RISCV
is defined in elf.h.
* src/abg-dwarf-reader.cc (e_machine_to_string): Handle
EM_RISCV if HAVE_EM_RISCV_MACRO is defined.
Dodji Seketeli [Wed, 29 Nov 2023 13:35:47 +0000 (14:35 +0100)]
Bump LIBABIGAIL_SO_CURRENT version to 4
Recent patches change the ABI of the library, namely, by adding
parameters to functions like is_pointer_type or adding virtual member
functions to classes in the IR. Thus the LIBABIGAIL_SO_CURRENT
version has to be bumped from 3 to 4.
Dodji Seketeli [Fri, 1 Dec 2023 10:37:49 +0000 (11:37 +0100)]
Bump abixml version to 2.3
An older version of libabigail won't be able to grok new abixml files
containing the recently added support for pointer-to-member types.
It's thus needed to bump the minor version number of the abixml
format. The new version is thus 2.3. As a result, this patch also
updates the version numbers shown in the various abixml files of the
test suite.
[C] 'void (X::* pmf)(int)' was changed to 'void (X::* pmf)(int, char)' at test-ptr-to-mbr-v1.cc:8:1:
type of variable changed:
pointer-to-member type changed from: 'void (X::*)(int) to: 'void (X::*)(int, char)'
in containing type 'struct X' of pointed-to-member type 'void (X::*)(int)' at test-ptr-to-mbr-v1.cc:1:1:
type size changed from 32 to 8 (in bits)
1 data member change:
type of 'int a' changed:
type name changed from 'int' to 'char'
type size changed from 32 to 8 (in bits)
[C] 'int X::* pmi' was changed to 'char X::* pmi' at test-ptr-to-mbr-v1.cc:7:1:
type of variable changed:
pointer-to-member type changed from: 'int X::* to: 'char X::*'
in data member type 'int' of pointed-to-member type 'int X::*':
type name changed from 'int' to 'char'
type size changed from 32 to 8 (in bits)
containing type of pointer-to-member 'struct X' changed at test-ptr-to-mbr-v0.cc:1:1, as reported earlier
$
* include/abg-comparison.h (class ptr_to_mbr_diff): Declare new
class.
(ptr_to_mbr_diff_sptr): Declare new typedef.
(compute_diff): Declare new overload for ptr_to_mbr_diff.
(ptr_to_mbr_type_sptr): Declare new typedef.
* src/abg-comparison-priv.h (struct ptr_to_mbr_diff::priv): Define
* src/abg-comparison.cc (compute_diff_for_types): Support new
ptr_to_mbr_type type.
(ptr_to_mbr_diff::{ptr_to_mbr_diff, first_ptr_to_mbr_type,
second_ptr_to_mbr_type, member_type_diff, containing_type_diff,
has_changes, has_local_changes, get_pretty_representation, report,
chain_into_hierarchy, ~ptr_to_mbr_diff}): Define member functions
of class ptr_to_mbr_diff.
(compute_diff): Define overload for ptr_to_mbr_type_sptr.
* include/abg-fwd.h (ptr_to_mbr_type_sptr): Declare new typedef.
(is_ptr_to_mbr_type, is_pointer_to_ptr_to_mbr_type)
(is_typedef_of_maybe_qualified_class_or_union_type): Declare new
functions.
* include/abg-ir.h (type_maps::ptr_to_mbr_types): Declare new
accessor.
(POINTER_TO_MEMBER_TYPE): Add new enumerator to enum
type_or_decl_base::type_or_decl_kind.
(class ptr_to_mbr_type): Declare new class.
(equals): Declare new overload for ptr_to_mbr_type.
(ir_node_visitor::visit_{begin,end}): Declare new member
functions.
* src/abg-ir.cc (ptr_to_mbr_declaration_name)
(ptr_to_mbr_declaration_name, add_outer_ptr_to_mbr_type_expr)
(add_outer_pointer_to_ptr_to_mbr_type_expr): Define new static
functions.
(type_maps::priv::ptr_to_mbr_types_): Define new
data member.
(type_maps::ptr_to_mbr_types): Define new accessor.
(is_ptr_to_mbr_type, is_pointer_to_ptr_to_mbr_type)
(is_typedef_of_maybe_qualified_class_or_union_type): Define new
functions.
(maybe_update_types_lookup_map, equals): Define new overloads for
ptr_to_mbr_type_sptr.
(is_npaf_type): Use is_ptr_to_mbr_type.
(maybe_update_types_lookup_map): In the overload for
decl_base_sptr, call the new overload for ptr_to_mbr_type_sptr
above.
(struct ptr_to_mbr_type::priv): Define new struct.
(ptr_to_mbr_type::{ptr_to_mbr_type, get_member_type,
get_containing_type, operator==, get_qualified_name, traverse,
~ptr_to_mbr_type}): Define member functions of ptr_to_mbr_type.
(types_have_similar_structure): Support the new ptr_to_mbr_type
type.
(ir_node_visitor::visit_{begin,end}): Add new member functions.
(var_decl::get_pretty_representation): Support pretty-printing
pointer-to-member types.
(pointer_declaration_name, array_declaration_name): Likewise.
* include/abg-reporter.h ({reporter_base, default_reporter,
leaf_reporter}::report): Add an overload for ptr_to_mbr_diff.
(default_reporter::report_local_ptr_to_mbr_type_changes): Declare
a member function.
private data class of ptr_to_mbr_diff.
* src/abg-default-reporter.cc
(default_reporter::report_local_ptr_to_mbr_type_changes): Define
member functions.
(default_reporter::report): Define an overload for
ptr_to_mbr_diff.
* src/abg-leaf-reporter.cc (leaf_reporter::report): Likewise.
* src/abg-dwarf-reader.cc (build_ptr_to_mbr_type): Define new
function.
(build_ir_node_from_die): Use the new build_ptr_to_mbr_type
function.
* src/abg-reader.cc (build_ptr_to_mbr_type): Define new function.
(build_type): Use the new build_ptr_to_mbr_type above.
* src/abg-writer.cc (write_ptr_to_mbr_type): Define new function.
(write_type, write_decl, write_member_type): Use the new
write_ptr_to_mbr_type above.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr1-output-1.txt:
Add new test material.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr1-v0.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr1-v0.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr1-v1.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr1-v1.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr2-output-1.txt:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr2-v0.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr2-v0.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr2-v1.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr2-v1.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr3-output-1.txt:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr3-v0.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr3-v0.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr3-v1.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr3-v1.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr4-output-1.txt:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr4-v0.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr4-v0.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr4-v1.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr4-v1.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr5-output-1.txt:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr5-v0.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr5-v0.o:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr5-v1.cc:
Likewise.
* tests/data/test-abidiff-exit/pointer-to-member/test-ptr-to-mbr5-v1.o:
Likewise.
* tests/data/test-read-dwarf/test-pointer-to-member-1.cc:
Likewise.
* tests/data/test-read-dwarf/test-pointer-to-member-1.o: Likewise.
* tests/data/test-read-dwarf/test-pointer-to-member-1.o.abi:
Likewise.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add the test material
above to this test harness.
* tests/test-annotate.cc (in_out_specs): Likewise.
* tests/test-read-dwarf.cc: Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi: Adjust.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
Dodji Seketeli [Thu, 30 Nov 2023 15:46:34 +0000 (16:46 +0100)]
Improve type naming
There are a number of glitches when pretty-printing type names.
This is particularly true for derived types like pointer to functions,
array of pointer to functions and the likes.
For instance, we can see in
tests/data/test-abidiff-exit/PR30048-test-2-report-1.txt that a
function N that takes no parameter and returns a pointer to an array
of 7 int is pretty-printed as:
int[7]* N()
That obviously doesn't respect the type naming rules of C or C++.
With this patch, function N is declared as:
int(*N(void))[7]
To learn more about the impact of the patch on how types are
pretty-printed, you can look at the parts of the patch that are
adjustments to the expected output of the regression tests.
For instance, here is how the expected output of type pretty-printing
in tests/data/test-abidiff-exit/PR30048-test-2 is modified by this
patch:
- [C] 'function int[7]* N()' at PR30048-test-2-v0.cc:62:1 has some indirect sub-type changes:
+ [C] 'function int(*N(void))[7]' at PR30048-test-2-v0.cc:62:1 has some indirect sub-type changes:
return type changed:
- entity changed from 'int[7]*' to 'int'
+ entity changed from 'int(*)[7]' to 'int'
type size changed from 64 to 32 (in bits)
- [C] 'function int* O()' at PR30048-test-2-v0.cc:64:1 has some indirect sub-type changes:
+ [C] 'function int* O(void)' at PR30048-test-2-v0.cc:64:1 has some indirect sub-type changes:
return type changed:
entity changed from 'int*' to 'int'
type size changed from 64 to 32 (in bits)
- [C] 'function int ()* P()' at PR30048-test-2-v0.cc:67:1 has some indirect sub-type changes:
+ [C] 'function int (*P(void))(void)' at PR30048-test-2-v0.cc:67:1 has some indirect sub-type changes:
return type changed:
- entity changed from 'int ()*' to 'int'
+ entity changed from 'int (*)(void)' to 'int'
type size changed from 64 to 32 (in bits)
Note that the change to the CTF test
tests/data/test-read-ctf/test9.o.abi is triggered by a change in the
sorting of types because types are sorted alphabetically.
All in all, this is clearly an overdue improvement to the type name
pretty-printing.
* include/abg-fwd.h (is_npaf_type, is_pointer_to_function_type)
(is_pointer_to_array_type, is_pointer_to_npaf_type): Declare new
functions.
(is_pointer_type, is_reference_type, is_array_type): Take a
boolean parameter to look through qualifiers.
* include/abg-ir.h (is_pointer_type): Do not make this function a
friend of the type_or_decl_base class anymore.
* src/abg-ir.cc (pointer_declaration_name, array_declaration_name)
(stream_pretty_representation_of_fn_parms)
(add_outer_pointer_to_fn_type_expr)
(add_outer_pointer_to_array_type_expr): Define new static
functions.
(is_npaf_type, is_pointer_to_function_type)
(is_pointer_to_array_type, is_pointer_to_npaf_type): Define new
functions.
(get_type_representation): Remove the overload for array_type_def.
(get_function_type_name, get_method_type_name)
(function_decl::get_pretty_representation_of_declarator): Use the
new stream_pretty_representation_of_fn_parms. This actually
factorizes parameters pretty-printing by reusing
stream_pretty_representation_of_fn_parms.
(is_pointer_type, is_reference_type, is_array_type): Take a
boolean parameter to look through qualifiers.
(is_void_pointer_type): Use const where it's due.
(pointer_type_def::get_qualified_name): Use the new
pointer_declaration_name in lieu of the old and removed
get_name_of_pointer_to_type.
(array_type_def::{get_pretty_representation, get_qualified_name}):
Use the new array_declaration_name instead of the old and removed
get_type_representation.
(var_decl::get_pretty_representation): Use the new
array_declaration_name and pointer_declaration_name.
(function_decl::get_pretty_representation): Use the new
add_outer_pointer_to_array_type_expr, and
add_outer_pointer_to_array_type_expr function to support the
proper syntax for function returning pointers and arrays.
(function_decl::parameter::get_pretty_representation): Fix the
pretty-printing of each function parameter.
* tests/data/test-abicompat/test0-fn-changed-report-0.txt: Adjust.
* tests/data/test-abicompat/test0-fn-changed-report-2.txt:
Likewise.
* tests/data/test-abicompat/test1-fn-removed-report-0.txt:
Likewise.
* tests/data/test-abicompat/test3-fn-removed-report-0.txt:
Likewise.
* tests/data/test-abidiff-exit/PR30048-test-2-report-1.txt: Likewise.
* tests/data/test-abidiff-exit/PR30048-test-report-0.txt: Likewise.
* tests/data/test-abidiff-exit/PR30329/PR30329-report-1.txt: Likewise.
* tests/data/test-abidiff-exit/PR30503/libsdl/libsdl-1.2.60-1.2.64-report.txt: Likewise.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt: Likewise.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt: Likewise.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt:
Likewise.
* tests/data/test-abidiff-exit/test-fun-param-report.txt:
Likewise.
* tests/data/test-abidiff-exit/test-ld-2.28-210.so--ld-2.28-211.so.txt:
Likewise.
* tests/data/test-abidiff-exit/test-leaf-fun-type-report.txt:
Likewise.
* tests/data/test-abidiff-exit/test-leaf-more-report.txt:
Likewise.
* tests/data/test-abidiff-exit/test-leaf-peeling-report.txt:
Likewise.
* tests/data/test-abidiff-exit/test-leaf-stats-report.txt:
Likewise.
* tests/data/test-abidiff-exit/test-net-change-report0.txt:
Likewise.
* tests/data/test-abidiff-exit/test-net-change-report2.txt:
Likewise.
* tests/data/test-abidiff-exit/test2-filtered-removed-fns-report0.txt:
Likewise.
* tests/data/test-abidiff/test-PR18791-report0.txt: Likewise.
* tests/data/test-abidiff/test-crc-report-0-1.txt: Likewise.
* tests/data/test-abidiff/test-crc-report-1-0.txt: Likewise.
* tests/data/test-abidiff/test-crc-report-1-2.txt: 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/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
* tests/data/test-annotate/test7.so.abi: Likewise.
* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
Likewise.
* tests/data/test-diff-dwarf/test-23-diff-arch-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test18-alias-sym-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test19-soname-report-0.txt: Likewise.
* tests/data/test-diff-dwarf/test24-added-fn-parms-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test32-fnptr-changes-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test33-fnref-changes-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf/test5-report.txt: Likewise.
* tests/data/test-diff-filter/test-PR26739-2-report-0.txt:
Likewise.
* tests/data/test-diff-filter/test26-qualified-redundant-node-report-0.txt:
Likewise.
* tests/data/test-diff-filter/test26-qualified-redundant-node-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/test6-report.txt: Likewise.
* tests/data/test-diff-filter/test7-report.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.
* tests/data/test-diff-pkg/PR24690/PR24690-report-0.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/libxcrypt-4.1.1-6.el8.x86_64--libxcrypt-compat-4.4.18-3.el9.x86_64-report-1.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-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.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-pkg-ctf/gmp-6.x.x86_64-report-0.txt:
Likewise.
* tests/data/test-diff-pkg-ctf/test-rpm-report-0.txt: Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-3.txt:
Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-5.txt:
Likewise.
* tests/data/test-diff-suppr/test0-type-suppr-report-7.txt:
Likewise.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-2.txt:
Likewise.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-5.txt:
Likewise.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-3.txt:
Likewise.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-5.txt:
Likewise.
* tests/data/test-diff-suppr/test27-add-aliased-function-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test27-add-aliased-function-report-3.txt:
Likewise.
* tests/data/test-diff-suppr/test27-add-aliased-function-report-4.txt:
Likewise.
* tests/data/test-diff-suppr/test28-add-aliased-function-report-0.txt:
Likewise.
* tests/data/test-diff-suppr/test28-add-aliased-function-report-1.txt:
Likewise.
* tests/data/test-diff-suppr/test28-add-aliased-function-report-2.txt:
Likewise.
* tests/data/test-diff-suppr/test28-add-aliased-function-report-4.txt:
Likewise.
* tests/data/test-diff-suppr/test28-add-aliased-function-report-5.txt:
Likewise.
* tests/data/test-diff-suppr/test30-report-0.txt: Likewise.
* tests/data/test-diff-suppr/test32-report-0.txt: Likewise.
* tests/data/test-diff-suppr/test32-report-1.txt: Likewise.
* tests/data/test-diff-suppr/test44-suppr-sym-name-not-regexp-report-1.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-ctf/test9.o.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-libaaudio.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/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/test19-pr19023-libtcmalloc_and_profiler.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/test7.so.abi: Likewise.
* tests/data/test-read-dwarf/test7.so.hash.abi: Likewise.
Dodji Seketeli [Thu, 30 Nov 2023 16:57:21 +0000 (17:57 +0100)]
abilint: Alphabetically sort programs options
It's a mess to find an option you are looking for both in the manual
or when doing abilint --help. So how about sorting the options of the
various libabigail programs, starting from abilint? Here we go.
* doc/manuals/abilint.rst: Alphabetically sort options in the
manual.
* tools/abilint.cc (display_usage): Likewise for the help strings.
Dodji Seketeli [Tue, 31 Oct 2023 17:11:52 +0000 (18:11 +0100)]
abilint: Support --annotate
It turns out abilint doesn't support the "--annotate" option like
abidw does. Annoying. Added thus.
* tools/abilint.cc (options::annotate): Define new data member.
(options::options): Initialize.
(display_usage): Add help string.
(parse_command): Support the --annotate command options.
(main): Set the annotate option on the context.
In the past, it was common to have a "fake flex array" at the end of a
structure. Like this:
Nowadays, with improved compiler support, it's more common to use a real
flex array. As this is a common change which changes ABI representation
in a compatible way, we should have a suppression for it.
For example, if you have a change like this:
struct foo
{
int x;
int flex[1];
};
...
struct foo
{
int x;
int flex[];
};
abidiff reports:
[C] 'struct foo' changed:
type size changed from 64 to 32 (in bits)
1 data member change:
type of 'int flex[1]' changed:
type name changed from 'int[1]' to 'int[]'
array type size changed from 32 to 'unknown'
array type subrange 1 changed length from 1 to 'unknown'
With a new has_strict_flexible_array_data_member_conversion property,
users can specify a suppression which stops abidiff from emitting
this diff for any "fake" flex arrays being converted to real ones:
* include/abg-comp-filter.h (has_strict_fam_conversion): Declare
new functions.
* include/abg-fwd.h
(ir::has_fake_flexible_array_data_member): Declare new accessor
functions.
* include/abg-suppression.h
(type_suppression::{,set_}has_strict_fam_conversion): Declare new
accessor functions.
* src/abg-comp-filter.cc (has_strict_fam_conversion): Define new
functions.
* src/abg-ir.cc
(ir::has_fake_flexible_array_data_member): Define new accessor
functions.
* src/abg-suppression-priv.h
(type_suppression::priv::has_strict_fam_conv_): Define new
data member.
* src/abg-suppression.cc
(type_suppression::{,set_}has_strict_fam_conversion): Define new
accessor functions.
(type_suppression::suppresses_diff): For a type suppression to
match a fake flex array conversion, either the size of the type
hasn't change or has_size_change must be true and then the type
must change from a fake flex array to a real flex array.
(read_type_suppression): Parse the new
'has_strict_flexible_array_data_member_conversion' property to
set the type_suppression::set_has_strict_fam_conversion property.
* doc/manuals/libabigail-concepts.rst: Add an entry for the new
'has_strict_flexible_array_data_member_conversion' property.
* tests/data/test-diff-suppr/test-has-strict-flexible-array-data-member-conversion-{1,2}.suppr:
Add new test suppression files.
* tests/data/test-diff-suppr/test-has-strict-flexible-array-data-member-conversion-report-{1,2}.txt:
Add new test reference output files.
* tests/data/test-diff-suppr/test-has-strict-flexible-array-data-member-conversion-v{0,1}.c:
Add source code for new binary test input files.
* tests/data/test-diff-suppr/test-has-strict-flexible-array-data-member-conversion-v{0,1}.o:
Add new binary test input files.
* tests/data/Makefile.am: Add the new test files to the source
distribution.
* tests/test-diff-suppr.cc (in_out_specs): Add the new test input
files to this test harness.
Signed-off-by: Dodji Seketeli <dodji@redhat.com> Signed-off-by: John Moon <quic_johmoo@quicinc.com>
Dodji Seketeli [Wed, 8 Nov 2023 13:46:04 +0000 (14:46 +0100)]
Bug 31045 - Don't try setting translation unit for unique types
Unique types (void, pointer to void and variadic parameter types)
should not have their translation unit set whenever they are being
added to a scope. This is because they are supposed to be created
independently from any translation unit, even if technically, they are
set to the translation unit they are referenced from, for the first
time.
To handle this, a new function maybe_set_translation_unit is created
to handle the setting of the translation unit for decls added to a
scope by scope_decl::{add,insert}_member_decl. That new function
asserts that unique types should have their translation unit be set.
* src/abg-ir.cc (maybe_set_translation_unit): Define new static
function.
(scope_decl::{add,insert}_member_decl): Use it.
* tests/data/test-abidiff-exit/PR31045/zfs-abigail-2.4/libnvpair.{abi,so,suppr}:
New test input files.
* tests/data/test-abidiff-exit/PR31045/zfs-abigail-2.4/test-PR31045-report-1.txt:
New reference test output.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add the input above
to this test harness.
Signed-off-by: Dodji Seketeli <dodji@redhat.com> Tested-by: Paolo Pisati <paolo.pisati@canonical.com>
Dodji Seketeli [Fri, 20 Oct 2023 16:19:48 +0000 (18:19 +0200)]
gen-changelog.py: Fix a long standing typo
While looking at something else, I stumbled upon a long standing
copy-paste typo where we refer to original GNET (from gstreamer) in
lieu of libabigail. Fixed thus.
* gen-changelog.py (get_rel_tags): It's libabigail, not GNET.
Dodji Seketeli [Wed, 18 Oct 2023 09:57:56 +0000 (11:57 +0200)]
suppression: Make the "end" data member offset selector be named boundary
Now that we have what is called a "named boundary", introduced by
commit [1], this patch re-writes the handling of the "end" data member
offset selector (used in expressions like: offset_of(end) in
suppression specifications) in terms of the new "named boundary"
infrastructure. In other words, the "end" keyword is now a named
boundary constant, just like the
"offset_of_flexible_array_data_member" is a named boundary constant.
[1]: The patch that introduced the concept of "named boundary" is this
one:
Support suppressing data member insertion before a flexible array member
* src/abg-suppression.cc (END_STRING): Define new static string
constant accessor.
(type_suppression::insertion_range::eval_boundary): Eval the "end"
named boundary as having a numerical value of
std::numeric_limits<uint64_t>::max().
(read_type_suppression): Parse the "end" token as a named
boundary.
[C] 'function void foo(foo*)' at test-v0.c:8:1 has some indirect sub-type changes:
parameter 1 of type 'foo*' has sub-type changes:
in pointed to type 'struct foo' at test-v1.c:1:1:
type size changed from 32 to 64 (in bits)
1 data member insertion:
'char member1', at offset 32 (in bits) at test-v1.c:4:1
1 data member change:
'char pad[]' offset changed from 32 to 40 (in bits) (by +8 bits)
returned value: 4
$
This patch allows users to suppress this change report using a new
property value to the "has_data_member_inserted_at" property of the
[suppress_type] directive. The resulting suppression specification
reads:
The patch adds new test cases and updates the documentation to add a
mention to the new offset_of_flexible_array_data_member named
boundary.
* doc/manuals/libabigail-concepts.rst: Add documentation for the
new "offset_of_flexible_array_data_member" named boundary.
* include/abg-fwd.h (has_flexible_array_data_member): Declare new
function.
* src/abg-ir.cc (has_flexible_array_data_member): Define it.
* include/abg-suppression.h
(type_suppression::insertion_range::named_boundary_sptr): Define
new typedef.
(type_suppression::insertion_range::create_named_boundary): Declare
new static function member function.
(is_named_boundary): Declare new function.
(class type_suppression::insertion_range::named_boundary): Declare
new type.
* src/abg-suppression.cc
(struct type_suppression::insertion_range::named_boundary::priv):
Define new private type.
(OFFSET_OF_FLEXIBLE_ARRAY_DATA_MEMBER_STRING): Define new static
constant string getter function.
(type_suppression::insertion_range::create_named_boundary): Define
new static member function.
(is_named_boundary): Define new function.
(read_type_suppression): Parse the new
"offset_of_flexible_array_data_member" named boundary.
(type_suppression::insertion_range::eval_boundary): Evaluate the
new "offset_of_flexible_array_data_member" named boundary.
* tests/data/test-abidiff-exit/test-fam1-report-[1-5].txt: New
reference test output.
* tests/data/test-abidiff-exit/test-fam2-report-1.txt: Likewise.
* tests/data/test-abidiff-exit/test-fam1-suppr-[1-4].abignore: New test
suppression specification.
* tests/data/test-abidiff-exit/test-fam{1,2}-v{0,1}.o: New test input
binaries.
* tests/data/test-abidiff-exit/test-fam{1,2}-v{0,1}.c: Source code of
the test input binaries.
* tests/data/Makefile.am: Add the new test material to the source
distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add the new test
input to this harness.
Following the changes to represent changed anonymous unreachable enums,
this patch does the same for anonymous unreachable unions, classes and
structs.
Basically, without this patch, this change:
union
{
int a;
int b;
};
------
union
{
int a;
int b;
int c;
};
yields:
1 removed type unreachable from any public interface:
[D] 'union {int a; int b;}' at test_1.c:1:1
1 added type unreachable from any public interface:
[A] 'union {int a; int b; int c;}' at test_2.c:1:1
But with the patch, it does yield:
1 changed type unreachable from any public interface:
[C] 'union {int a; int b;}' changed:
type size hasn't changed
1 data member insertion:
'int c' at test-anon-union-v1.c:5:1
type changed from:
union {int a; int b;}
to:
union {int a; int b; int c;}
* include/abg-fwd.h (class_or_union_types_of_same_kind)
(is_data_member_of_anonymous_class_or_union): Declare new
functions.
* include/abg-ir.h (lookup_data_member): Likewise, declare a new overload.
* src/abg-ir.cc (class_or_union_types_of_same_kind)
(lookup_data_member, is_data_member_of_anonymous_class_or_union):
Define news functions & overloads.
* src/abg-reporter-priv.cc (represent): When representing a change
in the name of a data member, if the context is an anonymous type,
use the non-qualified name of the data member, not its qualified
name.
* src/abg-comparison.cc
(corpus_diff::priv::ensure_lookup_tables_populated): Handle
deleted/added anonymous enums, unions, classes and structs
similarly. That is, if an anonymous type was removed and another
one got added, if they both have data members (or enumerators) in
common, then we are probably looking at an anonymous type that was
changed. This is because these anonymous types are named using
their flat representation.
* tests/data/test-abidiff-exit/test-anon-types-report-1.txt: New
reference test comparison output.
* tests/data/test-abidiff-exit/test-anon-types-v{0,1}.o: New
binary tests input files.
* tests/data/test-abidiff-exit/test-anon-types-v{0,1}.c: Source
code of new binary test input.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add the test inputs
above to this test harness.