From 3292dd408163da24f70fb93e962d0b9cdf20f74a Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 11 Feb 2015 16:09:48 +0100 Subject: [PATCH] re PR middle-end/65003 (-fsection-anchors ICE) PR middle-end/65003 * varasm.c (place_block_symbol): Assert that DECL_RTL of the ultimate alias is MEM with SYMBOL_REF satisfying SYMBOL_REF_HAS_BLOCK_INFO_P as its operand. Don't pass the MEM to place_block_symbol, but instead pass the SYMBOL_REF operand of it. * g++.dg/opt/pr65003.C: New test. From-SVN: r220625 --- gcc/ChangeLog | 8 ++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/opt/pr65003.C | 31 ++++++++++++++++++++++++++++++ gcc/varasm.c | 4 ++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/g++.dg/opt/pr65003.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 482b12876da..0f05ee4a25a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-02-11 Jakub Jelinek + + PR middle-end/65003 + * varasm.c (place_block_symbol): Assert that DECL_RTL of the + ultimate alias is MEM with SYMBOL_REF satisfying + SYMBOL_REF_HAS_BLOCK_INFO_P as its operand. Don't pass the MEM + to place_block_symbol, but instead pass the SYMBOL_REF operand of it. + 2015-02-11 Thomas Schwinge * config/nvptx/mkoffload.c: Include "diagnostic.h" instead of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bd508ec8e39..0cdaf456c1e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-02-11 Jakub Jelinek + + PR middle-end/65003 + * g++.dg/opt/pr65003.C: New test. + 2015-02-11 H.J. Lu * lib/target-supports.exp (check_effective_target_pie): Renamed diff --git a/gcc/testsuite/g++.dg/opt/pr65003.C b/gcc/testsuite/g++.dg/opt/pr65003.C new file mode 100644 index 00000000000..5d131afaedb --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr65003.C @@ -0,0 +1,31 @@ +// PR middle-end/65003 +// { dg-do compile } +// { dg-options "-O2" } +// { dg-additional-options "-fpic" { target fpic } } + +struct A +{ + void operator= (A &); + A (); +}; +struct B +{ + A b; +}; +struct C +{ + virtual bool foo (int &, bool) const; +}; +struct D : virtual C +{ + bool foo (int &, bool) const; + B e; +}; +struct F : D +{ + F (int &, const int &, const A &); + bool foo (int &, bool) const; +}; +bool D::foo (int &, bool) const {} +F::F (int &, const int &, const A &) {} +bool F::foo (int &, bool) const {} diff --git a/gcc/varasm.c b/gcc/varasm.c index eb65b1ff669..3f62fca04de 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -7180,6 +7180,10 @@ place_block_symbol (rtx symbol) { rtx target = DECL_RTL (snode->ultimate_alias_target ()->decl); + gcc_assert (MEM_P (target) + && GET_CODE (XEXP (target, 0)) == SYMBOL_REF + && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (target, 0))); + target = XEXP (target, 0); place_block_symbol (target); SYMBOL_REF_BLOCK_OFFSET (symbol) = SYMBOL_REF_BLOCK_OFFSET (target); return; -- 2.30.2