libabigail/tests/data/test-read-dwarf
Dodji Seketeli ba741963b9 Use cache type hash values only after type canonicalization is done
Look at this code:

    struct list;

    struct payload
    {
     int value;
     list* parent_list; //<-- the hash value of struct list when looking
                        //    through this pointer is the non-zero
                        //    value as computed on the struct list
                        //    type below.

    };

    struct list
    {
     payload* p; // <-- While walking the struct list type, the hash
                 // value of the 'struct list' sub-tree node when
		 // looking through this pointer is zero, because we
		 // are still computing the hash value of struct list.
		 // we do it this way to break the otherwise infinite
                 // recursion that might occur here.

     list* next; // <-- likewise here.
     list* prev; // <-- likewise here.
    }; // <-- when we reach this point the hash value of struct list
       // is computed and is different from zero.

Basically, when a type refers to itself in one of its sub-type (like
struct list here, where list::p refers to struct list, because its
type contains a pointer to struct list), then we need to devise a way
to break the infinite recursion we might fall into when computing its
hash value.

So, when computing the hash value of struct list, when we look at the
type of list::prev, which is "list*", we say that the hash value of the type
pointed to by the type of list::next (which is struct list itself) is
zero.  This allows us to break the possibly infinite recursion here.

But then, this means that the hash value of "struct list" depends on
*when* we request that hash value.  If we are computing the hash value
of struct list itself, then the temporary value of "struct list" is
zero.  But then once we are done computing the hash value of "struct
list", that value becomes non-zero.

Hence, the hash value of a type depends on when that value is
computed.

But then if we want to cache that hash value and re-use it later,
which value should we cache?  Definitely not the zero value!

So in other words, we can use (and thus cache) the hash value of a
given type T only after the hash values of all types which use T have
been computed.

To satisfy that condition, we decide to use the (cached) hash value of
each type only after we've computed all the hash values of all types
of the system.

So, during type canonicalization, when a type T is canonicalized, this
patch stores the hash value of T.  But then it's only when all types
are canonicalized that the hashing code is allowed to re-use the
cached value of types.

This fixes the issues of spurious type differences introduced when the
same type was read either from DWARF or from abixml.  Those
differences where introduced by differences in the order of hashing
types which sub-types refer to themselves. The patch also updates
regression tests accordingly.

	* src/abg-dwarf-reader.cc (read_debug_info_into_corpus): Before we
	read debug info and build the IR, set a flag in the environment
	saying that type canonicalization isn't finished yet.  But then,
	after type canonicalization is done, flip that flag to say that
	type canonicalization is done.
	* src/abg-reader.cc (read_corpus_from_input): Likewise.
	* src/abg-ir.cc (type_base::get_canonical_type_for): Once a type
	has been canonicalized, cache its hash value.
	* src/abg-hash.cc (type_base::dynamic_hash::operator()): If type
	canonicalization has been done and if the type has a cached value,
	use that one.
	* tests/data/test-read-dwarf/test2.so.abi: Adjust.
	* tests/data/test-read-dwarf/test9-pr18818-clang.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.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
2015-09-07 23:35:30 +02:00
..
test0 Tweak dwarf reading test to detect more namespace linking-fu 2014-01-13 17:36:20 +01:00
test0.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test0.cc Tweak dwarf reading test to detect more namespace linking-fu 2014-01-13 17:36:20 +01:00
test1 Add regression tests for dwarf reading 2014-01-07 15:51:52 +01:00
test1.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test1.cc Add regression tests for dwarf reading 2014-01-07 15:51:52 +01:00
test2-0.cc Initial support for DW_TAG_partial_unit 2014-05-19 17:26:40 +02:00
test2-1.cc Initial support for DW_TAG_partial_unit 2014-05-19 17:26:40 +02:00
test2.h Initial support for DW_TAG_partial_unit 2014-05-19 17:26:40 +02:00
test2.so Initial support for DW_TAG_partial_unit 2014-05-19 17:26:40 +02:00
test2.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test3.c Keep symbol's multiple aliases within single attribute separated by comma 2014-06-20 11:56:49 +02:00
test3.so Keep symbol's multiple aliases within single attribute separated by comma 2014-06-20 11:56:49 +02:00
test3.so.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test4.c Handle C99 restrict qualifier and DWARFv3 DW_TAG_restrict_type. 2014-06-23 15:55:37 +02:00
test4.so Handle C99 restrict qualifier and DWARFv3 DW_TAG_restrict_type. 2014-06-23 15:55:37 +02:00
test4.so.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test5.cc Support reading void* type from DWARF 2014-06-23 17:31:26 +02:00
test5.o Support reading void* type from DWARF 2014-06-23 17:31:26 +02:00
test5.o.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test6.cc Consider symbols with STB_GNU_UNIQUE binding as public 2014-07-08 14:18:36 +02:00
test6.so Consider symbols with STB_GNU_UNIQUE binding as public 2014-07-08 14:18:36 +02:00
test6.so.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test7.cc Support C and C++ array type. 2014-08-22 13:07:41 +02:00
test7.so Support C and C++ array type. 2014-08-22 13:07:41 +02:00
test7.so.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test8-qualified-this-pointer.cc Yet another fix to the DWARF method "static-ness" detection heuristic 2014-10-16 23:49:41 +02:00
test8-qualified-this-pointer.so Yet another fix to the DWARF method "static-ness" detection heuristic 2014-10-16 23:49:41 +02:00
test8-qualified-this-pointer.so.abi On changed fn, show symbol info when name is different from linkage name in C 2015-07-19 19:52:01 +02:00
test9-pr18818-clang.so Bug 18818 - abidw aborts on a class with a non-complete base class 2015-08-14 16:22:14 +02:00
test9-pr18818-clang.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test10-pr18818-gcc.so Bug 18818 - abidw aborts on a class with a non-complete base class 2015-08-14 16:22:14 +02:00
test10-pr18818-gcc.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test11-pr18828.so Bug 18828 - Handle force-resolving of multiple declarations-only of the same type 2015-08-15 00:26:39 +02:00
test11-pr18828.so.abi Bug 18893 - type degradation from dwarf to abixml on libGLU.so 2015-08-30 17:11:36 +02:00
test12-pr18844.so Bug 18844 - assert failure in abidw at abg-dwarf-reader.cc:6537 2015-08-18 12:33:57 +02:00
test12-pr18844.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test13-pr18894.so Bug 18894 - Fix representation of enumerators in abixml format 2015-08-29 17:17:48 +02:00
test13-pr18894.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test14-pr18893.so Bug 18893 - type degradation from dwarf to abixml on libGLU.so 2015-08-30 17:11:36 +02:00
test14-pr18893.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test15-pr18892.so Bug 18892 - type degradation from DWARF to abixml on libtsan.so 2015-08-30 17:56:19 +02:00
test15-pr18892.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00
test16-pr18904.so More type degradation fixes (from DWARF to abixml) 2015-09-02 14:15:58 +02:00
test16-pr18904.so.abi Use cache type hash values only after type canonicalization is done 2015-09-07 23:35:30 +02:00