Functions (and variables I suppose) in an anonymous namespace can't realisitically be used outside the shared library they are part of (due to the mangled name being randomized each compile). This means that they could be of visibility hidden, which 1) Cuts down on the amount of work for the dynamic linker 2) Means that internal calls to these functions can avoid the PLT trampoline (and thus get higher performance)
I don't think this is valid and here is why: anynymous namespace and still be used for templates and export so calling it from another shared library is possible if we (GCC) implements export.
Andrew's argument has been made a number of times, and is considered irrelevant until someone actually comes around and implements the 'export' keyword. This request is therefore definitely valid, but I close this PR since there are other duplicates of this somewhere in the database. W.
I think you mean bug 18267 However bug 18267 is about static versus non-static linkage. What I'm suggesting is visibility attribute level, eg non-static but hidden visibility.
As for andrews comment, the default could be hidden/private, where "export" would override the default to be non-private.
After talking with jason I think this is a legitimate request.
I think best would be to arrange for push_namespace that pushes anonymous namespace to do equivalent of #pragma GCC visibility push(hidden) and pop_namespace that leaves anonymous namespace to do equivalent of #pragma GCC visibility pop(hidden). That way users could override this if they want to. Unfortunately this relies on H.J.'s > 16 visibility pragma nesting patch.
There is a feature request to assign visibility attributes to namespaces. If this is done, then making anonymous namespaces hidden will just be a sub-class of that work. That enhancement request is c++/21764 Some of the semantics need to be fleshed out concretely, and behavior decided. -benjamin
Subject: Re: (optimisation) Functions in anonymous namespaces should default to "hidden" visibility "bkoz at gcc dot gnu dot org" <gcc-bugzilla@gcc.gnu.org> writes: | There is a feature request to assign visibility attributes to | namespaces. If this is done, then making anonymous namespaces hidden | will just be a sub-class of that work. | | That enhancement request is | | c++/21764 | | Some of the semantics need to be fleshed out concretely, and | behavior decided. I agree. Independently of the visvibility issue, GCC can make some other entities have internal linkage from the assembler/linker point of view (not C++ source point of view). -- Gaby
Related to PR 10591.
*** Bug 26770 has been marked as a duplicate of this bug. ***
Subject: Bug 21581 Author: jason Date: Tue Mar 21 16:15:25 2006 New Revision: 112250 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=112250 Log: PR c++/21581 * parser.c (cp_parser_declaration): Support attributes on anonymous namespaces. * name-lookup.c (push_namespace_with_attribs): Anonymous namespaces default to hidden visibility. Added: trunk/gcc/testsuite/g++.dg/ext/visibility/anon1.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/name-lookup.c trunk/gcc/cp/parser.c
Fixed.
Pardon the potentially silly question here, but why 'hidden'? Why not TREE_PUBLIC(decl) = 0? It seems that members of anonymous namespaces should be completely internal, and not depend on platform support for hidden visibility. If I understand correctly, marking something hidden places more slightly more burden on the static linker than marking it internal, and not all platforms support hidden. Should I (re)open a new bug for to request TREE_PUBLIC(decl) = 0 behavior? -Chris
(In reply to comment #13) > Should I (re)open a new bug for to request TREE_PUBLIC(decl) = 0 behavior? PR 10591 is for that issue.
Great, thanks!
Can't fix until more basic problems are resolved.
Subject: Bug 21581 Author: jason Date: Fri Jun 30 01:15:56 2006 New Revision: 115086 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=115086 Log: PR c++/26905 PR c++/26612 PR c++/27000 PR c++/26984 PR c++/19134 * tree.c (build_decl_stat): Don't hande #pragma visibility here. * c-common.c (c_determine_visibility): Handle it here. * c-decl.c (finish_decl): Call c_determine_visibility for functions, too. * flags.h (enum symbol_visibility): Sort from most to least visibility. * tree.h: Likewise. * varasm.c (default_assemble_visibility): Likewise. * c-common.c (handle_visibility_attribute): Complain about trying to give visibility to an already defined class, or trying to change declared visibility. Always attach the attribute. * cp/decl2.c (determine_visibility): Overhaul. (determine_visibility_from_class): Likewise. (min_vis_r, type_visibility, constrain_visibility): New fns. (constrain_visibility_for_template): Likewise. (constrain_class_visibility): Likewise. * cp/decl.c (cp_finish_decl): Call determine_visibility for function decls, too. * cp/name-lookup.c (pushtag): Call determine_visibility. * cp/decl.c (duplicate_decls): Don't copy visibility from template to specialization. * cp/pt.c (check_explicit_specialization): Likewise. (lookup_template_class, tsubst_decl): Call determine_visibility. * cp/class.c (finish_struct_1): Call constrain_class_visibility. PR c++/26905 PR c++/21675 PR c++/17470 * cp/parser.c (cp_parser_explicit_instantiation): Pass the attributes to grokdeclarator. (cp_parser_type_specifier): Allow 'enum __attribute ((...)) E'. (cp_parser_enum_specifier): Likewise. (cp_parser_elaborated_type_specifier): Apply attributes if this declares only the class. (cp_parser_class_specifier): Apply leading attributes immediately. * cp/semantics.c (begin_class_definition): Add attributes parameter, apply them to the type. * attribs.c (decl_attributes): Ignore type-in-place attributes once the type has been defined. PR c++/21581 PR c++/25915 * cp/tree.c (decl_anon_ns_mem_p): New function. * cp/cp-tree.h: Declare it. * cp/decl2.c (determine_visibility): Make anonymous namespace members static. (min_vis_r, constrain_visibility): Likewise. * cp/rtti.c (create_pseudo_type_info): Set TREE_PUBLIC on pseudo-types. * cp/decl.c (cxx_init_decl_processing): Set TREE_PUBLIC on global_namespace. * cp/name-lookup.c (push_namespace_with_attribs): Don't set TREE_PUBLIC on anonymous namespaces. Added: trunk/gcc/testsuite/g++.dg/ext/visibility/anon2.C trunk/gcc/testsuite/g++.dg/ext/visibility/class1.C trunk/gcc/testsuite/g++.dg/ext/visibility/prop1.C trunk/gcc/testsuite/g++.dg/ext/visibility/redecl1.C trunk/gcc/testsuite/g++.dg/ext/visibility/template1.C trunk/gcc/testsuite/g++.dg/ext/visibility/template2.C trunk/gcc/testsuite/g++.dg/ext/visibility/template3.C trunk/gcc/testsuite/g++.dg/ext/visibility/template4.C trunk/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C trunk/gcc/testsuite/g++.dg/ext/visibility/warn1.C trunk/gcc/testsuite/g++.dg/ext/visibility/warn2.C trunk/gcc/testsuite/g++.dg/ext/visibility/warn3.C trunk/gcc/testsuite/g++.dg/ext/visibility/warn4.C Modified: trunk/gcc/ChangeLog trunk/gcc/attribs.c trunk/gcc/c-common.c trunk/gcc/c-decl.c trunk/gcc/cp/ChangeLog trunk/gcc/cp/class.c trunk/gcc/cp/cp-tree.h trunk/gcc/cp/decl.c trunk/gcc/cp/decl2.c trunk/gcc/cp/name-lookup.c trunk/gcc/cp/parser.c trunk/gcc/cp/pt.c trunk/gcc/cp/rtti.c trunk/gcc/cp/semantics.c trunk/gcc/cp/tree.c trunk/gcc/doc/extend.texi trunk/gcc/doc/invoke.texi trunk/gcc/flags.h trunk/gcc/testsuite/g++.dg/ext/attrib14.C trunk/gcc/testsuite/g++.dg/ext/attrib9.C trunk/gcc/testsuite/g++.dg/ext/visibility/anon1.C trunk/gcc/testsuite/g++.dg/ext/visibility/assign1.C trunk/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C trunk/gcc/testsuite/g++.dg/ext/visibility/virtual.C trunk/gcc/testsuite/g++.old-deja/g++.pt/enum5.C trunk/gcc/tree.c trunk/gcc/tree.h trunk/gcc/varasm.c
Subject: Bug 21581 Author: jakub Date: Mon Aug 28 12:26:41 2006 New Revision: 116505 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=116505 Log: 2006-07-06 Jason Merrill <jason@redhat.com> cp/ PR c++/28279 * decl2.c (finish_static_data_member_decl): Don't assert TREE_PUBLIC. 2006-07-01 Jason Merrill <jason@redhat.com> cp/ PR c++/28215 * method.c (make_thunk): Unset DECL_USE_TEMPLATE and DECL_TEMPLATE_INFO. 2006-06-30 Jason Merrill <jason@redhat.com> objcp/ * objcp-decl.c (objcp_start_struct): Pass null attributes argument to begin_class_definition. 2006-06-29 Jason Merrill <jason@redhat.com> PR c++/26905 PR c++/26612 PR c++/27000 PR c++/26984 PR c++/19134 * tree.c (build_decl_stat): Don't hande #pragma visibility here. * c-common.c (c_determine_visibility): Handle it here. * c-decl.c (finish_decl): Call c_determine_visibility for functions, too. * flags.h (enum symbol_visibility): Sort from most to least visibility. * tree.h: Likewise. * varasm.c (default_assemble_visibility): Likewise. * c-common.c (handle_visibility_attribute): Complain about trying to give visibility to an already defined class, or trying to change declared visibility. Always attach the attribute. PR c++/26905 PR c++/21675 PR c++/17470 * attribs.c (decl_attributes): Ignore type-in-place attributes once the type has been defined. cp/ PR c++/26905 PR c++/26612 PR c++/27000 PR c++/26984 PR c++/19134 * decl2.c (determine_visibility): Overhaul. (determine_visibility_from_class): Likewise. (min_vis_r, type_visibility, constrain_visibility): New fns. (constrain_visibility_for_template): Likewise. (constrain_class_visibility): Likewise. * decl.c (cp_finish_decl): Call determine_visibility for function decls, too. * name-lookup.c (pushtag): Call determine_visibility. * decl.c (duplicate_decls): Don't copy visibility from template to specialization. * pt.c (check_explicit_specialization): Likewise. (lookup_template_class, tsubst_decl): Call determine_visibility. * class.c (finish_struct_1): Call constrain_class_visibility. PR c++/26905 PR c++/21675 PR c++/17470 * parser.c (cp_parser_explicit_instantiation): Pass the attributes to grokdeclarator. (cp_parser_type_specifier): Allow 'enum __attribute ((...)) E'. (cp_parser_enum_specifier): Likewise. (cp_parser_elaborated_type_specifier): Apply attributes if this declares only the class. (cp_parser_class_specifier): Apply leading attributes immediately. * semantics.c (begin_class_definition): Add attributes parameter, apply them to the type. PR c++/21581 PR c++/25915 * tree.c (decl_anon_ns_mem_p): New function. * cp-tree.h: Declare it. * decl2.c (determine_visibility): Make anonymous namespace members static. (min_vis_r, constrain_visibility): Likewise. * rtti.c (create_pseudo_type_info): Set TREE_PUBLIC on pseudo-types. * decl.c (cxx_init_decl_processing): Set TREE_PUBLIC on global_namespace. * name-lookup.c (push_namespace_with_attribs): Don't set TREE_PUBLIC on anonymous namespaces. Added: branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/anon1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/anon2.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/class1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/prop1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/redecl1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/template1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/template2.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/template3.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/template4.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/typeinfo1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/warn1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/warn2.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/warn3.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/warn4.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/template/anon2.C Modified: branches/redhat/gcc-4_1-branch/gcc/ChangeLog branches/redhat/gcc-4_1-branch/gcc/attribs.c branches/redhat/gcc-4_1-branch/gcc/c-common.c branches/redhat/gcc-4_1-branch/gcc/c-decl.c branches/redhat/gcc-4_1-branch/gcc/cp/ChangeLog branches/redhat/gcc-4_1-branch/gcc/cp/class.c branches/redhat/gcc-4_1-branch/gcc/cp/cp-tree.h branches/redhat/gcc-4_1-branch/gcc/cp/decl.c branches/redhat/gcc-4_1-branch/gcc/cp/decl2.c branches/redhat/gcc-4_1-branch/gcc/cp/method.c branches/redhat/gcc-4_1-branch/gcc/cp/name-lookup.c branches/redhat/gcc-4_1-branch/gcc/cp/parser.c branches/redhat/gcc-4_1-branch/gcc/cp/pt.c branches/redhat/gcc-4_1-branch/gcc/cp/rtti.c branches/redhat/gcc-4_1-branch/gcc/cp/semantics.c branches/redhat/gcc-4_1-branch/gcc/cp/tree.c branches/redhat/gcc-4_1-branch/gcc/doc/extend.texi branches/redhat/gcc-4_1-branch/gcc/doc/invoke.texi branches/redhat/gcc-4_1-branch/gcc/flags.h branches/redhat/gcc-4_1-branch/gcc/objcp/ChangeLog branches/redhat/gcc-4_1-branch/gcc/objcp/objcp-decl.c branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/attrib14.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/attrib9.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/assign1.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.dg/ext/visibility/virtual.C branches/redhat/gcc-4_1-branch/gcc/testsuite/g++.old-deja/g++.pt/enum5.C branches/redhat/gcc-4_1-branch/gcc/tree.c branches/redhat/gcc-4_1-branch/gcc/tree.h branches/redhat/gcc-4_1-branch/gcc/varasm.c