libabigail/tests/data/test-annotate
Dodji Seketeli 6eb2b268f8 Allow selective resolution of class declaration
When a class is forward-declared, resolving it to a definition that
appears later in the same translation unit or in another translation
is an interesting problem.

Until now, the declaration would be resolved to the definition of that
class found in the binary.  The problem is that there can be different
such definitions, especially in C where there is no "One Definition
Rule".  In that case, the definition chosen is random.

This patch resolves that randomness.

For a given class declaration, if there is just one possible
definition in the binary, then the declaration is resolved to that
definition.  If there is one definition for that declaration in the
same translation unit, then the declaration is resolved to that
definition.  If there are more than one definitions in translation
units that are not the one of the declaration, then the declaration is
left unresolved.  This is what I call "selective class declaration resolution".

Note that an unresolved class declaration now compares different to a
definition of a class of the same name.  This is so that we can have
an unresolved class be present in the resulting .abi file, alongside
an (incompatible) definition of the same class.  The change from a class
declaration to its definition is filtered out by default, though.

	* include/abg-fwd.h (type_base_wptrs_type)
	(istring_type_base_wptrs_map_type): Define new typedefs.
	(lookup_class_types): Declare new functions.
	* include/abg-ir.h
	(environment::decl_only_class_equals_definition): Declare new
	accessor.
	(type_maps::{*_types}): Make these accessors return
	istring_type_base_wptrs_map_type& instead of
	istring_type_base_wptr_map_type&.
	* src/abg-dwarf-reader.cc
	(read_context::resolve_declaration_only_classes): Implement the
	new selective declaration resolution scheme.
	* src/abg-ir.cc (type_maps::priv::{*_types_}): Change the type of
	these data members from istring_type_base_wptr_map_type to
	istring_type_base_wptrs_map_type.
	(type_maps::{*_types}): Make these accessors definitions return
	istring_type_base_wptrs_map_type& instead of
	istring_type_base_wptr_map_type&.
	(translation_unit::bind_function_type_life_time): Adjust.
	(environment::priv::decl_only_class_equals_definition_): New data
	member.
	(environment::priv::priv): Initialize it.  By default, a decl-only
	class is now considered different from its definition.
	(environment::decl_only_class_equals_definition): Define new
	accessor.
	(lookup_types_in_map, lookup_class_types): Define new functions.
	(lookup_type_in_map, lookup_union_type_per_location)
	(lookup_basic_type, lookup_basic_type_per_location)
	(lookup_class_type, lookup_class_type_per_location)
	(lookup_union_type, lookup_enum_type)
	(lookup_enum_type_per_location, lookup_typedef_type)
	(lookup_typedef_type_per_location, lookup_qualified_type)
	(lookup_pointer_type, lookup_reference_type, lookup_array_type)
	(lookup_function_type, maybe_update_types_lookup_map)
	(maybe_update_types_lookup_map<class_decl>)
	(maybe_update_types_lookup_map<function_type>): Adjust.
	(type_base::get_canonical_type_for): When doing type comparison
	here, we can now consider that an unresolved class declaration
	compares different to an incompatible class definition of the same
	name.  So no need to look through decl-only classes in that case.
	(equals): In the overload for class_or_union, if
	environment::decl_only_class_equals_definition() is false, then an
	unresolved class declaration of name "N" compares different to a
	class definition named "N".
	* tests/data/test-annotate/test15-pr18892.so.abi: Adjust.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi: Adjust
	* tests/data/test-read-dwarf/test12-pr18844.so.abi: Adjust.
	* tests/data/test-read-dwarf/test15-pr18892.so.abi: Adjust.
	* tests/data/test-diff-dwarf/test28-vtable-changes-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.
	* tests/data/test-diff-filter/test38/Makefile: New test material.
	* tests/data/test-diff-filter/test38/test38-a.c: Likewise.
	* tests/data/test-diff-filter/test38/test38-b.c: Likewise.
	* tests/data/test-diff-filter/test38/test38-c.c: Likewise.
	* tests/data/test-diff-filter/test38/test38-report-0.txt: Likewise.
	* tests/data/test-diff-filter/test38/test38-v0: Likewise.
	* tests/data/test-diff-filter/test38/test38-v1: Likewise.
	* tests/data/test-diff-filter/test38/test38.h: Likewise.
	* tests/data/test-diff-filter/test39/Makefile: Likewise.
	* tests/data/test-diff-filter/test39/test39-a-v0.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-a-v1.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-b-v0.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-b-v1.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-c-v0.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-c-v1.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-main.c: Likewise.
	* tests/data/test-diff-filter/test39/test39-report-0.txt: Likewise.
	* tests/data/test-diff-filter/test39/test39-v0: Likewise.
	* tests/data/test-diff-filter/test39/test39-v1: Likewise.
	* tests/data/test-diff-filter/test39/test39.h: Likewise.
	* tests/data/Makefile.am: Add the new test material above to the
	source distribution.
	* tests/test-diff-filter.cc (in_out_specs): Add the new test
	inputs above to the test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2017-07-03 17:45:46 +02:00
..
libtest23.so.abi Avoid de-duplicating different C types that have identical name 2017-07-03 17:45:42 +02:00
libtest24-drop-fns-2.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
libtest24-drop-fns.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test0.abi Update the reference output of regression tests after kabidiff work 2017-07-03 17:45:37 +02:00
test1.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test2.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test3.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test4.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test5.o.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test6.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test7.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test8-qualified-this-pointer.so.abi Bug 20970 - Add a --annotate option to abidw 2017-01-24 15:41:37 +01:00
test13-pr18894.so.abi Avoid de-duplicating different C types that have identical name 2017-07-03 17:45:42 +02:00
test14-pr18893.so.abi Allow selective resolution of class declaration 2017-07-03 17:45:46 +02:00
test15-pr18892.so.abi Speedup DIE representation computing esp function signature in C 2017-07-03 17:45:43 +02:00
test17-pr19027.so.abi Allow selective resolution of class declaration 2017-07-03 17:45:46 +02:00
test18-pr19037-libvtkRenderingLIC-6.1.so.abi Allow selective resolution of class declaration 2017-07-03 17:45:46 +02:00
test19-pr19023-libtcmalloc_and_profiler.so.abi Allow selective resolution of class declaration 2017-07-03 17:45:46 +02:00
test20-pr19025-libvtkParallelCore-6.1.so.abi Allow selective resolution of class declaration 2017-07-03 17:45:46 +02:00
test21-pr19092.so.abi Speedup DIE representation computing esp function signature in C 2017-07-03 17:45:43 +02:00