diff options
author | Geoffrey Keating <geoffk@apple.com> | 2006-07-13 06:16:59 +0000 |
---|---|---|
committer | Geoffrey Keating <geoffk@gcc.gnu.org> | 2006-07-13 06:16:59 +0000 |
commit | 7c0de6a544ba5d293eab1f91b70e017ef5d5834f (patch) | |
tree | d0cf7502eabafc2262e5a615fdbd20410a69b531 /gcc | |
parent | 72af9f0b517b8dec055f72bf2ba7bfcb2e8da99b (diff) | |
download | gcc-7c0de6a544ba5d293eab1f91b70e017ef5d5834f.zip gcc-7c0de6a544ba5d293eab1f91b70e017ef5d5834f.tar.gz gcc-7c0de6a544ba5d293eab1f91b70e017ef5d5834f.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl2.c | 15 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C | 19 |
6 files changed, 52 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4c269fc..9e907dd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c7aa918..de1f4f1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index defeafb..3a78c40 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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. */ diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 59830ec..0a1a917 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e196166..1548411 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C new file mode 100644 index 0000000..ed38ebe --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden-2.C @@ -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(); +} |