Index: ChangeLog

2006-07-12  Geoffrey Keating  <geoffk@apple.com>

	* doc/invoke.texi (C++ Dialect Options): Explain difference
	between -fvisibility-inlines-hidden and setting hidden
	visibility explicitly.

Index: cp/ChangeLog
2006-07-12  Geoffrey Keating  <geoffk@apple.com>

	* decl2.c (determine_visibility): Don't change visibility of
	function locals because of -fvisibility-inlines-hidden.

Index: testsuite/ChangeLog
2006-07-12  Geoffrey Keating  <geoffk@apple.com>

	* g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C: New.

From-SVN: r115411
This commit is contained in:
Geoffrey Keating 2006-07-13 06:16:59 +00:00 committed by Geoffrey Keating
parent 72af9f0b51
commit 7c0de6a544
6 changed files with 52 additions and 6 deletions

View File

@ -1,3 +1,9 @@
2006-07-12 Geoffrey Keating <geoffk@apple.com>
* doc/invoke.texi (C++ Dialect Options): Explain difference
between -fvisibility-inlines-hidden and setting hidden
visibility explicitly.
2006-07-12 Eric Christopher <echristo@apple.com>
* config/t-slibgcc-darwin (SHLIB_LINK): Don't munge stmp-lipo.

View File

@ -1,3 +1,8 @@
2006-07-12 Geoffrey Keating <geoffk@apple.com>
* decl2.c (determine_visibility): Don't change visibility of
function locals because of -fvisibility-inlines-hidden.
2006-07-12 Jason Merrill <jason@redhat.com>
PR c++/28217

View File

@ -1712,13 +1712,20 @@ determine_visibility (tree decl)
gcc_assert (TREE_CODE (decl) != VAR_DECL
|| !DECL_VTABLE_OR_VTT_P (decl));
if (DECL_FUNCTION_SCOPE_P (decl))
if (DECL_FUNCTION_SCOPE_P (decl) && ! DECL_VISIBILITY_SPECIFIED (decl))
{
/* Local statics and classes get the visibility of their
containing function. */
containing function by default, except that
-fvisibility-inlines-hidden doesn't affect them. */
tree fn = DECL_CONTEXT (decl);
DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
DECL_VISIBILITY_SPECIFIED (decl) = DECL_VISIBILITY_SPECIFIED (fn);
if (DECL_VISIBILITY_SPECIFIED (fn) || ! DECL_CLASS_SCOPE_P (fn))
{
DECL_VISIBILITY (decl) = DECL_VISIBILITY (fn);
DECL_VISIBILITY_SPECIFIED (decl) =
DECL_VISIBILITY_SPECIFIED (fn);
}
else
determine_visibility_from_class (decl, DECL_CONTEXT (fn));
/* Local classes in templates have CLASSTYPE_USE_TEMPLATE set,
but have no TEMPLATE_INFO, so don't try to check it. */

View File

@ -1618,10 +1618,15 @@ when used within the DSO@. Enabling this option can have a dramatic effect
on load and link times of a DSO as it massively reduces the size of the
dynamic export table when the library makes heavy use of templates.
The behaviour of this switch is not quite the same as marking the
methods as hidden directly, because it does not affect static variables
local to the function or cause the compiler to deduce that
the function is defined in only one shared object.
You may mark a method as having a visibility explicitly to negate the
effect of the switch for that method. For example, if you do want to
compare pointers to a particular inline method, or the method has
local static data, you might mark it as having default visibility.
compare pointers to a particular inline method, you might mark it as
having default visibility.
@item -fno-weak
@opindex fno-weak

View File

@ -1,3 +1,7 @@
2006-07-12 Geoffrey Keating <geoffk@apple.com>
* g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C: New.
2006-07-13 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25097

View File

@ -0,0 +1,19 @@
/* Test that -fvisibility-inlines-hidden doesn't affect static variables. */
/* { dg-do compile } */
/* { dg-require-visibility "" } */
/* { dg-options "-fvisibility-inlines-hidden" } */
/* { dg-final { scan-not-hidden "_ZZN3foo7my_funcEvE1x" } } */
struct foo
{
int my_func() {
static int x;
return x++;
}
};
int t()
{
foo f;
return f.my_func();
}