From 3c4e91c903a599641e3adf08b6f2646d778c4cf3 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 12 Jan 2016 14:22:40 +0000 Subject: [PATCH] re PR debug/69077 (omnetpp ICEs with -flto -g) 2016-01-12 Richard Biener PR lto/69077 lto/ * lto-symtab.c (lto_symtab_prevailing_virtual_decl): Properly merge TREE_ADDRESSABLE and DECL_POSSIBLY_INLINED flags. * g++.dg/lto/pr69077_0.C: New testcase. * g++.dg/lto/pr69077_1.C: Likewise. From-SVN: r232272 --- gcc/lto/ChangeLog | 6 ++++++ gcc/lto/lto-symtab.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/lto/pr69077_0.C | 14 ++++++++++++++ gcc/testsuite/g++.dg/lto/pr69077_1.C | 15 +++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 gcc/testsuite/g++.dg/lto/pr69077_0.C create mode 100644 gcc/testsuite/g++.dg/lto/pr69077_1.C diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index 8d5d2782db88..352fe17eecbd 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,9 @@ +2016-01-12 Richard Biener + + PR lto/69077 + * lto-symtab.c (lto_symtab_prevailing_virtual_decl): Properly + merge TREE_ADDRESSABLE and DECL_POSSIBLY_INLINED flags. + 2016-01-04 Jakub Jelinek Update copyright years. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 3936916d8734..a6f6d01dda12 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -997,6 +997,18 @@ lto_symtab_prevailing_virtual_decl (tree decl) n = n->next_sharing_asm_name; if (n) { + /* Merge decl state in both directions, we may still end up using + the other decl. */ + TREE_ADDRESSABLE (n->decl) |= TREE_ADDRESSABLE (decl); + TREE_ADDRESSABLE (decl) |= TREE_ADDRESSABLE (n->decl); + + if (TREE_CODE (decl) == FUNCTION_DECL) + { + /* Merge decl state in both directions, we may still end up using + the other decl. */ + DECL_POSSIBLY_INLINED (n->decl) |= DECL_POSSIBLY_INLINED (decl); + DECL_POSSIBLY_INLINED (decl) |= DECL_POSSIBLY_INLINED (n->decl); + } lto_symtab_prevail_decl (n->decl, decl); decl = n->decl; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3ac04575ed52..98ac65044eb5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2016-01-12 Richard Biener + + PR lto/69077 + * g++.dg/lto/pr69077_0.C: New testcase. + * g++.dg/lto/pr69077_1.C: Likewise. + 2016-01-12 Jakub Jelinek PR target/69175 diff --git a/gcc/testsuite/g++.dg/lto/pr69077_0.C b/gcc/testsuite/g++.dg/lto/pr69077_0.C new file mode 100644 index 000000000000..6a81d0e3a5cb --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr69077_0.C @@ -0,0 +1,14 @@ +// { dg-lto-do link } +// { dg-lto-options { { -O3 -g -flto } } } +// { dg-extra-ld-options "-r -nostdlib" } + +struct cStdDev +{ + long ns; + virtual double mean() const { return ns; } +}; + +struct cWeightedStdDev : public cStdDev { + virtual int netPack(); +}; +int cWeightedStdDev::netPack() { } diff --git a/gcc/testsuite/g++.dg/lto/pr69077_1.C b/gcc/testsuite/g++.dg/lto/pr69077_1.C new file mode 100644 index 000000000000..2173b6c901f9 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr69077_1.C @@ -0,0 +1,15 @@ +struct cStdDev +{ + long ns; + virtual double mean() const { return ns; } +}; + +struct sf +{ + void recordScalar(double value); + cStdDev eedStats; + virtual void finish(); +}; +void sf::finish() { + recordScalar(eedStats.mean()); +}