http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51635
--- Comment #13 from Markus Trippelsdorf <markus at trippelsdorf dot de>
2011-12-21 12:55:21 UTC ---
(In reply to comment #11)
> One issue we still hit is that we for example merge in
> stl_iterator_base_types.h
>
> template<typename _Iterator>
> struct iterator_traits
> {
> typedef typename _Iterator::iterator_category iterator_category;
> typedef typename _Iterator::value_type value_type;
> typedef typename _Iterator::difference_type difference_type;
> typedef typename _Iterator::pointer pointer;
> typedef typename _Iterator::reference reference;
> };
>
> and
>
> template<typename _Tp>
> struct iterator_traits<const _Tp*>
> {
> typedef random_access_iterator_tag iterator_category;
> typedef _Tp value_type;
> typedef ptrdiff_t difference_type;
> typedef const _Tp* pointer;
> typedef const _Tp& reference;
> };
>
> and so end up attaching the same TYPE_DECL to both iterator_category typedefs.
> An extreme idea was to only merge if the TYPE_DECLs source location was the
> same (but not sure if that works reliably without expensive location
> expansion).
>
> The above merging causes us to infinitely recurse in modified_type_die
> through DECL_ORIGINAL_TYPE which forms a typedef cycle. You probably
> hit a similar bug.
>
> A non-optimial patch for the above is (non-optimal because it does not
> include hashing)
>
> Index: gcc/gimple.c
> ===================================================================
> --- gcc/gimple.c (revision 182525)
> +++ gcc/gimple.c (working copy)
> @@ -3318,28 +3318,35 @@ compare_type_names_p (tree t1, tree t2)
> tree name1 = TYPE_NAME (t1);
> tree name2 = TYPE_NAME (t2);
>
> + if (name1 == name2)
> + return true;
> +
> if ((name1 != NULL_TREE) != (name2 != NULL_TREE))
> return false;
>
> - if (name1 == NULL_TREE)
> - return true;
> -
> /* Either both should be a TYPE_DECL or both an IDENTIFIER_NODE. */
> if (TREE_CODE (name1) != TREE_CODE (name2))
> return false;
>
> if (TREE_CODE (name1) == TYPE_DECL)
> - name1 = DECL_NAME (name1);
> - gcc_checking_assert (!name1 || TREE_CODE (name1) == IDENTIFIER_NODE);
> + {
> + expanded_location loc1, loc2;
>
> - if (TREE_CODE (name2) == TYPE_DECL)
> - name2 = DECL_NAME (name2);
> - gcc_checking_assert (!name2 || TREE_CODE (name2) == IDENTIFIER_NODE);
> + if (DECL_NAME (name1) != DECL_NAME (name2))
> + return false;
>
> - /* Identifiers can be compared with pointer equality rather
> - than a string comparison. */
> - if (name1 == name2)
> - return true;
> + if (DECL_SOURCE_LOCATION (name1) == DECL_SOURCE_LOCATION (name2))
> + return true;
> +
> + loc1 = expand_location (DECL_SOURCE_LOCATION (name1));
> + loc2 = expand_location (DECL_SOURCE_LOCATION (name2));
> + if (loc1.line != loc2.line
> + || loc1.column != loc2.column
> + || strcmp (loc1.file, loc2.file) != 0)
> + return false;
> +
> + return true;
> + }
>
> return false;
> }
Program received signal SIGSEGV, Segmentation fault.
[Switching to process 30844]
strcmp () at ../sysdeps/x86_64/strcmp.S:214
214 movlpd (%rsi), %xmm2
(gdb) bt
#0 strcmp () at ../sysdeps/x86_64/strcmp.S:214
#1 0x00000000005bff0f in compare_type_names_p (t1=<optimized out>,
t2=<optimized out>) at ../../gcc/gcc/gimple.c:3345
#2 gimple_types_compatible_p_1 (t1=0x7ffff6feb000, t2=0x7ffff728f690,
p=0x10ea9dc, sccstack=0x7ffffffee068, sccstate=0x1118380,
sccstate_obstack=0x7ffffffee070) at ../../gcc/gcc/gimple.c:3554
#3 0x00000000005bea20 in gimple_types_compatible_p (t2=0x7ffff728f690,
t1=0x7ffff6feb000) at ../../gcc/gcc/gimple.c:3943
#4 gimple_type_eq (p1=0x7ffff6feb000, p2=0x7ffff728f690) at
../../gcc/gcc/gimple.c:4438
#5 0x0000000000b6f064 in htab_find_slot_with_hash (htab=0x7ffff727db60,
element=0x7ffff728f690, hash=1226149484, insert=INSERT)
at ../../gcc/libiberty/hashtab.c:668
#6 0x00000000005b87d1 in gimple_register_type_1 (t=0x7ffff728f690,
registering_mv=<optimized out>) at ../../gcc/gcc/gimple.c:4473
#7 0x00000000005b8803 in gimple_register_type_1 (t=0x7ffff6fc1540,
registering_mv=<optimized out>) at ../../gcc/gcc/gimple.c:4470
#8 0x00000000004996d4 in uniquify_nodes (data_in=0x10bb2b0, from=236) at
../../gcc/gcc/lto/lto.c:742
#9 0x0000000000499b13 in lto_read_decls (decl_data=0x7ffff73bf000,
data=0x7ffff718e020, resolutions=<optimized out>) at
../../gcc/gcc/lto/lto.c:933
#10 0x000000000049ab80 in lto_file_finalize (file_data=0x7ffff73bf000,
file=<optimized out>) at ../../gcc/gcc/lto/lto.c:1173
#11 lto_create_files_from_ids (count=<synthetic pointer>,
file_data=0x7ffff73bf000, file=0x1028eb0) at ../../gcc/gcc/lto/lto.c:1183
#12 lto_file_read (count=<synthetic pointer>, resolution_file=0x10b70b0,
file=0x1028eb0) at ../../gcc/gcc/lto/lto.c:1223
#13 read_cgraph_and_symbols (fnames=0x103ac10, nfiles=110) at
../../gcc/gcc/lto/lto.c:2624
#14 lto_main () at ../../gcc/gcc/lto/lto.c:2938
#15 0x00000000006f5b24 in compile_file () at ../../gcc/gcc/toplev.c:557
#16 do_compile () at ../../gcc/gcc/toplev.c:1935
#17 toplev_main (argc=173, argv=0x10130d0) at ../../gcc/gcc/toplev.c:2011
#18 0x00007ffff7895425 in __libc_start_main (main=0x49ea50 <main>, argc=64,
ubp_av=0x7fffffffdb58, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffdb48) at libc-start.c:226
#19 0