]> sourceware.org Git - libabigail.git/log
libabigail.git
3 years agodwarf-reader: properly set artificial-ness in opaque types
Dodji Seketeli [Tue, 13 Apr 2021 14:17:39 +0000 (16:17 +0200)]
dwarf-reader: properly set artificial-ness in opaque types

get_opaque_version_of_type forgets to set the "is-artificial" property
according to the initial type the opaque type is derived from.  This
can lead to some instability in the abixml output.

Fixed thus.

* src/abg-dwarf-reader.cc (get_opaque_version_of_type): Propagate
the artificial-ness of the original type here.
* tests/data/test-read-dwarf/PR27700/test-PR27700.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: Canonicalize opaque enums and classes
Dodji Seketeli [Mon, 12 Apr 2021 10:48:14 +0000 (12:48 +0200)]
dwarf-reader: Canonicalize opaque enums and classes

This issue was reported in bug https://sourceware.org/bugzilla/show_bug.cgi?id=27700.

When we construct an opaque type (triggered by the use of
--drop-private-types along with the --headers-dir option on abidw, for
instance) with get_opaque_version_of_type we forget to canonicalize
the resulting type.

Later, at abixml emitting time (for instance)
hash_as_canonical_type_or_constant would rightfully abort because the
type wasn't canonicalized.  We want all types (okay, modulo one
exception) in the system to be canonicalized.

This patch fixes the problem by canonicalizing opaque types.

* src/abg-dwarf-reader.cc (build_ir_node_from_die): Canonicalize
opaque enums and classes.
* tests/data/test-read-dwarf/PR27700/include-dir/priv.h: New test
header file.
* tests/data/test-read-dwarf/PR27700/include-dir/pub.h: Likewise
* tests/data/test-read-dwarf/PR27700/pub-incdir/inc.h: Likewise.
* tests/data/test-read-dwarf/PR27700/test-PR27700.o: New binary
input file.
* tests/data/test-read-dwarf/PR27700/test-PR27700.abi: Reference
abi file of the binary above.
* tests/data/test-read-dwarf/PR27700/test-PR27700.c: Source file
of the binary above.
* tests/data/Makefile.am: Add the test material above to source
distribution.
* tests/test-read-dwarf.cc (InOutSpec::in_public_headers_path):
Add new data member.
(in_out_specs): Adjust to reflect the new data member in the
InOutSpec type.  Add a new test input.
(set_suppressions_from_headers): Define new static function.
(test_task::perform): Use the content of the new
InOutSpec::in_public_headers_path to construct and add
"--headers-dir <headers-dir> --drop-private-types" to the options
of the abidw program run.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agosymtab: Add support for MODVERSIONS (CRC checksums)
Matthias Maennich [Tue, 30 Jun 2020 22:37:14 +0000 (00:37 +0200)]
symtab: Add support for MODVERSIONS (CRC checksums)

The Linux Kernel has a mechanism (MODVERSIONS) to checksum symbols based
on their type. In a way similar to what libabigail does, but different.
The CRC values for symbols can be extracted from the symtab either by
following the __kcrctab_<symbol> entry or by using the __crc_<symbol>
value directly.

This patch adds support for extracting those CRC values and storing them
as a property of elf_symbol. Subsequently, 'crc' gets emitted as an
attribute of 'elf-symbol' in the XML representation.

CRC comparisons are also added to the abidiff machinery such that if
both representations of a comparison contain a CRC value, they will be
compared and if any of the values is unset (i.e. == 0), equality is
assumed. Differences will be reported in the format that the Kernel
presents them e.g. via Module.symvers. It is likely, but not necessary,
that a CRC difference comes along with an ABI difference reported by
libabigail. Not everything that leads to a change of the CRC value an
ABI breakage in the libabigail sense.

In case a function or variable symbol changes in a harmless way, we
would previously also consider a CRC change harmless (or more precise:
not harmful). Explicitly testing for CRC changes when analyzing whether
diff nodes need to be considered harmful, allows to still classify them
harmful.

Also add some test cases to ensure reading CRC values from kernel
binaries works as expected. The empty-report files have been
consolidated to one file: empty-report.txt. That also clarifies the
expected outcome for the affected tests.

* include/abg-ir.h (elf_symbol::elf_symbol): Add CRC parameter.
(elf_symbol::create): Likewise.
(elf_symbol::get_crc): New member method.
(elf_symbol::set_crc): New member method.
* src/abg-comp-filter.cc (crc_changed): New function.
(categorize_harmful_diff_node): Also test for CRC changes.
* src/abg-ir.cc (elf_symbol::priv::crc_): New data member.
* src/abg-ir.cc (elf_symbol::priv::priv): Add CRC parameter.
(elf_symbol::elf_symbol): Likewise.
(elf_symbol::create): Likewise.
(elf_symbol::textually_equals): Add CRC support.
(elf_symbol::get_crc): New member method.
(elf_symbol::set_crc): New member method.
* src/abg-reader.cc (build_elf_symbol): Add CRC support.
* src/abg-reporter-priv.cc (maybe_report_diff_for_symbol): Likewise.
* src/abg-symtab-reader.cc (symtab::load): Likewise.
* src/abg-writer.cc (write_elf_symbol): Likewise.
* tests/data/Makefile.am: Add new test data files.
* tests/data/test-abidiff-exit/test-crc-report.txt: New test file.
* tests/data/test-abidiff-exit/test-crc-v0.abi: Likewise.
* tests/data/test-abidiff-exit/test-crc-v1.abi: Likewise.
* tests/data/test-abidiff/empty-report.txt: New file.
* tests/data/test-abidiff/test-PR18166-libtirpc.so.report.txt: Deleted.
* tests/data/test-abidiff/test-PR24552-report0.txt: Deleted.
* tests/data/test-abidiff/test-crc-0.xml: New test file.
* tests/data/test-abidiff/test-crc-1.xml: Likewise.
* tests/data/test-abidiff/test-crc-2.xml: Likewise.
* tests/data/test-abidiff/test-crc-report.txt: Likewise.
* tests/data/test-abidiff/test-empty-corpus-report.txt: Deleted.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Add CRC values.
* tests/data/test-read-write/test-crc.xml: New test data file.
* tests/data/test-symtab/kernel-modversions/Makefile: New test source.
* tests/data/test-symtab/kernel-modversions/one_of_each.c: Likewise.
* tests/data/test-symtab/kernel-modversions/one_of_each.ko: Likewise.
* tests/test-abidiff-exit.cc: Add new test case.
* tests/test-abidiff.cc: Add new test case.
* tests/test-read-write.cc: Likewise.
* tests/test-symtab.cc (Symtab::KernelSymtabsWithCRC): New test case.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoabg-writer.cc: fix write_elf_symbol_reference loop
Giuliano Procida [Thu, 15 Oct 2020 09:23:51 +0000 (10:23 +0100)]
abg-writer.cc: fix write_elf_symbol_reference loop

The function write_elf_symbol_reference iterates through aliases,
looking for an unsuppressed alias to use. The existing code went wrong
in the case when aliases are present. In the case of all symbols
suppressed, it would also have selected the last alias, rather than
the first, if the data structure invariants had matched the code's
expectations.

The main symbol is always distinguished. When aliases are absent, the
sole symbol's next pointer is null, but when aliases are present, they
form a circular list. This makes traversal of aliases a bit tricky.

The code now picks the first symbol from the following:

- the given symbol, if unsuppressed
- the main symbol, if unsuppressed
- the unsuppressed aliases in the remainder of the alias chain
- the main symbol (suppressed)

The given symbol, which need not be the same as the main symbol, will
be tested twice, if suppressed, but addressing this would make the
code even more elaborate and fragile.

The last case may be unreachable if symbol suppression triggers when
all aliases are suppressed.

I left this change stand-alone for easier review and to credit Giuliano for his
work on it, though it fixes a previous commit.

* src/abg-writer.cc (write_elf_symbol_reference): Check main
symbol and aliases with more care.

Fixes: commmit ("dwarf-reader/writer: consider aliases when dealing with suppressions")
Signed-off-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agodwarf-reader/writer: consider aliases when dealing with suppressions
Matthias Maennich [Sun, 28 Jun 2020 19:40:36 +0000 (21:40 +0200)]
dwarf-reader/writer: consider aliases when dealing with suppressions

When the symbol of a decl is suppressed and it happens to be the main
symbol of a group of aliased symbols where another symbol is not
suppressed, the dwarf reader discards the decl from the internal
representation altogether upon reading and thus the writer will not be
able to connect that decl to the non-suppressed aliased elf symbol.

In order to address this, ensure we are not suppressing decls for which
an alias is not suppressed. We therefore keep the decl in the IR when at
least one its underlying aliased symbols is non-suppressed.

Likewise, when the abg-writer is having to attach an elf-symbol-id to
the decl, instead of omitting the symbol altogether, rather make use of
the property of aliases and connect the dwarf information to an alias
instead. This way the function dwarf information stays connected to the
elf symbol that we want to track.

When reading from XML with a symbol whitelist that leads to suppression
of aliased symbols, abidiff would hit an assertion and crash when
looking up the aliased symbol due to it being suppressed. In the new
symtab reader we can still suppress a symbol without removing it from
the lookup. Make use of that property to fix this bug.

A test has been added for this as well.

* src/abg-dwarf-reader.cc(function_is_suppressed): Do not suppress
  a function for which there is an alias that is not suppressed.
(variable_is_suppressed): Likewise for variables.
* src/abg-reader.cc (build_elf_symbol): Improve handling of
suppressed aliased symbols when reading from XML.
* src/abg-symtab-reader.cc (load): Likewise.
* src/abg-writer.cc(write_elf_symbol_reference): Fall back to
  any aliased symbol if the main symbol is suppressed.
* tests/data/Makefile.am: Add new test files.
* tests/data/test-abidiff-exit/test-missing-alias-report.txt: New test file.
* tests/data/test-abidiff-exit/test-missing-alias.abi: Likewise.
* tests/data/test-abidiff-exit/test-missing-alias.suppr: Likewise.
* tests/test-abidiff-exit.cc: Add support for whitelists and add
new testcase.
* tests/data/test-read-dwarf/test-suppressed-alias.c: New test file.
* tests/data/test-read-dwarf/test-suppressed-alias.o: Likewise.
* tests/data/test-read-dwarf/test-suppressed-alias.o.abi: Likewise.
* tests/data/test-read-dwarf/test-suppressed-alias.suppr: Likewise.
* tests/data/test-read-dwarf/test3-alias-1.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-1.suppr: Likewise.
* tests/data/test-read-dwarf/test3-alias-2.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-2.suppr: Likewise.
* tests/data/test-read-dwarf/test3-alias-3.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-3.suppr: Likewise.
* tests/data/test-read-dwarf/test3-alias-4.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test3-alias-4.suppr: Likewise.
* tests/test-read-dwarf.cc: Add new test cases.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agosymtab/dwarf-reader: allow hinting of main symbols for aliases
Matthias Maennich [Tue, 30 Jun 2020 21:31:55 +0000 (23:31 +0200)]
symtab/dwarf-reader: allow hinting of main symbols for aliases

In case of aliased symbols, the "main symbol" cannot be deduced from
the symtab as this solely contains a name->addr mapping and aliases
are represented by multiple names resolving to the same address.
Therefore the main symbol can only be picked rather randomly and
unpredictable.

Unlike DWARF, which contains a single symbol entry for only the main
symbol. Hence we can (late) detect the main symbol. Exploiting that
property allows to correct the addr->symbol lookup in the symtab to
return the correct main symbol and it also allows to correct the aliased
symbols to maintain the correct main symbol.

This patch adds the `update_main_symbol` functionality to `elf_symbol`
to update the main symbol by name (ELF symbols need unique names) and
adds `update_main_symbol` to `symtab` that makes use of said new method.

When we discover a main symbol during DWARF reading, we instruct the
symtab to update the mapping.

This creates consistent representations across different builds of the
same binary with the same ABI by pinning down the main symbol to the
defined one. Knowing the main symbol also helps to keep the correct
dwarf information in the representation in the presence of symbol
suppressions. A later patch will address that.

Some test cases in tests/data need adjustment and they have all been
verified to be valid changes.

- main symbol changed for various elf symbols
  - test-annotate/test15-pr18892.so.abi
  - test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi
  - test-annotate/test3.so.abi
  - test-read-dwarf/test15-pr18892.so.abi
  - test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi
  - test-read-dwarf/test3.so.abi
  - test-read-dwarf/test3.so.hash.abi

- due to main symbol changes, the symbol diff needs to be corrected
  - test-diff-dwarf/test12-report.txt
  - test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
  - test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt

- the test scenario needed adjustments as the main symbol changed
  - test-diff-suppr/test23-alias-filter-4.suppr
  - test-diff-suppr/test23-alias-filter-report-0.txt
  - test-diff-suppr/test23-alias-filter-report-2.txt

As usual, the complete changelog follows.

* include/abg-ir.h (elf_symbol::update_main_symbol): New method.
* include/abg-symtab-reader.h (symtab::update_main_symbol): New method.
* src/abg-dwarf-reader.cc
(build_var_decl): Hint symtab about main symbol discovered in DWARF.
(build_function_decl): Likewise.
* src/abg-ir.cc (elf_symbol::get_main_symbol): Lock the weak_ptr
  on access in both overloads.
(update_main_symbol): New method to allow updating the main symbol.
* src/abg-symtab-reader.cc (symtab::update_main_symbol): New method.
* data/Makefile.am: Add new test data files.
* tests/data/test-annotate/test15-pr18892.so.abi: Updated test file.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi: Likewise.
* tests/data/test-annotate/test2.so.abi: Likewise.
* tests/data/test-annotate/test3.so.abi: Likewise.
* tests/data/test-diff-dwarf/test12-report.txt: Likewise.
* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt: Likewise.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt: Likewise.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt: Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt: Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt: Likewise.
* tests/data/test-diff-suppr/test23-alias-filter-4.suppr: Likewise.
* tests/data/test-diff-suppr/test23-alias-filter-report-0.txt: Likewise.
* tests/data/test-diff-suppr/test23-alias-filter-report-2.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/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/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.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/test22-pr19097-libstdc++.so.6.0.17.so.abi: Likewise.
* tests/data/test-read-dwarf/test3.so.abi: Likewise.
* tests/data/test-read-dwarf/test3.so.hash.abi: Likewise.
* tests/data/test-symtab/basic/aliases.c: New test source file.
* tests/data/test-symtab/basic/aliases.so: Likewise.
* tests/test-symtab.cc (Symtab::AliasedFunctionSymbols): New test case.
(Symtab::AliasedVariableSymbols): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agotest-symtab: add tests for whitelisted functions
Matthias Maennich [Mon, 29 Jun 2020 13:06:48 +0000 (15:06 +0200)]
test-symtab: add tests for whitelisted functions

Extend the test functionality in test-symtab to allow processing of KMI
whitelists and add additional test cases for whitelist handling.

* tests/data/Makefile.am: add new test files
* tests/data/test-symtab/basic/one_function_one_variable_all.whitelist: New test file,
* tests/data/test-symtab/basic/one_function_one_variable_function.whitelist: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable_irrelevant.whitelist: Likewise.
* tests/data/test-symtab/basic/one_function_one_variable_variable.whitelist: Likewise.
* tests/test-symtab.cc (read_corpus): Add support for whitelists.
(assert_symbol_count): Likewise.
(Symtab::SymtabWithWhitelist): New testcase.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agodwarf reader: drop (now) unused code related to symbol table reading
Matthias Maennich [Tue, 2 Jun 2020 11:36:09 +0000 (13:36 +0200)]
dwarf reader: drop (now) unused code related to symbol table reading

The introduction of the new symtab reader incorporated much of the
existing functionality. Now that the most code parts are migrated to the
new symtab reader, we can safely remove the old code paths.

Ignoring the symbol table is not a thing anymore. The new symtab reader
does read the symtab unconditionally for consistency reasons. Hence also
remove all functionality around conditional symtab reading.

* include/abg-dwarf-reader.h (set_ignore_symbol_table): Remove.
(get_ignore_symbol_table): Likewise.
* src/abg-dwarf-reader.cc (add_symbol_to_map): Likewise.
(read_context::options_type::ignore_symbol_table): Likewise.
(read_context::options_type): Adjust.
(read_context::fun_addr_sym_map_): Remove.
(read_context::fun_entry_addr_sym_map_): Likewise.
(read_context::fun_syms_): Likewise.
(read_context::var_addr_sym_map_): Likewise.
(read_context::var_syms_): Likewise.
(read_context::undefined_fun_syms_): Likewise.
(read_context::undefined_var_syms_): Likewise.
(read_context::initialize): Adjust.
(read_context::lookup_elf_symbol_from_index): Remove.
(read_context::fun_entry_addr_sym_map_sptr): Likewise.
(read_context::fun_entry_addr_sym_map): Likewise.
(read_context::fun_syms_sptr): Likewise.
(read_context::fun_syms): Likewise.
(read_context::var_syms_sptr): Likewise.
(read_context::var_syms): Likewise.
(read_context::undefined_fun_syms_sptr): Likewise.
(read_context::undefined_var_syms_sptr): Likewise.
(read_context::load_symbol_maps_from_symtab_section): Likewise.
(read_context::load_symbol_maps): Likewise.
(read_context::maybe_load_symbol_maps): Likewise.
(set_ignore_symbol_table): Likewise.
(get_ignore_symbol_table): Likewise.
(create_default_var_sym): Likewise.
(build_var_decl): Adjust.
(function_is_suppressed): Likewise.
(variable_is_suppressed): Likewise.
(build_function_decl): Likewise.
(add_symbol_to_map): Remove.
(read_corpus_from_elf): Adjust.
(build_corpus_group_from_kernel_dist_under): Likewise.
* tools/abidw.cc (main): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoabg-corpus: remove symbol maps and their setters
Matthias Maennich [Wed, 20 May 2020 22:44:01 +0000 (00:44 +0200)]
abg-corpus: remove symbol maps and their setters

With the prework in previous commits, we are now able to drop the
public symbols maps in corpus::priv and replace them by private members
with access through getters. The getters use the new symtab
implementation to generate the maps on the fly. Setters are not required
anymore and are removed. Also remove redundant getters.

We could also remove the getters for the symbol maps and the local
caching variable and leave it all to lookup_symbol, but this is left for
a later change.

* include/abg-corpus.h (corpus::set_fun_symbol_map): Remove
method declaration.
(corpus::set_undefined_fun_symbol_map): Likewise.
(corpus::set_var_symbol_map): Likewise.
(corpus::set_undefined_var_symbol_map): Likewise.
(corpus::get_fun_symbol_map_sptr): Likewise.
(corpus::get_undefined_fun_symbol_map_sptr): Likewise.
(corpus::get_var_symbol_map_sptr): Likewise.
(corpus::get_undefined_var_symbol_map_sptr): Likewise.
* src/abg-corpus-priv.h (corpus::priv::var_symbol_map): make
private and mutable
(corpus::priv::undefined_var_symbol_map): Likewise.
(corpus::priv::fun_symbol_map): Likewise.
(corpus::priv::undefined_fun_symbol_map): Likewise.
(corpus::priv::get_fun_symbol_map): New method declaration.
(corpus::priv::get_undefined_fun_symbol_map): Likewise.
(corpus::priv::get_var_symbol_map): Likewise.
(corpus::priv::get_undefined_var_symbol_map): Likewise.
* src/abg-corpus.cc (corpus::priv::get_fun_symbol_map): New
method implementation.
(corpus::priv::get_undefined_fun_symbol_map): Likewise.
(corpus::priv::get_var_symbol_map): Likewise.
(corpus::priv::get_undefined_var_symbol_map): Likewise.
(corpus::is_empty): depend on symtab only.
(corpus::set_fun_symbol_map): Remove method.
(corpus::set_undefined_fun_symbol_map): Likewise.
(corpus::set_var_symbol_map): Likewise.
(corpus::set_undefined_var_symbol_map): Likewise.
(corpus::get_fun_symbol_map_sptr): Likewise.
(corpus::get_undefined_fun_symbol_map_sptr): Likewise.
(corpus::get_var_symbol_map_sptr): Likewise.
(corpus::get_undefined_var_symbol_map_sptr): Likewise.
(corpus::get_fun_symbol_map): Use corpus::priv proxy method.
(corpus::get_undefined_fun_symbol_map): Likewise.
(corpus::get_var_symbol_map): Likewise.
(corpus::get_undefined_var_symbol_map): Likewise.
* src/abg-dwarf-reader.cc (read_debug_info_into_corpus): Do not
set corpus symbol maps anymore.
* src/abg-reader.cc (read_corpus_from_input): Likewise.
* tests/test-symtab.cc (assert_symbol_count): Do not access the
corpus symbol maps through sptr anymore.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Adjust
expected test output.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agosymtab_reader: add support for ppc64 ELFv1 binaries
Matthias Maennich [Thu, 14 May 2020 14:33:34 +0000 (16:33 +0200)]
symtab_reader: add support for ppc64 ELFv1 binaries

When loading the symtab from an ppc64 binary, also keep track of the
function entry addresses as a key for the symbol lookup. That
accommodates the differences in DWARF pointing to the function entry
address while the symbol table points to the function pointer.

The implementation is mostly copied and adopted from abg-dwarf-reader's
read_context to add this functionality also to the new symtab reader.

* src/abg-symtab-reader.cc (symtab::lookup_symbol): fall back to
  lookup the address in entry_addr_symbol_map_.
  (symtab::load): update the function entry address map for
  ppc64 targets.
  (symtab::update_function_entry_address_symbol_map): New
  function implementation.
* src/abg-symtab-reader.h
  (symtab::entry_addr_symbol_map_): New data member.
  (symtab::update_function_entry_address_symbol_map): New
  function declaration.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoabg-elf-helpers: migrate ppc64 specific helpers
Matthias Maennich [Mon, 11 May 2020 22:29:19 +0000 (00:29 +0200)]
abg-elf-helpers: migrate ppc64 specific helpers

This migrates more helpers to abg-elf-helpers:
  lookup_ppc64_elf_fn_entry_point_address  with dependencies
    read_uint64_from_array_of_bytes
    read_int_from_array_of_bytes

  address_is_in_opd_section  with dependency
    address_is_in_section

read_context::find_opd_section and read_context::opd_section_ are obsolete.

* src/abg-dwarf-reader.cc (read_context::opd_section_): Delete.
(read_context::find_opd_section): Delete.
(read_context::read_uint64_from_array_of_bytes): Delete.
(read_context::read_int_from_array_of_bytes): Delete.
(read_context::lookup_ppc64_elf_fn_entry_point_address): Delete.
(read_context::address_is_in_opd_section): Delete.
(read_context::address_is_in_section): Delete.
(read_context::load_symbol_maps_from_symtab_section): Adjust.
* src/abg-elf-helpers.cc (read_int_from_array_of_bytes): New.
(read_uint64_from_array_of_bytes): New.
(lookup_ppc64_elf_fn_entry_point_address): New.
(address_is_in_section): New.
(address_is_in_opd_section): New.
* src/abg-elf-helpers.h
(lookup_ppc64_elf_fn_entry_point_address): New declaration.
(address_is_in_opd_section): New declaration.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoSwitch kernel stuff over to new symtab and drop unused code
Matthias Maennich [Wed, 6 May 2020 21:58:50 +0000 (23:58 +0200)]
Switch kernel stuff over to new symtab and drop unused code

Now that the new symtab implementation is capable of reading the
ksymtab, we can switch over the implementation to gather information
from there and delete all now-obsolete code.

* src/abg-dwarf-reader.cc (read_context::ksymtab_format_): Delete.
(read_context::ksymtab_entry_size_): Likewise.
(read_context::nb_ksymtab_entries_): Likewise.
(read_context::nb_ksymtab_gpl_entries_): Likewise.
(read_context::ksymtab_section_): Likewise.
(read_context::ksymtab_reloc_section_): Likewise.
(read_context::ksymtab_gpl_section_): Likewise.
(read_context::ksymtab_gpl_reloc_section_): Likewise.
(read_context::ksymtab_strings_section_): Likewise.
(read_context::linux_exported_fn_syms): Likewise.
(read_context::linux_exported_var_syms): Likewise.
(read_context::linux_exported_gpl_fn_syms): Likewise.
(read_context::linux_exported_gpl_var_syms): Likewise.
(read_context::initialize): Remove initializations accordingly.
(read_context::find_ksymtab_section): Delete.
(read_context::find_ksymtab_gpl_section): Likewise.
(read_context::find_ksymtab_reloc_section): Likewise.
(read_context::find_ksymtab_gpl_reloc_section): Likewise.
(read_context::find_ksymtab_strings_section): Likewise.
(read_context::find_any_ksymtab_section): Likewise.
(read_context::find_any_ksymtab_reloc_section): Likewise.
(read_context::lookup_elf_symbol_from_index): Adjust.
(read_context::linux_exported_fn_syms): Delete.
(read_context::create_or_get_linux_exported_fn_syms): Likewise.
(read_context::linux_exported_var_syms): Likewise.
(read_context::create_or_get_linux_exported_var_syms): Likewise.
(read_context::linux_exported_gpl_fn_syms): Delete.
(read_context::create_or_get_linux_exported_gpl_fn_syms): Likewise.
(read_context::linux_exported_gpl_var_syms): Likewise.
(read_context::create_or_get_linux_exported_gpl_var_syms): Likewise.
(read_context::try_reading_first_ksymtab_entry): Likewise.
(read_context::try_reading_first_ksymtab_entry_using_pre_v4_19_format): Likewise.
(read_context::try_reading_first_ksymtab_entry_using_v4_19_format): Likewise.
(read_context::get_ksymtab_format_module): Likewise.
(read_context::get_ksymtab_format): Likewise.
(read_context::get_ksymtab_symbol_value_size): Likewise.
(read_context::get_ksymtab_entry_size): Likewise.
(read_context::get_nb_ksymtab_entries): Likewise.
(read_context::get_nb_ksymtab_gpl_entries): Likewise.
(read_context::populate_symbol_map_from_ksymtab): Likewise.
(read_context::populate_symbol_map_from_ksymtab_reloc): Likewise.
(read_context::load_kernel_symbol_table): Likewise.
(read_context::load_ksymtab_symbols): Likewise.
(read_context::load_ksymtab_gpl_symbols): Likewise.
(read_context::load_linux_specific_exported_symbol_maps): Likewise.
(read_context::load_symbol_maps): Do not load kernel symbol maps.
(read_context::maybe_adjust_sym_address_from_v4_19_ksymtab): Delete.
(read_context::add_fn_symbols_to_map): Likewise.
(read_context::add_var_symbols_to_map): Likewise.
(read_context::read_debug_info_into_corpus): Fill export maps
from new symtab.
(read_context::lookup_elf_fn_symbol_from_address): Delete.
(read_context::lookup_elf_var_symbol_from_address): Likewise.
(read_context::lookup_elf_symbol_from_address): Likewise.
(read_context::lookup_public_function_symbol_from_elf): Likewise.
(read_context::fun_entry_addr_sym_map_sptr): Likewise.
(read_context::fun_entry_addr_sym_map): Likewise.
(read_context::var_addr_sym_map): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: read_context: use new symtab in *_symbols_is_exported
Matthias Maennich [Wed, 6 May 2020 15:26:31 +0000 (17:26 +0200)]
dwarf-reader: read_context: use new symtab in *_symbols_is_exported

Testing whether a symbol is exported can be simplified using the new
symtab implementation. The same holds true for whether a symbol is
exported via ksymtab in case of linux kernel binaries. So, do that.

* src/abg-dwarf-reader.cc (function_symbol_is_exported): Use new
  symtab implementation.
  (variable_symbol_is_exported): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoabg-reader: avoid using the (var|function)_symbol_map
Matthias Maennich [Mon, 4 May 2020 21:41:14 +0000 (23:41 +0200)]
abg-reader: avoid using the (var|function)_symbol_map

Instead of using the corpus var|function_symbol_maps for symbol lookups,
let build_elf_symbol_from_reference use the symtab::lookup_symbol
method. That leads to a shorter implementation and we can drop the
indicative parameter.

* src/abg-reader.cc (build_elf_symbol_from_reference): drop
  last parameter indicating the lookup type and use corpus
  symtab for the lookup
  (build_function_decl): Adjust accordingly.
  (build_var_decl): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agocorpus: make get_unreferenced_(function|variable)_symbols use the new symtab
Matthias Maennich [Mon, 4 May 2020 20:08:52 +0000 (22:08 +0200)]
corpus: make get_unreferenced_(function|variable)_symbols use the new symtab

Make the corresponding members an implementation detail of corpus::priv.
They get computed based on the new symtab whenever they are accessed
first with an atomic instantiation. That simplifies the implementation
and homogenizes the access to functions and variables. Sorting does not
need to be done as the symtab already gives a guarantee for that.

        * src/abg-corpus-priv.h (corpus::priv::unrefed_var_symbols): make
          private, mutable and optional.
          (corpus::unrefed_fun_symbols): Likewise.
          (corpus::priv::get_unreferenced_function_symbols): New method declaration.
          (corpus::priv::get_unreferenced_variable_symbols): Likewise.
        * src/abg-corpus.cc
          (corpus::priv::build_unreferenced_symbols_tables): Delete method.
          (corpus::priv::get_unreferenced_function_symbols): New method implementation.
          (corpus::priv::get_unreferenced_variable_symbols): Likewise.
          (corpus::get_unreferenced_function_symbols): Proxy call to corpus::priv.
          (corpus::get_unreferenced_variable_symbols): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agocorpus: make get_(undefined_)?_(var|fun)_symbols use the new symtab
Matthias Maennich [Thu, 30 Apr 2020 14:35:08 +0000 (16:35 +0200)]
corpus: make get_(undefined_)?_(var|fun)_symbols use the new symtab

Make the corresponding members an implementation detail of corpus::priv.
They get computed based on the new symtab whenever they are accessed
first with an atomic instantiation. That simplifies the implementation
and homogenizes the access to functions and variables. Sorting does not
need to be done as the symtab already gives a guarantee for that.

Due to improved alias detection in the new symtab reader, ensure we only
write symbol aliases to ksymtab symbols if having a ksymtab main symbol.

Test data needed to be adjusted as the new symtab reader is stricter in
regards to symbols listed in ksymtab. I.e. init_module is not an
exported symbol in the ksymtab of a kernel module.

* src/abg-corpus-priv.h (corpus::priv::sorted_var_symbols): make
  private, mutable and optional.
  (corpus::sorted_undefined_var_symbols): Likewise.
  (corpus::sorted_fun_symbols): Likewise.
  (corpus::sorted_undefined_fun_symbols): Likewise.
  (corpus::priv::get_sorted_fun_symbols): New method declaration.
  (corpus::priv::get_sorted_undefined_fun_symbols): Likewise.
  (corpus::priv::get_sorted_var_symbols): Likewise.
  (corpus::priv::get_sorted_undefined_var_symbols): Likewise.
* src/abg-corpus.cc
  (corpus::elf_symbol_comp_functor): Delete struct.
  (corpus::priv::get_sorted_fun_symbols): New method implementation.
  (corpus::priv::get_sorted_undefined_fun_symbols): Likewise.
  (corpus::priv::get_sorted_var_symbols): Likewise.
  (corpus::priv::get_sorted_undefined_var_symbols): Likewise.
  (corpus::get_sorted_fun_symbols): Proxy call to corpus::priv.
  (corpus::get_sorted_undefined_fun_symbols): Likewise.
  (corpus::get_sorted_var_symbols): Likewise.
  (corpus::get_sorted_undefined_var_symbols): Likewise.
* src/abg-writer.cc (write_elf_symbol_aliases): When emitting
  aliases for a kernel symbol, ensure to only emit exported,
  public aliases.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: update test
  data.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoIntegrate new symtab reader into corpus and read_context
Matthias Maennich [Tue, 19 May 2020 20:10:55 +0000 (22:10 +0200)]
Integrate new symtab reader into corpus and read_context

While reading the corpus in the read_context, also load the new type
symtab object side-by-side and set it accordingly in the resulting
corpus. This is still side by side and passive code that gets active in
the following changes. This is applicable for the dwarf reader as well
as for the reader that consumes XML.

* include/abg-corpus.h (corpus::set_symtab): New method declaration.
  (corpus::get_symtab): New method declaration.
* include/abg-fwd.h (symtab_reader::symtab_sptr): New forward
  declaration.
* src/abg-corpus-priv.h (corpus::priv::symtab_): New data member.
* src/abg-corpus.cc
  (corpus::set_symtab): Likewise.
  (corpus::get_symtab): Likewise.
* src/abg-dwarf-reader.cc (read_context::symtab_): New data member.
  (read_context::initialize): reset symtab_ as well
  (read_context::symtab): new method that loads a symtab on
  first access and returns it.
  (read_debug_info_into_corpus): also set the new symtab object
  on the current corpus.
  (read_corpus_from_elf): Also determine (i.e. load) the new
  symtab object and contribute to the load status.
* src/abg-reader.cc (read_corpus_from_input): also set the new
  type symtab when reading from xml.
* tests/test-symtab.cc: Add test assertions.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoRefactor ELF symbol table reading by adding a new symtab reader
Matthias Maennich [Wed, 29 Apr 2020 11:33:31 +0000 (13:33 +0200)]
Refactor ELF symbol table reading by adding a new symtab reader

Based on existing functionality, implement the reading of ELF symbol
tables as a separate component. This reduces the complexity of
abg-dwarf-reader's read_context by separating and delegating the
functionality. This also allows dedicated testing.

The new namespace symtab_reader contains a couple of new components that
work loosely coupled together. Together they allow for a consistent view
on a symbol table. With filter criteria those views can be restricted,
iterated and consistent lookup maps can be built on top of them. While
this implementation tries to address some shortcomings of the previous
model, it still provides the high level interfaces to the symbol table
contents through sorted iterating and name/address mapped access.

symtab_reader::symtab

  While the other classes in the same namespace are merely helpers, this
  is the main implementation of symtab reading and storage.
  Symtab objects are factory created to ensure a consistent construction
  and valid invariants. Thus a symtab will be loaded by either passing
  an ELF handle (when reading from binary) or by passing a set of
  function/variable symbol maps (when reading from XML).
  When constructed they are considered const and are not writable
  anymore. As such, all public methods are const.

  The load reuses the existing implementation for loading symtab
  sections, but since the new implementation does not distinguish
  between functions and variables, the code could be simplified. The
  support for ppc64 function entry addresses has been deferred to a
  later commit.

  Linux Kernel symbol tables are now directly loaded by name when
  encountering symbols prefixed with the __ksymtab_ as per convention.
  This has been tricky in the past due to various different binary
  layouts (relocations, position relative relocations, symbol
  namespaces, CFI indirections, differences between vmlinux and kernel
  modules). Thus the new implementation is much simpler and is less
  vulnerable to future ksymtab changes. As we are also not looking up
  the Kernel symbols by addresses, we could resolve shortcomings with
  symbol aliasing: Previously a symbol and its alias were
  indistinguishable as they are having the same symbol address. We could
  not identify the one that is actually exported via ksymtab.

  One major architectural difference of this implementation is that we
  do not early discard suppressed symbols. While we keep them out of the
  vector of exported symbols, we still make them available for lookup.
  That helps addressing issues when looking up a symbol by address (e.g.
  from the ksymtab read implementation) that is suppressed. That would
  fail in the existing implementation.

  Still, we intend to only instantiate each symbol once and pass around
  shared_ptr instances to refer to it from the vector as well as from
  the lookup maps.

  For reading, there are two access paths that serve the existing
  patterns:
1) lookup_symbol: either via a name or an address
2) filtered iteration with begin(), end()

  The former is used for direct access with a clue in hand (like a name
  or an address), the latter is used for iteration (e.g. when emitting
  the XML).

symtab_reader::symtab_iterator

  The symtab_iterator is an STL compatible iterator that is returned
  from begin() and end() of the symtab. It allows usual forward iterator
  operations and can optionally take a filter predicate to skip non
  matching elements.

symtab_reader::symtab_filter

  The symtab_filter serves as a predicate for the symtab_iterator by
  providing a matches(const elf_symbol_sptr&) function.  The predicate
  is built by ANDing together several conditions on attributes a symbol
  can have. The filter conditions are implemented in terms of
  std::optional<bool> members to allow a tristate: "needs to have the
  condition set", "must not have it set" and "don't care".

symtab_reader::filtered_symtab

  The filtered_symtab is a convenience zero cost abstraction that allows
  prepopulating the symtab_filter (call it a capture) such that begin()
  and end() are now accessible without the need to pass the filter
  again. Argumentless begin() and end() are a requirement for range-for
  loops and other STL based algorithms.

* src/abg-symtab-reader.h (symtab_filter): New class.
(symtab_iterator): Likewise.
(symtab): Likewise.
(filtered_symtab): Likewise.
* src/abg-symtab-reader.cc (symtab_filter::matches): New.
(symtab::make_filter): Likewise.
(symtab::lookup_symbol): Likewise.
(symbol_sort): Likewise.
(symtab::load): Likewise.
(symtab::load_): Likewise.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Reviewed-by: Dodji Seketeli <dodji@seketeli.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoclang-format: Minor correction to not break parameters on the first line
Matthias Maennich [Mon, 29 Mar 2021 10:45:50 +0000 (11:45 +0100)]
clang-format: Minor correction to not break parameters on the first line

Before:
   someLongFunction(
    argument1,
    argument2);

After:
   someLongFunction(argument1,
                    argument2);

* .clang-format: correct function parameter break/indentation

Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoBug 27598 - abidiff mishandles union member functions
Dodji Seketeli [Wed, 31 Mar 2021 12:56:52 +0000 (14:56 +0200)]
Bug 27598 - abidiff mishandles union member functions

abidiff segfaults when a union member function is involved in the
comparison.  This patch fixes that.

* src/abg-default-reporter.cc (default_reporter::report): Assume
the parent type of the method can be either a class or a union.
* tests/data/test-diff-filter/test-PR27598-report-0.txt: New
reference output for the test.
* tests/data/test-diff-filter/test-PR27598-v{0,1}.cc: New source
code for the input binaries below.
* tests/data/test-diff-filter/test-PR27598-v{0,1}.o: New input
test binaries.
* tests/data/Makefile.am: Add the new test material to source
distribution.
* tests/test-diff-filter.cc (in_out_specs): Add the test inputs
above to this test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27569 - abidiff misses a function parameter addition
Dodji Seketeli [Thu, 25 Mar 2021 10:45:57 +0000 (11:45 +0100)]
Bug 27569 - abidiff misses a function parameter addition

Adding or deleting function parameters are changes that have not yet
been categorized in the comparison engine.  As a result, those changes
can be considered harmless and thus be filtered out.  Oops.

This patch categorizes function addition and removal as
FN_PARM_ADD_REMOVE_CHANGE_CATEGORY, which is a new category being
introduced.  Changes in this category are considered harmful and are
thus always reported by default.

* include/abg-comparison.h (enum diff_category): Add a new
FN_PARM_ADD_REMOVE_CHANGE_CATEGORY enumerator and adjust the
following enumerator values.  Update the EVERYTHING_CATEGORY
accordingly.
(function_type_diff::{sorted_deleted_parms, sorted_added_parms}):
Add new member functions.
* src/abg-comparison.cc
(function_type_diff::{sorted_deleted_parms, sorted_added_parms}):
Define new accessors.
(get_default_harmful_categories_bitmap):
Consider changes of the category
FN_PARM_ADD_REMOVE_CHANGE_CATEGORY as harmful.
(operator<<(ostream& o, diff_category c)): Support the new
FN_PARM_ADD_REMOVE_CHANGE_CATEGORY while serializing a category
bitmap.
* src/abg-comp-filter.cc
(has_added_or_removed_function_parameters): Define new static
function.
(categorize_harmful_diff_node): Categorize diff nodes representing
function parameter addition or removal as
FN_PARM_ADD_REMOVE_CHANGE_CATEGORY.
* tests/data/test-diff-filter/test-PR27569-report-0.txt: New test
reference output.
* tests/data/test-diff-filter/test-PR27569-v{0,1}.abi: New test inputs.
* tests/data/Makefile.am: Add the new test inputs to the source
distribution.
* tests/test-diff-filter.cc (in_out_specs): Add the new test
inputs to this test harness.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt:
Adjust.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
Likewise.
* tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt:
Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: Treat union members as public by default.
Giuliano Procida [Mon, 15 Mar 2021 16:04:18 +0000 (16:04 +0000)]
dwarf-reader: Treat union members as public by default.

This fixes a bug where abidw reports the access of members of C unions
and of C++ unions without any access specifiers as private.

* src/abg-dwarf-reader.cc (add_or_update_union_type): Replace
        "class" with "union" in comments; give union members public
        access by default.
(finish_member_function_reading): Give union members public access
by default.
(maybe_set_member_type_access_specifier): Give union members
public access by default.
* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Refresh.
* tests/data/test-annotate/libtest24-drop-fns.so.abi: Refresh.
* tests/data/test-annotate/test-anonymous-members-0.o.abi:
Refresh.
* tests/data/test-annotate/test13-pr18894.so.abi: Refresh.
* tests/data/test-annotate/test14-pr18893.so.abi: Refresh.
* tests/data/test-annotate/test15-pr18892.so.abi: Refresh.
* tests/data/test-annotate/test17-pr19027.so.abi: Refresh.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Refresh.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
        Refresh.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
        Refresh.
* tests/data/test-annotate/test21-pr19092.so.abi: Refresh.
* tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
        Refresh.
* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
        Refresh.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
        Refresh.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Refresh.
* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
        Refresh.
* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test-PR26568-1.o.abi: Refresh.
* tests/data/test-read-dwarf/test-PR26568-2.o.abi: Refresh.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Refresh.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Refresh.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Refresh.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Refresh.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Refresh.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Refresh.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Refresh.
* tests/data/test-read-dwarf/test17-pr19027.so.abi: Refresh.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Refresh.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
        Refresh.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi:
        Refresh.

Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27512 - Remove broken zip-archive support
Ben Woodard via Libabigail [Fri, 12 Mar 2021 19:42:41 +0000 (11:42 -0800)]
Bug 27512 - Remove broken zip-archive support

The optional zip archive feature was broken when the concept of
environment was introduced by commit b2e5366d3 back in 2015. Since it
wouldn't even compile and nobody noticed, we are fairly sure nobody
uses that feature. Therefore, we decided to remove it rather than fix
it.

* configure.ac: remove --enable-zip-archive option and logic
associated with it.
* include/abg-libzip-utils.h: Remove.
* src/abg-libzip-utils.cc: Likewise.
* include/Makefile.am: remove reference to include/abg-libzip-utils.h
that no longer exists.
* src/Makefile.am: remove reference to src/abg-libzip-utils.cc that no
longer exists.
* relicensing-scripts/file-licenses.orig.txt: remove references to
files that no longer exist.
* relicensing-scripts/files-with-lgplv3.txt: remove references to
files that no longer exist.
* tests/test-write-read-archive.cc: Remove because it tests code
that no longer exists.
* tests/Makefile.am: remove reference to tests that no longer exist.
* include/abg-reader.h: remove conditionally compiled code for zip
archives.
* include/abg-tools-utils.h: remove conditionally compiled code for
zip archives.
* src/abg-corpus.cc: remove conditionally compiled code for zip
archives.
* src/abg-reader.cc: remove conditionally compiled code for zip
archives.
* src/abg-tools-utils.cc: remove conditionally compiled code for zip
archives.
* src/abg-writer.cc: remove conditionally compiled code for zip
archives.
* tools/abidiff.cc: remove conditionally compiled code for zip
archives.
* tools/abilint.cc: remove conditionally compiled code for zip
archives.
* tools/abiar.c: Remove.
* tools/Makefile.am: remove references to abiar a utility that no
longer has a reason for existing.

Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: Support more DWARF-5 type DIEs
Dodji Seketeli [Thu, 18 Mar 2021 10:58:44 +0000 (11:58 +0100)]
dwarf-reader: Support more DWARF-5 type DIEs

When analyzing DWARF-5 some binaries, is_type_tag chokes on the new
DWARF-5 type DIEs it doesn't know about.

This patch teaches it about them.

* src/abg-dwarf-reader.cc (is_type_tag): Support
DW_TAG_coarray_type, DW_TAG_atomic_type and DW_TAG_immutable_type.
* tests/data/test-diff-pkg/elfutils-debuginfo-0.183-1.el9.x86_64.rpm:
Add new binary test input.
* tests/data/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64.rpm: Likewise.
* tests/data/test-diff-pkg/elfutils-libs-0.183-1.el9.x86_64.rpm: Likewise.
* tests/data/test-diff-pkg/elfutils-libs-debuginfo-0.183-1.el9.x86_64-self-check-report-0.txt:
Add new reference test output.
* tests/test-diff-pkg.cc (in_out_specs): Add the test inputs above
to the harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoDWARF reader: Comment ARM32 ELF address interpretation
Giuliano Procida [Wed, 10 Mar 2021 12:22:54 +0000 (12:22 +0000)]
DWARF reader: Comment ARM32 ELF address interpretation

Bug 27552 - libabigail needs to interpret ARM32 symbol addresses specially

The previous commit omitted any code commentary. This adds a link to
the relevant reference. The code is shortened slightly as well.

* src/abg-dwarf-reader.cc
(read_context::load_symbol_maps_from_symtab_section): Add
descriptive comment to ARM32 address handling; shorten
the assignment using &=.

Signed-off-by: Giuliano Procida <gprocida@google.com>
3 years agodwarf-reader split: create abg-symtab-reader.{h,cc} and test case
Matthias Maennich [Wed, 27 Jan 2021 12:58:37 +0000 (12:58 +0000)]
dwarf-reader split: create abg-symtab-reader.{h,cc} and test case

abg-symtab-reader.{h,cc} shall contain the refactored symtab reader.
Create the stub files, an empty unit test and hook everything up in the
make system.

    * src/abg-symtab-reader.h: New header file.
    * src/abg-symtab-reader.cc: New source file.
    * src/Makefile.am: Add new source files.
    * tests/Makefile.am: Add new test case runtestsymtabreader.
    * tests/test-symtab-reader.cc: New test source file.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoDWARF reader: Interpret ARM32 ELF addresses correctly
Giuliano Procida [Tue, 9 Mar 2021 22:57:54 +0000 (22:57 +0000)]
DWARF reader: Interpret ARM32 ELF addresses correctly

Bug 27552 - libabigail needs to interpret ARM32 symbol addresses specially

The ARM32 ELF specification specifies that bit 0 of an ELF function
address is a flag specifying whether the instructions are Thumb or
ARM. So clear this bit before using the addresses for symbol mapping.

* src/abg-dwarf-reader.cc
(read_context::load_symbol_maps_from_symtab_section): Clear
bit zero of ARM32 function addresses.
* src/abg-elf-helpers.cc (architecture_is_arm32): Add new
function.
* src/abg-elf-helpers.h (architecture_is_arm32): Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Update.

Signed-off-by: Giuliano Procida <gprocida@google.com>
3 years agoabg-ir: elf_symbol: add is_suppressed field
Matthias Maennich [Wed, 27 Jan 2021 12:58:36 +0000 (12:58 +0000)]
abg-ir: elf_symbol: add is_suppressed field

In the context of libabigail and a single library run (when reading from
dwarf or from xml), a symbol is either suppressed or it is not. While
one could argue that this is a property of the read_context, the
read_context might not be around anymore when the symbol still is.
Hence, persist the 'is_suppressed' state along with the symbol itself.

        * include/abg-ir.h (elf_symbol::elf_symbol): Add is_suppressed
        parameter.
        (elf_symbol::create): Likewise.
        (elf_symbol::is_suppressed): New getter declaration.
        (elf_symbol::set_is_suppressed): New setter declaration.
        * src/abg-ir.cc (elf_symbol::priv::priv): Add is_suppressed
        parameter.
        (elf_symbol::priv::is_suppressed_): New field.
        (elf_symbol::elf_symbol): Add is_suppressed parameter.
        (elf_symbol::create): Likewise.
        (elf_symbol::is_suppressed): New getter implementation.
        (elf_symbol::set_is_suppressed): New setter implementation.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoabg-ir: elf_symbol: add is_in_ksymtab field
Matthias Maennich [Wed, 27 Jan 2021 12:58:35 +0000 (12:58 +0000)]
abg-ir: elf_symbol: add is_in_ksymtab field

Being exported through a ksymtab (in case of Linux Kernel binaries) is
actually a property of the Elf symbol itself and we can therefore track
it along with the symbol that we collect from symtab. While tracking is
currently done by keeping separate symbol lists and maps for symtab and
ksymtab symbols, they can be consolidated having a property to indicate
whether this symbol also appeared as a ksymtab entry.

Hence, and for future changes in this area, add this property and update
all references. The flag is false initially unless otherwise specified.

* include/abg-ir.h (elf_symbol::elf_symbol): Add is_in_ksymtab
parameter.
(elf_symbol::create): Likewise.
(elf_symbol::is_in_ksymtab): New getter declaration.
(elf_symbol::set_is_in_ksymtab): New setter declaration.
* src/abg-ir.cc (elf_symbol::priv::priv): Add is_in_ksymtab
parameter.
(elf_symbol::priv::is_in_ksymtab_): New field.
(elf_symbol::elf_symbol): Add is_in_ksymtab parameter.
(elf_symbol::create): Likewise.
(elf_symbol::is_in_ksymtab): New getter implementation.
(elf_symbol::set_is_in_ksymtab): New setter implementation.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoabg-cxx-compat: add simplified version of std::optional
Matthias Maennich [Wed, 27 Jan 2021 12:58:34 +0000 (12:58 +0000)]
abg-cxx-compat: add simplified version of std::optional

In the absence (but desire) of std::optional<T>, add a simplified
version of it to abg_compat:: in case we are compiling with a pre-C++17
standard. Otherwise use std::optional from <optional> directly.

This is being used by a later patch and serves as a prerequisite.
It only serves the purpose of being a compatibility implementation and
does not claim to be complete at all. Just enough for the project's
needs.

* include/abg-cxx-compat.h (abg_compat::optional): Add new class.
* tests/tests-cxx-compat.cc: Add new test cases.

Reviewed-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoFix declaratons of conditionally defined functions
Ben Woodard via Libabigail [Tue, 2 Mar 2021 22:11:12 +0000 (14:11 -0800)]
Fix declaratons of conditionally defined functions

Functions relating to zip archives are declared but are never compiled
when --enable-zip-archive=no, the default.

This makes sure that they are not declared when they won't be defined
due to conditional compilation.

* include/abg-reader.h (read_corpus_from_file): Guard the
declaration of these overloads with #ifdef WITH_ZIP_ARCHIVE.
* tools/abilint.cc: Guard the use of
abigail::xml_reader::read_corpus_from_file with #ifdef
WITH_ZIP_ARCHIVE.

Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoRevert "Fix declaratons of conditionally defined functions"
Dodji Seketeli [Mon, 8 Mar 2021 12:04:13 +0000 (13:04 +0100)]
Revert "Fix declaratons of conditionally defined functions"

I forgot to edit the commit message of this commit to make it comply
with the rules in https://sourceware.org/git/?p=libabigail.git;a=blob;f=COMMIT-LOG-GUIDELINES.

So I am reverting commit cd2af9e5f5f973759ade0595a32694f9e0230647

3 years agoFix declaratons of conditionally defined functions
Ben Woodard via Libabigail [Tue, 2 Mar 2021 22:11:12 +0000 (14:11 -0800)]
Fix declaratons of conditionally defined functions

Functions relating to zip archives are declared but are never compiled
when --enable-zip-archive=no, the default.

This makes sure that they are not declared when they won't be defined
due to conditional compilation.

Signed-off-by: Ben Woodard <woodard@redhat.com>
3 years agotests/catch.hpp: Add SPDX header back
Dodji Seketeli [Mon, 8 Mar 2021 10:32:05 +0000 (11:32 +0100)]
tests/catch.hpp: Add SPDX header back

* tests/lib/catch.hpp: Add SPDX header back.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: Keep stable order when de-duplicating class definitions
Dodji Seketeli [Thu, 25 Feb 2021 11:44:13 +0000 (12:44 +0100)]
dwarf-reader: Keep stable order when de-duplicating class definitions

During de-duplication of class definition while resolving decl-only
classes to their definition, the order in which classes of the same
name are compared is not always the same.  That results in an
instability of the particular class being kept.  This can have an
impact when some classes have member types because member types are
not meaningful during comparison; so in the end that can lead to
spurious order instability during ABIXML serialization.

* src/abg-dwarf-reader.cc
(read_context::resolve_declaration_only_classes): Compare the
classes that have the same name across several TU, always in the
same order.
* tests/data/test-annotate/test15-pr18892.so.abi: Adjust.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBetter sorting of (anonymous) types in ABIXML files
Dodji Seketeli [Wed, 24 Feb 2021 11:51:27 +0000 (12:51 +0100)]
Better sorting of (anonymous) types in ABIXML files

I am still seeing in some cases, some instability in type sorting in
ABIXML.

It looks related to anonymous types sorting, so this patch tries
harder to have anonymous types have names more suitable for internal
matters this.

* src/abg-writer.cc (type_ptr_cmp::operator()): Use the internal
pretty representation of types, for comparison.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
Adjust.
* 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/PR25042-libgdbm-clang-dwarf5.so.6.0.0.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/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-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.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agotests: Update to catch.hpp v2.13.4 and fix #2178 libabigail-1.8.2
Dodji Seketeli [Tue, 23 Feb 2021 16:00:19 +0000 (17:00 +0100)]
tests: Update to catch.hpp v2.13.4 and fix #2178

This patch is about fixing a compilation error that we are seeing on
Fedora Rawhide with glibc 2.33.9000, which makes MINSIGSTKSZ not be a
constant value anymore.  Thus, the sigStackSize variable that is
declared constexpr cannot use that MINSIGSTKSZ as initializer anymore.

So as suggested in the issue
https://github.com/catchorg/Catch2/issues/2178 filed against
'catchorg' for this purpose, I am hardwiring the initialization value
of sigStackSize for now.

* tests/lib/catch.hpp: Update to v2.13.4 and initialize
sigStackSize to 32768 for now, as suggested by
https://github.com/catchorg/Catch2/issues/2178.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoDon't consider type name when comparing typedefs
Dodji Seketeli [Thu, 11 Feb 2021 14:04:55 +0000 (15:04 +0100)]
Don't consider type name when comparing typedefs

This is from a problem report originating from Red Hat bugzilla at
https://bugzilla.redhat.com/show_bug.cgi?id=1925876

I some C programs, the same type can be defined more than once in a
binary, as there is no "One Definition Rule[1]" in C.

    [1]: https://en.wikipedia.org/wiki/One_Definition_Rule

The definition of those two types can be slightly different and yet be
equivalent.

For instance, the data member of a struct S might be defined once as
having a type which is a typedef Foo of, say, "long int" and that
struct S might be defined again elsewhere with a data member of type
typedef Bar of "long int" as well.

With the current code, because Foo and Bar have different names, they
are are going to compare different; so the two struct S are doing to
compare different even though they are equivalent.

Down the road, this is likely going to imply that the several 'struct
S' that are declaration-only will not be resolved as being
declarations of the definition of "struct S", because they is more
than one such definition, and those definitions are different.

This is going to lead to spurious (and hard to debug) type differences
that are going to be detected and reported by libabigail later down
the road.

This patch addresses the problem by not taking typedef names into
account when comparing typedefs before canonicalization.  That allows
the comparison of classes and structs that happens during the
resolution of declaration-only classes to correctly deduce their
equivalence even in cases like the one exposed above.  It thus reduces
the amount of declaration-only classes that are unnecessarily
considered to be different from the definition they ought to equal.

* include/abg-ir.h (maybe_compare_as_member_decls): Declare new
function.  Make it a friend of class decl_base.
* src/abg-dwarf-reader.cc (maybe_canonicalize_type): Don't early
canonicalize typedefs because they can be "part" of a type that is
not yet completed, especially considering that class declaration
resolution is part of type building, stricto sensu.
* src/abg-ir.cc (maybe_compare_as_member_decls): Factorize this
out of ...
(equals): ... the overload for decl_base.  Use it in the overload
for typedef_decl.
* tests/data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64-self-check-report-0.txt:
New test reference output.
* tests/data/test-diff-pkg/nmap-7.70-5.el8_testjcc.x86_64.rpm: New
binary input.
* tests/data/test-diff-pkg/nmap-debuginfo-7.70-5.el8_testjcc.x86_64.rpm: Likewise.
* tests/data/Makefile.am: Add these new testing material to source
distribution.
  * tests/test-diff-pkg.cc (in_out_specs): Add the new test input to
the harness.
* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-0.txt:
Adjust.
* tests/data/test-diff-suppr/test39-opaque-type-report-0.txt:
Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoUse generic internal type name to canonicalize anonymous enums
Dodji Seketeli [Wed, 10 Feb 2021 17:43:52 +0000 (18:43 +0100)]
Use generic internal type name to canonicalize anonymous enums

This is from the problem report in Red Hat bugzilla

    https://bugzilla.redhat.com/show_bug.cgi?id=1924624
    "comparing 'libpinyin.so.13.0.0' to itself wrongly yielded result"

During the canonicalization of an anonymous enum, the algorithm uses
its internal pretty representation to limit the number of types to
compare it to.  That internal pretty representation is based on its
type name.

For anonymous types, the type name is not unique; it's constructed for
internal purposes that are different from the purpose of
canonicalization.  So using that in the pretty representation might
negatively impact the accuracy of the canonicalization; it might make
it so that two anonymous in the same namespace types might wrongly be
considered canonically different.

To fix that, this change makes the internal pretty representation of
anonymous enum types essentially be "enum
<namespace-name>::__anonymous_enum__".

This is on part with what is done for unions and classes in commit:
    005ab5c9 Use flat representation to canonicalize anonymous classes and unions

* src/abg-ir.cc (has_generic_anonymous_internal_type_name) :
Define new static function.
(get_generic_anonymous_internal_type_name): Use it here.
(decl_base::get_pretty_representation): For internal purposes,
build an anonymous name that is stable.
* tests/data/test-annotate/test21-pr19092.so.abi: Adjust.
* tests/data/test-diff-pkg/PR24690/PR24690-report-0.txt: Adjust.
* tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt: Adjust.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Adjust.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Adjust.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoabg-dwarf-reader: Fix typo in compare_dies_string_attribute_value
Giuliano Procida [Mon, 8 Feb 2021 17:31:46 +0000 (17:31 +0000)]
abg-dwarf-reader: Fix typo in compare_dies_string_attribute_value

A recent commit to add DW_FORM_line_strp support had a small typo in
an assertion. This commit corrects that.

* src/abg-dwarf-reader.cc
(compare_dies_string_attribute_value): Typo fix.

Signed-off-by: Giuliano Procida <gprocida@google.com>
3 years agoabidiff: do not qualify member names in diff report
Giuliano Procida [Wed, 27 Jan 2021 12:08:43 +0000 (12:08 +0000)]
abidiff: do not qualify member names in diff report

Bug 26012 - abidiff: do not emit qualified name for data members

The enclosing struct (or union or class) is given by the surrounding
diff context. This change eliminates a lot of repetition in the diff
report.

* src/abg-reporter-priv.cc (represent_data_member): Do not
qualify member names. (represent): Do not qualify member names.
* tests/data/test-abicompat/test0-fn-changed-report-0.txt: Refresh.
* tests/data/test-abicompat/test0-fn-changed-report-2.txt: Refresh.
* tests/data/test-abicompat/test5-fn-changed-report-0.txt: Refresh.
* tests/data/test-abicompat/test5-fn-changed-report-1.txt: Refresh.
* tests/data/test-abicompat/test6-var-changed-report-0.txt: Refresh.
* tests/data/test-abicompat/test6-var-changed-report-1.txt: Refresh.
* tests/data/test-abicompat/test7-fn-changed-report-0.txt: Refresh.
* tests/data/test-abicompat/test7-fn-changed-report-1.txt: Refresh.
* tests/data/test-abicompat/test7-fn-changed-report-2.txt: Refresh.
* tests/data/test-abicompat/test8-fn-changed-report-0.txt: Refresh.
* tests/data/test-abicompat/test9-fn-changed-report-0.txt: Refresh.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt:
Refresh.
* tests/data/test-abidiff-exit/test-fun-param-report.txt: Refresh.
* tests/data/test-abidiff-exit/test-headers-dirs/test-headers-dir-report-2.txt:
Refresh.
* tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt:
Refresh.
* tests/data/test-abidiff-exit/test-leaf-peeling-report.txt: Refresh.
* tests/data/test-abidiff-exit/test-leaf-redundant-report.txt: Refresh.
* tests/data/test-abidiff-exit/test-member-size-report0.txt: Refresh.
* tests/data/test-abidiff-exit/test-member-size-report1.txt: Refresh.
* tests/data/test-abidiff-exit/test-net-change-report0.txt: Refresh.
* tests/data/test-abidiff/test-PR18791-report0.txt: Refresh.
* tests/data/test-abidiff/test-qual-type0-report.txt: Refresh.
* tests/data/test-abidiff/test-struct0-report.txt: Refresh.
* tests/data/test-abidiff/test-struct1-report.txt: Refresh.
* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
Refresh.
* tests/data/test-diff-dwarf/test0-report.txt: Refresh.
* tests/data/test-diff-dwarf/test1-report.txt: Refresh.
* tests/data/test-diff-dwarf/test10-report.txt: Refresh.
* tests/data/test-diff-dwarf/test11-report.txt: Refresh.
* tests/data/test-diff-dwarf/test13-report.txt: Refresh.
* tests/data/test-diff-dwarf/test21-redundant-fn-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test27-local-base-diff-report.txt:
Refresh.
* tests/data/test-diff-dwarf/test3-report.txt: Refresh.
* tests/data/test-diff-dwarf/test32-fnptr-changes-report-0.txt:
Refresh.
* tests/data/test-diff-dwarf/test33-fnref-changes-report-0.txt:
Refresh.
* tests/data/test-diff-dwarf/test36-ppc64-aliases-report-0.txt:
Refresh.
* tests/data/test-diff-dwarf/test37-union-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test38-union-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test39-union-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test4-report.txt: Refresh.
* tests/data/test-diff-dwarf/test40-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test44-anon-struct-union-report-0.txt:
Refresh.
* tests/data/test-diff-dwarf/test45-anon-dm-change-report-0.txt:
Refresh.
* tests/data/test-diff-dwarf/test46-rust-report-0.txt: Refresh.
* tests/data/test-diff-dwarf/test5-report.txt: Refresh.
* tests/data/test-diff-dwarf/test8-report.txt: Refresh.
* tests/data/test-diff-filter/libtest45-basic-type-change-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test-PR26739-2-report-0.txt: Refresh.
* tests/data/test-diff-filter/test0-report.txt: Refresh.
* tests/data/test-diff-filter/test01-report.txt: Refresh.
* tests/data/test-diff-filter/test1-report.txt: Refresh.
* tests/data/test-diff-filter/test10-report.txt: Refresh.
* tests/data/test-diff-filter/test11-report.txt: Refresh.
* tests/data/test-diff-filter/test13-report.txt: Refresh.
* tests/data/test-diff-filter/test14-0-report.txt: Refresh.
* tests/data/test-diff-filter/test14-1-report.txt: Refresh.
* tests/data/test-diff-filter/test15-0-report.txt: Refresh.
* tests/data/test-diff-filter/test15-1-report.txt: Refresh.
* tests/data/test-diff-filter/test16-report-2.txt: Refresh.
* tests/data/test-diff-filter/test16-report.txt: Refresh.
* tests/data/test-diff-filter/test17-0-report.txt: Refresh.
* tests/data/test-diff-filter/test17-1-report.txt: Refresh.
* tests/data/test-diff-filter/test18-report.txt: Refresh.
* tests/data/test-diff-filter/test2-report.txt: Refresh.
* tests/data/test-diff-filter/test25-cyclic-type-report-0.txt: Refresh.
* tests/data/test-diff-filter/test25-cyclic-type-report-1.txt: Refresh.
* tests/data/test-diff-filter/test26-qualified-redundant-node-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test26-qualified-redundant-node-report-1.txt:
Refresh.
* tests/data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-1.txt:
Refresh.
* tests/data/test-diff-filter/test27-redundant-and-filtered-children-nodes-report-2.txt:
Refresh.
* tests/data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test28-redundant-and-filtered-children-nodes-report-1.txt:
Refresh.
* tests/data/test-diff-filter/test29-finer-redundancy-marking-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test3-report.txt: Refresh.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt:
Refresh.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt:
Refresh.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt:
Refresh.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt:
Refresh.
* tests/data/test-diff-filter/test32-ppc64le-struct-change-report0.txt:
Refresh.
* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test36-report-0.txt: Refresh.
* tests/data/test-diff-filter/test37-report-0.txt: Refresh.
* tests/data/test-diff-filter/test39/test39-report-0.txt: Refresh.
* tests/data/test-diff-filter/test42-leaf-report-output-0.txt: Refresh.
* tests/data/test-diff-filter/test44-anonymous-data-member-report-0.txt:
Refresh.
* tests/data/test-diff-filter/test44-anonymous-data-member-report-1.txt:
Refresh.
* tests/data/test-diff-filter/test9-report.txt: Refresh.
* tests/data/test-diff-pkg/GtkAda-gl-2.24.2-29.fc29.x86_64--2.24.2-30.fc30.x86_64-report-0.txt:
Refresh.
* tests/data/test-diff-pkg/PR24690/PR24690-report-0.txt: Refresh.
* tests/data/test-diff-pkg/dirpkg-1-report-1.txt: Refresh.
* tests/data/test-diff-pkg/dirpkg-3-report-1.txt: Refresh.
* tests/data/test-diff-pkg/dirpkg-3-report-2.txt: Refresh.
* 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:
Refresh.
* tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt:
Refresh.
* 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:
Refresh.
* tests/data/test-diff-pkg/nss-3.23.0-1.0.fc23.x86_64-report-0.txt:
Refresh.
* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
Refresh.
* tests/data/test-diff-pkg/symlink-dir-test1-report0.txt: Refresh.
* tests/data/test-diff-pkg/tarpkg-0-report-0.txt: Refresh.
* tests/data/test-diff-pkg/tarpkg-1-report-0.txt: Refresh.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt:
Refresh.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/libtest48-soname-abixml-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test0-type-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test0-type-suppr-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test0-type-suppr-report-5.txt: Refresh.
* tests/data/test-diff-suppr/test0-type-suppr-report-7.txt: Refresh.
* tests/data/test-diff-suppr/test1-typedef-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test1-typedef-suppr-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test11-add-data-member-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test12-add-data-member-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test12-add-data-member-report-2.txt:
Refresh.
* tests/data/test-diff-suppr/test13-suppr-through-pointer-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test13-suppr-through-pointer-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test14-suppr-non-redundant-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test14-suppr-non-redundant-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test15-suppr-added-fn-report-5.txt:
Refresh.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-2.txt:
Refresh.
* tests/data/test-diff-suppr/test16-suppr-removed-fn-report-5.txt:
Refresh.
* tests/data/test-diff-suppr/test17-suppr-added-var-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test17-suppr-added-var-report-2.txt:
Refresh.
* tests/data/test-diff-suppr/test17-suppr-added-var-report-5.txt:
Refresh.
* tests/data/test-diff-suppr/test18-suppr-removed-var-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test18-suppr-removed-var-report-2.txt:
Refresh.
* tests/data/test-diff-suppr/test18-suppr-removed-var-report-5.txt:
Refresh.
* tests/data/test-diff-suppr/test2-struct-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test23-alias-filter-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test23-alias-filter-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-10.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-12.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-14.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-16.txt: Refresh.
* tests/data/test-diff-suppr/test24-soname-report-4.txt: Refresh.
* tests/data/test-diff-suppr/test25-typedef-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test26-loc-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test26-loc-suppr-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test29-soname-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test29-soname-report-6.txt: Refresh.
* tests/data/test-diff-suppr/test29-soname-report-8.txt: Refresh.
* tests/data/test-diff-suppr/test3-struct-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test3-struct-suppr-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test3-struct-suppr-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test30-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test31-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test33-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test35-leaf-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test36-leaf-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test4-local-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test4-local-suppr-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test42-negative-suppr-type-report-0.txt:
Refresh.
* tests/data/test-diff-suppr/test42-negative-suppr-type-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test46-PR25128-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test46-PR25128-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test47-non-reachable-types-report-1.txt:
Refresh.
* tests/data/test-diff-suppr/test47-non-reachable-types-report-2.txt:
Refresh.
* tests/data/test-diff-suppr/test47-non-reachable-types-report-4.txt:
Refresh.
* tests/data/test-diff-suppr/test47-non-reachable-types-report-7.txt:
Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-4.txt: Refresh.
* tests/data/test-diff-suppr/test5-fn-suppr-report-5.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-0-1.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test6-fn-suppr-report-4.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-1.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-2.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-3.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-4.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-7.txt: Refresh.
* tests/data/test-diff-suppr/test7-var-suppr-report-8.txt: Refresh.
* tests/data/test-diff-suppr/test8-redundant-fn-report-0.txt: Refresh.
* tests/data/test-diff-suppr/test8-redundant-fn-report-1.txt: Refresh.

Signed-off-by: Giuliano Procida <gprocida@google.com>
3 years agodwarf-reader: Use DW_FORM_line_strp only if it's present
Dodji Seketeli [Mon, 8 Feb 2021 11:03:19 +0000 (12:03 +0100)]
dwarf-reader: Use DW_FORM_line_strp only if it's present

* configure.ac: Define if HAS_DW_FORM_line_strp if the
DW_FORM_line_strp enumerator is present.
* src/abg-dwarf-reader.cc (form_is_DW_FORM_line_strp): Define new
static function.
(compare_dies_string_attribute_value): Use it.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27267 - Better support for opaque enum types
Dodji Seketeli [Thu, 4 Feb 2021 08:26:05 +0000 (09:26 +0100)]
Bug 27267 - Better support for opaque enum types

Upon a request to build the IR for a opaque enum type,
get_opaque_version_of_type wrongly returns a nil type even though the
code is in there to construct an opaque variant of the enum.

This patch cleans up that code to let it build an opaque enum type.
It also ensures the opaque enum type is properly added to its lexical
scope to ensure proper life cycle management.

* src/abg-dwarf-reader.cc (get_opaque_version_of_type): Do not
quit early for enum types, because the code that comes a bit later
can handle enums.  Add the newly built enum to its scope for
proper life cycle management.
* tests/data/test-diff-suppr/PR27267/include-dir-v{0,1}/include.h: New
include files for the input test library.
* tests/data/test-diff-suppr/PR27267/libtestpr27267-v{0,1}.so: New
input test library.
* tests/data/test-diff-suppr/PR27267/report-1.txt: New reference
output for the comparison.
* tests/data/test-diff-suppr/PR27267/v{0,1}.c: Source code for the
new input test library.
* 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
above to the test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27331 - Data member offset change not considered local
Dodji Seketeli [Wed, 3 Feb 2021 12:47:46 +0000 (13:47 +0100)]
Bug 27331 - Data member offset change not considered local

The comparison code fails to consider that a data member which offset
changed (and which type didn't change) constitutes a local change of
the enclosing class type.

Fixed thus.

* src/abg-ir.cc (equals): In the overload of class_or_union, when
a data member changes without having its type change, then
consider the data change as being local.
* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-3.txt:
Adjust.
* tests/data/test-diff-filter/test-PR27331-report-0.txt: New
reference output.
* tests/data/test-diff-filter/test-PR27331-v{0,1}.c: New test
source files.
* tests/data/test-diff-filter/test-PR27331-v{0,1}.o: New test
binary inputs.
* tests/data/Makefile.am: Add these new test material to source
distribution.
* tests/test-diff-filter.cc (in_out_specs): Add the tests above to
the harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27165 - Better support multi-language binaries
Dodji Seketeli [Tue, 2 Feb 2021 11:35:54 +0000 (12:35 +0100)]
Bug 27165 - Better support multi-language binaries

In some binaries, a DIE named I originating from a compilation unit
written in the C++ language can be an implementation of a DIE named S
(linked through the DW_AT_specification attribute on I) originating
from a compilation unit written in, say, the C language.

In that case, when are we looking at I and try to get the scope of S
(which the DWARF reader considers as the logical scope of I)
get_scope_for_die needs to look at the DW_AT_language attribute
carried by the compilation unit DIE of S.  At the moment, we wrongly
look at the DW_AT_language carried by the compilation unit DIE of I
and we deduce the wrong language (C++ instead of C).

This patch fixes that.

* src/abg-dwarf-reader.cc (get_scope_for_die): Get the language of
the DIE from the compilation unit of the DIE itself.
* tests/data/test-types-stability/PR27165-libzmq.so.5.2.3: New
test input.
* tests/data/test-types-stability/PR27165-libzmq.so.5.2.3.debug:
Debug information for the new test input.
* tests/data/Makefile.am: Add the test inputs above to the source
distribution.
* tests/test-types-stability.cc (elf_paths): Add the new test
inputs to this test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBump ABIXML format version to 2.0
Dodji Seketeli [Thu, 22 Oct 2020 14:04:08 +0000 (16:04 +0200)]
Bump ABIXML format version to 2.0

After fixing the interpretation of the DW_AT_bit_offset attribute for
offset of bit field data members, serialized abixml might now be
incompatible with versions of Libabigail that use the previous
interpretation.

That means that comparing an abixml file generated with previous
versions of Libabigail against a corpus resulting from an analysis
performed with the current version of libabigail might yield spurious
changes due to the differences in the way we now interpret the
DW_AT_bit_offset.

Hence, this patch bumps the version of abixml files emitted from now
on to "2.0".  This version is deemed incompatible with the previous
"1.0" version.

Subsequently, an abixml file of the "1.0" format cannot be compared
against an abixml file of the "2.0" format, or against a binary
analyzed with a current version of Libabigail.

It's thus advised that abixml files of the "1.0" format version should
be re-generated with a current version of Libabigail, bumping their
format version number to the new "2.0".

* include/abg-corpus.h (corpus::init_format_version): Declare new
private method.
(corpus::set_environment): Make this non-const.
(corpus::{get,set}_format_{major,minor}_version_number): Declare
new accessors.
* src/abg-corpus.cc (corpus::init_format_version): Define new
method.
(corpus::set_environment): By default, initialize the format
version number of the corpus to the one supported by Libabigail.
(corpus::{get,set}_format_{major,minor}_version_number): Define
new accessors.
* include/abg-ir.h: Include abg-config.h to use the
abigail::config.
(environment::get_config): Declare new accessor.
* src/abg-ir.cc (environment::priv::config_): Add new data member.
(environment::get_config): Define new accessor.
* src/abg-config.cc (config::config): Bump the format
version number to "2.0".
* src/abg-corpus-priv.h
(corpus::priv::format_{major,minor}_version_number_): Add new data members.
* src/abg-reader.cc (handle_version_attribute): Define new static
function.
(read_corpus_from_input, read_corpus_group_from_input): Use it to
read the value of the "version" attribute and set the format
version number of the corpus and corpus group accordingly.
* src/abg-writer.cc (write_context::m_config): Remove the config
object because we can now get it from the environment.
(write_context::get_config): Get the config object from the
environment.
(write_translation_unit): Do not emit the version attribute on the
translation unit element anymore.
(write_version_info): Define static function.
(write_corpus, write_corpus_group): Use it to emit version
attribute on both the corpus and corpus group elements.
* tools/abidiff.cc
(emit_incomptatible_format_version_error_message): Define new
static function.
(main): Ensure that corpora and corpus groups being compared have
the same major version number.
* tests/update-test-output.py: Adjust syntax for python3.
* tests/data/test-annotate/libtest23.so.abi: Adjust.
* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Likewise.
* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-annotate/test-anonymous-members-0.o.abi:
Likewise.
* tests/data/test-annotate/test0.abi: Likewise.
* tests/data/test-annotate/test1.abi: Likewise.
* tests/data/test-annotate/test13-pr18894.so.abi: Likewise.
* tests/data/test-annotate/test14-pr18893.so.abi: Likewise.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test17-pr19027.so.abi: Likewise.
* tests/data/test-annotate/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-annotate/test2.so.abi: Likewise.
* tests/data/test-annotate/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.
* tests/data/test-annotate/test3.so.abi: Likewise.
* tests/data/test-annotate/test4.so.abi: Likewise.
* tests/data/test-annotate/test5.o.abi: Likewise.
* tests/data/test-annotate/test6.so.abi: Likewise.
* tests/data/test-annotate/test7.so.abi: Likewise.
* tests/data/test-annotate/test8-qualified-this-pointer.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-report-0.txt:
Likewise.
* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
Likewise.
* tests/data/test-diff-suppr/libtest48-soname-abixml-v0.so.abi:
Likewise.
* tests/data/test-diff-suppr/libtest48-soname-abixml-v1.so.abi:
Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi:
Likewise.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
* tests/data/test-read-dwarf/PR24378-fn-is-not-scope.abi:
Likewise.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Likewise.
* tests/data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi:
Likewise.
* tests/data/test-read-dwarf/PR26261/PR26261-exe.abi: Likewise.
* tests/data/test-read-dwarf/libtest23.so.abi: Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-read-dwarf/test-PR26568-1.o.abi: Likewise.
* tests/data/test-read-dwarf/test-PR26568-2.o.abi: Likewise.
* tests/data/test-read-dwarf/test0.abi: Likewise.
* tests/data/test-read-dwarf/test0.hash.abi: Likewise.
* tests/data/test-read-dwarf/test1.abi: Likewise.
* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Likewise.
* tests/data/test-read-dwarf/test14-pr18893.so.abi: Likewise.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-read-dwarf/test17-pr19027.so.abi: Likewise.
* tests/data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Likewise.
* tests/data/test-read-dwarf/test2.so.abi: Likewise.
* tests/data/test-read-dwarf/test2.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi:
Likewise.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Likewise.
* tests/data/test-read-dwarf/test3.so.abi: Likewise.
* tests/data/test-read-dwarf/test3.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test4.so.abi: Likewise.
* tests/data/test-read-dwarf/test4.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test5.o.abi: Likewise.
* tests/data/test-read-dwarf/test5.o.hash.abi: Likewise.
* tests/data/test-read-dwarf/test6.so.abi: Likewise.
* tests/data/test-read-dwarf/test6.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test7.so.abi: Likewise.
* tests/data/test-read-dwarf/test7.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi:
Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi:
Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
* tests/data/test-read-write/test0.xml: Likewise.
* tests/data/test-read-write/test1.xml: Likewise.
* tests/data/test-read-write/test10.xml: Likewise.
* tests/data/test-read-write/test11.xml: Likewise.
* tests/data/test-read-write/test12.xml: Likewise.
* tests/data/test-read-write/test13.xml: Likewise.
* tests/data/test-read-write/test14.xml: Likewise.
* tests/data/test-read-write/test15.xml: Likewise.
* tests/data/test-read-write/test16.xml: Likewise.
* tests/data/test-read-write/test17.xml: Likewise.
* tests/data/test-read-write/test18.xml: Likewise.
* tests/data/test-read-write/test19.xml: Likewise.
* tests/data/test-read-write/test2.xml: Likewise.
* tests/data/test-read-write/test20.xml: Likewise.
* tests/data/test-read-write/test21.xml: Likewise.
* tests/data/test-read-write/test22.xml: Likewise.
* tests/data/test-read-write/test23.xml: Likewise.
* tests/data/test-read-write/test24.xml: Likewise.
* tests/data/test-read-write/test25.xml: Likewise.
* tests/data/test-read-write/test26.xml: Likewise.
* tests/data/test-read-write/test27.xml: 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.
* tests/data/test-read-write/test3.xml: Likewise.
* tests/data/test-read-write/test4.xml: Likewise.
* tests/data/test-read-write/test5.xml: Likewise.
* tests/data/test-read-write/test6.xml: Likewise.
* tests/data/test-read-write/test7.xml: Likewise.
* tests/data/test-read-write/test8.xml: Likewise.
* tests/data/test-read-write/test9.xml: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 26684 - Support DW_AT_data_bit_offset attribute
Dodji Seketeli [Tue, 20 Oct 2020 09:36:42 +0000 (11:36 +0200)]
Bug 26684 - Support DW_AT_data_bit_offset attribute

This patch adds support for the DW_AT_data_bit_offset DWARF 5
attribute.  Note that this attribute has been introduced in prior
versions of DWARF, but since the version 5, it supersedes the
DW_AT_bit_offset attribute.

Note that Libabigail was wrongly interpreting the DW_AT_bit_offset
attribute.  It was considering it as the offset of the bit field data
member, starting from the least significant bit of the containing
structure.  That is not the case on little endian machines,
unfortunately.

So this patch fixes that mistake.

So with this patch, we can now compare a binary using DW_AT_bit_offset
against a binary using DW_AT_data_bit_offset and expect things to work
correctly.

The problem is that abixml files generated with Libabigail versions
prior to this patch contain bit field data member offset values that
are not compatible with those contained in abixml files generated with
this version, onward.

So I guess a subsequent patch is needed to introduce a new abixml
version string (maybe "2.0") that would be deemed incompatible with
the previous "1.0" one.  That way, we can prevent comparing 2.0 abixml
files against 1.0 ones in abidiff, for instance.

For now, the patch adjusts the various abixml files to make them
reflect the proper representation of DW_AT_bit_offset on little endian
machines.

* src/abg-dwarf-reader.cc (read_and_convert_DW_at_bit_offset):
Define new static function.
(die_member_offset): Primarily use DW_AT_data_bit_offset if its
present.  Otherwise, look for DW_AT_bit_offset.  Use the new
read_and_convert_DW_at_bit_offset function to properly interpret
DW_AT_bit_offset if its present.  Update comment.
* tests/data/test-diff-filter/test-PR26684-dwarf{4,5}.o: New
binary test inputs.
* tests/data/test-diff-filter/test-PR26684.c: Source code of the
new binary test inputs above.
* tests/data/test-diff-filter/test-PR26684-report-0.txt: New
reference test output.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-diff-filter.cc (in_out_specs): Add the test inputs
above to this test harness.
* tests/data/test-annotate/test13-pr18894.so.abi: Adjust.
* tests/data/test-annotate/test15-pr18892.so.abi: Adjust.
* tests/data/test-annotate/test17-pr19027.so.abi: Adjust.
* tests/data/test-annotate/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Adjust.
* tests/data/test-annotate/test21-pr19092.so.abi: Adjust.
* tests/data/test-diff-dwarf-abixml/PR25409-librte_bus_dpaa.so.20.0.abi:
Adjust.
* tests/data/test-diff-pkg/libcdio-0.94-1.fc26.x86_64--libcdio-0.94-2.fc26.x86_64-report.1.txt:
Adjust.
* tests/data/test-read-dwarf/PR25007-sdhci.ko.abi: Adjust.
* tests/data/test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi:
Adjust.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Adjust.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Adjust.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Adjust.
* tests/data/test-read-dwarf/test17-pr19027.so.abi: Adjust.
* tests/data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi:
Adjust.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Adjust.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27255 - fedabipkgdiff fails on nfs-utils on Fedora 33
Dodji Seketeli [Wed, 27 Jan 2021 10:20:48 +0000 (11:20 +0100)]
Bug 27255 - fedabipkgdiff fails on nfs-utils on Fedora 33

When running fedabipkgdiff as:

    fedabipkgdiff --self-compare -a --from fc33 nfs-utils

I am getting:

    Error encountered while running fedabipkgdiff with error message:

Running it with the --verbose option yields more clue, though.

It turns out that fedabipkgdiff runs abipkgdiff on an RPM and gives it
the wrong associated -debuginfo RPM.

This is because the member function
RPMCollection.get_sibling_debuginfo() doesn't returns the "first"
debuginfo package that comes with a given RPM.  In the case of the
package nfs-utils-2.5.2-1.rc4.fc33.aarch64.rpm, it was using the
package nfs-utils-coreos-debuginfo-2.5.2-1.rc4.fc33.aarch64.rpm
instead of the package nfs-utils-debuginfo-2.5.2-1.rc4.fc33.aarch64.rpm.

So, of course, abipkgdiff could not find the proper debuginfo for the
binaries carried by nfs-utils-2.5.2-1.rc4.fc33.aarch64.rpm.

This happens only in cases where there a several debuginfo packages
for a given RPM.  In that case, we need to be more careful to select
the right debuginfo package and not just a random one.

This patch adds a RPMCollection.get_matching_debuginfo() member function
that does the right thing.  It thus teaches
generate_comparison_halves() to use the new function.

* tools/fedabipkgdiff (RPMCollection::get_sibling_debuginfo):
Update comment.
(RPMCollection::get_matching_debuginfo): Define new function.
(generate_comparison_halves): Use
RPMCollection::get_matching_debuginfo instead of
RPMCollection::get_sibling_debuginfo.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agodwarf-reader: Support fast DW_FORM_line_strp string comparison
Dodji Seketeli [Tue, 26 Jan 2021 18:19:01 +0000 (19:19 +0100)]
dwarf-reader: Support fast DW_FORM_line_strp string comparison

When running Libabigail on Fedora 34 it appeared that we don't support
DW_FORM_line_strp in the fast string comparison scheme, during DIE
de-duplication.

This patch fixes that.

* src/abg-dwarf-reader.cc (compare_dies_string_attribute_value):
Support DW_FORM_line_strp.
* tests/data/test-diff-pkg/sshpass-1.07-1.fc34.x86_64-self-check-report-0.txt:
New reference test output.
* tests/data/test-diff-pkg/sshpass-1.07-1.fc34.x86_64.rpm: New
test input.
* tests/data/test-diff-pkg/sshpass-debuginfo-1.07-1.fc34.x86_64.rpm:
Likewise.
* tests/data/Makefile.am: Add the new testing material above to
source distribution.
* tests/test-diff-pkg.cc (in_out_specs): Add the test input above
to this harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27232 - fedabipkgdiff fails on gawk from Fedora 33
Dodji Seketeli [Tue, 26 Jan 2021 05:35:29 +0000 (06:35 +0100)]
Bug 27232 - fedabipkgdiff fails on gawk from Fedora 33

When running fedabipkgdiff on the gawk-5.1.0-2.fc33.aarch64.rpm
package we get this error message:

    Error encountered while running fedabipkgdiff with error message:

That is not a very useful error message to say the least.

The issue is that abipkgdiff returns with an "unknown error" which is
due to the fact that the gawk package contains a directory that is
owned by root.  As abipkgdiff tries to write temporary files into that
directory, it fails to do so.

The patch now writes the temporary ABIXML file into a sub-directory
that is not owned the package where we should have write privileges.

It also improves error reporting.

* tools/abipkgdiff.cc (options::pkg{1,2}): Add new data members to
store the packages to compare and have them available for the
various functions that may need them down the road.
(package::create_abi_file_path): Add new function.
(compare_to_self): Use the new package::create_abi_file_path to
create the path to the ABI file in a directory not owned by the
package.  That should increase our chances of having the rights to
write that one.  Make sure to emit error message when the
comparison against self fails.
({compare_task, self_compare_task}::perform): During the process
of comparison if an internal error happens, report it.  Cleanup
the existing reporting a little bit.
(pkg_extraction_task::perform): Fix comment.
* tests/data/test-diff-pkg/libxfce4ui-devel-4.12.1-8.fc27.ppc64-self-report-0.txt:
Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoabipkgdiff: Address operator precedence warning
Matthias Maennich [Tue, 26 Jan 2021 09:56:56 +0000 (09:56 +0000)]
abipkgdiff: Address operator precedence warning

When compiling with clang, it (rightfully) complains about an operator
precedence issue:

abipkgdiff.cc:1646:7: error: operator '?:' has lower precedence than '<<'; '<<' will be evaluated first [-Wparentheses]
      ? string("Comparison against self SUCCEEDED\n")
      ^

Fix that by properly placing the parentheses. Also, drop the superfluous
string conversion.

* tools/abipkgdiff.cc (compare_to_self): address clang warning.

Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoBug 27233 - fedabipkgdiff fails on package gnupg2 from Fedora 33
Dodji Seketeli [Tue, 26 Jan 2021 13:05:19 +0000 (14:05 +0100)]
Bug 27233 - fedabipkgdiff fails on package gnupg2 from Fedora 33

At the core of this issue, Libabigail is failing to canonicalize some
types in some cases.  And that is triggering the assertion at the end
of hash_as_canonical_type_or_constant when emitting ABIXML.

It turns out read_context::canonicalize_types_scheduled in the dwarf
reader sometimes fails to canonicalize the types contained in
read_context::extra_types_to_canonicalize().

This patch fixes that.

Incidentally, this patch also fixes a previous issue where
hash_as_canonical_type_or_constant would hit that assert at its end
because of non-canonicalized function types.  I am now removing the
band-aid I put in place at the time by loosening the assertion there.

* src/abg-dwarf-reader.cc
(read_context::canonicalize_types_scheduled): Don't forget to
canonicalize types stored in extra_types_to_canonicalize_.
* src/abg-ir.cc (type_base::get_canonical_type_for): Add better
comment.
(hash_as_canonical_type_or_constant): Remove crutch that is
useless now that we canonicalize almost all types in the system.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27236 - Pointer comparison wrongly fails because of typedef change
Dodji Seketeli [Mon, 25 Jan 2021 17:40:13 +0000 (18:40 +0100)]
Bug 27236 - Pointer comparison wrongly fails because of typedef change

Support we have a type struct S and a type T defined as:
  typedef struct S T;

Today, Libabigail considers that the two pointers "struct S*" and "T*"
are different.

The problem is that this can cause spurious change reports (as
reported by (abidw --abidiff) in binaries where we have the same type
defined more than once, each time using a different various around
this theme.

This patch make libabigail to now consider that "struct S*" and "T*"
are equal.  It does the same for references and arrays.

 * src/abg-ir.cc (equals): In the overloads for pointer_type_def,
reference_type_def and array_type_def, compare the pointed-to-type
modulo typedefs.
* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt: Adjust.
* 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:
Adjust.
* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoIgnore duplicated functions and those not associated with ELF symbols
Dodji Seketeli [Fri, 22 Jan 2021 10:24:43 +0000 (11:24 +0100)]
Ignore duplicated functions and those not associated with ELF symbols

While looking at several ABIXML files I noticed that several (member)
functions didn't have any associated ELF symbol and that in some cases,
there were even duplicated member functions.  Those are the source of
some spurious changes sometimes reported by abidiff.

In DWARF the same function F can be represented several times.  One
representation of F has some properties and other representations of F
might have properties that complement the properties carried by the
former representations.  It's the unions of the properties of all
representations of F that constitute the properties of F.

An example of that "linked" nature is how DWARF represents inlined
functions.  A function F can be inlined somewhere else.  That inlined
version is called F', for instance.  The DWARF representation of F'
will carry a DW_AT_abstract_origin attribute that points back to F to
signify that F' is the concrete inlined version of the abstract F.

F' will carry properties that are specific to its "inlined nature"
whereas F will carry properties that are more generic and independent
from all its various potential inlined forms.

So when Libabigail sees the DWARF representation of F, if it's
associated with an ELF symbol, then it must wait to encounter an F'
representation that is associated with an ELF symbol before adding an
internal representation (IR) of F into the final IR graph.  Otherwise
the IR of F can be unnecessarily duplicated, with some instances
having an associated ELF symbol and others not.

This is what this patch does, in essence.  While working on this, I
encountered some tangential issues that needed to be fixed altogether
for the whole to function.  A lot of regression tests output had to be
adjusted.

In the end, a number of spurious change reports could be fixed;
notably reports about removal of destructors like STR::~STR(int).
Note how that destructor has a parameter; it's a GCC-specific
implementation detail that should not appear at this level, I believe.

* include/abg-ir.h (class_or_union::string_mem_fn_sptr_map_type):
Add a typedef for unordered_map<string, method_decl_sptr>.
(class_or_union::find_member_function_sptr): Declare new function.
* src/abg-ir.cc (class_or_union::priv::mem_fns_map_): Change the
type of this to string_mem_fn_sptr_map_type, so that shared
pointers to functions can be stored in the map, instead of bare
pointers to functions.  This is useful to implement
class_or_union::find_member_function_sptr which returns a shared
pointer to function.
(class_or_union::find_member_function_sptr): Define new function.
(class_or_union::find_member_function): Adjust.
(method_decl::set_linkage_name): Use a non-deleting shared pointer
to store the current instance of member function into
class_or_union::priv::mem_fns_map_.
(hash_as_canonical_type_or_constant): As we are seeing more
function types, it appears that some function types are not
canonicalized.  I am not sure why exactly, but let's loosen the
assert here for now, I'll chase the root of this later.
* src/abg-dwarf-reader.cc (finish_member_function_reading):
Improve detection of member function 'static-ness' by handling
cases where a this pointer can be const.  Also support
DW_AT_object_pointer when it's present.  This fixes the occurrence
of spurious change reports about loss of 'static-ness' of member
functions.
(potential_member_fn_should_be_dropped): Define new static
function and ...
(build_ir_node_from_die): ... use it here.  When a function DIE
has the same linkage name as an existing function IR, do not
create a new IR for it.  Rather, re-use the existing one to
complete it with the properties found on the function DIE.  If a
new function doesn't seem to have an associated ELF symbol and is
not meant to be a virtual member function then drop its IR on the
floor as well.
* tests/data/test-annotate/libtest23.so.abi: Adjust.
* tests/data/test-annotate/libtest24-drop-fns-2.so.abi: Likewise.
* tests/data/test-annotate/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-annotate/test0.abi: Likewise.
* tests/data/test-annotate/test1.abi: Likewise.
* tests/data/test-annotate/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/test6.so.abi: Likewise.
* tests/data/test-annotate/test8-qualified-this-pointer.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/test0-report.txt: Likewise.
* tests/data/test-diff-dwarf/test28-vtable-changes-report-0.txt: Likewise.
* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.txt: Likewise.
* tests/data/test-diff-filter/test0-report.txt: Likewise.
* tests/data/test-diff-filter/test01-report.txt: Likewise.
* tests/data/test-diff-filter/test10-report.txt: Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report0.txt: Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report1.txt: Likewise.
* tests/data/test-diff-filter/test30-pr18904-rvalueref-report2.txt: Likewise.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-0.txt: Likewise.
* tests/data/test-diff-filter/test31-pr18535-libstdc++-report-1.txt: Likewise.
* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-0.txt: Likewise.
* tests/data/test-diff-filter/test35-pr18754-no-added-syms-report-1.txt: Likewise.
* tests/data/test-diff-filter/test41-report-0.txt: Likewise.
* tests/data/test-diff-filter/test9-report.txt: Likewise.
* tests/data/test-diff-pkg/libsigc++-2.0-0c2a_2.4.0-1_amd64--libsigc++-2.0-0v5_2.4.1-1ubuntu2_amd64-report-0.txt: Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt: Likewise.
* tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-1.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-1.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-10.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-12.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-14.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-16.txt: Likewise.
* tests/data/test-diff-suppr/test24-soname-report-4.txt: Likewise.
* tests/data/test-diff-suppr/test31-report-1.txt: Likewise.
* tests/data/test-read-dwarf/PR22015-libboost_iostreams.so.abi: Likewise.
* tests/data/test-read-dwarf/PR22122-libftdc.so.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-libandroid.so.abi: Likewise.
* tests/data/test-read-dwarf/test0.abi: Likewise.
* tests/data/test-read-dwarf/test0.hash.abi: Likewise.
* tests/data/test-read-dwarf/test1.abi: Likewise.
* tests/data/test-read-dwarf/test1.hash.abi: Likewise.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test11-pr18828.so.abi: Likewise.
* tests/data/test-read-dwarf/test12-pr18844.so.abi: Likewise.
* tests/data/test-read-dwarf/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/test6.so.abi: Likewise.
* tests/data/test-read-dwarf/test6.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.abi: Likewise.
* tests/data/test-read-dwarf/test8-qualified-this-pointer.so.hash.abi: Likewise.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoBug 27204 - potential loss of some aliased ELF function symbols
Dodji Seketeli [Wed, 20 Jan 2021 05:03:59 +0000 (06:03 +0100)]
Bug 27204 -  potential loss of some aliased ELF function symbols

Sometimes when a symbol S' of a function F' aliases the symbol S of a function
F, the ABIXML reader might not add F' back into the set of exported
functions of the ABI corpus (as the DWARF reader has done initially).
That results in the apparent 'loss' of F' (and S') from the corpus.

This is due to the way F' is identified, using function_decl::get_id.
In the case where the symbol S' of F' has aliases,
function_decl::get_id (wrongly) uses the linkage name of F' as the
identifier.  If F' and F happen to have the same linkage name and if F
is already in the set of exported functions of the corpus then F'
won't be added into that set.

To solve that problem, this patch makes function_decl::get_id
construct an ID that ensures that F and F' always have different IDs.

* src/abg-ir.cc (function_decl::get_id): If the elf symbol has
aliases, make the function name be part of the ID so that this ID
differs from the one of the other functions that share a symbol
alias with this one.
* tests/data/test-abidiff/test-PR18791-report0.txt: Adjust.
* tests/data/test-diff-dwarf/test42-PR21296-clanggcc-report0.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/test41-report-0.txt: Likewise.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-diff-pkg/glibc-2.32-3.fc33.aarch64-self-check-report-0.txt:
New test reference output.
* tests/data/test-diff-pkg/glibc-2.32-3.fc33.aarch64.rpm: New test
input RPM.
* tests/data/test-diff-pkg/glibc-debuginfo-2.32-3.fc33.aarch64.rpm:
Likewise.
* tests/data/Makefile.am: Add the new test material to source
distribution.
* tests/test-diff-pkg.cc (in_out_specs): Add the new test input
RPMs to this test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agoabg-ir: Optimize calls to std::string::find() for a single char.
Matthias Maennich [Tue, 15 Dec 2020 21:45:19 +0000 (21:45 +0000)]
abg-ir: Optimize calls to std::string::find() for a single char.

This is a common micro optimization suggested by clang-tidy to improve
string::find performance. I have not done any measurements as to how it
impacts performance for that particular piece of code, but generally
this overload is to prefer here.

* src/abg-ir.cc (elf_symbol::get_name_and_version_from_id):
  use character literal overload for single character string::find.
  (parse_integral_type): Likewise.

Suggested-by: Chris Kennelly <ckennelly@google.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
3 years agoBug 26992 - Try harder to resolve declaration-only classes
Dodji Seketeli [Fri, 15 Jan 2021 14:38:44 +0000 (15:38 +0100)]
Bug 26992 - Try harder to resolve declaration-only classes

When a declaration of a class, named H, matches more than one
definition (let's call them D) of H (in several other translation
units of the abi corpus) then H is left unresolved; that is, H is
considered as being a declaration-only class.  Note that down the
road, H will compare different to all those Ds.

However when those Ds are all equal, it turns out that this can lead
to issues down the road.  This is because conceptually, H equals D.
But then by not resolving H to D (and there are several Ds), we
artificially create a situation where H is different from D.  We can
even create situations where those Ds are different among themselves.
So doing comparisons inevitably leads to spurious changes.

This is the root cause of the issue described in this bug at
https://sourceware.org/bugzilla/show_bug.cgi?id=26992.

To fix the issue, this patch thus resolves H to D when the different
Ds are all equal.

Note that a similar thing should be done for the process of resolving
declaration-only enums as well.  But I don't have an issue reproducer
at hand involving enums at the moment, so I am adding a comment to
read_context::resolve_declaration_only_enums for now.

I have also filled the enhancement request
https://sourceware.org/bugzilla/show_bug.cgi?id=27189 to track a task
that would do away with read_context::resolve_declaration_only_enums
altogether by factorizing out the resolution of declaration-only
abigail::ir::decl_base.

* src/abg-dwarf-reader.cc
(read_context::compare_before_canonicalisation): Define new member
function.
(read_context::resolve_declaration_only_classes): When there are
more than one definition that can resolve a given declaration, if
all those definitions are equal, then resolve the declaration to
those definitions.
(read_context::resolve_declaration_only_enums): Add a comment to
update similarly update this function (or do away with it
completely) later.
* tests/data/test-annotate/test15-pr18892.so.abi: Adjust.
* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Likewise.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.rpm: Add new
test input.
* tests/data/test-diff-pkg/cogl-debuginfo-1.22.8-2.fc33.x86_64.rpm:
Likewise.
* tests/data/test-diff-pkg/cogl-1.22.8-2.fc33.x86_64.self-check-report-0.txt:
Likewise.
* tests/test-diff-pkg.cc (in_out_specs): Add the new test inputs
to the test harness.
* tests/data/Makefile.am: Add the new test input files to source
distribution.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
3 years agomainpage: Update web page for 1.8 release
Dodji Seketeli [Mon, 11 Jan 2021 14:10:19 +0000 (15:10 +0100)]
mainpage: Update web page for 1.8 release

* doc/website/mainpage.txt: Update web page for 1.8 release

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoUpdate catch2 testing framework: v1.12.2 -> v2.13.3
Matthias Maennich [Mon, 14 Dec 2020 23:05:57 +0000 (23:05 +0000)]
Update catch2 testing framework: v1.12.2 -> v2.13.3

We can now use the latest upstream stable version since we bumped up our
minimum C++ standard version.

* tests/lib/catch.hpp: update to v2.13.3
* tests/test-symtab.cc (TEST_CASE("Symtab::SimpleSymtabs")): Use
the corpus variable to avoid unused variable warnings.

Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoclang-format: define C++ standard to improve formatting
Matthias Maennich [Mon, 14 Dec 2020 23:02:12 +0000 (23:02 +0000)]
clang-format: define C++ standard to improve formatting

This is mostly seen for nested templates like
  std::pair<int, std::vector<int> > vs. std::pair<int, std::vector<int>>
                                ^^^                                   ^^

* .clang-format: Set C++11 standard for formatting.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoRefresh ABI cross check test files
Giuliano Procida [Fri, 11 Dec 2020 15:03:24 +0000 (15:03 +0000)]
Refresh ABI cross check test files

The test file test0-pr19026-libvtkIOSQL-6.1.so.1 is intended to be
used to check that diffing a binary entity against its ABI
representation results in an empty diff.  In this case, the ABI of the
library is also under revision control and so the test also functions
to a certain extent as check on whether the generated ABI is stable
between revisions of libabigail.

Recent changes have affected attributes and ordering of elements. The
result is that there is now a non-empty diff between the library and
the saved ABI, albeit all "harmless" changes.

This commit refreshes the revision-controlled ABI, eliminating the
differences.

* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi:
Refreshed ABI.
* tests/data/test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1-report-0.txt:
File now empty.

Signed-off-by: Giuliano Procida <gprocida@google.com>
4 years agoDrop unneccessary includes of abg-cxx-compat.h
Matthias Maennich [Mon, 14 Dec 2020 23:08:56 +0000 (23:08 +0000)]
Drop unneccessary includes of abg-cxx-compat.h

Remove the unneccessary includes of abg-cxx-compat.h as users have been
migrated to use the corresponding standard includes.

* include/abg-comparison.h: Remove include of abg-cxx-compat.h.
* include/abg-diff-utils.h: Likewise.
* include/abg-fwd.h: Likewise.
* include/abg-ini.h: Likewise.
* include/abg-interned-str.h: Likewise.
* include/abg-ir.h: Likewise.
* include/abg-libxml-utils.h: Likewise.
* include/abg-libzip-utils.h: Likewise.
* include/abg-regex.h: Likewise.
* include/abg-reporter.h: Likewise.
* include/abg-sptr-utils.h: Likewise.
* include/abg-suppression.h: Likewise.
* include/abg-tools-utils.h: Likewise.
* include/abg-workers.h: Likewise.
* src/abg-comp-filter.cc: Likewise.
* src/abg-comparison-priv.h: Likewise.
* src/abg-corpus.cc: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* src/abg-hash.cc: Likewise.
* src/abg-ir.cc: Likewise.
* src/abg-reader.cc: Likewise.
* src/abg-suppression.cc: Likewise.
* src/abg-tools-utils.cc: Likewise.
* src/abg-writer.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tests/test-read-write.cc: Likewise.
* tools/abicompat.cc: Likewise.
* tools/abidw.cc: Likewise.
* tools/abilint.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoRemove <unordered_set> usages from abg_compat
Matthias Maennich [Mon, 14 Dec 2020 23:08:55 +0000 (23:08 +0000)]
Remove <unordered_set> usages from abg_compat

std::unordered_set is now provided through the language standard, hence
remove the compatibility code for <unordered_set> and adjust all users
accordingly.

* include/abg-cxx-compat.h: Drop compatibility for <unordered_set>.
* include/abg-comparison.h: migrate abg_compat use to std.
* include/abg-interned-str.h: Likewise.
* include/abg-suppression.h: Likewise.
* src/abg-comparison-priv.h: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoRemove <unordered_map> usages from abg_compat
Matthias Maennich [Mon, 14 Dec 2020 23:08:54 +0000 (23:08 +0000)]
Remove <unordered_map> usages from abg_compat

std::unordered_map is now provided through the language standard, hence
remove the compatibility code for <unordered_map> and adjust all users
accordingly.

* include/abg-cxx-compat.h: Drop compatibility layer for <unordered_map>.
* include/abg-comparison.h: migrate abg_compat use to std.
* include/abg-cxx-compat.h: Likewise.
* include/abg-fwd.h: Likewise.
* include/abg-ir.h: Likewise.
* src/abg-corpus.cc: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* src/abg-ir.cc: Likewise.
* src/abg-reader.cc: Likewise.
* src/abg-writer.cc: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoRemove <memory> usages from abg_compat
Matthias Maennich [Mon, 14 Dec 2020 23:08:53 +0000 (23:08 +0000)]
Remove <memory> usages from abg_compat

std::shared_ptr, std::weak_ptr, std::dynamic_pointer_cast,
std::static_pointer_cast are now provided through the language standard,
hence remove the compatibility code for <memory> and adjust all users
accordingly.

* include/abg-cxx-compat.h: Drop compatibility layer for <memory>.
* include/abg-diff-utils.h: migrate abg_compat use to std.
* include/abg-fwd.h: Likewise.
* include/abg-ini.h: Likewise.
* include/abg-interned-str.h: Likewise.
* include/abg-libxml-utils.h: Likewise.
* include/abg-libzip-utils.h: Likewise.
* include/abg-regex.h: Likewise.
* include/abg-reporter.h: Likewise.
* include/abg-sptr-utils.h: Likewise.
* include/abg-tools-utils.h: Likewise.
* include/abg-workers.h: Likewise.
* src/abg-comp-filter.cc: Likewise.
* src/abg-comparison-priv.h: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* src/abg-ir.cc: Likewise.
* src/abg-reader.cc: Likewise.
* src/abg-suppression.cc: Likewise.
* src/abg-tools-utils.cc: Likewise.
* src/abg-writer.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-pkg.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tests/test-read-dwarf.cc: Likewise.
* tests/test-read-write.cc: Likewise.
* tests/test-types-stability.cc: Likewise.
* tests/test-write-read-archive.cc: Likewise.
* tools/abicompat.cc: Likewise.
* tools/abidiff.cc: Likewise.
* tools/abidw.cc: Likewise.
* tools/abilint.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoRemove <functional> usages from abg_compat
Matthias Maennich [Mon, 14 Dec 2020 23:08:52 +0000 (23:08 +0000)]
Remove <functional> usages from abg_compat

std::hash is now provided through the language standard, hence remove
the compatibility code for <functional> and adjust all users
accordingly.

* include/abg-cxx-compat.h: Drop compatibility layer for <functional>.
* include/abg-interned-str.h: migrate abg_compat use to std.
* include/abg-ir.h: Likewise.
* src/abg-hash.cc: Likewise.
* src/abg-ir.cc: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoDrop C++03 compatibility layer
Matthias Maennich [Mon, 14 Dec 2020 23:08:51 +0000 (23:08 +0000)]
Drop C++03 compatibility layer

Now with C++11 as minimum standard, we can drop the facilities required
to support earlier standards. Hence purge the use of std::tr1 from the
sources.

* include/abg-cxx-compat.h: remove compatibility with pre C++11.
* include/abg-ir.h: Remove mention of std::tr1 from comments.
* include/abg-sptr-utils.h: Likewise.

Signed-off-by: Matthias Maennich <maennich@google.com>
4 years agoAdd qualifier / typedef / array / pointer test
Giuliano Procida [Fri, 4 Dec 2020 16:55:24 +0000 (16:55 +0000)]
Add qualifier / typedef / array / pointer test

This change adds a test which exercises libabigail's handling of
qualified typedefs of arrays. The base type in the test case is an
array of pointers (chosen so we can also use restrict).

Various typedefs and (indirect) qualifications of this type are
created. In all cases, the resulting type should be an array of
qualified pointers.

However, abidiff reports things like

  'const volatile void* const'

changed to

  'restrict const volatile volatile void* const'

I've not attempted to check whether DWARF and ABI XML faithfully
reflect the source types. There may be trouble there as well.

For the record, these are the expected v0 types:

A = void *[7]
B = void *[7]
C = void *const[7]
D = void *const[7]
E = void *const volatile[7]
F = void *const volatile[7]
G = void *const volatile restrict[7]
H = void *const volatile restrict[7]

The v1 types should be these plus others with extra pointer
qualifiers.

* tests/data/Makefile.am: Add new test files
* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.c:
New test file.
* tests/data/test-abidiff-exit/qualifier-typedef-array-v0.o:
New test file.
* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.c:
New test file.
* tests/data/test-abidiff-exit/qualifier-typedef-array-v1.o:
New test file.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-0.txt:
Plain diff report.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-1.txt:
Harmless diff report.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-2.txt:
Leaf changes report.
* tests/data/test-abidiff-exit/qualifier-typedef-array-report-3.txt:
Harmless leaf changes report.
* tests/test-abidiff-exit.cc: Run new test.

Signed-off-by: Giuliano Procida <gprocida@google.com>
4 years agoir: Arrays are indirect types for type structure similarity purposes
Giuliano Procida [Thu, 3 Dec 2020 15:09:16 +0000 (15:09 +0000)]
ir: Arrays are indirect types for type structure similarity purposes

As described in the comments of types_have_similar_structure:

    "Two indirect types have similar structure if their underlying
    types are of the same kind and have the same name. [...] The size
    of their underlying type does not matter"

Yet, the size of array elements (a.k.a the underlying type of an array
type) is wrongly considered to matter when assessing the "type
structure similarity" relationship for arrays.

This patch fixes that.

* src/abg-ir.cc (types_have_similar_structure): When examining
array types, always treat element types as being underlying types
of an indirect type.
* tests/data/Makefile.am: Add new test case files.
* tests/data/test-abidiff-exit/test-non-leaf-array-report.txt:
New test case showing correct --leaf-changes-only reporting.
* tests/data/test-abidiff-exit/test-non-leaf-array-v0.c:
Likewise.
* tests/data/test-abidiff-exit/test-non-leaf-array-v0.o:
Likewise.
* tests/data/test-abidiff-exit/test-non-leaf-array-v1.c:
Likewise.
* tests/data/test-abidiff-exit/test-non-leaf-array-v1.o:
Likewise.
* tests/test-abidiff-exit.cc: Run new test case.

Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoir: Add better comments to types_have_similar_structure
Dodji Seketeli [Fri, 4 Dec 2020 10:27:00 +0000 (11:27 +0100)]
ir: Add better comments to types_have_similar_structure

* src/abg-ir.cc (types_have_similar_structure): Arrays are also
indirect types, just like pointers and references, for the purpose
of the concept of "type similarity".  Add that to the introductory
comment of the function.  Add some more misc comments throughout
the code base.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoabidiff: support --dump-diff-tree with --leaf-changes-only
Giuliano Procida [Thu, 3 Dec 2020 15:09:00 +0000 (15:09 +0000)]
abidiff: support --dump-diff-tree with --leaf-changes-only

* src/abg-leaf-reporter.cc (leaf_reporter::report): In the
corpus_diff override, conclude by calling
maybe_dump_diff_tree.

Signed-off-by: Giuliano Procida <gprocida@google.com>
4 years agoUse C++11 for the code base
Dodji Seketeli [Thu, 3 Dec 2020 09:53:08 +0000 (10:53 +0100)]
Use C++11 for the code base

As the Enterprise Linux 6 platform has now essentially reached it's
end of life for what it's worth (the Fedora EPEL6 distribution is not
maintained anymore) nothing ties us to using C++03 only anymore.

So, I think it makes sense to move the code base to the C++11
standard.

Why C++11 and not, say, C++14 or more?  Well, the more direct reason I
see is that we need to support long life cycle platforms, the older
one being Enterprise Linux 7 currently.  This is the Fedora EPEL7
distribution, in concrete terms.  And in that distribution, the
compiler is GCC 4.8.x.  And it supports C++11.

In practise, nothing changes in the code that is already there.

The new code however can use C++11 constructs just fine.

I have updated the CONTRIBUTING file to write down some of the
unwritten cultural biases of the current code base.  Hopefully these
few lines will help to shed some light on the choices made so far.

The update to that file also enacts the use of C++11 and sets some
limits to what we expects in terms of what the code base would look
like.

configure.ac is modified to unconditionally pass -std=c++11 to the
compiler and express that in the configuration text displayed at the
end of the configuration stage.

Some Makefile.am files are updated accordingly.

* CONTRIBUTING: Enact use of c++11. Also, we favor those who
read/debug/maintain the code as opposed to those who write it ;-)
* configure.ac: Switch to c++11 unconditionally.
* src/Makefile.am: Adjust.
* tests/Makefile.am: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoCONTRIBUTING: Update instructions about regression tests
Dodji Seketeli [Thu, 3 Dec 2020 09:25:31 +0000 (10:25 +0100)]
CONTRIBUTING: Update instructions about regression tests

* CONTRIBUTING: Update instructions about how to launch regression
tests.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoTeach Automake that COPYING* files are gone from sources
Dodji Seketeli [Wed, 2 Dec 2020 16:19:40 +0000 (17:19 +0100)]
Teach Automake that COPYING* files are gone from sources

The COPYING* files are not in the source distribution anymore.
Furthermore, LICENSE.txt and license-change-2020.txt files were newly
added.  This patch updates Makefile.am accordingly.

* Makefile.am: Teach Automake that COPYING* files are gone and
that LICENSE.txt and license-change-2020.txt were added.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoAdd a license-change-2020.txt file
Dodji Seketeli [Tue, 9 Jun 2020 15:35:55 +0000 (17:35 +0200)]
Add a license-change-2020.txt file

Add a license-change-2020.txt file which contains text explaining that
we went through a licence change in 2020 from LGPLv3+ to Apache-v2
with LLVM exception.

     * license-change-2020.txt: New file.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoDelete COPYING* files
Dodji Seketeli [Tue, 9 Jun 2020 14:53:33 +0000 (16:53 +0200)]
Delete COPYING* files

* COPYING: Delete.
* COPYING-GPLV3: Likewise.
* COPYING-LGPLV2: Likewise.
* COPYING-LGPLV3: Likewise.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoAdd the LICENSE.txt file
Dodji Seketeli [Tue, 9 Jun 2020 14:06:42 +0000 (16:06 +0200)]
Add the LICENSE.txt file

* LICENSE.txt: New file coming from
http://llvm.org/foundation/relicensing/LICENSE.txt.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoRe-license the project to Apache v2 With LLVM Exception
Dodji Seketeli [Fri, 29 May 2020 14:26:04 +0000 (16:26 +0200)]
Re-license the project to Apache v2 With LLVM Exception

Thanks to the previous work done, changing the license is just a
matter of changing the SPDX identifer from "LGPL-3.0-or-later" to
"Apache-2.0 WITH LLVM-exception".  Note that for the abigail.m4,
tests/test-dot.cc and tests/test-svg.cc the change was from
"GPL-3.0-or-later WITH GCC-exception-3.1" to "Apache-2.0 WITH
LLVM-exception".  include/abg-cxx-compat.h was changed from
"LGPL-2.0-or-later" to "Apache-2.0 WITH LLVM-exception".  Source code
of programs (as opposed to source code of the library) where generally
licensed under GPL-3.0-or-later; they are also now licensed
"Apache-2.0 WITH LLVM-exception".

This is what this patch does.

* abigail.m4: Change the SPDX identifier from "GPL-3.0-or-later
WITH GCC-exception-3.1" to "Apache-2.0 WITH LLVM-exception"
* include/abg-cxx-compat.h: Change the SPDX identifier from
"LGPL-2.0-or-later" to "Apache-2.0 WITH LLVM-exception".
* .clang-format: Change the SPDX identifier from
  "LGPL-3.0-or-later" to "Apache-2.0 WITH LLVM-exception".
* Makefile.am: Likewise.
* bash-completion/Makefile.am: Likewise.
* bash-completion/abicompat: Likewise.
* bash-completion/abidiff: Likewise.
* bash-completion/abidw: Likewise.
* bash-completion/abilint: Likewise.
* bash-completion/abinilint: Likewise.
* bash-completion/abipkgdiff: Likewise.
* bash-completion/abisym: Likewise.
* bash-completion/fedabipkgdiff: Likewise.
* configure.ac: Likewise.
* default.abignore: Likewise.
* doc/Makefile.am: Likewise.
* doc/api/libabigail.doxy: Likewise.
* doc/manuals/Makefile.am: Likewise.
* doc/website/libabigail-website.doxy: Likewise.
* include/Makefile.am: Likewise.
* include/abg-comp-filter.h: Likewise.
* include/abg-comparison.h: Likewise.
* include/abg-config.h: Likewise.
* include/abg-corpus.h: Likewise.
* include/abg-diff-utils.h: Likewise.
* include/abg-dwarf-reader.h: Likewise.
* include/abg-fwd.h: Likewise.
* include/abg-hash.h: Likewise.
* include/abg-ini.h: Likewise.
* include/abg-interned-str.h: Likewise.
* include/abg-ir.h: Likewise.
* include/abg-libxml-utils.h: Likewise.
* include/abg-libzip-utils.h: Likewise.
* include/abg-reader.h: Likewise.
* include/abg-regex.h: Likewise.
* include/abg-reporter.h: Likewise.
* include/abg-sptr-utils.h: Likewise.
* include/abg-suppression.h: Likewise.
* include/abg-tools-utils.h: Likewise.
* include/abg-traverse.h: Likewise.
* include/abg-version.h.in: Likewise.
* include/abg-viz-common.h: Likewise.
* include/abg-viz-dot.h: Likewise.
* include/abg-viz-svg.h: Likewise.
* include/abg-workers.h: Likewise.
* include/abg-writer.h: Likewise.
* scripts/dot_to_png.sh: Likewise.
* scripts/dot_to_svg.sh: Likewise.
* scripts/make-verbose.sh: Likewise.
* scripts/svg_to_plain_svg.sh: Likewise.
* scripts/svg_to_png_and_pdf.sh: Likewise.
* src/Makefile.am: Likewise.
* src/abg-comp-filter.cc: Likewise.
* src/abg-comparison-priv.h: Likewise.
* src/abg-comparison.cc: Likewise.
* src/abg-config.cc: Likewise.
* src/abg-corpus-priv.h: Likewise.
* src/abg-corpus.cc: Likewise.
* src/abg-default-reporter.cc: Likewise.
* src/abg-diff-utils.cc: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* src/abg-elf-helpers.cc: Likewise.
* src/abg-elf-helpers.h: Likewise.
* src/abg-hash.cc: Likewise.
* src/abg-ini.cc: Likewise.
* src/abg-internal.h: Likewise.
* src/abg-ir-priv.h: Likewise.
* src/abg-ir.cc: Likewise.
* src/abg-leaf-reporter.cc: Likewise.
* src/abg-libxml-utils.cc: Likewise.
* src/abg-libzip-utils.cc: Likewise.
* src/abg-reader.cc: Likewise.
* src/abg-regex.cc: Likewise.
* src/abg-reporter-priv.cc: Likewise.
* src/abg-reporter-priv.h: Likewise.
* src/abg-suppression-priv.h: Likewise.
* src/abg-suppression.cc: Likewise.
* src/abg-tools-utils.cc: Likewise.
* src/abg-traverse.cc: Likewise.
* src/abg-viz-common.cc: Likewise.
* src/abg-viz-dot.cc: Likewise.
* src/abg-viz-svg.cc: Likewise.
* src/abg-workers.cc: Likewise.
* src/abg-writer.cc: Likewise.
* tests/Makefile.am: Likewise.
* tests/data/Makefile.am: Likewise.
* tests/lib/catch.cc: Likewise.
* tests/mockfedabipkgdiff.in: Likewise.
* tests/print-diff-tree.cc: Likewise.
* tests/runtestcanonicalizetypes.sh.in: Likewise.
* tests/runtestdefaultsupprs.py.in: Likewise.
* tests/runtestdefaultsupprspy3.sh.in: Likewise.
* tests/runtestfedabipkgdiff.py.in: Likewise.
* tests/runtestfedabipkgdiffpy3.sh.in: Likewise.
* tests/test-abicompat.cc: Likewise.
* tests/test-abidiff-exit.cc: Likewise.
* tests/test-abidiff.cc: Likewise.
* tests/test-alt-dwarf-file.cc: Likewise.
* tests/test-annotate.cc: Likewise.
* tests/test-core-diff.cc: Likewise.
* tests/test-cxx-compat.cc: Likewise.
* tests/test-diff-dwarf-abixml.cc: Likewise.
* tests/test-diff-dwarf.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-pkg.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tests/test-diff2.cc: Likewise.
* tests/test-dot.cc: Change the SPDX identifier from
"GPL-3.0-or-later WITH GCC-exception-3.1" to "Apache-2.0 WITH
LLVM-exception"
* tests/test-elf-helpers.cc: Change the SPDX identifier from
"LGPL-3.0-or-later" to "Apache-2.0 WITH LLVM-exception"
* tests/test-ini.cc: Likewise.
* tests/test-ir-walker.cc: Likewise.
* tests/test-kmi-whitelist.cc: Likewise.
* tests/test-lookup-syms.cc: Likewise.
* tests/test-read-dwarf.cc: Likewise.
* tests/test-read-write.cc: Likewise.
* tests/test-svg.cc: Change the SPDX identifier from
"GPL-3.0-or-later WITH GCC-exception-3.1" to "Apache-2.0 WITH
LLVM-exception".
* tests/test-symtab.cc: Change the SPDX identifier from
"LGPL-3.0-or-later" to "Apache-2.0 WITH LLVM-exception"
* tests/test-tools-utils.cc: Likewise.
* tests/test-types-stability.cc: Likewise.
* tests/test-utils.cc: Likewise.
* tests/test-utils.h: Likewise.
* tests/test-write-read-archive.cc: Likewise.
* tests/update-test-output.py: Likewise.
* tools/Makefile.am: Likewise.
* tools/abiar.cc: Likewise.
* tools/abicompat.cc: Likewise.
* tools/abidiff.cc: Likewise.
* tools/abidw.cc: Likewise.
* tools/abilint.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.
* tools/abisym.cc: Likewise.
* tools/binilint.cc: Likewise.
* tools/fedabipkgdiff: Likewise.
* tools/kmidiff.cc: Likewise.
* update-copyright.sh: Likewise.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoAdd helper files to perform the re-licensing
Dodji Seketeli [Fri, 29 May 2020 14:34:37 +0000 (16:34 +0200)]
Add helper files to perform the re-licensing

* relicensing-scripts/file-licenses.orig.txt: New file that
contains the raw set of files with SPDX identifiers denoting
LGPLv3+ files.  It's the result of a simple command based on
"find" and "grep".
* relicensing-scripts/files-with-lgplv3.txt: New file
containing the same data as the file above, but massaged to be
easily useable by the script below.
* relicensing-scripts/do-relicensing.sh: This is a simple command
which performs the re-licensing on the files listed in the file
above.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoAdd replace-spdx-license.sh script
Dodji Seketeli [Fri, 29 May 2020 08:45:34 +0000 (10:45 +0200)]
Add replace-spdx-license.sh script

This script is to replace an SPDX license ID by another one.
I.e, it's to perform an actual re-licensing of a given file.

A way to use the script is this:

    replace-spdx-license.sh  --from LGPL-3.0-or-later \
      --to  "Apache-2.0 WITH LLVM-exception" \
      some-file-to-relicense.cc

* relicensing-scripts/replace-spdx-license.sh: New script.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoAdd has-spdx-header.sh script
Dodji Seketeli [Wed, 27 May 2020 16:40:17 +0000 (18:40 +0200)]
Add has-spdx-header.sh script

Add a script to detect if a file has a SPDX header and what the
advertised license is.

   * relicensing-scripts/has-spdx-header.sh: New script.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoAdd missing SPDX headers to source files not specifying any license
Dodji Seketeli [Fri, 29 May 2020 13:50:16 +0000 (15:50 +0200)]
Add missing SPDX headers to source files not specifying any license

Default to the project's defautl - LGPLv3+ - for those.

* Makefile.am: Add a LGPL-3.0-or-later SPDX header prefixed
with '##' so that that the header doesn't get emitted in the
resulting Makefile.in file.  Note that the license of Makefile.in
files is "FSF All Permissible License", which virtually compatible
with anything.
* bash-completion/Makefile.am: Likewise.
* doc/Makefile.am: Likewise
* doc/manuals/Makefile.am: Likewise
* include/Makefile.am: Likewise
* src/Makefile.am: Likewise
* tests/Makefile.am: Likewise
* tests/data/Makefile.am: Likewise
* tools/Makefile.am: Likewise
* .clang-format: Add a LGPL-3.0-or-later SPDX header.
* bash-completion/abicompat: Likewise.
* bash-completion/abidiff: Likewise.
* bash-completion/abidw: Likewise.
* bash-completion/abilint: Likewise.
* bash-completion/abinilint: Likewise.
* bash-completion/abipkgdiff: Likewise.
* bash-completion/abisym: Likewise.
* bash-completion/fedabipkgdiff: Likewise.
* configure.ac: Likewise.
* default.abignore: Likewise.
* doc/api/libabigail.doxy: Likewise.
* doc/website/libabigail-website.doxy: Likewise.
* include/abg-version.h.in: Likewise.
* scripts/dot_to_png.sh: Likewise.
* scripts/dot_to_svg.sh: Likewise.
* scripts/make-verbose.sh: Likewise.
* scripts/svg_to_plain_svg.sh: Likewise.
* scripts/svg_to_png_and_pdf.sh: Likewise.
* tests/runtestcanonicalizetypes.sh.in: Likewise.
* tests/runtestdefaultsupprs.py.in: Likewise.
* tests/runtestdefaultsupprspy3.sh.in: Likewise.
* tests/runtestfedabipkgdiffpy3.sh.in: Likewise.
* tests/update-test-output.py: Likewise.
* update-copyright.sh: Likewise.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoReplace individual license references with SPDX Identifiers
Matthias Maennich [Sat, 7 Mar 2020 23:46:31 +0000 (23:46 +0000)]
Replace individual license references with SPDX Identifiers

This patch replaces license headers with SPDX identifiers in all files
containing license headers.  For each file, the SPDX identifier
formally represents its current license.  Note that the list of SPDX
identifiers is available on the SPDX web site at
https://spdx.org/licenses.

For autoconf-archive/ax_prog_python_version.m4 however, there is a
little catch.  Dodji Seketeli wrote this ax_check_python_modules.m4.
Just like the other autoconf-archive macros, it makes sense to have it
under the FSF All Permissive license.  Actually, the terms of that
license was already in the file but then the license header was
wrongly set to GPLv2 with autoconf exception.  So I fixed that in this
commit by setting the SPDX identifier to FSFAP.

* abigail.m4: Replace the license header with the SPDX identifier
GPL-3.0-or-later WITH GCC-exception-3.1
* autoconf-archive/ax_check_python_modules.m4: Correctly set the
SPDX identifier to FSFAP.
* autoconf-archive/ax_compare_version.m4: Replace the license
header with the SPDX identifier FSFAP.
* autoconf-archive/ax_prog_python_version.m4: Likewise.
header with the SPDX identifier FSFAP.
* autoconf-archive/ax_valgrind_check.m4: Likewise.
* gen-changelog.py: Replace the license header with the SPDX
identifier LGPL-2.0-or-later.
* include/abg-comp-filter.h: Replace the license header with the
SPDX identifier LGPL-3.0-or-later.
* include/abg-comparison.h: Likewise.
* include/abg-config.h: Likewise.
* include/abg-corpus.h: Likewise.
* include/abg-cxx-compat.h: Replace the license header with the
SPDX identifier LGPL-2.0-or-later.
* include/abg-diff-utils.h: Replace the license header with the
SPDX identifier LGPL-3.0-or-later
* include/abg-dwarf-reader.h: Likewise.
* include/abg-fwd.h: Likewise.
* include/abg-hash.h: Likewise.
* include/abg-ini.h: Likewise.
* include/abg-interned-str.h: Likewise.
* include/abg-ir.h: Likewise.
* include/abg-libxml-utils.h: Likewise.
* include/abg-libzip-utils.h: Likewise.
* include/abg-reader.h: Likewise.
* include/abg-regex.h: Likewise.
* include/abg-reporter.h: Likewise.
* include/abg-sptr-utils.h: Likewise.
* include/abg-suppression.h: Likewise.
* include/abg-tools-utils.h: Likewise.
* include/abg-traverse.h: Likewise.
* include/abg-viz-common.h: Likewise.
* include/abg-viz-dot.h: Likewise.
* include/abg-viz-svg.h: Likewise.
* include/abg-workers.h: Likewise.
* include/abg-writer.h: Likewise.
* install-sh: Replace the license header with the SPDX identifier MIT.
* ltmain.sh: Replace the license header with the SPDX identifier
GPL-2.0-or-later.  Note that this file has the libtool special
exception which allows us to redistribute it under the general
license of the project.
* src/abg-comp-filter.cc: Replace the license header with the SPDX
* src/abg-comparison-priv.h: Likewise.
* src/abg-comparison.cc: Likewise.
* src/abg-config.cc: Likewise.
* src/abg-corpus-priv.h: Likewise.
* src/abg-corpus.cc: Likewise.
* src/abg-default-reporter.cc: Likewise.
* src/abg-diff-utils.cc: Likewise.
* src/abg-dwarf-reader.cc: Likewise.
* src/abg-elf-helpers.cc: Likewise.
* src/abg-elf-helpers.h: Likewise.
* src/abg-regex.cc: Likewise.
* src/abg-hash.cc: Likewise.
* src/abg-ini.cc: Likewise.
* src/abg-internal.h: Likewise.
* src/abg-ir-priv.h: Likewise.
* src/abg-ir.cc: Likewise.
* src/abg-leaf-reporter.cc: Likewise.
* src/abg-libxml-utils.cc: Likewise.
* src/abg-libzip-utils.cc: Likewise.
* src/abg-reader.cc: Likewise.
* src/abg-reporter-priv.cc: Likewise.
* src/abg-reporter-priv.h: Likewise.
* src/abg-sptr-utils.cc: Likewise.
* src/abg-suppression-priv.h: Likewise.
* src/abg-suppression.cc: Likewise.
* src/abg-tools-utils.cc: Likewise.
* src/abg-traverse.cc: Likewise.
* src/abg-viz-common.cc: Likewise.
* src/abg-viz-dot.cc: Likewise.
* src/abg-viz-svg.cc: Likewise.
* src/abg-workers.cc: Likewise.
* src/abg-writer.cc: Likewise.
* tests/lib/catch.cc: Likewise.
* tests/lib/catch.hpp: Add an SPDX identifier BSL-1.0.
* tests/mockfedabipkgdiff.in: Replace the license header with the
SPDX identifier GPL-3.0-or-later.
* tests/print-diff-tree.cc: Likewise.
* tests/runtestfedabipkgdiff.py.in: Replaace the license header
with the SPDW identifier GPL-3.0-or-later.
* tests/test-abicompat.cc: Replace the license header with the
SPDX identifier LGPL-3.0-or-later.
* tests/test-abidiff-exit.cc: Likewise.
* tests/test-abidiff.cc: Likewise.
* tests/test-alt-dwarf-file.cc: Likewise.
* tests/test-annotate.cc: Likewise.
* tests/test-cxx-compat.cc: Likewise.
* tests/test-core-diff.cc: Likewise.
* tests/test-diff-dwarf-abixml.cc: Likewise.
* tests/test-diff-dwarf.cc: Likewise.
* tests/test-diff-filter.cc: Likewise.
* tests/test-diff-pkg.cc: Likewise.
* tests/test-diff-suppr.cc: Likewise.
* tests/test-diff2.cc: Likewise.
* tests/test-dot.cc: Replace the license header with the
SPDX identifier GPL-3.0-with-GCC-exception.
* tests/test-elf-helpers.cc: Replace the license header with the
SPDX identifier LGPL-3.0-or-later.
* tests/test-ini.cc: Likewise.
* tests/test-ir-walker.cc: Likewise.
* tests/test-kmi-whitelist.cc: Likewise.
* tests/test-lookup-syms.cc: Likewise.
* tests/test-read-dwarf.cc: Likewise.
* tests/test-read-write.cc: Likewise.
* tests/test-svg.cc: Replace the license header with the SPDX
identifier GPL-3.0-with-GCC-exception.
* tests/test-symtab.cc: Replace the license header with the SPDX
identifier LGPL-3.0-or-later.
* tests/test-tools-utils.cc: Likewise.
* tests/test-types-stability.cc: Likewise.
* tests/test-utils.cc: Likewise.
* tests/test-utils.h: Likewise.
* tests/test-write-read-archive.cc: Likewise.
* tools/abiar.cc: Likewise.
* tools/abicompat.cc: Likewise.
* tools/abidiff.cc: Likewise.
* tools/abidw.cc: Likewise.
* tools/abilint.cc: Likewise.
* tools/abipkgdiff.cc: Likewise.
* tools/abisym.cc: Likewise.
* tools/binilint.cc: Likewise.
* tools/fedabipkgdiff: Replace the license header with the
SPDX identifier GPL-3.0-or-later.
* tools/kmidiff.cc: Likewise.

Signed-off-by: Benjamin De Kosnik <bkoz@gnu.org>
Signed-off-by: Ben Woodard <woodard@redhat.com>
Signed-off-by: Chenxiong Qi <cqi@redhat.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Giuliano Procida <gprocida@google.com>
Signed-off-by: Jan Engelhardt <jengelh@inai.de>
Signed-off-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
Signed-off-by: Matthias Klose <doko@ubuntu.com>
Signed-off-by: Matthias Maennich <maennich@google.com>
Signed-off-by: Ondrej Oprala <ondrej.oprala@gmail.com>
Signed-off-by: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sinny Kumari <ksinny@gmail.com>
Signed-off-by: Slava Barinov <v.barinov@samsung.com>
4 years agoBump version number to 2.0
Dodji Seketeli [Tue, 1 Dec 2020 20:42:08 +0000 (21:42 +0100)]
Bump version number to 2.0

* configure.ac: Bump number version to 2.0

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoUpdate NEWS file for 1.8
Dodji Seketeli [Tue, 1 Dec 2020 14:17:25 +0000 (15:17 +0100)]
Update NEWS file for 1.8

* NEWS: Update for 1.8

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoUpdate the Changelog for 1.8
Dodji Seketeli [Tue, 1 Dec 2020 14:13:57 +0000 (15:13 +0100)]
Update the Changelog for 1.8

       * Changelog: Update automatically with "make update-changelog'

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoAdd check-self-compare to release regression testing
Dodji Seketeli [Tue, 1 Dec 2020 14:11:50 +0000 (15:11 +0100)]
Add check-self-compare to release regression testing

* Makefile.am: Make 'make tarball-and-all' run the
'check-self-compare' target as part of the release process.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoconfigure: add --enable-rpm415 option
Dodji Seketeli [Tue, 1 Dec 2020 10:26:27 +0000 (11:26 +0100)]
configure: add --enable-rpm415 option

It's useful to be able to force the build system into avoiding the use
of rpm 4.15 version or higher.  That version of RPM is the one that
supports RPMs from Fedora 31 or higher.  Those RPMs use the zstd
compression scheme.  Prior to Fedora 31, RPM were not using the zstd
compression scheme.  So, systems with rpm version lower than 4.15
cannot deal with RPMs coming from Fedora 31 or higher.  So on those
systems, some regression tests of libabigail who use RPMs from Fedora
33 will fail.

With this patch, one can use the --disable-rpm415 option of the
configure script to prevent those tests from running on those pre 4.15
rpm systems.

* configure: Introduce the --{en, dis}able-rpm415 option.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agodwarf-reader: Bug 26908 - don't crash on empty DW_TAG_partial_unit libabigail-1.8
Dodji Seketeli [Mon, 30 Nov 2020 04:53:11 +0000 (05:53 +0100)]
dwarf-reader: Bug 26908 - don't crash on empty DW_TAG_partial_unit

Sometimes a DW_TAG_partial_unit (imported via a DW_TAG_imported_unit)
has no children node.  That means the the DW_TAG_partial_unit has no
sub-tree.

In those cases, the dwarf-reader crashes when
ctxt.build_die_parent_relations_under tries to record the point at
which the sub-tree (which is non-existent here) of the partial unit is
imported by the DW_TAG_imported_unit DIE.

This patch avoids crashing in those cases.  As this problem is
reported on libclang-cpp.so (on Fedora 33) which takes "abidw --abidiff"
five hours and ~ 20GB of ram to complete at this point (on a power7 box)
this patch doesn't have a regression test attached.

* src/abg-dwarf-reader.cc (die_has_children): Define new static
function.
(read_context::build_die_parent_relations_under): Do not try to
instantiate an imported_unit_point type for an imported unit with
no children node.
(imported_unit_point::imported_unit_point): Assert that the
imported die has a sub-tree.
(imported_unit_point::imported_unit_point): Remove useless spaces.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoreader: Fix off-by-one error in assert
Dodji Seketeli [Fri, 27 Nov 2020 20:11:59 +0000 (21:11 +0100)]
reader: Fix off-by-one error in assert

* src/abg-reader.cc (build_subrange_type): Fix off-by-one error.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agowriter: fix off-by-one error in assertion
Dodji Seketeli [Fri, 27 Nov 2020 19:51:45 +0000 (20:51 +0100)]
writer: fix off-by-one error in assertion

* src/abg-writer.cc (write_array_subrange_type): Fix off-by-one
error in assertion.
* src/abg-dwarf-reader.cc (build_subrange_type): Assert the length
of the array complies with its bounds.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoabipkgdiff: make --self-check to fail on any change against own ABIXML
Dodji Seketeli [Fri, 27 Nov 2020 12:03:38 +0000 (13:03 +0100)]
abipkgdiff: make --self-check to fail on any change against own ABIXML

Now that several subtle causes of spurious ABI change report when
comparing a binary against its own ABIXML have been addressed, this
patch makes 'abipkgdiff --self-check' to fail on any ABI change
reported.  That is, harmless changes are not ignored anymore.

* tools/abipkgdiff.cc (compare_to_self): Report *any* ABI change.
Not just the "net" changes.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoabidw: make --abidiff report any change against own ABIXML
Dodji Seketeli [Thu, 26 Nov 2020 12:23:03 +0000 (13:23 +0100)]
abidw: make --abidiff report any change against own ABIXML

Sometimes, "abidw --abidiff <binary>" would pass while
"abidw <binary> > abi; abidiff <binary> abi" would fail.

This is because "abidw --abidiff" emits an error only when the
comparison between the binary and its ABIXML representation yields and
incompatible change.

Now that many subtle causes of spurious ABI change report emitted when
comparing a binary against its own ABIXML have been fixed, this patch
makes it so that *any* change would make abidw --abidiff to emit an
error.

* tools/abidw.cc (load_corpus_and_write_abixml): Emit an error
when comparing the binary to its ABIXML representation yields any
change.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agodwarf-reader: Avoid having several functions with the same symbol
Dodji Seketeli [Fri, 27 Nov 2020 11:13:26 +0000 (12:13 +0100)]
dwarf-reader: Avoid having several functions with the same symbol

In the DWARF debug info, a C++ class can be represented by pieces
throughout a given binary.

In this picture, a given virtual member function can be represented
several times; each time in one different piece of the C++ class.  In
a given piece of the class, a virtual member function can be
represented with its ELF symbol set.  In another one, the same virtual
member function can be represented without that ELF symbol set.  And
there can also be pieces of the class that don't have a given virtual
function.

To handle this, the DWARF reader constructs one class from all its
pieces scattered around.  It adds each virtual member function to the
class as it comes across them while scanning the DWARF.

Then there is a pass at the end of the process that sets ELF symbols
to the (virtual) member functions that need it.

The problem with that pass is that it sometimes sets the same ELF
symbol to more than one virtual member function.  Those virtual member
functions all have the same mangled name that correspond to the ELF
symbol; but only one of them is meant to be associated with the ELF
symbol.  In essence, that one is the one that is exported by the ELF
binary.

This patch teaches the pass that sets the ELF symbols of function to
avoid setting the same ELF symbol to more than one function.

The patch also avoids build_function_decl to set symbol to a function
if that symbol was already set to an existing function.

This patch thus fixes a class of issues what arise when comparing a
binary against its own ABIXML representation.  Those several functions
having the same ELF symbol would cause spurious changes in that
context.

* src/abg-dwarf-reader.cc
(read_context::symbol_already_belongs_to_a_function): Define new
member function.
(read_context::fixup_functions_with_no_symbols): Use the new
symbol_already_belongs_to_a_function function to avoid setting a
symbol that already belongs to a function.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Adjust.
* tests/data/test-read-dwarf/test10-pr18818-gcc.so.abi: Likewise.
* tests/data/test-read-dwarf/test16-pr18904.so.abi: Likewise.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoreader: Don't lose anonymous-ness of decl-only classes
Dodji Seketeli [Fri, 27 Nov 2020 10:54:13 +0000 (11:54 +0100)]
reader: Don't lose anonymous-ness of decl-only classes

When reading an anonymous declaration-only class from ABIXML
libabigail forgets to set the is-anonymous class.  This leads to
spurious change reports when comparing a binary against its ABIXML
representation.  Fixed thus.

Note that this doesn't yet impact any regression test but is useful
for a coming patch that will make abidw --abidiff to emit an error for
all ABI changes, not just the hard incompatible ones.  Without this
change, that coming patch will make runtestreaddwarf to fail.

* src/abg-reader.cc (build_class_decl): Set the is-anonymous flag
when reading a decl-only class.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoir: Introduce internal pretty representation for anonymous classes
Dodji Seketeli [Fri, 27 Nov 2020 06:06:48 +0000 (07:06 +0100)]
ir: Introduce internal pretty representation for anonymous classes

There are two views for internal pretty representation of anonymous
classes.

1/ When we look at the anonymous class itself, we use its 'flat
representation' i.e:

    'class {int blah; char bleh;}'

2/ When we look at a pointer or a reference to the anonymous class we
use its generic anonymous internal name, i.e:

   '__anonymous_struct__*'

As a general rule, libabigail always use the keyword 'class' to prefix
the name of classes for internal purposes, independent from the fact
that the type is a struct or a class.  That is a pre-requisite to be
able to canonicalize classes and structs together.  In other words, if
a class and a struct are structurally equal, they are going to be
considered equivalent by the canonicalization process.

Currently however, in the view 1/ of the pretty representation of
anonymous classes, a struct and a class will have different
representations.  For instance, and empty anonymous struct would be
represented as 'struct {}', whereas an empty anonymous class would be
represented as 'class {}'.  This prevents these two be considered
equivalent by the canonicalization process.  This leads to spurious
change reports later down the road.

In the view 2/ we have a similar but different problem: the qualified
names of the anonymous classes are not taken into account when
representing pointer or references to said anonymous classes.  Only
their unqualified generic anonymous internal names are taken into
account in the representation.  This leads to pointers/references to
anonymous classes being wrongly considered equivalent even when they
belong to different namespaces.

This patch corrects the issues related to both views 1/ and 2/.  It
should make libabigail correctly consider some anonymous classes as
equivalent (view 1) and correctly consider pointers/references to
anonymous classes as different when they belong to different
namespaces (view 2).

A number of reference tests are adjusted accordingly.

* include/abg-fwd.h (get_class_or_union_flat_representation):
Introduce an "internal" parameter.
* src/abg-ir.cc (get_class_or_union_flat_representation):
Introduce an "internal" parameter.  In the flat representation of
a class for internal purposes, always use the prefix "class" even
if this is a struct.
(get_type_name): To build an internal name for a
reference or pointer to an anonymous type, consider the namespace
name of said type.
(equals): In the overload for decl_base, take the namespace name
of anonymous decls into account when comparing them.
({var_decl, union_decl}::get_pretty_representation): Adjust calls
to get_class_or_union_flat_representation to pass a proper
"internal" argument.
* src/abg-default-reporter.cc (default_reporter::report): Adjust
the call to get_class_or_union_flat_representation to pass an
"internal" argument set to 'false'.
* tests/data/test-annotate/libtest23.so.abi: Adjust.
* tests/data/test-read-dwarf/PR22122-libftdc.so.abi: Likewise.
* tests/data/test-read-dwarf/libtest23.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/test9-pr18818-clang.so.abi: Likewise.
* tests/data/test-read-dwarf/test-libandroid.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agowriter: Emit definitions of declarations when they are present
Dodji Seketeli [Thu, 26 Nov 2020 13:58:31 +0000 (14:58 +0100)]
writer: Emit definitions of declarations when they are present

Libabigail goes a long way to resolve declaration-only classes
to their definitions when it's possible.

The ABIXML writer however sometimes forgets to emit the definition of
such declarations that have been "resolved".

Later, when the binary is compared to its own ABIXML representation,
the reporting engine thus reports that the definition is lost.

This patch fixes that.

* src/abg-writer.cc (write_class_decl, write_union_decl): Get the
definition of the declaration if it exists and emit that.
* tests/data/test-read-dwarf/test13-pr18894.so.abi: Adjust.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Likewise.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Likewise.
* tests/data/test-annotate/test13-pr18894.so.abi: Likewise.
* tests/data/test-annotate/test15-pr18892.so.abi: Likewise.
* tests/data/test-annotate/test21-pr19092.so.abi: Likewise.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoBug 26780 - Fix array subrange bounds (de)serialization
Dodji Seketeli [Thu, 26 Nov 2020 12:39:12 +0000 (13:39 +0100)]
Bug 26780 - Fix array subrange bounds (de)serialization

When serializing subrange bounds to ABIXML today the writer omits the
lower and upper bounds.  Only the length is emitted.  The reader thus
assumes that the lower bound of an array subrange is always 0.  In
Fortran however, that is not true, as the lower bound is 1.

This patch instructs the writer to emits the lower bound whenever it's
different from zero.  It also emits the upper bound in that case.  The
reader is updated accordingly to take the lower and upper bounds into
account whenever they are present.  It they are not, then the
lower bound is assumed to be zero and the upper bound is deduced from
the length, as was already the case until now.

* src/abg-reader.cc (build_subrange_type): Read lower-bound
attribute if present.  Then try to read upper-bound attribute as
well.  If this is not an infinite subrange assert that the length
must be equal to the difference between the bounds.
* src/abg-writer.cc (write_array_subrange_type): Write the
lower-bound if it's present and not zero.  In that case, write the
upper-bound as well.
* tests/data/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.rpm: Add new
binary test input.
* tests/data/test-diff-pkg/hdf5-debuginfo-1.10.6-2.fc33.x86_64.rpm:
Likewise.
* tests/data/test-diff-pkg/hdf5-1.10.6-2.fc33.x86_64.self-check-report-0.txt:
Add new reference output.
* tests/data/Makefile.am: Add the new test material above to
source distribution.
* tests/test-diff-pkg.cc (in_out_specs): Add the binary test input
to the set of --self-check tests.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoreader: Read array subrange length into an uint64_t
Dodji Seketeli [Thu, 26 Nov 2020 12:33:39 +0000 (13:33 +0100)]
reader: Read array subrange length into an uint64_t

We read subrange length like an integer of type 'int" today.  We
should read it as an uint64_t.  Fixed thus.

* src/abg-reader.cc (build_subrange_type): Change the type of
length to uint64_t and read it using strtoull.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
4 years agoabipkgdiff: Avoid uncertainty when sorting worker tasks
Dodji Seketeli [Wed, 25 Nov 2020 11:57:47 +0000 (12:57 +0100)]
abipkgdiff: Avoid uncertainty when sorting worker tasks

Worker tasks that have compared the binaries of two packages are
sorted according to the sizes of the binaries they compared.  The
tasks that compared bigger binaries come first.  So the output of
these tasks is always sorted the same.

When two tasks have sorted binaries of the same size, let's sort them
by taking into account the lexicographic order of the binaries names.

* elf_size_is_greater: Take the name of the binaries into account
when their size is equal.  Also, assert that all comparison tasks
have compared binaries.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This page took 0.118753 seconds and 5 git commands to generate.