From be46831f5a914a19bce02cb73a5c31bbba95d1b0 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Sat, 15 Jan 2011 16:44:56 +0100 Subject: [PATCH] re PR tree-optimization/47276 (ICE in function_and_variable_visibility, at ipa.c:857 during compiling glibc.) PR tree-optimization/47276 * ipa.c (function_and_variable_visibility): Do not try to mark alias declarations as needed. * gcc.dg/pr47276.c: New testcase. From-SVN: r168844 --- gcc/ChangeLog | 6 ++++++ gcc/ipa.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr47276.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr47276.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f9e9b359aece..610507b7c1fb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-01-13 Jan Hubicka + + PR tree-optimization/47276 + * ipa.c (function_and_variable_visibility): Do not try to mark alias + declarations as needed. + 2011-01-15 Martin Jambor * common.opt (fdevirtualize): New flag. diff --git a/gcc/ipa.c b/gcc/ipa.c index fa39f92925d2..0320ded7a879 100644 --- a/gcc/ipa.c +++ b/gcc/ipa.c @@ -847,6 +847,8 @@ function_and_variable_visibility (bool whole_program) if ((node = cgraph_node_for_asm (p->target)) != NULL && !DECL_EXTERNAL (node->decl)) { + if (!node->analyzed) + continue; /* Weakrefs alias symbols from other compilation unit. In the case the destination of weakref became available because of LTO, we must mark it as needed. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b30e532b847e..d95034fff443 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-01-13 Jan Hubicka + + PR tree-optimization/47276 + * gcc.dg/pr47276.c: New testcase. + 2011-01-15 Giovanni Funchal Jonathan Wakely diff --git a/gcc/testsuite/gcc.dg/pr47276.c b/gcc/testsuite/gcc.dg/pr47276.c new file mode 100644 index 000000000000..ae1e81a0aa5c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr47276.c @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-require-alias "" } */ +extern void syslog (int __pri, __const char *__fmt, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); +extern void vsyslog (int __pri, __const char *__fmt, int __ap) + __attribute__ ((__format__ (__printf__, 2, 0))); +void +__vsyslog(int pri, const char *fmt, int ap) +{ +} +void +__syslog_chk(int pri, int flag, const char *fmt, ...) +{ +} +void +__vsyslog_chk(int pri, int flag, const char *fmt, int ap) +{ +} +extern __typeof (__vsyslog_chk) __EI___vsyslog_chk __asm__("" "__vsyslog_chk"); extern __typeof (__vsyslog_chk) __EI___vsyslog_chk __attribute__((alias ("" "__GI___vsyslog_chk"))); +void +__syslog(int pri, const char *fmt, ...) +{ +} +extern __typeof (__syslog) syslog __attribute__ ((alias ("__syslog"))); +extern __typeof (syslog) __EI_syslog __asm__("" "syslog"); extern __typeof (syslog) __EI_syslog __attribute__((alias ("" "__GI_syslog"))); +extern __typeof (__vsyslog) vsyslog __attribute__ ((alias ("__vsyslog"))); +extern __typeof (vsyslog) __EI_vsyslog __asm__("" "vsyslog"); extern __typeof (vsyslog) __EI_vsyslog __attribute__((alias ("" "__GI_vsyslog"))); +extern __typeof (syslog) syslog __asm__ ("" "__GI_syslog") __attribute__ ((visibility ("hidden"))); +extern __typeof (vsyslog) vsyslog __asm__ ("" "__GI_vsyslog") __attribute__ ((visibility ("hidden"))); +extern __typeof (__vsyslog_chk) __vsyslog_chk __asm__ ("" "__GI___vsyslog_chk") __attribute__ ((visibility ("hidden")));