diff options
| author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-05 04:52:19 +0000 |
|---|---|---|
| committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-10-05 04:52:19 +0000 |
| commit | 6d2efab4454ae9347c6cb2b1b892c9a0413b8d28 (patch) | |
| tree | 42e40f688ee0956175e7643952262d1205fa2a72 | |
| parent | 37625fa19e4aefd016eacc568822e99fa026236b (diff) | |
| download | ppe42-gcc-6d2efab4454ae9347c6cb2b1b892c9a0413b8d28.tar.gz ppe42-gcc-6d2efab4454ae9347c6cb2b1b892c9a0413b8d28.zip | |
PR ipa/61144
* varpool.c (ctor_for_folding): Do not fold WEAK symbols.
* gcc.dg/tree-ssa/pr61144.c: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@215896 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr61144.c | 7 | ||||
| -rw-r--r-- | gcc/varpool.c | 12 |
4 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f58b0431e49..80106edf5d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-10-03 Jan Hubicka <hubicka@ucw.cz> + PR ipa/61144 + * varpool.c (ctor_for_folding): Do not fold WEAK symbols. + +2014-10-03 Jan Hubicka <hubicka@ucw.cz> + PR ipa/62121 * ipa-devirt.c (restrict_to_inner_class): Do not ICE when type is unknown. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1f02fbccd33..2b699588469 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2014-10-03 Jan Hubicka <hubicka@ucw.cz> + PR ipa/61144 + * gcc.dg/tree-ssa/pr61144.c: New testcase. + +2014-10-03 Jan Hubicka <hubicka@ucw.cz> + PR ipa/62121 * g++.dg/torture/pr62121.C: New testcase. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61144.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61144.c new file mode 100644 index 00000000000..cd34b144e89 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61144.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-require-weak "" } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +static int dummy = 0; +extern int foo __attribute__((__weak__, __alias__("dummy"))); +int bar() { if (foo) return 1; return 0; } +/* { dg-final { scan-tree-dump-not "return 0" "optimized"} } */ diff --git a/gcc/varpool.c b/gcc/varpool.c index dc869e2512d..8cf68c62343 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -329,8 +329,16 @@ ctor_for_folding (tree decl) /* Variables declared 'const' without an initializer have zero as the initializer if they may not be - overridden at link or run time. */ - if (!DECL_INITIAL (real_decl) + overridden at link or run time. + + It is actually requirement for C++ compiler to optimize const variables + consistently. As a GNU extension, do not enfore this rule for user defined + weak variables, so we support interposition on: + static const int dummy = 0; + extern const int foo __attribute__((__weak__, __alias__("dummy"))); + */ + if ((!DECL_INITIAL (real_decl) + || (DECL_WEAK (decl) && !DECL_COMDAT (decl))) && (DECL_EXTERNAL (decl) || decl_replaceable_p (decl))) return error_mark_node; |

