I noticed crashes in canonicalize_types when it deals with nullptr
types. Fixed thus.
* src/abg-ir-priv.h (canonicalize_types): Avoid crashing when
de-referencing an iterator to a nullptr type.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
The current code checks explicitly for musl and if so uses pkg-config to
find fts-standalone. This is suboptimal because musl may not be the only
libc to need a standalone fts implementation, and fts-standalone is an
old gentoo-specific name[1] so libabigail won't build on any other system
against musl.
Instead, use AC_SEARCH_LIBS to look for fts_open in libc then libfts. Do
this before the check for behaviour just in case someone has a standalone
and broken implementation. I assume that the standalone fts is installed
on the standard search path, which should be a fair assumption.
As we're not using pkg-config anymore the required link flags are now in
LIBS, so remove all instances of FTS_CFLAGS and FTS_LIBS.
[1] https://gitweb.gentoo.org/repo/gentoo.git/commit/sys-libs/fts-standalone?id=a403fe6c61d1aaeecd58d521f3def2f6d3513449
* configure.ac: Use AC_SEARCH_LIBS to look for fts_open in libc
and in libfts if necessary. Remove the use of FTS_LIBS which is
now unnecessary.
* src/Makefile.am: Do not use FTF_LIBS as it's now unnecessary.
* tools/Makefile.am: Likewise.
Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
btf::reader::initialize forgets to reset a few data members used
during binary type information loading. This resetting is key to get
the reader ready for being re-used to load a new binary, like a kernel
module. Otherwise, the working set just keeps growing unnecessarily.
* src/abg-btf-reader.cc (btf::reader::initialize): Clear
types_to_canonicalize_, btf_type_id_to_artifacts_ and cur_tu_.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
After cleaning up re-initialization sequence of the the CTF reader ,
Claudiu Ianculescu suggested that I look into the DWARF reader's
initialization sequence as well. Lo and behold, the
dwarf::reader::read_debug_info_into_corpus calls
reader::clear_per_corpus_data while reader::initialize does not.
This patch moves the call to reader::clear_per_corpus_data into
reader::initialize. It makes the code consistent with what we are now
doing in the CTF reader.
* src/abg-dwarf-reader.cc (reader::initialize): Call
clear_per_corpus_data.
(reader::read_debug_info_into_corpus): Remove the call to
clear_per_corpus_data from here.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Profiling showed that during pre-canonicalization types sorting (which
uses type_topo_comp and decl_topo_comp sorting functors) we spend a
lot of time computing the pretty representation of types and decls
invoked from type_topo_comp::operator() and
decl_topo_comp::operator().
This patch thus uses type_base::get_cached_pretty_representation and
introduces a new similar decl_base::get_cached_pretty_representation
to cache the pretty representation of types and decls and re-use that
representation instead of computing it over and over.
Together with the previous patch of this series, the time spent to
analyze a Linux Kernel tree went from ~ 55 minutes to around 1m15s
using a non-optimized build of libabigail.
* include/abg-ir.h (decl_base::get_cached_pretty_representation):
Declare new member function.
* src/abg-ir-priv.h ({type,decl}_topo_comp::operator()): Use
{type,decl}_base::get_cached_pretty_representation instead of
get_pretty_representation.:
* src/abg-ir.cc (decl_base::priv::{internal_cached_repr_,
cached_repr}): Define new data members.
(decl_base::get_cached_pretty_representation):
Define new member function.
(type_base::get_cached_pretty_representation): Cache pretty
representation even for non-canonicalized types. Fix comments.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When analyzing a Linux Kernel tree made of vmlinux and loadable module
binaries, the same (CTF) binary reader is re-used to load every single
binaries in a loop. That can be seen, for instance, by reading the
code of load_vmlinux_corpus in abg-tools-utils.cc.
As part of that process, abigail::ctf::reader::initialize is invoked
prior to using the reader to read type information from each binary.
But then, looking at things a bit closer, I realized that
ctf::reader::initialize is failing to reset the reader::ctfa data
member. That leads to a memory leak that was making things grow
out of proportion.
Also, the resetting code fails to actually clear out the map of types
that are to be sorted and canonicalized. That leads to unnecessarily
sorting huge amounts of types.
The patch address the two points above.
Apart from the obvious gain in code integrity, this patch
significantly reduces the time taken to analyze a Linux Kernel tree.
Please note that the subsequent patch coming after this one will
reduce that time even further.
* src/abg-ctf-reader.cc (reader::reader): Initialize ctfa,
ctf_sect, symtab_sect and strtab_sect data members.
(reader::initialize): In the overload taking no argument, make
sure to free the ctfa data member before setting it to nullptr.
In the overload that takes arguments, make sure to invoke
reader::initialize() to really free the data used. Also, improve
the comments.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Log the time spent while reading the CTF archive and canonicalizing it.
* src/abg-ctf-reader.cc (do_log()): Getter of the do_log flag.
(read_corpus()): Add time logging.
Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Sorting the functions and variables is done twice. First in the
process_ctf_archive() and second in read_corpus(). However, we need
to call them only once when we do the canonicalization of all types
and functions. Thus, move canonicalization of types in read_corpus()
and perfom only once sorting the functions and types.
* abg-ctf-reader.cc (process_ctf_archive()): Move
canonicalize_all_types(), sort_functions() and sort_variables()...
(read_corpus()): ...here, just after calling process_ctf_archive().
Signed-off-by: Claudiu Zissulescu <claudiu.zissulescu-ianculescu@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
* src/abg-leaf-reporter.cc (leaf_reporter::report): In the
overload for corpus_diff, avoid using auto type deduction in
for-each loop.
Signed-off-by: Romain Geissler <romain.geissler@amadeus.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When analyzing a Linux Kernel tree, the BTF reader needs to be reset
after each binary (vmlinux or module) read. It turns out the reset
was not being done properly. Fixed thus. Also, I noticed that
reader::read_debug_info_into_corpus would not return an empty corpus
when no BTF information was found in the binary. Fixed as well.
* src/abg-btf-reader.cc (reader::initialize): Free the btf handle
first thing as part of the re-initialization.
(reader::~reader): Once the BTF handle has been freed, set it to
nil to show that it's been deleted.
(reader::read_debug_info_into_corpus): If no BTF handle could be
retrieved then it means no BTF data was found on the binary.
Thus, return an empty corpus.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When building the ABI for a Linux kernel that has BTF and DWARF debug
info, the --btf option doesn't select the BTF debug info if DWARF is
also present.
Fixed thus.
* tools/abidw.cc (load_kernel_corpus_group_and_write_abixml):
Support --btf.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When 'abidw --lt /some/dir' runs with /some/dir being a linux kernel
tree built from source (as opposed to coming from a distribution),
get_binary_paths_from_kernel_dist misbehaves because it expects to
find modules somewhere under/lib/modules. This patch makes it support
linux kernel trees built from source by looking for modules all over
the place, wherever they might be.
* src/abg-tools-utils.cc (get_binary_paths_from_kernel_dist): Look
for kernel modules under the root directory by default.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When is_regular_file is given a directory, it loops endlessly. Oops.
Fixed thus.
* src/abg-tools-utils.cc (is_regular_file): Loop on symbolic links
only.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
While looking at something else, it appeared that the process of
setting the size of the array_type_def::subrange_type is wrong for all
front-ends.
For this patch, I went back to read the DWARF 5 specification at
"5.13/ Subrange Type Entries".
Basically, the size of the subrange type as described by the
DW_TAG_subrange_type DIE is set either:
* by the size of the base type designated by the DW_AT_type
attribute.
* or by the DW_AT_byte_size or DW_AT_bit_size attribute that might
be present on the DIE.
That is different from the length property carried by the subrange
type.
The patch updates the four front-rends (DWARF, BTF, CTF and ABIXML) to
fix the setting process of the size of the subrange type and adjusts
the testsuite accordingly.
* src/abg-btf-reader.cc (reader::build_array_type): The size of
the subrange is not defined specifically. Let's set it to the
default address size of the translation unit.
* src/abg-ctf-reader.cc (build_array_ctf_range): If no basis type
was found, then set the size of the subrange type to the default
address size of the translation unit.
* src/abg-dwarf-reader.cc (build_subrange_type): Consider the
DW_AT_byte_size and DW_AT_bit_size attribute of
DW_TAG_subrange_type if present. Otherwise, if the basis type is
present, its size as the size of the subrange type. Otherwise,
use the default address size of the translation unit as the size
of the subrange type.
* src/abg-ir.cc (array_type_def::subrange_type::subrange_type): If
the underlying (basis) type is present, then use its size as the
size of the subrange type. Otherwise the size is zero.
(array_type_def::subrange_type::set_underlying_type): Update the
size of the subrange when setting a new underlying (basis) type.
* src/abg-reader.cc (build_subrange_type): Read and set the size
of the subrange.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-1.txt:
Adjust.
* tests/data/test-abidiff-exit/ada-subrange/test1-ada-subrange/test1-ada-subrange-report-2.txt:
Likewise.
* tests/data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-1.txt:
Likewise.
* tests/data/test-abidiff-exit/ada-subrange/test2-ada-subrange-redundant/test2-ada-subrange-redundant-report-2.txt:
Likewise.
* tests/data/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64--2.24.2-30.fc30.x86_64-report-0.txt:
Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Cestmir Kalina reported that running configure with --enable-btf with
no BTF header present on the system wrongly leads to the BTF
front-end of libabigail being enabled, and later leads to
compilation/installation errors.
This patch fixes that by ensuring that the ENABLE_BTF variable set by
the --enable-btf option handling code is not reused later during
actual btf.h header file detection code.
* configure.ac: Use a new HAS_BTF_HEADERS to store the detection
status for the btf.h header. Emit a better notice message when
the BTF header file is found.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Tested-by: Cestmir Kalina <ckalina@redhat.com>
For now, the BTF nodes BTF_KIND_DECL_TAG, BTF_KIND_DATASEC, and
BTF_KIND_UNKN are ignored by libabigail, in practice. We should thus
not abort when we encounter them. Fixed thus. Many thanks to Cestmir
Kalina for reporting this.
* src/abg-btf-reader.cc (build_ir_node_from_btf_type): Ignore and
return nil for node of kind BTF_KIND_DECL_TAG, BTF_KIND_DATASEC,
and BTF_KIND_UNKN. For all other nodes, abort.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
# Veuillez saisir le message de validation pour vos
modifications. Les lignes # commençant par '#' seront ignorées, et
un message vide abandonne la validation. # # Sur la branche
master # Votre branche est à jour avec 'origin/master'. # #
Modifications qui seront validées : # modifié :
src/abg-btf-reader.cc # # Fichiers non suivis: #
doc/api/libabigail.doxy.bak # patches/ # prtests/ # #
------------------------ >8 ------------------------ # Ne touchez
pas à la ligne ci-dessus. # Tout ce qui suit sera éliminé.
diff --git a/src/abg-btf-reader.cc b/src/abg-btf-reader.cc
index f22e92bf..67206bb4 100644
--- a/src/abg-btf-reader.cc
+++ b/src/abg-btf-reader.cc
@@ -486,12 +486,16 @@ public:
#ifdef WITH_BTF_KIND_TYPE_TAG
case BTF_KIND_TYPE_TAG/* Type Tag */:
+ break;
#endif
#ifdef WITH_BTF_KIND_DECL_TAG
case BTF_KIND_DECL_TAG/* Decl Tag */:
+ break;
#endif
case BTF_KIND_DATASEC/* Section */:
+ break;
case BTF_KIND_UNKN/* Unknown */:
+ break;
default:
ABG_ASSERT_NOT_REACHED;
break;
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This fixes the temporary breakage I have introduced by committing too
soon the patch below that should have been committed after the type
hashing patch:
d26bd3d2 dwarf-reader,ir: Merge member fns of classes
Oops.
That patch introduces some instability in the ABIXML output due to the
fact that sorting of function types in particular is not deterministic
enough. I believe that because the sorting is using the internal
pretty representation of function types, it can introduce instability
in the sorting of two types that are equivalent modulo one typedef,
because the internal pretty representation strips typedefs off of
function return and parameter types. This patch fixes that by using
the type_topo_comp operator used in the IR for sorting types, instead
of having a different sorting routine in the ABIXML writer. Another
instability is due to the fact that method types where there is no
parameter beside the implicit "this" parameter and that are different
due to const-ness of the enclosing class could not be told apart. The
patch fixes that as well.
The patch also sorts types before canonicalizing them in the ABIXML
reader, so that type canonicalization happens in the same order (in
DWARF and ABIXML) to minimize changes in canonicalization results
between DWARF and ABIXML. This should hopefully help minimize
self-comparison errors.
Note that sorting types (based on their pretty representation) before
canonicalizing them might incur some (temporary) slowness that I
believe should be handled by the coming type hashing patch set. If we
see that the slowness is not bearable, we might remove that sorting at
some point. For now, let's keep it for testing purposes.
* src/abg-ctf-reader.cc (reader::canonicalize_all_types): Use a
temporary vector as input for ir::canonicalize_types because it
needs an ordered container as it now sorts types before
canonicalizing them.
* src/abg-dwarf-reader.cc (reader::types_to_canonicalize): Add a
non-const overload for this accessor.
* src/abg-ir-priv.h (compare_using_locations)
(is_ptr_ref_or_qual_type): Add a declaration for these functions
defined in abg-ir.cc.
(struct decl_topo_comp, struct type_topo_comp): Move these here,
from abg-ir.cc.
(canonicalize_types): Sort the types before canonicalizing them.
* src/abg-ir.cc (compare_using_locations): Turn this from static
to non-static, now that it's declared in abg-ir-priv.h.
(struct decl_topo_comp, struct type_topo_comp): Move these into
abg-ir-priv.h.
* src/abg-reader.cc: Include abg-ir-priv.h.
(reader::perform_late_type_canonicalizing): Use
ir::canonicalize_types, rather than canonicalizing types one by
one.
* src/abg-writer.cc: Include abg-ir-priv.h.
(struct type_topo_comp): Remove.
(write_context::sort_types): Use type_topo_comp from abg-ir-priv.h
instead of type_topo_comp that was removed.
* tests/data/test-annotate/test13-pr18894.so.abi: Adjust.
* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
Likewise.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Likewise.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
* tests/data/test-read-write/test28-without-std-fns-ref.xml:
Likewise.
* tests/data/test-read-write/test28-without-std-vars-ref.xml:
Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
* src/abg-elf-reader.cc (reader::variable_symbol_is_exported): Do
not crash when the symbol we are looking at is non-present.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
I have wrongly added a patch to the source repository. Oops. Remove it.
* patches/0001-WIP-Emit-read-undefined-interfaces-to-from-ABIXML.patch:
Remove from the repository.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
The error message in test_task::run_abidw in test-read-common.cc is
wrong. Fixed thus. Also, emit the error message directly to the standard
error as the error is detected.
* tests/test-read-common.cc (test_task::run_abidw): Fix error
message and emit it to stderr directly.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When looking at something else, I realized that in DWARF, two classes
C and C' of the same name and coming from the same corpus might not
have the same member functions that are defined. This is probably
because for a given translation unit, some compilers emit debug info
only for the member functions that are used somehow.
So, depending on which of C or C' is the canonical class in the end,
we will not necessarily have the same member functions emitted in
ABIXML. That is annoying. So there was a kludge in
maybe_adjust_canonical_type to ensure that the canonical type has all
the member functions of the types belonging to same class of
equivalence.
This patch adds a pass before type canonicalization in the DWARF
reader to ensure that all classes of the same name in a given corpus
have the same member functions. The patch thus removes the now
unnecessary kludge from maybe_adjust_canonical_type and asserts the
impossibility of the member function discrepancy.
* src/abg-dwarf-reader.cc (reader::{copy_missing_member_functions,
contains_anonymous_class, merge_member_functions_of_classes,
merge_member_functions_in_classes_of_same_names}): Define new
member functions.
(reader::read_debug_info_into_corpus): Call the reader::new
merge_member_functions_in_classes_of_same_names.
* src/abg-ir.cc (maybe_adjust_canonical_type): When looking at the
canonical type C of a type T, if they both come from the same
corpus, assert that C has all the member functions of T. This
because the DWARF reader now ensures that all types have the same
name in a given corpus have the same member functions.
* tests/data/test-annotate/test14-pr18893.so.abi: Adjust.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
There is a confusion in the DWARF reader about static member functions
and non-static member functions. With recent versions of DWARF, a
member function with the DW_AT_object_pointer attribute is known to
have a this-pointer and thus designates a non-static member function.
DWARF emitted by gcc 4.4.x and previous compiler didn't emit the
DW_AT_object_pointer so we need to look at the first parameter of the
member function, make sure it's artificial and pointers to a pointer
to the same class as the class of the current member function.
This patch avoids to confuse static and non-static member functions by
telling apart types of static member functions, non-static member
function and non member functions. This fixes the representation of
several method types and function declaration signatures across the
test suite.
* include/abg-ir.h (method_type::get_is_for_static_method): Add
new method.
* src/abg-dwarf-reader.cc (fn_die_first_parameter_die)
(member_fn_die_has_this_pointer, die_peel_typedef): Define new
static functions.
(die_this_pointer_is_const): Make this support DIEs representing
const pointers.
(die_function_type_is_method_type): Use the new
member_fn_die_has_this_pointer function rather than (wrongly) open
coding its functionality. If the (member) function DIE has no
this pointer DIE and if the function is at class scope, then we
are looking a static member function.
(finish_member_function_reading): Use the new
method::get_is_for_static_method method rather than open-coding
its functionality.
* src/abg-ir.cc (method_type::get_is_for_static_method): Define
new method.
(type_topo_comp::operator()): In this comparison
operator for types, if two method types have the same string
representation then if one method type is for a static method,
then make the non-static method type come first.
(function_type::get_first_non_implicit_parm): The first parameter
of a function can only carry the "this pointer" if it's
artificial.
* tests/data/test-abidiff-exit/PR31513/reported/PR31513-reported-report-1.txt:
Adjust.
* tests/data/test-abidiff/test-struct1-report.txt: Likewise.
* tests/data/test-abidiff/test-struct1-v0.cc.bi: Likewise.
* tests/data/test-abidiff/test-struct1-v1.cc.bi: Likewise.
* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
Likewise.
* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
Likewise.
* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt:
Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt:
Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt:
Likewise.
* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt:
Likewise.
* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-1.txt:
Likewise.
* tests/data/test-diff-filter/test41-report-0.txt: Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
Likewise.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
is_non_canonicalized_type is the function that decides which type
should be canonicalized or not. So, code that expects a type to be
canonicalized should comply with the rule of
is_non_canonicalized_type, aka The Rule. It turns out, the IR node
visitor code fails to comply with The Rule. Fixed thus. Note that
with this commit, the program build/tests/testirwalker now works fine
on itself. Many thanks to Cestmir Kalina who noticed and reported the
issue.
* src/abg-ir.cc (ir_node_visitor::{mark_type_node_as_visited,
type_node_has_been_visited}): Invoke is_non_canonicalized_type to
know if we should expect a type to have a canonical type or not.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
While looking at something else, it occurred to me that function type
annotation in ABIXML (as emitted by abidw --annotate) is wrong,
especially when it comes to pointer to member function types. Now
that we support pointer to member function types naming, just using
ir::get_type_name in the annotate function should be enough to do the
trick. And this is what this patch does.
Also, I realized that get_function_type_name was wrongly invoking
get_pretty_representation on the return type of the function type,
instead of just emitting its type name. This patch fixes that as
well.
* src/abg-ir.cc (get_function_type_name, get_method_type_name):
Use get_type_name in lieu of get_pretty_representation.
* src/abg-writer.cc (annotate): In the overload for function_type,
use get_function_name instead of open coding function type
representations.
* tests/data/test-annotate/test-pointer-to-member-1.o.annotated.abi: Adjust.
* tests/data/test-annotate/test13-pr18894.so.abi: Likewise.
* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi: Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi: Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi: Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt: Likewise.
* tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt: Likewise.
* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
Likewise.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
'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.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Some distributions don't have the libarchive python module packaged.
This patch makes that module optional and enables abidb to function
without it, as it's only necessary for the support of the '--archive'
command line option of the abidb program.
* configure.ac: Detect the libarchive python module as an optional
dependency for the abidb program. So far, only the git python
module remains a hard dependency.
* tools/abidb (main): Do not support the '--archive' command line
option if the libarchive python module is not present.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
The apidoc is not generating any documentation for the libabigail::btf
and libabigail::ctf namespaces.
It turns out I need to add some doxygen comment to the these namespaces
in the source code. Fixed thus.
* include/abg-btf-reader.h (namespace btf): Add doxygen comment.
Just adding it to the *.cc won't cut it, I am not sure why.
* include/abg-ctf-reader.h (namespace ctf): Likewise.
* src/abg-btf-reader.cc (namespace btf): Add doxygen comment.
* src/abg-ctf-reader.cc (namespace ctf): Add doxygen commit.
(create_reader, reset_reader): Fix doxygen comments.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
When doing "make doc", doxygen issues a lot of warning due to the the
configuration file using old property values.
This patch updates the doxygen configuration file for the apidoc using
doxygen -u.
* doc/api/libabigail.doxy: Update using doxygen -u.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
While looking at packaging libabigail for EPEL8, it turned out abidb
requires python 3.9 for the type hints on function definitions. Yet,
EPEL8 has an older python.
This patch adds a --disable-abidb option to configure to handle EPEL8.
* configure.ac: Add a --disable-abidb option to configure to
disable the abidb tool and related tests.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
By default, using abidw --abidiff on the binary
/usr/lib64/libwebkit2gtk-4.0.so.37 on the ppc64le platform takes more
than 50GB of RAM and ooms on my system. That is why a number of
suppression specifications have been put in place in the
default.abignore file that is installed by default on the system.
With that suppression specification however, abidw --abidiff hits an
assert and crashes.
That is because the suppression specification rule below is too eager
and thus removes parameters from some function's signature, in the
final internal representation:
[suppress_type]
soname_regexp = libwebkit2?gtk-.*\\.so.*
name_regexp = (^std::.*|WebCore::.*|WebKit::.*)
drop = true
An example of function signature that got changed (in the IR) because
of this suppression specification is:
This function signature:
WebKitAuthenticationScheme
webkit_authentication_request_get_scheme(WebKitAuthenticationRequest*)
becomes (after applying the suppression specification above):
void
webkit_authentication_request_get_scheme()
Woops. That is not good.
To address that problem, this patch changes that suppression
specification to make libabigail transform those types into opaque
types. An opaque struct, class or enum is essentially a
declaration-only type of the same kind and name.
So the suppression specification above becomes:
[suppress_type]
# Drop all standard c++ types on the floor like before.
soname_regexp = libwebkit2?gtk-.*\\.so.*
name_regexp = ^std::.*
drop = true
[suppress_type]
# Transform all C++ types in the WebCore and WebKit namespaces into
# opaque types. These are essentially internal types of libwebkit2
# anyway. This greatly reduces the size of the in-memory working set.
label = libabigail::OPAQUE_TYPE_LABEL
soname_regexp = libwebkit2?gtk-.*\\.so.*
name_regexp = (WebCore::.*|WebKit::.*)
drop = true
Notice the introduction of the new special label
"libabigail::OPAQUE_TYPE_LABEL". This new special label is what makes
the suppression engine of libabigail transform a type (that matches
that suppression specification) into an opaque type, rather than
dropping it on the floor.
The patch then adapts the code of the suppression engine to detect
this special label for the purpose of transforming types into opaque
types. The patch normalizes the use of the term "opaque type" instead
of "private type" that was used previously in the code.
The patch fixes a bug in the code of get_opaque_version_of_type that
prevents this function from working on types with no location
information.
While working on this, I have noticed that the abipkgdiff has a bug
that was making it ignore suppression specifications provided via the
--suppression option. The patch fixes that.
I have noticed that abipkgdiff --self-check completely ignores all
suppression specifications provided either via --suppression or
indirectly via devel packages. The patch fixes that.
Last but not least, fedabipkgdiff --self-compare completely ignores
suppression specifications too! The patch fixes that as well.
With all those fixes, the system now takes around 7GB of RAM and ~ 30
minutes to complete the analysis of the webkit2gtk3 package, using a
non-optimized libabigail build.
The command I use is:
$ time tools/fedabipkgdiff --debug --self-compare --abipkgdiff build/tools/abipkgdiff --suppressions default.abignore -a --from fc39 webkit2gtk3
[...]
[DEBUG] Result from run_abipkgdiff: 0, in: 0:29:00.088735
[DEBUG] Result from self_compare_rpms_from_distro: 0, in: 0:29:20.721748
real 29m20,846s
user 29m4,561s
sys 2m41,611s
$
The culprit package was webkit2gtk3-2.40.1-1.fc36.ppc64le.rpm.
To reproduce the issue on that package, I do:
$ time ~/git/libabigail/rhbz2273891/build/tools/abipkgdiff --self-check --suppr ~/git/libabigail/rhbz2273891/default.abignore --d1 webkit2gtk3-debuginfo-2.40.1-1.fc36.ppc64le.rpm --devel1 webkit2gtk3-devel-2.40.1-1.fc36.ppc64le.rpm webkit2gtk3-2.40.1-1.fc36.ppc64le.rpm
==== SELF CHECK SUCCEEDED for 'libwebkit2gtk-4.0.so.37.63.2' ====
==== SELF CHECK SUCCEEDED for 'WebKitWebDriver' ====
==== SELF CHECK SUCCEEDED for 'WebKitNetworkProcess' ====
==== SELF CHECK SUCCEEDED for 'WebKitWebProcess' ====
real 8m25,895s
user 8m46,433s
sys 0m15,683s
$
* default.abignore: Split the libwebkit2gtk suppression
specification for types whose names match the regexp
^std::.*|WebCore::.*|WebKit::.* into two. One that drops type
with names being ^std::.* and another one that turns type being
WebCore::.*|WebKit::.* into opaque types.
* doc/manuals/libabigail-concepts.rst: Add documentation for the
new special label libabigail::OPAQUE_TYPE_LABEL that transforms
types matching a [suppress_type] into opaque types.
* include/abg-suppression.h (is_opaque_type_suppr_spec): Renamed
is_private_type_suppr_spec into this.
(get_opaque_types_suppr_spec_label): Renamed
get_private_types_suppr_spec_label.
* src/abg-comparison.cc (diff::is_suppressed): Adjust.
* src/abg-dwarf-reader.cc (type_is_suppressed): Adjust. Change the
name of the type_is_private parameter into type_is_opaque.
(get_opaque_version_of_type): Do not return early if the type has
no associated location. What was I thinking.
(build_ir_node_from_die): For enums, struct and classes adjust
call to type_is_suppressed.
* src/abg-suppression.cc (type_suppression::suppresses_diff):
Adjust to using is_opaque_type_suppr_spec and
get_opaque_version_of_type in lieu of is_private_type_suppr_spec
and get_private_types_suppr_spec_label.
(get_opaque_types_suppr_spec_label): Rename
get_private_types_suppr_spec_label into this. Also, rename the
name of the special label that specifies opaque types from
"Artificial private types suppression specification" to
"libabigail::OPAQUE_TYPE_LABEL".
(is_opaque_type_suppr_spec): Rename is_private_type_suppr_spec
into this.
(is_type_suppressed): Rename the "type_is_private" parameter into
"type_is_opaque".
* src/abg-tools-utils.cc (handle_file_entry): Adjust to using
get_opaque_types_suppr_spec_label rather than
get_private_types_suppr_spec_label.
* tools/abipkgdiff.cc (compare): Use the supprs variable where all
the suppression specifications got accumulated, not just the
priv_types_supprs1.
(compare_to_self): Add a suppression specifications variable for
private types. Add those private types specs to the user-provided
ones.
* tools/fedabipkgdiff (abipkgdiff): In the self comparison mode,
take into account devel packages and suppression specifications.
Pass those to the abipkgdiff tool's invocation.
* tests/data/test-diff-suppr/PR31646/test-PR31646-result-[1-3].txt:
New reference test output files.
* tests/data/test-diff-suppr/PR31646/test-PR31646-v{0,1}.cc:
Source code of binary inputs below.
* tests/data/test-diff-suppr/PR31646/test-PR31646-v{0,1}.o: Binary
input files.
* tests/data/test-diff-suppr/PR31646/test-PR31646.2.abignore:
Suppression specification file.
* tests/data/test-diff-suppr/PR31646/test-PR31646.abignore:
Likewise.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-diff-suppr.cc (in_out_specs): Add the new test input
to this harness.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
In binaries originating from OCaml on s390x or ppcle platforms, it can
happen that a function symbol aliases a variable symbol.
By default, the ABIXML reader doesn't expect that. It expects that
all aliases of a symbol are symbols of the same kind as their target.
This patch relaxes that constraint from the ABIXML reader. It teaches
read_symbol_db_from_input how to resolve unresolved function (resp.
variable) symbol aliases to variable (resp. function) symbols.
* src/abg-reader.cc (typedef string_strings_map_type): Define new
typedef.
(resolve_symbol_aliases): Define new function.
(build_elf_symbol_db): Add two new parameters to carry unresolved
function and variable symbol aliases. When a symbol alias can't
resolve to any of the symbols of its kind (function or variable)
then stage the alias away in the set of unresolved aliases. That
set is then going to be resolved later.
(read_symbol_db_from_input): Add two new parameters to carry
unresolved function and variable symbol aliases. Pass them down
to build_elf_symbol_db.
(reader::read_corpus): Adjust the invocation of
read_symbol_db_from_input to get the sets of unresolved function &
variable symbol aliases. Invoke the new resolve_symbol_aliases
the unresolved function & variable aliases.
* tests/data/test-diff-pkg/PR29610/guestfs-tools-1.51.6-2.el9.s390x-self-check-report.txt:
New test reference output.
* tests/data/test-diff-pkg/PR29610/guestfs-tools-1.51.6-2.el9.s390x.rpm:
New binary test input.
* tests/data/test-diff-pkg/PR29610/guestfs-tools-debuginfo-1.51.6-2.el9.s390x.rpm:
Likewise.
* tests/data/Makefile.am: Add this new test material to source
distribution.
* tests/test-diff-pkg.cc (in_out_specs): Add the new test input to
this test harness.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
As Jianfeng Fan pointed out in a comment at
https://sourceware.org/bugzilla/show_bug.cgi?id=31513#c14, there is a
thinko in commit
https://sourceware.org/git/?p=libabigail.git;a=commit;h=338394f5454990c715b52bb4bc2ed47b39d6528b.
has_subtype_changes forgets to reset the s_member when f_member is
reset. Both variables should be reset in tandem, just like what is
done in has_offset_changes.
Fixed thus.
* src/abg-comp-filter.cc (has_subtype_changes): Reset s_member in
the loop, just like f_member.
* tests/data/test-abidiff-exit/PR31513/non-regr/report1.txt: Adjust.
* tests/data/test-abidiff-exit/PR31513/non-regr/report2.txt: Adjust.
* tests/test-abidiff-exit.cc (in_out_specs): Adjust.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
It has been reported over IRC by Robin Jarry that in some cases,
abidiff would wrongly consider anonymous data members as being
deleted. These are cases where the anonymous data members were moved
into other anonymous data members without incurring any size or offset
change.
This patch reduces (and hopefully eliminates) false positives in
detecting anonymous data members deletion by considering the leaf data
members of the anonymous data members.
It considers that if all leaf data members contained in the previous
anonymous data members are still present in the new version of the
type, then no data member deletion occurred, basically.
The non-regression test added to this patch contains two binaries that
Robin Jarry sent me. They were built for the source code before and
after the patch he submitted at
http://patches.dpdk.org/project/dpdk/patch/20240327091440.1166119-2-rjarry@redhat.com/.
Note that I have also added a synthetic reproducer example I came up
with after understanding the issue at hand.
* src/abg-comparison.cc
(class_or_union_diff::ensure_lookup_tables_populated): If leaf
data members of an anonymous data member are still present in the
new version of the class, then the anonymous data member cannot be
considered as being removed from the second version of the class.
* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/report0.txt:
Reference test output.
* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/test0-v{0,1}.c:
Source code of the binary input below.
* tests/data/test-abidiff-exit/non-del-anon-dm/non-regr/test0-v{0,1}.o:
New binary test input.
* tests/data/test-abidiff-exit/non-del-anon-dm/reported/binaries-origin.txt:
File mentioning the origin of the reported binary.
* tests/data/test-abidiff-exit/non-del-anon-dm/reported/librte_graph.so.24.{0,1}:
Binary test input.
* tests/data/test-abidiff-exit/non-del-anon-dm/reported/report0.txt:
Reference test output.
* tests/data/Makefile.am: Add the test material above to source
distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add test material
above to this harness.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Consider the 'struct type' below and its use in the file
example-v0.cc:
//----> example-v0.cc: <------
struct type
{
int m0;
};
int
use(type& t)
{
return t.m0;
}
//---->8<-----
Now, consider a second version of that program where the data member
of the 'struct type' is moved into a base class:
//----> example-v1.cc: <------
struct base
{
int m0;
};
struct type : public base
{
};
int
use(type& t)
{
return t.m0;
}
//---->8<------
The first and second version of 'struct type' are ABI compatible
because neither the size of 'struct type' nor the offset of the data
member m0 has changed.
But then look at what abidiff says:
$ abidiff example-v0.o example-v1.o || echo "exit code: $?"
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 function with some indirect sub-type change:
[C] 'function int use(type&)' at example-v0.cc:7:1 has some indirect sub-type changes:
parameter 1 of type 'type&' has sub-type changes:
in referenced type 'struct type' at example-v1.cc:6:1:
type size hasn't changed
1 base class insertion:
struct base at example-v1.cc:1:1
1 data member deletion:
'int m0', at offset 0 (in bits) at example-v0.cc:3:1
exit code: 4
$
abidiff considers that the mere addition of a base class constitutes a
potential ABI incompatibility.
Also, abidiff fails to see that although the data member m0 was
removed from 'struct type' itself, it was moved into its new base
type. In practice, the data member m0 is still a member of 'struct
type', by definition of class type inheritance.
Thus, the exit code of abidiff is ABIDIFF_ABI_CHANGE which value is 4.
This patch fixes this problem.
First of all, here is what abidiff now says with this patch:
$ abidiff example-v0.o example-v1.o && echo "return code: $?"
Functions changes summary: 0 Removed, 0 Changed (1 filtered out), 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
return code: 0
$
In other words, abidiff now recognizes the changes as being ABI
compatible and filters them out by default.
Furthermore, here are the changes that abidiff sees when asked to
avoid filtering these (now considered harmless) changes:
$ abidiff --harmless example-v0.o example-v1.o && echo "return code: $?"
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
1 function with some indirect sub-type change:
[C] 'function int use(type&)' at example-v0.cc:7:1 has some indirect sub-type changes:
parameter 1 of type 'type&' has sub-type changes:
in referenced type 'struct type' at example-v1.cc:6:1:
type size hasn't changed
1 base class insertion:
struct base at example-v1.cc:1:1
$
We can see that abidiff no longer considers that the data member m0
was deleted.
At its core, this patch teaches
class_diff::ensure_lookup_tables_populated to detect data members
being moved to base classes. That detection prevents the code base to
consider those data members as being removed from the class.
Now that the moved data members are not considered as removed, the
patch goes further to consider data member moves to base classes that
are not accompanied with any size or offset change as being harmless,
and thus, to be filtered out by default.
To that end, the patch teaches categorize_harmful_diff_node that an
added base classes is not necessarily a harmful change if it is not
accompanied with a size or offset change. Rather, an added base
classes (or any change to a class) not accompanied with a size or
offset change is now categorized into
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY. Note that the previous
HARMLESS_UNION_CHANGE_CATEGORY was renamed into
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.
Incidentally, a removal of a base class or any change accompanied with
an offset change is always categorized as harmful change.
The patch also adds several non-regression tests.
* include/abg-comparison.h (typedef string_decl_base_sptr_map):
Move this typedef to include/abg-fwd.h:
(HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY): Inside the enum
diff_category, rename the enumerator
HARMLESS_UNION_CHANGE_CATEGORY into this.
(EVERYTHING_CATEGORY): Adjust this enum to refer to
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY, no more HARMLESS_UNION_CHANGE_CATEGORY
* include/abg-fwd.h (typedef string_decl_base_sptr_map): Move this
typedef here from abg-comparison.h
(collect_non_anonymous_data_members): Declare new function.
* src/abg-comp-filter.cc (has_offset_changes)
(type_has_offset_changes, has_offset_changes)
(has_subtype_changes, class_diff_has_only_harmless_changes):
Define new static functions.
(base_classes_removed): Rename base_classes_added_or_removed into
this and update comment.
(categorize_harmless_diff_node): Changes that were categorized as
HARMLESS_UNION_CHANGE_CATEGORY is now categorized as
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY. Also, a diff that
satisfies either union_diff_has_harmless_changes or
class_diff_has_only_harmless_changes is categorized as
HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY.
(categorize_harmful_diff_node): Adjust to invoke
base_classes_removed instead of base_classes_added_or_removed. An
added base class doesn't necessarily qualifies as a harmful change
anymore. Rather, a diff node that carries an offset change as
detected by type_has_offset_changes is categorized as
SIZE_OR_OFFSET_CHANGE_CATEGORY.
* src/abg-comparison.cc (get_default_harmless_categories_bitmap):
Adjust to use
abigail::comparison::HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY
rather than abigail::comparison::HARMLESS_UNION_CHANGE_CATEGORY.
(operator<<(ostream& o, diff_category c)): Likewise.
(class_diff::ensure_lookup_tables_populated): Detect data members
that are moved into base classes to avoid considering those data
members as being removed from the class.
* src/abg-default-reporter.cc (default_reporter::report): Adjust
to use HARMLESS_UNION_OR_CLASS_CHANGE_CATEGORY rather than
HARMLESS_UNION_CHANGE_CATEGORY.
* src/abg-ir.cc (collect_non_anonymous_data_members): Define
function overloads.
* tests/data/test-abidiff-exit/PR31513/non-regr/libtest[1-4]-v{0,1}.so:
New binary test input files.
* tests/data/test-abidiff-exit/PR31513/non-regr/report[1-4.txt:
New reference output files.
* tests/data/test-abidiff-exit/PR31513/non-regr/test[1-4]-v{0,1}.cc:
Source code of the binary input files above.
* tests/data/test-abidiff-exit/PR31513/reported/PR31513-reported-report-{1,2}.txt:
New reference output files.
* tests/data/test-abidiff-exit/PR31513/reported/libloremipsum_gcc{7,11}.so:
New binary test input files.
* tests/data/test-abidiff-exit/PR31513/reported/libstdcpp.suppr:
New test suppression file.
* tests/data/Makefile.am: Add new test files above to source
distribution.
* tests/test-abidiff-exit.cc (in_out_specs): Add the new input
test files to this test harness.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
Adjust.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
Adjust.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
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>
It turns out the tool is almost always returning ABIDIFF_OK in weak
mode. Oops. Fixed thus. Also, update the test-abicompat.cc to test
for expected exit codes to catch this kind of regressions in the
future.
* tools/abicompat.cc (perform_compat_check_in_weak_mode): Do not
override the status code when doing the comparison in the reverse
direction.
(compare_expected_against_provided_functions)
(compare_expected_against_provided_variables): Set the status code
close to the detected diff. In the future, this might help us
provide finer grained status.
* tests/test-abicompat.cc (InOutSpec::status): Add a new data
member to represent the expected exit code.
(in_out_specs): Adjust the array of tests.
(main): If the actual exit code is different from the expected
one, then the test failed so let's report it.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This patch teaches the ABIXML writer to emit information about
undefined interfaces. It also teaches the ABIXML reader to read
information about undefined interfaces.
It introduces two new ABIXML elements:
'undefined-elf-function-symbols' and 'undefined-elf-variable-symbols'
to represent undefined function and variable symbols.
Then, in the 'abi-instr' element functions and variables that
reference undefined elf symbols now have an 'elf-symbol-id' attribute
referencing the undefined symbol listed in the new
'undefined-elf-variable-symbols' or 'undefined-elf-function-symbols'
element.
The patch introduces tests that perform compatibility checks done on
ABIXML files.
* include/abg-writer.h (set_write_undefined_symbols): Declare new
function.
(set_common_options): Use the new set_write_undefined_symbols in
this function template.
* src/abg-dwarf-reader.cc (reader::{get_die_language, die_is_in_c,
die_is_in_cplus_plus, die_is_in_c_or_cplusplus}): Move these
member functions into ...
(get_die_language, die_is_in_c, die_is_in_cplus_plus)
(die_is_in_c_or_cplusplus): ... these static non-member functions.
(fn_die_equal_by_linkage_name): Adjust and remove the now useless
reader parameter.
(compare_dies, get_scope_die, function_is_suppressed)
(variable_is_suppressed): Adjust.
(build_translation_unit_and_add_to_ir): When we are asked to load
undefined symbol, make sure to also analyze top-level class types
and if we are in C++, also analyze top-level unions and structs as
these might also have some undefined interfaces.
* src/abg-reader.cc (build_elf_symbol_db): Let's not construct and
return the symbol DB anymore. Rather, let's let the caller
construct it, so we can just update it with the input gathered.
(read_symbol_db_from_input): Support getting undefined function
and variable symbols from the new undefined-elf-function-symbols
and undefined-elf-variable-symbols elements. Note that undefined
and defined function symbols go into the same symbol DB whereas
undefined and defined variable symbols go into another symbol DB.
Now, we suppose that the variable & symbol DBs are allocated by
the caller. We pass it down to build_elf_symbol_db that populates
it. Maybe we should rename build_elf_symbol_db into
populate_elf_symbol_db.
(reader::read_corpus): Allocate the function
and variable symbol DB and let read_symbol_db_from_input populate
it. Sort functions and variables after reading the whole ABIXML.
* src/abg-writer.cc (write_context::write_context): Define new
data member.
(write_context::write_context): Initialize it.
(write_context::{get,set}::write_undefined_symbols): Define
accessors.
(set_write_undefined_symbols): Define a new function.
(write_context::decl_is_emitted): Add a new overload.
(write_elf_symbol_reference): Add a writer context and a corpus
parameter. If the symbol is not in the corpus or if the symbol is
undefined and we were not asked to emit undefined symbols then do
not emit any reference to it.
(write_translation_unit): Emit the undefined functions and
variables that belong to the current translation unit, along with
their reference to the undefined ELF symbol they are associated
to.
(write_var_decl, write_function_decl): Let
write_elf_symbol_reference decide whether it should emit the
reference to ELF symbol or not, as it now know how to make that
decision.
(write_corpus): Write the undefined function & variable ELF symbol
data bases. These in the new 'undefined-elf-function-symbols' and
'undefined-elf-variable-symbols' elements.
* tools/abidw.cc (options::load_undefined_interfaces): Define new
data member.
(options:options): Initialize it.
(display_usage): Add a help string for the
--no-load-undefined-interfaces option.
(parse_command_line): Parse the --no-load-undefined-interfaces
option.
(set_generic_options): Set the
fe_iface::option_type::load_undefined_interfaces option.
* doc/manuals/abidw.rst: Document the new
--no-load-undefined-interfaces of abidw.
* tests/data/test-abicompat/test10/libtest10-with-exported-symbols.so:
New binary input file.
* tests/data/test-abicompat/test10/libtest10-with-incompatible-exported-symbols.so:
New binary input file.
* tests/data/test-abicompat/test10/libtest10-with-incompatible-exported-symbols.so.abi:
New abixml input file.
* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols:
New binary input file.
* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols.abi:
New abixml input file.
* tests/data/test-abicompat/test10/test10-app-with-undefined-symbols.cc:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-fn-changed-report-0.txt:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-fn-changed-report-1.txt:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-fn-changed-report-2.txt:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-fn-changed-report-3.txt:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-fn-changed-report-4.txt:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-with-exported-symbols.cc:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-with-exported-symbols.h:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-with-incompatible-exported-symbols.cc:
New source file for binary test input
* tests/data/test-abicompat/test10/test10-with-incompatible-exported-symbols.h:
New source file for binary test input.
* tests/data/Makefile.am: Add new test input files to source
distribution.
* tests/test-abicompat.cc (in_out_specs): Add the new test inputs
to this test harness.
* tests/test-annotate.cc (main): Use the new
--no-load-undefined-interfaces option of abidw to keep the old
behavior.
* tests/test-read-common.cc (test_task::serialize_corpus): Do not
emit undefined symbols.
* tests/test-read-dwarf.cc (test_task_dwarf::perform): Likewise.
Signed-off-by: Dodji Seketeli <dodji@redhat.com>