re PR target/39175 (ICE while compiling qt-4.5.0-rc1)

PR target/39175
	* c-common.c (c_determine_visibility): If visibility changed and
	DECL_RTL has been already set, call make_decl_rtl to update symbol
	flags.

	* decl2.c (determine_visibility): If visibility changed and
	DECL_RTL has been already set, call make_decl_rtl to update symbol
	flags.

	* gcc.dg/visibility-20.c: New test.
	* g++.dg/ext/visibility/visibility-11.C: New test.

From-SVN: r144305
This commit is contained in:
Jakub Jelinek 2009-02-19 22:15:12 +01:00 committed by Jakub Jelinek
parent 9c747b9747
commit 0981262229
7 changed files with 85 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2009-02-19 Jakub Jelinek <jakub@redhat.com>
PR target/39175
* c-common.c (c_determine_visibility): If visibility changed and
DECL_RTL has been already set, call make_decl_rtl to update symbol
flags.
2009-02-19 H.J. Lu <hongjiu.lu@intel.com>
PR c++/39188

View File

@ -1,6 +1,7 @@
/* Subroutines shared by all languages that are variants of C.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
This file is part of GCC.
@ -6249,8 +6250,18 @@ c_determine_visibility (tree decl)
visibility_specified depending on #pragma GCC visibility. */
if (!DECL_VISIBILITY_SPECIFIED (decl))
{
DECL_VISIBILITY (decl) = default_visibility;
DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma;
if (visibility_options.inpragma
|| DECL_VISIBILITY (decl) != default_visibility)
{
DECL_VISIBILITY (decl) = default_visibility;
DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma;
/* If visibility changed and DECL already has DECL_RTL, ensure
symbol flags are updated. */
if (((TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
|| TREE_CODE (decl) == FUNCTION_DECL)
&& DECL_RTL_SET_P (decl))
make_decl_rtl (decl);
}
}
return false;
}

View File

@ -1,3 +1,10 @@
2009-02-19 Jakub Jelinek <jakub@redhat.com>
PR target/39175
* decl2.c (determine_visibility): If visibility changed and
DECL_RTL has been already set, call make_decl_rtl to update symbol
flags.
2009-02-19 H.J. Lu <hongjiu.lu@intel.com>
PR c++/39188

View File

@ -1,6 +1,6 @@
/* Process declarations and variables for C++ compiler.
Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com)
@ -1922,6 +1922,8 @@ determine_visibility (tree decl)
{
tree class_type = NULL_TREE;
bool use_template;
bool orig_visibility_specified;
enum symbol_visibility orig_visibility;
/* Remember that all decls get VISIBILITY_DEFAULT when built. */
@ -1934,6 +1936,9 @@ determine_visibility (tree decl)
maybe_clone_body. */
gcc_assert (!DECL_CLONED_FUNCTION_P (decl));
orig_visibility_specified = DECL_VISIBILITY_SPECIFIED (decl);
orig_visibility = DECL_VISIBILITY (decl);
if (TREE_CODE (decl) == TYPE_DECL)
{
if (CLASS_TYPE_P (TREE_TYPE (decl)))
@ -2062,6 +2067,15 @@ determine_visibility (tree decl)
|| ! DECL_VISIBILITY_SPECIFIED (decl))
constrain_visibility (decl, tvis);
}
/* If visibility changed and DECL already has DECL_RTL, ensure
symbol flags are updated. */
if ((DECL_VISIBILITY (decl) != orig_visibility
|| DECL_VISIBILITY_SPECIFIED (decl) != orig_visibility_specified)
&& ((TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl))
|| TREE_CODE (decl) == FUNCTION_DECL)
&& DECL_RTL_SET_P (decl))
make_decl_rtl (decl);
}
/* By default, static data members and function members receive

View File

@ -1,3 +1,9 @@
2009-02-19 Jakub Jelinek <jakub@redhat.com>
PR target/39175
* gcc.dg/visibility-20.c: New test.
* g++.dg/ext/visibility/visibility-11.C: New test.
2009-02-19 H.J. Lu <hongjiu.lu@intel.com>
PR c++/39188

View File

@ -0,0 +1,18 @@
// PR target/39175
// { dg-do compile }
// { dg-require-visibility "" }
// { dg-options "-O2 -fvisibility=hidden -fpic" { target fpic } }
__attribute__((noinline)) int
foo (int x)
{
return x;
}
int foo (int x);
int
bar (int x)
{
return foo (x);
}

View File

@ -0,0 +1,18 @@
/* PR target/39175 */
/* { dg-do compile } */
/* { dg-require-visibility "" } */
/* { dg-options "-O2 -fvisibility=hidden -fpic" { target fpic } } */
__attribute__((noinline)) int
foo (int x)
{
return x;
}
int foo (int x);
int
bar (int x)
{
return foo (x);
}