diff options
author | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-12-15 03:41:41 +0000 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-12-15 03:41:41 +0000 |
commit | bebecd51b6d2bb0f29423a582b0294183392e0d4 (patch) | |
tree | 5c599da445c4658615bd7d6ae1567f48487ceaa6 | |
parent | 1bf7c3241444b26d2b89b7731de198a9139b7d4e (diff) | |
download | gcc-bebecd51b6d2bb0f29423a582b0294183392e0d4.zip gcc-bebecd51b6d2bb0f29423a582b0294183392e0d4.tar.gz gcc-bebecd51b6d2bb0f29423a582b0294183392e0d4.tar.bz2 |
re PR lto/64043 (ICE (segfault) with LTO: in tree_check/tree.h:2758 get_binfo_at_offset/tree.c:11914)
PR lto/64043
* tree.c (virtual_method_call_p): Return false when OTR type has
no BINFO.
* g++.dg/lto/pr64043_0.C: New testcase.
From-SVN: r218727
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/lto/pr64043_0.C | 14 | ||||
-rw-r--r-- | gcc/tree.c | 15 |
4 files changed, 40 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3e9e2c5..1c637f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,14 @@ -2014-12-14 Jan HUbicka <hubicka@ucw.cz> +2014-12-14 Jan Hubicka <hubicka@ucw.cz> + + * cgraphunit.c (analyze_functions): Always analyze targets of aliases. + +2014-12-14 Jan Hubicka <hubicka@ucw.cz> + + PR lto/64043 + * tree.c (virtual_method_call_p): Return false when OTR type has + no BINFO. + +2014-12-14 Jan Hubicka <hubicka@ucw.cz> * cgraphunit.c (analyze_functions): Do not analyze extern inline funtions when not optimizing; skip comdat locals. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c42c3fe..bc4e0da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-14 Jan HUbicka <hubicka@ucw.cz> + + PR lto/64043 + * g++.dg/lto/pr64043_0.C: New testcase. + 2014-12-14 H.J. Lu <hongjiu.lu@intel.com> PR rtl-optimization/64037 diff --git a/gcc/testsuite/g++.dg/lto/pr64043_0.C b/gcc/testsuite/g++.dg/lto/pr64043_0.C new file mode 100644 index 0000000..9cc5596 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr64043_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do link } +// { dg-lto-options { { -flto -std=c++11 } } } +// { dg-extra-ld-options "-r -nostdlib -O2" } +class Validator +{ +public: + virtual ~Validator (); +}; +class FooWriter +{ + Validator *validator; + ~FooWriter (); +}; +FooWriter::~FooWriter () { delete validator; } @@ -11864,12 +11864,17 @@ virtual_method_call_p (tree target) { if (TREE_CODE (target) != OBJ_TYPE_REF) return false; - target = TREE_TYPE (target); - gcc_checking_assert (TREE_CODE (target) == POINTER_TYPE); - target = TREE_TYPE (target); - if (TREE_CODE (target) == FUNCTION_TYPE) + tree t = TREE_TYPE (target); + gcc_checking_assert (TREE_CODE (t) == POINTER_TYPE); + t = TREE_TYPE (t); + if (TREE_CODE (t) == FUNCTION_TYPE) + return false; + gcc_checking_assert (TREE_CODE (t) == METHOD_TYPE); + /* If we do not have BINFO associated, it means that type was built + without devirtualization enabled. Do not consider this a virtual + call. */ + if (!TYPE_BINFO (obj_type_ref_class (target))) return false; - gcc_checking_assert (TREE_CODE (target) == METHOD_TYPE); return true; } |