diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2015-12-09 20:35:18 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2015-12-09 19:35:18 +0000 |
commit | 378004b9d2633f4817da26feb2e07ba739b2eba1 (patch) | |
tree | 67dd9ada0d311d144f45d0c3ceb077eda686a4f9 /gcc | |
parent | 811582ec147f4eb722b75578faba4a94c5cfd829 (diff) | |
download | gcc-378004b9d2633f4817da26feb2e07ba739b2eba1.zip gcc-378004b9d2633f4817da26feb2e07ba739b2eba1.tar.gz gcc-378004b9d2633f4817da26feb2e07ba739b2eba1.tar.bz2 |
re PR lto/68811 (ICE: in get, at cgraph.h:1218)
PR lto/68811
* g++.dg/lto/pr68811_0.C: New testcase.
* g++.dg/lto/pr68811_1.C: New testcase.
* lto-symtab.c (lto_symtab_merge_decls_2): Decl can never be prevailed
by itself.
From-SVN: r231473
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/lto/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lto/lto-symtab.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr68811_0.C | 11 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr68811_1.C | 94 |
5 files changed, 120 insertions, 2 deletions
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index faeb3ee..9f0733d 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,5 +1,11 @@ 2015-12-08 Jan Hubicka <hubicka@ucw.cz> + PR lto/68811 + * lto-symtab.c (lto_symtab_merge_decls_2): Decl can never be prevailed + by itself. + +2015-12-08 Jan Hubicka <hubicka@ucw.cz> + PR ipa/61886 * lto-symtab.c: Include lto-symtab.h. (lto_cgraph_replace_node): Do not merge profiles here. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index a0cc170..d4868c4 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -568,7 +568,8 @@ lto_symtab_merge_decls_2 (symtab_node *first, bool diagnosed_p) for (this_prevailing = prevailing; ; this_prevailing = this_prevailing->next_sharing_asm_name) { - if (lto_symtab_merge_p (this_prevailing->decl, e->decl)) + if (this_prevailing->decl != e->decl + && lto_symtab_merge_p (this_prevailing->decl, e->decl)) break; if (this_prevailing == last_prevailing) { @@ -709,7 +710,7 @@ lto_symtab_merge_decls_1 (symtab_node *first) && lto_symtab_symbol_p (e)) prevailing = e; } - /* For variables prefer the non-builtin if one is available. */ + /* For functions prefer the non-builtin if one is available. */ else if (TREE_CODE (prevailing->decl) == FUNCTION_DECL) { for (e = first; e; e = e->next_sharing_asm_name) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 20f62af..17f7b07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-12-08 Jan Hubicka <hubicka@ucw.cz> + + PR lto/68811 + * g++.dg/lto/pr68811_0.C: New testcase. + * g++.dg/lto/pr68811_1.C: New testcase. + 2015-12-09 Paolo Carlini <paolo.carlini@oracle.com> PR c++/60218 diff --git a/gcc/testsuite/g++.dg/lto/pr68811_0.C b/gcc/testsuite/g++.dg/lto/pr68811_0.C new file mode 100644 index 0000000..2ae4eb0 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr68811_0.C @@ -0,0 +1,11 @@ +// { dg-lto-do link } +/* { dg-lto-options "-O2 -w" } */ +// { dg-extra-ld-options "-r -nostdlib" } +extern "C" char *strcpy(char *, const char *); +char InitXPCOMGlue_lastSlash; +void InitXPCOMGlue() { strcpy(&InitXPCOMGlue_lastSlash, ".so"); } +extern "C" void memcpy(void *); +char LZ4_decompress_safe_usingDict_ip; +void LZ4_decompress_safe_usingDict() { + memcpy(&LZ4_decompress_safe_usingDict_ip); +} diff --git a/gcc/testsuite/g++.dg/lto/pr68811_1.C b/gcc/testsuite/g++.dg/lto/pr68811_1.C new file mode 100644 index 0000000..1f5b356 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr68811_1.C @@ -0,0 +1,94 @@ +// { dg-options "-O2 -flto -w" } +template <typename> class allocator; +template <typename _CharT, typename = _CharT, typename = allocator<_CharT>> +class Trans_NS___cxx11_basic_string; +struct __false_type {}; +template <typename> using __void_t = void; +template <typename, typename, template <typename...> class, typename...> +struct __detector { + using type = int; +}; +template <typename _Default, template <typename...> class _Op, + typename... _Args> +struct __detector<_Default, __void_t<_Op<_Args...>>, _Op, _Args...> { + using type = _Op<_Args...>; +}; +template <typename _Default, template <typename...> class _Op, + typename... _Args> +using __detected_or = __detector<_Default, void, _Op, _Args...>; +template <typename _Default, template <typename...> class _Op, + typename... _Args> +using __detected_or_t = typename __detected_or<_Default, _Op, _Args...>::type; +template <template <typename...> class _Default, + template <typename...> class _Op, typename... _Args> +using __detected_or_t_ = __detected_or_t<_Default<_Args...>, _Op, _Args...>; +struct random_access_iterator_tag {}; +class __undefined; +template <typename, typename> using __replace_first_arg_t = __undefined; +template <typename> class allocator { +public: + template <typename> struct rebind { typedef allocator other; }; +}; +struct __allocator_traits_base { + template <typename _Alloc, typename _Up> + using __rebind = typename _Alloc::template rebind<_Up>::other; + template <typename _Tp> using __pointer = typename _Tp::pointer; + template <typename _Tp> using __size_type = typename _Tp::size_type; +}; +template <typename _Alloc, typename _Up> +using __alloc_rebind = + __detected_or_t_<__replace_first_arg_t, __allocator_traits_base::__rebind, + _Alloc, _Up>; +struct allocator_traits : __allocator_traits_base { + using pointer = __detected_or_t<char, __pointer, allocator<char>>; + using size_type = __detected_or_t<int, __size_type, allocator<char>>; + template <typename _Tp> + using rebind_alloc = __alloc_rebind<allocator<char>, _Tp>; +}; +struct __alloc_traits : allocator_traits { + struct rebind { + typedef rebind_alloc<int> other; + }; +}; +template <typename, typename, typename> class Trans_NS___cxx11_basic_string { +public: + struct _Alloc_hider : __alloc_traits::rebind::other { + _Alloc_hider(__alloc_traits::pointer, allocator); + } _M_dataplus; + __alloc_traits::pointer _M_local_data(); + template <typename _InIterator> + void _M_construct_aux(_InIterator __beg, _InIterator __end, __false_type) { + _M_construct(__beg, __end, random_access_iterator_tag()); + } + template <typename _InIterator> + void _M_construct(_InIterator __beg, _InIterator __end) { + _M_construct_aux(__beg, __end, __false_type()); + } + template <typename _FwdIterator> + void _M_construct(_FwdIterator, _FwdIterator, random_access_iterator_tag); + char _S_copy___s2; + void _S_copy(char *, __alloc_traits::size_type __n) { + __builtin_memcpy(0, &_S_copy___s2, __n); + } + template <class _Iterator> + void _S_copy_chars(char *__p, _Iterator __k1, _Iterator __k2) { + _S_copy(__p, __k2 - __k1); + } + Trans_NS___cxx11_basic_string(char *__s, + allocator<char> __a = allocator<char>()) + : _M_dataplus(_M_local_data(), __a) { + _M_construct(__s, __s); + } +}; +template <typename _CharT, typename _Traits, typename _Alloc> +template <typename _InIterator> +void Trans_NS___cxx11_basic_string<_CharT, _Traits, _Alloc>::_M_construct( + _InIterator __beg, _InIterator __end, random_access_iterator_tag) { + _S_copy_chars(0, __beg, __end); +} +class Decimal { + Trans_NS___cxx11_basic_string<char> toString() const; +}; +Trans_NS___cxx11_basic_string<char> Decimal::toString() const { + return "Infinity"; +} |