diff -Nurp gcc-3.4.4.orig/gcc/c-common.c gcc-3.4.4/gcc/c-common.c --- gcc-3.4.4.orig/gcc/c-common.c 2005-01-07 14:58:51.000000000 -0500 +++ gcc-3.4.4/gcc/c-common.c 2006-02-10 01:38:12.000000000 -0500 @@ -832,7 +832,7 @@ const struct attribute_spec c_common_att handle_deprecated_attribute }, { "vector_size", 1, 1, false, true, false, handle_vector_size_attribute }, - { "visibility", 1, 1, true, false, false, + { "visibility", 1, 1, false, false, false, handle_visibility_attribute }, { "tls_model", 1, 1, true, false, false, handle_tls_model_attribute }, @@ -4925,7 +4925,16 @@ handle_visibility_attribute (tree *node, *no_add_attrs = true; - if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl)) + if (TYPE_P (*node)) + { + if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE) + { + warning ("`%s' attribute ignored on non-class types", + IDENTIFIER_POINTER (name)); + return NULL_TREE; + } + } + else if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl)) { warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); return NULL_TREE; @@ -4936,6 +4945,14 @@ handle_visibility_attribute (tree *node, error ("visibility arg not a string"); return NULL_TREE; } + + /* If this is a type, set the visibility on the type decl. */ + if (TYPE_P (decl)) + { + decl = TYPE_NAME (decl); + if (! decl) + return NULL_TREE; + } if (strcmp (TREE_STRING_POINTER (id), "default") == 0) DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; @@ -4947,6 +4964,14 @@ handle_visibility_attribute (tree *node, DECL_VISIBILITY (decl) = VISIBILITY_PROTECTED; else error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\""); + DECL_VISIBILITY_SPECIFIED (decl) = 1; + + /* For decls only, go ahead and attach the attribute to the node as well. + This is needed so we can determine whether we have VISIBILITY_DEFAULT + because the visibility was not specified, or because it was explicitly + overridden from the class visibility. */ + if (DECL_P (*node)) + *no_add_attrs = false; return NULL_TREE; } diff -Nurp gcc-3.4.4.orig/gcc/c-decl.c gcc-3.4.4/gcc/c-decl.c --- gcc-3.4.4.orig/gcc/c-decl.c 2005-05-01 06:43:46.000000000 -0400 +++ gcc-3.4.4/gcc/c-decl.c 2006-02-10 01:38:12.000000000 -0500 @@ -1164,9 +1164,8 @@ diagnose_mismatched_decls (tree newdecl, } /* warnings */ - /* All decls must agree on a non-default visibility. */ - if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT - && DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT + /* All decls must agree on a visibility. */ + if (DECL_VISIBILITY_SPECIFIED (newdecl) && DECL_VISIBILITY_SPECIFIED (olddecl) && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) { warning ("%Jredeclaration of '%D' with different visibility " @@ -1366,9 +1365,12 @@ merge_decls (tree newdecl, tree olddecl, Currently, it can only be defined in the prototype. */ COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); - /* If either declaration has a nondefault visibility, use it. */ - if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT) - DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); + /* Use visibility of whichever declaration had it specified */ + if (DECL_VISIBILITY_SPECIFIED (olddecl)) + { + DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); + DECL_VISIBILITY_SPECIFIED (newdecl) = 1; + } if (TREE_CODE (newdecl) == FUNCTION_DECL) { diff -Nurp gcc-3.4.4.orig/gcc/c-opts.c gcc-3.4.4/gcc/c-opts.c --- gcc-3.4.4.orig/gcc/c-opts.c 2005-03-08 20:00:56.000000000 -0500 +++ gcc-3.4.4/gcc/c-opts.c 2006-02-10 01:38:12.000000000 -0500 @@ -920,6 +920,10 @@ c_common_handle_option (size_t scode, co case OPT_fuse_cxa_atexit: flag_use_cxa_atexit = value; break; + + case OPT_fvisibility_inlines_hidden: + visibility_options.inlines_hidden = value; + break; case OPT_fweak: flag_weak = value; diff -Nurp gcc-3.4.4.orig/gcc/c-pragma.c gcc-3.4.4/gcc/c-pragma.c --- gcc-3.4.4.orig/gcc/c-pragma.c 2004-05-07 03:07:30.000000000 -0400 +++ gcc-3.4.4/gcc/c-pragma.c 2006-02-10 01:38:12.000000000 -0500 @@ -481,6 +481,86 @@ maybe_apply_renaming_pragma (tree decl, return asmname; } + +#ifdef HANDLE_PRAGMA_VISIBILITY +static void handle_pragma_visibility (cpp_reader *); + +/* Sets the default visibility for symbols to something other than that + specified on the command line. */ +static void +handle_pragma_visibility (cpp_reader *dummy ATTRIBUTE_UNUSED) +{ /* Form is #pragma GCC visibility push(hidden)|pop */ + static int visstack [16], visidx; + tree x; + enum cpp_ttype token; + enum { bad, push, pop } action = bad; + + token = c_lex (&x); + if (token == CPP_NAME) + { + const char *op = IDENTIFIER_POINTER (x); + if (!strcmp (op, "push")) + action = push; + else if (!strcmp (op, "pop")) + action = pop; + } + if (bad == action) + GCC_BAD ("#pragma GCC visibility must be followed by push or pop"); + else + { + if (pop == action) + { + if (!visidx) + { + GCC_BAD ("No matching push for '#pragma GCC visibility pop'"); + } + else + { + default_visibility = visstack[--visidx]; + visibility_options.inpragma = (visidx>0); + } + } + else + { + if (c_lex (&x) != CPP_OPEN_PAREN) + GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored"); + token = c_lex (&x); + if (token != CPP_NAME) + { + GCC_BAD ("malformed #pragma GCC visibility push"); + } + else if (visidx >= 16) + { + GCC_BAD ("No more than sixteen #pragma GCC visibility pushes allowed at once"); + } + else + { + const char *str = IDENTIFIER_POINTER (x); + visstack[visidx++] = default_visibility; + if (!strcmp (str, "default")) + default_visibility = VISIBILITY_DEFAULT; + else if (!strcmp (str, "internal")) + default_visibility = VISIBILITY_INTERNAL; + else if (!strcmp (str, "hidden")) + default_visibility = VISIBILITY_HIDDEN; + else if (!strcmp (str, "protected")) + default_visibility = VISIBILITY_PROTECTED; + else + { + GCC_BAD ("#pragma GCC visibility push() must specify default, internal, hidden or protected"); + } + visibility_options.inpragma = 1; + } + if (c_lex (&x) != CPP_CLOSE_PAREN) + GCC_BAD ("missing '(' after '#pragma GCC visibility push' - ignored"); + } + } + if (c_lex (&x) != CPP_EOF) + warning ("junk at end of '#pragma GCC visibility'"); +} + +#endif + /* Front-end wrapper for pragma registration to avoid dragging cpplib.h in almost everywhere. */ void @@ -506,6 +586,9 @@ init_pragma (void) #ifdef HANDLE_PRAGMA_EXTERN_PREFIX c_register_pragma (0, "extern_prefix", handle_pragma_extern_prefix); #endif +#ifdef HANDLE_PRAGMA_VISIBILITY + c_register_pragma ("GCC", "visibility", handle_pragma_visibility); +#endif #ifdef REGISTER_TARGET_PRAGMAS REGISTER_TARGET_PRAGMAS (); diff -Nurp gcc-3.4.4.orig/gcc/c-pragma.h gcc-3.4.4/gcc/c-pragma.h --- gcc-3.4.4.orig/gcc/c-pragma.h 2004-01-31 01:18:05.000000000 -0500 +++ gcc-3.4.4/gcc/c-pragma.h 2006-02-10 01:38:12.000000000 -0500 @@ -44,6 +44,11 @@ extern struct cpp_reader* parse_in; #define HANDLE_PRAGMA_PACK 1 #endif /* HANDLE_PRAGMA_PACK_PUSH_POP */ +/* It's safe to always leave visibility pragma enabled as if + visibility is not supported on the host OS platform the + statements are ignored. */ +#define HANDLE_PRAGMA_VISIBILITY 1 + extern void init_pragma (void); /* Front-end wrapper for pragma registration to avoid dragging diff -Nurp gcc-3.4.4.orig/gcc/c.opt gcc-3.4.4/gcc/c.opt --- gcc-3.4.4.orig/gcc/c.opt 2005-03-19 15:30:38.000000000 -0500 +++ gcc-3.4.4/gcc/c.opt 2006-02-10 01:38:12.000000000 -0500 @@ -656,6 +656,10 @@ fuse-cxa-atexit C++ ObjC++ Use __cxa_atexit to register destructors +fvisibility-inlines-hidden +C++ +Marks all inlined methods as having hidden visibility + fvtable-gc C++ ObjC++ Discard unused virtual functions diff -Nurp gcc-3.4.4.orig/gcc/common.opt gcc-3.4.4/gcc/common.opt --- gcc-3.4.4.orig/gcc/common.opt 2004-10-27 23:43:09.000000000 -0400 +++ gcc-3.4.4/gcc/common.opt 2006-02-10 01:38:12.000000000 -0500 @@ -718,6 +718,11 @@ fverbose-asm Common Add extra commentary to assembler output +fvisibility= +Common Joined RejectNegative +-fvisibility=[default|internal|hidden|protected] Set the default symbol visibility + + fvpt Common Use expression value profiles in optimizations diff -Nurp gcc-3.4.4.orig/gcc/cp/class.c gcc-3.4.4/gcc/cp/class.c --- gcc-3.4.4.orig/gcc/cp/class.c 2005-05-09 07:47:53.000000000 -0400 +++ gcc-3.4.4/gcc/cp/class.c 2006-02-10 01:38:15.000000000 -0500 @@ -6799,14 +6799,9 @@ initialize_vtable (tree binfo, tree init static void initialize_array (tree decl, tree inits) { - tree context; - - context = DECL_CONTEXT (decl); - DECL_CONTEXT (decl) = NULL_TREE; DECL_INITIAL (decl) = build_constructor (NULL_TREE, inits); TREE_HAS_CONSTRUCTOR (DECL_INITIAL (decl)) = 1; cp_finish_decl (decl, DECL_INITIAL (decl), NULL_TREE, 0); - DECL_CONTEXT (decl) = context; } /* Build the VTT (virtual table table) for T. diff -Nurp gcc-3.4.4.orig/gcc/cp/cp-tree.h gcc-3.4.4/gcc/cp/cp-tree.h --- gcc-3.4.4.orig/gcc/cp/cp-tree.h 2005-05-09 07:47:57.000000000 -0400 +++ gcc-3.4.4/gcc/cp/cp-tree.h 2006-02-10 01:38:15.000000000 -0500 @@ -75,6 +75,7 @@ struct diagnostic_context; or FIELD_DECL). NEED_TEMPORARY_P (in REF_BIND, BASE_CONV) IDENTIFIER_TYPENAME_P (in IDENTIFIER_NODE) + DECL_TINFO_P (in VAR_DECL) 5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE) DECL_VTABLE_OR_VTT_P (in VAR_DECL) 6: For future expansion @@ -1008,7 +1009,12 @@ enum languages { lang_c, lang_cplusplus, #define PUBLICLY_UNIQUELY_DERIVED_P(PARENT, TYPE) \ (lookup_base ((TYPE), (PARENT), ba_not_special | ba_quiet, NULL) \ != NULL_TREE) - + +/* Gives the visibility specification for a class type. */ +#define CLASSTYPE_VISIBILITY(TYPE) DECL_VISIBILITY (TYPE_NAME (TYPE)) +#define CLASSTYPE_VISIBILITY_SPECIFIED(TYPE) DECL_VISIBILITY_SPECIFIED (TYPE_NAME (TYPE)) + + /* This is a few header flags for 'struct lang_type'. Actually, all but the first are used only for lang_type_class; they are put in this structure to save space. */ @@ -2064,6 +2070,10 @@ struct lang_decl GTY(()) (DECL_CONTEXT (NODE) \ && TREE_CODE (DECL_CONTEXT (NODE)) == FUNCTION_DECL) +/* 1 iff VAR_DECL node NODE is a type-info decl. This flag is set for + both the primary typeinfo object and the associated NTBS name. */ +#define DECL_TINFO_P(NODE) TREE_LANG_FLAG_4 (VAR_DECL_CHECK (NODE)) + /* 1 iff VAR_DECL node NODE is virtual table or VTT. */ #define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE)) @@ -3669,7 +3679,7 @@ extern int init_type_desc (void); extern tree check_tag_decl (tree); extern tree shadow_tag (tree); extern tree groktypename (tree); -extern tree start_decl (tree, tree, int, tree, tree); +extern tree start_decl (tree, tree, int, tree, tree, bool *); extern void start_decl_1 (tree); extern void cp_finish_decl (tree, tree, tree, int); extern void finish_decl (tree, tree, tree); @@ -3754,6 +3764,7 @@ extern tree finish_table (tree, tree, tr extern tree coerce_new_type (tree); extern tree coerce_delete_type (tree); extern void comdat_linkage (tree); +extern void determine_visibility (tree); extern void import_export_vtable (tree, tree, int); extern void import_export_decl (tree); extern void import_export_tinfo (tree, tree, bool); diff -Nurp gcc-3.4.4.orig/gcc/cp/decl.c gcc-3.4.4/gcc/cp/decl.c --- gcc-3.4.4.orig/gcc/cp/decl.c 2005-03-19 09:00:45.000000000 -0500 +++ gcc-3.4.4/gcc/cp/decl.c 2006-02-10 01:38:15.000000000 -0500 @@ -1889,17 +1889,20 @@ duplicate_decls (tree newdecl, tree oldd DECL_COMMON (newdecl) = DECL_COMMON (olddecl); COPY_DECL_ASSEMBLER_NAME (olddecl, newdecl); - /* If either declaration has a nondefault visibility, use it. */ - if (DECL_VISIBILITY (olddecl) != VISIBILITY_DEFAULT) + /* Warn about conflicting visibility specifications. */ + if (DECL_VISIBILITY_SPECIFIED (olddecl) + && DECL_VISIBILITY_SPECIFIED (newdecl) + && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) + { + warning ("%J'%D': visibility attribute ignored because it", + newdecl, newdecl); + warning ("%Jconflicts with previous declaration here", olddecl); + } + /* Choose the declaration which specified visibility. */ + if (DECL_VISIBILITY_SPECIFIED (olddecl)) { - if (DECL_VISIBILITY (newdecl) != VISIBILITY_DEFAULT - && DECL_VISIBILITY (newdecl) != DECL_VISIBILITY (olddecl)) - { - warning ("%J'%D': visibility attribute ignored because it", - newdecl, newdecl); - warning ("%Jconflicts with previous declaration here", olddecl); - } DECL_VISIBILITY (newdecl) = DECL_VISIBILITY (olddecl); + DECL_VISIBILITY_SPECIFIED (newdecl) = 1; } if (TREE_CODE (newdecl) == FUNCTION_DECL) @@ -3321,6 +3324,10 @@ build_library_fn_1 (tree name, enum tree TREE_NOTHROW (fn) = 1; SET_OVERLOADED_OPERATOR_CODE (fn, operator_code); SET_DECL_LANGUAGE (fn, lang_c); + /* Runtime library routines are, by definition, available in an + external shared object. */ + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT; + DECL_VISIBILITY_SPECIFIED (fn) = 1; return fn; } @@ -3684,7 +3691,8 @@ start_decl (tree declarator, tree declspecs, int initialized, tree attributes, - tree prefix_attributes) + tree prefix_attributes, + bool *pop_scope_p) { tree decl; tree type, tem; @@ -3720,14 +3728,11 @@ start_decl (tree declarator, context = DECL_CONTEXT (decl); - if (initialized && context && TREE_CODE (context) == NAMESPACE_DECL - && context != current_namespace && TREE_CODE (decl) == VAR_DECL) - { - /* When parsing the initializer, lookup should use the object's - namespace. */ - push_decl_namespace (context); - } - + if (context) + *pop_scope_p = push_scope (context); + else + *pop_scope_p = false; + /* We are only interested in class contexts, later. */ if (context && TREE_CODE (context) == NAMESPACE_DECL) context = NULL_TREE; @@ -3783,8 +3788,6 @@ start_decl (tree declarator, if (context && COMPLETE_TYPE_P (complete_type (context))) { - push_nested_class (context); - if (TREE_CODE (decl) == VAR_DECL) { tree field = lookup_field (context, DECL_NAME (decl), 0, false); @@ -4820,20 +4823,10 @@ cp_finish_decl (tree decl, tree init, tr && (DECL_INITIAL (decl) || init)) DECL_INITIALIZED_IN_CLASS_P (decl) = 1; - if (TREE_CODE (decl) == VAR_DECL - && DECL_CONTEXT (decl) - && TREE_CODE (DECL_CONTEXT (decl)) == NAMESPACE_DECL - && DECL_CONTEXT (decl) != current_namespace - && init) - { - /* Leave the namespace of the object. */ - pop_decl_namespace (); - } - type = TREE_TYPE (decl); if (type == error_mark_node) - goto finish_end0; + goto finish_end; if (TYPE_HAS_MUTABLE_P (type)) TREE_READONLY (decl) = 0; @@ -4850,7 +4843,7 @@ cp_finish_decl (tree decl, tree init, tr && !DECL_PRETTY_FUNCTION_P (decl) && !dependent_type_p (TREE_TYPE (decl))) maybe_deduce_size_from_array_init (decl, init); - goto finish_end0; + goto finish_end; } /* Parameters are handled by store_parm_decls, not cp_finish_decl. */ @@ -4943,6 +4936,9 @@ cp_finish_decl (tree decl, tree init, tr the class specifier. */ if (!DECL_EXTERNAL (decl)) var_definition_p = true; + /* The variable is being defined, so determine its + visibility. */ + determine_visibility (decl); } /* If the variable has an array type, lay out the type, even if there is no initializer. It is valid to index through the @@ -5028,26 +5024,6 @@ cp_finish_decl (tree decl, tree init, tr if (var_definition_p && TREE_STATIC (decl)) expand_static_init (decl, init); } - finish_end0: - - /* Undo call to `pushclass' that was done in `start_decl' - due to initialization of qualified member variable. - I.e., Foo::x = 10; */ - { - tree context = CP_DECL_CONTEXT (decl); - if (context - && TYPE_P (context) - && (TREE_CODE (decl) == VAR_DECL - /* We also have a pushclass done that we need to undo here - if we're at top level and declare a method. */ - || TREE_CODE (decl) == FUNCTION_DECL) - /* If size hasn't been set, we're still defining it, - and therefore inside the class body; don't pop - the binding level.. */ - && COMPLETE_TYPE_P (context) - && context == current_class_type) - pop_nested_class (); - } } /* If a CLEANUP_STMT was created to destroy a temporary bound to a @@ -10244,6 +10220,9 @@ start_function (tree declspecs, tree dec && lookup_attribute ("noinline", attrs)) warning ("%Jinline function '%D' given attribute noinline", decl1, decl1); + /* Determine the ELF visibility attribute for the function. */ + determine_visibility (decl1); + if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (decl1)) /* This is a constructor, we must ensure that any default args introduced by this definition are propagated to the clones diff -Nurp gcc-3.4.4.orig/gcc/cp/decl2.c gcc-3.4.4/gcc/cp/decl2.c --- gcc-3.4.4.orig/gcc/cp/decl2.c 2004-10-11 10:42:36.000000000 -0400 +++ gcc-3.4.4/gcc/cp/decl2.c 2006-02-10 01:38:24.000000000 -0500 @@ -1658,6 +1658,63 @@ maybe_emit_vtables (tree ctype) return true; } +/* Determine the ELF symbol visibility for DECL. */ + +void +determine_visibility (tree decl) +{ + tree class_type; + + /* Cloned constructors and destructors get the same visibility as + the underlying function. That should be set up in + maybe_clone_body. */ + if (DECL_CLONED_FUNCTION_P (decl)) + return; + + if (DECL_CLASS_SCOPE_P (decl)) + class_type = DECL_CONTEXT (decl); + else if (TREE_CODE (decl) == VAR_DECL + && DECL_TINFO_P (decl) + && CLASS_TYPE_P (TREE_TYPE (DECL_NAME (decl)))) + class_type = TREE_TYPE (DECL_NAME (decl)); + else + { + /* Virtual tables have DECL_CONTEXT set to their associated class, + so they are automatically handled above. */ + my_friendly_assert (!(TREE_CODE (decl) == VAR_DECL + && DECL_VTABLE_OR_VTT_P (decl)), 20040803); + /* Entities not associated with any class just get the + visibility specified by their attributes. */ + return; + } + + /* By default, static data members and function members receive + the visibility of their containing class. */ + if (class_type + && (TREE_CODE (decl) == VAR_DECL + || TREE_CODE (decl) == FUNCTION_DECL) + && !lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))) + { + if (TREE_CODE (decl) == FUNCTION_DECL + && DECL_DECLARED_INLINE_P (decl) + && visibility_options.inlines_hidden) + { + /* Don't change it if it has been set explicitly by user. */ + if (!DECL_VISIBILITY_SPECIFIED (decl)) + { + DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; + DECL_VISIBILITY_SPECIFIED (decl) = 1; + } + } + else + { + DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type); + DECL_VISIBILITY_SPECIFIED (decl) + = CLASSTYPE_VISIBILITY_SPECIFIED (class_type); + } + } +} + /* Determines the proper settings of TREE_PUBLIC and DECL_EXTERNAL for an inline function or template instantiation at end-of-file. */ diff -Nurp gcc-3.4.4.orig/gcc/cp/method.c gcc-3.4.4/gcc/cp/method.c --- gcc-3.4.4.orig/gcc/cp/method.c 2005-05-09 07:48:01.000000000 -0400 +++ gcc-3.4.4/gcc/cp/method.c 2006-02-10 01:38:15.000000000 -0500 @@ -398,6 +398,8 @@ use_thunk (tree thunk_fndecl, bool emit_ rewrite. */ TREE_PUBLIC (thunk_fndecl) = TREE_PUBLIC (function); DECL_VISIBILITY (thunk_fndecl) = DECL_VISIBILITY (function); + DECL_VISIBILITY_SPECIFIED (thunk_fndecl) + = DECL_VISIBILITY_SPECIFIED (function); if (flag_syntax_only) { diff -Nurp gcc-3.4.4.orig/gcc/cp/optimize.c gcc-3.4.4/gcc/cp/optimize.c --- gcc-3.4.4.orig/gcc/cp/optimize.c 2004-02-07 20:52:50.000000000 -0500 +++ gcc-3.4.4/gcc/cp/optimize.c 2006-02-10 01:38:12.000000000 -0500 @@ -155,6 +155,7 @@ maybe_clone_body (tree fn) DECL_NOT_REALLY_EXTERN (clone) = DECL_NOT_REALLY_EXTERN (fn); TREE_PUBLIC (clone) = TREE_PUBLIC (fn); DECL_VISIBILITY (clone) = DECL_VISIBILITY (fn); + DECL_VISIBILITY_SPECIFIED (clone) = DECL_VISIBILITY_SPECIFIED (fn); /* Adjust the parameter names and locations. */ parm = DECL_ARGUMENTS (fn); diff -Nurp gcc-3.4.4.orig/gcc/cp/parser.c gcc-3.4.4/gcc/cp/parser.c --- gcc-3.4.4.orig/gcc/cp/parser.c 2005-04-04 19:43:47.000000000 -0400 +++ gcc-3.4.4/gcc/cp/parser.c 2006-02-10 01:38:15.000000000 -0500 @@ -5881,10 +5881,13 @@ cp_parser_condition (cp_parser* parser) for sure. */ if (cp_parser_parse_definitely (parser)) { + bool pop_p; + /* Create the declaration. */ decl = start_decl (declarator, type_specifiers, /*initialized_p=*/true, - attributes, /*prefix_attributes=*/NULL_TREE); + attributes, /*prefix_attributes=*/NULL_TREE, + &pop_p); /* Parse the assignment-expression. */ initializer = cp_parser_assignment_expression (parser); @@ -5893,7 +5896,9 @@ cp_parser_condition (cp_parser* parser) initializer, asm_specification, LOOKUP_ONLYCONVERTING); - + if (pop_p) + pop_scope (DECL_CONTEXT (decl)); + return convert_from_reference (decl); } } @@ -10109,12 +10114,12 @@ cp_parser_init_declarator (cp_parser* pa have_extern_spec = false; } decl = start_decl (declarator, decl_specifiers, - is_initialized, attributes, prefix_attributes); + is_initialized, attributes, prefix_attributes, + &pop_p); } - - /* Enter the SCOPE. That way unqualified names appearing in the - initializer will be looked up in SCOPE. */ - if (scope) + else if (scope) + /* Enter the SCOPE. That way unqualified names appearing in the + initializer will be looked up in SCOPE. */ pop_p = push_scope (scope); /* Perform deferred access control checks, now that we know in which @@ -10161,17 +10166,13 @@ cp_parser_init_declarator (cp_parser* pa if (cp_parser_attributes_opt (parser)) warning ("attributes after parenthesized initializer ignored"); - /* Leave the SCOPE, now that we have processed the initializer. It - is important to do this before calling cp_finish_decl because it - makes decisions about whether to create DECL_STMTs or not based - on the current scope. */ - if (pop_p) - pop_scope (scope); - /* For an in-class declaration, use `grokfield' to create the declaration. */ if (member_p) { + if (pop_p) + pop_scope (scope); + decl = grokfield (declarator, decl_specifiers, initializer, /*asmspec=*/NULL_TREE, /*attributes=*/NULL_TREE); @@ -10182,15 +10183,19 @@ cp_parser_init_declarator (cp_parser* pa /* Finish processing the declaration. But, skip friend declarations. */ if (!friend_p && decl) - cp_finish_decl (decl, - initializer, - asm_specification, - /* If the initializer is in parentheses, then this is - a direct-initialization, which means that an - `explicit' constructor is OK. Otherwise, an - `explicit' constructor cannot be used. */ - ((is_parenthesized_init || !is_initialized) - ? 0 : LOOKUP_ONLYCONVERTING)); + { + cp_finish_decl (decl, + initializer, + asm_specification, + /* If the initializer is in parentheses, then this is + a direct-initialization, which means that an + `explicit' constructor is OK. Otherwise, an + `explicit' constructor cannot be used. */ + ((is_parenthesized_init || !is_initialized) + ? 0 : LOOKUP_ONLYCONVERTING)); + if (pop_p) + pop_scope (DECL_CONTEXT (decl)); + } /* Remember whether or not variables were initialized by constant-expressions. */ diff -Nurp gcc-3.4.4.orig/gcc/cp/pt.c gcc-3.4.4/gcc/cp/pt.c --- gcc-3.4.4.orig/gcc/cp/pt.c 2005-03-06 11:59:08.000000000 -0500 +++ gcc-3.4.4/gcc/cp/pt.c 2006-02-10 01:38:15.000000000 -0500 @@ -11265,20 +11265,13 @@ instantiate_decl (tree d, int defer_ok) } else { - /* This is done in analogous to `start_decl'. It is - required for correct access checking. */ + /* Enter the scope of D so that access-checking works correctly. */ push_nested_class (DECL_CONTEXT (d)); cp_finish_decl (d, (!DECL_INITIALIZED_IN_CLASS_P (d) ? DECL_INITIAL (d) : NULL_TREE), NULL_TREE, 0); - /* Normally, pop_nested_class is called by cp_finish_decl - above. But when instantiate_decl is triggered during - instantiate_class_template processing, its DECL_CONTEXT - is still not completed yet, and pop_nested_class isn't - called. */ - if (!COMPLETE_TYPE_P (DECL_CONTEXT (d))) - pop_nested_class (); + pop_nested_class (); } /* We're not deferring instantiation any more. */ TI_PENDING_TEMPLATE_FLAG (DECL_TEMPLATE_INFO (d)) = 0; diff -Nurp gcc-3.4.4.orig/gcc/cp/rtti.c gcc-3.4.4/gcc/cp/rtti.c --- gcc-3.4.4.orig/gcc/cp/rtti.c 2004-07-12 18:26:39.000000000 -0400 +++ gcc-3.4.4/gcc/cp/rtti.c 2006-02-10 01:38:15.000000000 -0500 @@ -354,17 +354,16 @@ get_tinfo_decl (tree type) TREE_READONLY (d) = 1; TREE_STATIC (d) = 1; DECL_EXTERNAL (d) = 1; + DECL_TINFO_P (d) = 1; DECL_COMDAT (d) = 1; TREE_PUBLIC (d) = 1; SET_DECL_ASSEMBLER_NAME (d, name); - - pushdecl_top_level_and_finish (d, NULL_TREE); - + /* Remember the type it is for. */ + TREE_TYPE (name) = type; if (CLASS_TYPE_P (type)) CLASSTYPE_TYPEINFO_VAR (TYPE_MAIN_VARIANT (type)) = d; - /* Remember the type it is for. */ - TREE_TYPE (name) = type; + pushdecl_top_level_and_finish (d, NULL_TREE); /* Add decl to the global array of tinfo decls. */ my_friendly_assert (unemitted_tinfo_decls != 0, 20030312); @@ -751,19 +750,20 @@ tinfo_base_init (tree desc, tree target) NULL_TREE); tree name_string = tinfo_name (target); + /* Determine the name of the variable -- and remember with which + type it is associated. */ name_name = mangle_typeinfo_string_for_type (target); + TREE_TYPE (name_name) = target; + name_decl = build_lang_decl (VAR_DECL, name_name, name_type); - + SET_DECL_ASSEMBLER_NAME (name_decl, name_name); DECL_ARTIFICIAL (name_decl) = 1; TREE_READONLY (name_decl) = 1; TREE_STATIC (name_decl) = 1; DECL_EXTERNAL (name_decl) = 0; + DECL_TINFO_P (name_decl) = 1; TREE_PUBLIC (name_decl) = 1; import_export_tinfo (name_decl, target, typeinfo_in_lib_p (target)); - /* External name of the string containing the type's name has a - special name. */ - SET_DECL_ASSEMBLER_NAME (name_decl, - mangle_typeinfo_string_for_type (target)); DECL_INITIAL (name_decl) = name_string; mark_used (name_decl); pushdecl_top_level_and_finish (name_decl, name_string); diff -Nurp gcc-3.4.4.orig/gcc/doc/invoke.texi gcc-3.4.4/gcc/doc/invoke.texi --- gcc-3.4.4.orig/gcc/doc/invoke.texi 2005-04-22 02:49:59.000000000 -0400 +++ gcc-3.4.4/gcc/doc/invoke.texi 2006-02-10 01:38:12.000000000 -0500 @@ -183,7 +183,8 @@ in the following sections. -fno-optional-diags -fpermissive @gol -frepo -fno-rtti -fstats -ftemplate-depth-@var{n} @gol -fuse-cxa-atexit -fno-weak -nostdinc++ @gol --fno-default-inline -Wabi -Wctor-dtor-privacy @gol +-fno-default-inline -fvisibility-inlines-hidden @gol +-Wabi -Wctor-dtor-privacy @gol -Wnon-virtual-dtor -Wreorder @gol -Weffc++ -Wno-deprecated @gol -Wno-non-template-friend -Wold-style-cast @gol @@ -678,7 +679,8 @@ in the following sections. -fargument-alias -fargument-noalias @gol -fargument-noalias-global -fleading-underscore @gol -ftls-model=@var{model} @gol --ftrapv -fwrapv -fbounds-check} +-ftrapv -fwrapv -fbounds-check @gol +-fvisibility} @end table @menu @@ -1437,6 +1439,20 @@ This option is required for fully standa destructors, but will only work if your C library supports @code{__cxa_atexit}. +@item -fvisibility-inlines-hidden +@opindex fvisibility-inlines-hidden +Causes all inlined methods to be marked with +@code{__attribute__ ((visibility ("hidden")))} so that they do not +appear in the export table of a DSO and do not require a PLT indirection +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. While +it can cause bloating through duplication of code within each DSO where +it is used, often the wastage is less than the considerable space occupied +by a long symbol name in the export table which is typical when using +templates and namespaces. For even more savings, combine with the +@code{-fvisibility=hidden} switch. + @item -fno-weak @opindex fno-weak Do not use weak symbol support, even if it is provided by the linker. @@ -11270,6 +11286,54 @@ The @var{model} argument should be one o The default without @option{-fpic} is @code{initial-exec}; with @option{-fpic} the default is @code{global-dynamic}. + +@item -fvisibility=@var{default|internal|hidden|protected} +@opindex fvisibility +Set the default ELF image symbol visibility to the specified option - all +symbols will be marked with this unless overrided within the code. +Using this feature can very substantially improve linking and +load times of shared object libraries, produce more optimised +code, provide near-perfect API export and prevent symbol clashes. +It is @strong{strongly} recommended that you use this in any shared objects +you distribute. + +Despite the nomenclature, @code{default} always means public ie; +available to be linked against from outside the shared object. +@code{protected} and @code{internal} are pretty useless in real-world +usage so the only other commonly used option will be @code{hidden}. +The default if -fvisibility isn't specified is @code{default} ie; make every +symbol public - this causes the same behaviour as previous versions of +GCC. + +A good explanation of the benefits offered by ensuring ELF +symbols have the correct visibility is given by ``How To Write +Shared Libraries'' by Ulrich Drepper (which can be found at +@w{@uref{http://people.redhat.com/~drepper/}}) - however a superior +solution made possible by this option to marking things hidden when +the default is public is to make the default hidden and mark things +public. This is the norm with DLL's on Windows and with @option{-fvisibility=hidden} +and @code{__attribute__ ((visibility("default")))} instead of +@code{__declspec(dllexport)} you get almost identical semantics with +identical syntax. This is a great boon to those working with +cross-platform projects. + +For those adding visibility support to existing code, you may find +@samp{#pragma GCC visibility} of use. This works by you enclosing +the declarations you wish to set visibility for with (for example) +@samp{#pragma GCC visibility push(hidden)} and +@samp{#pragma GCC visibility pop}. These can be nested up to sixteen +times. Bear in mind that symbol visibility should be viewed @strong{as +part of the API interface contract} and thus all new code should +always specify visibility when it is not the default ie; declarations +only for use within the local DSO should @strong{always} be marked explicitly +as hidden as so to avoid PLT indirection overheads - making this +abundantly clear also aids readability and self-documentation of the code. +Note that due to ISO C++ specification requirements, operator new and +operator delete must always be of default visibility. + +An overview of these techniques, their benefits and how to use them +is at @w{@uref{http://www.nedprod.com/programs/gccvisibility.html}}. + @end table @c man end diff -Nurp gcc-3.4.4.orig/gcc/flags.h gcc-3.4.4/gcc/flags.h --- gcc-3.4.4.orig/gcc/flags.h 2004-02-17 19:09:04.000000000 -0500 +++ gcc-3.4.4/gcc/flags.h 2006-02-10 01:38:12.000000000 -0500 @@ -60,6 +60,30 @@ extern bool use_gnu_debug_info_extension /* Nonzero means emit debugging information only for symbols which are used. */ extern int flag_debug_only_used_symbols; +/* Enumerate visibility settings. */ +#ifndef SYMBOL_VISIBILITY_DEFINED +#define SYMBOL_VISIBILITY_DEFINED +enum symbol_visibility +{ + VISIBILITY_DEFAULT, + VISIBILITY_INTERNAL, + VISIBILITY_HIDDEN, + VISIBILITY_PROTECTED +}; +#endif + +/* The default visibility for all symbols (unless overridden). */ +extern enum symbol_visibility default_visibility; + +struct visibility_flags +{ + unsigned inpragma : 1; /* True when in #pragma GCC visibility. */ + unsigned inlines_hidden : 1; /* True when -finlineshidden in effect. */ +}; + +/* Global visibility options. */ +extern struct visibility_flags visibility_options; + /* Nonzero means do optimizations. -opt. */ extern int optimize; diff -Nurp gcc-3.4.4.orig/gcc/opts.c gcc-3.4.4/gcc/opts.c --- gcc-3.4.4.orig/gcc/opts.c 2004-02-17 19:09:04.000000000 -0500 +++ gcc-3.4.4/gcc/opts.c 2006-02-10 01:38:12.000000000 -0500 @@ -142,6 +142,12 @@ enum debug_info_level debug_info_level = write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */ bool use_gnu_debug_info_extensions; +/* The default visibility for all symbols (unless overridden) */ +enum symbol_visibility default_visibility = VISIBILITY_DEFAULT; + +/* Global visibility options. */ +struct visibility_flags visibility_options; + /* Columns of --help display. */ static unsigned int columns = 80; @@ -1214,6 +1220,21 @@ common_handle_option (size_t scode, cons flag_profile_values = value; break; + case OPT_fvisibility_: + { + if (!strcmp(arg, "default")) + default_visibility = VISIBILITY_DEFAULT; + else if (!strcmp(arg, "internal")) + default_visibility = VISIBILITY_INTERNAL; + else if (!strcmp(arg, "hidden")) + default_visibility = VISIBILITY_HIDDEN; + else if (!strcmp(arg, "protected")) + default_visibility = VISIBILITY_PROTECTED; + else + error ("unrecognised visibility value \"%s\"", arg); + } + break; + case OPT_fvpt: flag_value_profile_transformations_set = value; flag_value_profile_transformations = value; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/assign1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/assign1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/assign1.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/assign1.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN1DaSERKS_" } } */ + +struct B { + B& operator=(const B&); +}; + +struct D : public B { + // The implicit assignment operator should be hidden. +} __attribute__((visibility("hidden"))); + +D d1, d2; + +void f() { + d1 = d2; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-inlines-hidden.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,18 @@ +/* Test that -fvisibility-inlines-hidden affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility-inlines-hidden" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class Foo +{ +public: + void method() { } +}; + +int main(void) +{ + Foo f; + f.method(); + return 0; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override1.C 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,12 @@ +/* Test that -fvisibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ + +class __attribute__ ((visibility ("internal"))) Foo +{ + void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility-override2.C 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,12 @@ +/* Test that -fvisibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ + +class Foo +{ + __attribute__ ((visibility ("internal"))) void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/fvisibility.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,12 @@ +/* Test that -fvisibility affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class Foo +{ + void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/memfuncts.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,11 @@ +/* Test that setting visibility for class member functions works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class __attribute__ ((visibility ("hidden"))) Foo +{ + void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/new1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/new1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/new1.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/new1.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,13 @@ +// { dg-require-visibility "" } +// { dg-options "-fvisibility=hidden" } +// { dg-final { scan-not-hidden "_Znwj" } } + +void f() { + new int; +} + +void *g(); + +void *operator new(__SIZE_TYPE__) { + return g(); +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/noPLT.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/noPLT.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/noPLT.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/noPLT.C 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,20 @@ +/* Test that -fvisibility=hidden prevents PLT. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fPIC -fvisibility=hidden" } */ +/* { dg-final { scan-assembler-not "methodEv@PLT" } } */ + +class Foo +{ +public: + void method(); +}; + +void Foo::method() { } + +int main(void) +{ + Foo f; + f.method(); + return 0; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,13 @@ +/* Test that #pragma GCC visibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ + +#pragma GCC visibility push(hidden) +class __attribute__ ((visibility ("internal"))) Foo +{ + void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,13 @@ +/* Test that #pragma GCC visibility does not override class member specific settings. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */ + +#pragma GCC visibility push(hidden) +class Foo +{ + __attribute__ ((visibility ("internal"))) void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/pragma.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/pragma.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,13 @@ +/* Test that #pragma GCC visibility affects class members. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +#pragma GCC visibility push(hidden) +class Foo +{ + void method(); +}; +#pragma GCC visibility pop + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/staticmemfuncts.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,11 @@ +/* Test that setting visibility for static class member functions works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "_ZN3Foo6methodEv" } } */ + +class __attribute__ ((visibility ("hidden"))) Foo +{ + static void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/virtual.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/virtual.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/virtual.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/virtual.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,11 @@ +/* Test that setting visibility for class affects virtual table. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "ZTV3Foo" } } */ + +class __attribute__ ((visibility ("hidden"))) Foo +{ + virtual void method(); +}; + +void Foo::method() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-1.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,8 @@ +/* Test visibility attribute on function definition. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void +__attribute__((visibility ("hidden"))) +foo() +{ } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-2.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,7 @@ +/* Test that visibility attribute on declaration extends to definition. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void __attribute__((visibility ("hidden"))) foo(); + +void foo() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-3.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,7 @@ +/* Test visibility attribute on forward declaration of global variable */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +int +__attribute__((visibility ("hidden"))) +xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-4.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,8 @@ +/* Test visibility attribute on forward declaration of global variable */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int __attribute__ ((visibility ("hidden"))) +xyzzy; + +int xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-5.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,11 @@ +/* Test visibility attribute on definition of a function that has + already had a forward declaration. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "_Z3foov" } } */ + +void foo(); + +void + __attribute__((visibility ("hidden"))) +foo() +{ } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-6.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,10 @@ +/* Test visibility attribute on definition of global variable that has + already had a forward declaration. */ +/* { dg-require-visibility "" } +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int xyzzy; + +int +__attribute__((visibility ("hidden"))) +xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility/visibility-7.C 2006-02-10 01:38:18.000000000 -0500 @@ -0,0 +1,11 @@ +/* Test warning from conflicting visibility specifications. */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-hidden "xyzzy" } } */ + +extern int +__attribute__((visibility ("hidden"))) +xyzzy; /* { dg-warning "previous declaration here" "" } */ + +int +__attribute__((visibility ("protected"))) +xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */ diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-1.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-1.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-1.C 2003-12-10 01:34:44.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-1.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,8 +0,0 @@ -/* Test visibility attribute on function definition. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ - -void -__attribute__((visibility ("hidden"))) -foo() -{ } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-2.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-2.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-2.C 2003-12-10 01:34:44.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-2.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,7 +0,0 @@ -/* Test that visibility attribute on declaration extends to definition. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ - -void __attribute__((visibility ("hidden"))) foo(); - -void foo() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-3.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-3.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-3.C 2003-12-10 01:34:45.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-3.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,7 +0,0 @@ -/* Test visibility attribute on forward declaration of global variable */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ - -int -__attribute__((visibility ("hidden"))) -xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-4.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-4.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-4.C 2003-12-10 01:34:45.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-4.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,8 +0,0 @@ -/* Test visibility attribute on forward declaration of global variable */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ - -extern int __attribute__ ((visibility ("hidden"))) -xyzzy; - -int xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-5.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-5.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-5.C 2003-12-10 01:34:45.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-5.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,11 +0,0 @@ -/* Test visibility attribute on definition of a function that has - already had a forward declaration. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*_Z3foov" } } */ - -void foo(); - -void - __attribute__((visibility ("hidden"))) -foo() -{ } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-6.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-6.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-6.C 2003-12-10 01:34:45.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-6.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,10 +0,0 @@ -/* Test visibility attribute on definition of global variable that has - already had a forward declaration. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ - -extern int xyzzy; - -int -__attribute__((visibility ("hidden"))) -xyzzy = 5; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-7.C gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-7.C --- gcc-3.4.4.orig/gcc/testsuite/g++.dg/ext/visibility-7.C 2003-12-10 01:34:45.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/g++.dg/ext/visibility-7.C 1969-12-31 19:00:00.000000000 -0500 @@ -1,11 +0,0 @@ -/* Test warning from conflicting visibility specifications. */ -/* { dg-do compile { target *86-*-linux* } } */ -/* { dg-final { scan-assembler "\\.hidden.*xyzzy" } } */ - -extern int -__attribute__((visibility ("hidden"))) -xyzzy; /* { dg-warning "previous declaration here" "" } */ - -int -__attribute__((visibility ("protected"))) -xyzzy = 5; /* { dg-warning "visibility attribute ignored" "" } */ diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.cc gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.cc --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.cc 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.cc 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,16 @@ +#pragma GCC visibility push(default) +template +struct VisTest +{ + inline VisTest (); +}; +template +inline VisTest::VisTest() +{} +extern template class VisTest; +#pragma GCC visibility pop +int some_function( int do_something ) +{ + VisTest a; + return 0; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.x gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.x --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.x 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-1.x 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,9 @@ +if ![is-shared-library-supported] { + return +} + +# +# build shared libray +# +gcc-special-compile $srcdir/$subdir/inline-hidden-1.cc \ + "-shared -fPIC -fvisibility-inlines-hidden" "" "no" diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.cc gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.cc --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.cc 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.cc 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,14 @@ +template +struct VisTest +{ + inline VisTest (); +}; +template +inline VisTest::VisTest() +{} +extern template class VisTest; +int some_function( int do_something ) +{ + VisTest a; + return 0; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.x gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.x --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.x 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-2.x 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,9 @@ +if ![is-shared-library-supported] { + return +} + +# +# build shared libray +# +gcc-special-compile $srcdir/$subdir/inline-hidden-2.cc \ + "-shared -fPIC -fvisibility-inlines-hidden" "" "yes" diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3.x gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3.x --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3.x 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3.x 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,11 @@ +if ![is-shared-library-supported] { + return +} + +# +# build shared libray +# +set obj [gcc-special-compile "$srcdir/$subdir/inline-hidden-3a.cc" \ + "-fPIC -fvisibility-inlines-hidden" "" "no"] +gcc-special-compile $srcdir/$subdir/inline-hidden-3b.cc \ + "-shared -fPIC" "$obj" "no" diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3a.cc gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3a.cc --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3a.cc 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3a.cc 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,14 @@ +template +struct VisTest +{ + inline VisTest (); +}; +template +inline VisTest::VisTest() +{} +extern template class VisTest; +int some_function( int do_something ) +{ + VisTest a; + return 0; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3b.cc gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3b.cc --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3b.cc 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/inline-hidden-3b.cc 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,9 @@ +template +struct VisTest +{ + inline VisTest (); +}; +template +inline VisTest::VisTest() +{} +template class VisTest; diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/special.exp gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/special.exp --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/g++.special/special.exp 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/g++.special/special.exp 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,30 @@ +# Copyright (C) 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if $tracelevel then { + strace $tracelevel +} + +# load support procs +load_lib gcc-special.exp + +# +# run special tests +# + +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.x]] { + source $src +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-dso.c gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-dso.c --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-dso.c 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-dso.c 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,13 @@ +void +__attribute__ ((visibility ("protected"))) +foo () +{ +} + +void (*foo_p) () = foo; + +void * +bar (void) +{ + return foo; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-main.c gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-main.c --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-main.c 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1-main.c 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,14 @@ +extern void (*foo_p) (void); +extern void foo (void); +extern void* bar (void); + +int +main () +{ + void *p; + p = bar (); + if (p == foo && p == foo_p) + return 0; + else + return 1; +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1.x gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1.x --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1.x 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/protfunc-1.x 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,14 @@ +if ![is-shared-library-supported] { + return +} + +# +# build shared libray +# +set dso [gcc-special-compile $srcdir/$subdir/protfunc-1-dso.c \ + "-fPIC -shared -O" "" "no"] + +# +# build and run executable +# +gcc-special-execute $srcdir/$subdir/protfunc-1-main.c $dso "-O" diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/special.exp gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/special.exp --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/gcc.special/special.exp 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/gcc.special/special.exp 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,30 @@ +# Copyright (C) 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +if $tracelevel then { + strace $tracelevel +} + +# load support procs +load_lib gcc-special.exp + +# +# run special tests +# + +foreach src [lsort [glob -nocomplain $srcdir/$subdir/*.x]] { + source $src +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/lib/gcc-special.exp gcc-3.4.4/gcc/testsuite/gcc/testsuite/lib/gcc-special.exp --- gcc-3.4.4.orig/gcc/testsuite/gcc/testsuite/lib/gcc-special.exp 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc/testsuite/lib/gcc-special.exp 2006-02-10 01:38:27.000000000 -0500 @@ -0,0 +1,177 @@ +# Copyright (C) 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# Based on c-torture.exp. + +load_lib file-format.exp +load_lib target-supports.exp + +# +# gcc-special-compile -- compile source file or build shared library. +# +# SRC is the full pathname of the testcase. +# OPTIONS is the specific compiler flag we're testing (eg: -O2). +# OBJ is the additional object. +# XFAIL is to indicate if it should fail. +# +proc gcc-special-compile { src options obj xfail } { + global tool + global output + global srcdir tmpdir + global host_triplet + + if [string match "yes" $xfail] { + setup_xfail "*-*-*" + } + + set shared "no" + set option "" + foreach opt $options { + if [string match "-shared" $opt] { + lappend option [get-build-shared-library-option] + set shared "yes" + } elseif [string match "-fPIC" $opt] { + lappend option [get-compile-shared-library-option] + } else { + lappend option "$opt" + } + } + + if [string match "yes" $shared] { + set type "executable" + set output "$tmpdir/[file tail [file rootname $src]].so" + } else { + set type "object" + set output "$tmpdir/[file tail [file rootname $src]].o" + } + + regsub "^$srcdir/?" $src "" testcase + # If we couldn't rip $srcdir out of `src' then just do the best we can. + # The point is to reduce the unnecessary noise in the logs. Don't strip + # out too much because different testcases with the same name can confuse + # `test-tool'. + if [string match "/*" $testcase] { + set testcase "[file tail [file dirname $src]]/[file tail $src]" + } + + verbose "Testing $testcase, $option" 1 + + # Run the compiler and analyze the results. + set options "" + lappend options "additional_flags=-w $option $obj" + + set comp_output [${tool}_target_compile "$src" "$output" $type $options]; + if [${tool}_check_compile $testcase $option $output $comp_output] { + if [string match "yes" $xfail] { + fail "$testcase, $option" + } else { + foreach file "$obj" { + remote_file build delete $file + } + } + } elseif [string match "yes" $xfail] { + foreach file "$obj" { + remote_file build delete $file + } + } + return $output +} + +# +# gcc-special-execute -- utility to compile and execute a testcase +# +# SOURCES is a list of full pathnames to the test source files. +# The first filename in this list forms the "testcase". +# +# If the testcase has an associated .x file, we source that to run the +# test instead. We use .x so that we don't lengthen the existing filename +# to more than 14 chars. +# +proc gcc-special-execute { sources shlib additional_flags } { + global tmpdir tool srcdir output compiler_conditional_xfail_data + + # Use the first source filename given as the filename under test. + set src [lindex $sources 0] + + set option "" + + # Check for alternate driver. + if [file exists [file rootname $src].x] { + verbose "Using alternate driver [file rootname [file tail $src]].x" 2 + set done_p 0 + catch "set done_p \[source [file rootname $src].x\]" + if { $done_p } { + return + } + } + + set executable $tmpdir/[file tail [file rootname $src].x] + + regsub "^$srcdir/?" $src "" testcase + # If we couldn't rip $srcdir out of `src' then just do the best we can. + # The point is to reduce the unnecessary noise in the logs. Don't strip + # out too much because different testcases with the same name can confuse + # `test-tool'. + if [string match "/*" $testcase] { + set testcase "[file tail [file dirname $src]]/[file tail $src]" + } + + # torture_{compile,execute}_xfail are set by the .x script + # (if present) + if [info exists torture_compile_xfail] { + setup_xfail $torture_compile_xfail + } + + # torture_execute_before_{compile,execute} can be set by the .x script + # (if present) + if [info exists torture_eval_before_compile] { + set ignore_me [eval $torture_eval_before_compile] + } + + verbose "Testing $testcase, $option" 1 + + set options "" + lappend options "additional_flags=-w $option $shlib" + if { $additional_flags != "" } { + lappend options "additional_flags=$additional_flags"; + } + + set comp_output [${tool}_target_compile "$sources" "${executable}" executable $options]; + + if ![${tool}_check_compile "$testcase compilation" $option $executable $comp_output] { + unresolved "$testcase execution, $option" + remote_file build delete $executable + return + } + + if [info exists torture_execute_xfail] { + setup_xfail $torture_execute_xfail + } + + if [info exists torture_eval_before_execute] { + set ignore_me [eval $torture_eval_before_execute] + } + + set result [${tool}_load "$executable" "" ""] + set status [lindex $result 0]; + set output [lindex $result 1]; + $status "$testcase execution, $option" + if { $status == "pass" } { + foreach file "$executable $shlib" { + remote_file build delete $file + } + } +} diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc.dg/visibility-9.c gcc-3.4.4/gcc/testsuite/gcc.dg/visibility-9.c --- gcc-3.4.4.orig/gcc/testsuite/gcc.dg/visibility-9.c 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc.dg/visibility-9.c 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,9 @@ +/* Test that -fvisibility works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-options "-fvisibility=hidden" } */ +/* { dg-final { scan-assembler "\\.hidden.*foo" } } */ + +void foo(); + +void foo() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/gcc.dg/visibility-a.c gcc-3.4.4/gcc/testsuite/gcc.dg/visibility-a.c --- gcc-3.4.4.orig/gcc/testsuite/gcc.dg/visibility-a.c 1969-12-31 19:00:00.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/gcc.dg/visibility-a.c 2006-02-10 01:38:13.000000000 -0500 @@ -0,0 +1,10 @@ +/* Test that #pragma GCC visibility works. */ +/* { dg-do compile } */ +/* { dg-require-visibility "" } */ +/* { dg-final { scan-assembler "\\.hidden.*foo" } } */ + +#pragma GCC visibility push(hidden) +void foo(); +#pragma GCC visibility pop + +void foo() { } diff -Nurp gcc-3.4.4.orig/gcc/testsuite/lib/scanasm.exp gcc-3.4.4/gcc/testsuite/lib/scanasm.exp --- gcc-3.4.4.orig/gcc/testsuite/lib/scanasm.exp 2004-02-12 12:48:32.000000000 -0500 +++ gcc-3.4.4/gcc/testsuite/lib/scanasm.exp 2006-02-10 01:38:18.000000000 -0500 @@ -79,6 +79,32 @@ proc scan-assembler-not { args } { dg-scan "scan-assembler-not" 0 $testcase $output_file $args } +# Check that a symbol is defined as a hidden symbol in the .s file +# produced by the compiler. + +proc scan-hidden { args } { + upvar 2 name testcase + set output_file "[file rootname [file tail $testcase]].s" + + set symbol [lindex $args 0] + set args [lreplace $args 0 0 "hidden\[ \t_\]*$symbol"] + + dg-scan "scan-hidden" 1 $testcase $output_file $args +} + +# Check that a symbol is not defined as a hidden symbol in the .s file +# produced by the compiler. + +proc scan-not-hidden { args } { + upvar 2 name testcase + set output_file "[file rootname [file tail $testcase]].s" + + set symbol [lindex $args 0] + set args [lreplace $args 0 0 "hidden\[ \t_\]*$symbol"] + + dg-scan "scan-not-hidden" 0 $testcase $output_file $args +} + # Look for a pattern in OUTPUT_FILE. See dg-scan for details. proc scan-file { output_file args } { diff -Nurp gcc-3.4.4.orig/gcc/testsuite/lib/target-supports.exp gcc-3.4.4/gcc/testsuite/lib/target-supports.exp --- gcc-3.4.4.orig/gcc/testsuite/lib/target-supports.exp 2004-08-23 14:03:13.000000000 -0400 +++ gcc-3.4.4/gcc/testsuite/lib/target-supports.exp 2006-02-10 01:38:27.000000000 -0500 @@ -289,3 +289,53 @@ proc check_vmx_hw_available { } { return $vmx_hw_available_saved } + +# Return 1 if the target support shared library. + +proc is-shared-library-supported { } { + # Shared library is only supported on a couple of ELF platforms. + if { ![istarget hppa*64*-*-hpux*] \ + && ![istarget hppa*-*-linux*] \ + && ![istarget i?86-*-sysv4*] \ + && ![istarget i?86-*-unixware] \ + && ![istarget i?86-*-elf*] \ + && ![istarget i?86-*-linux*] \ + && ![istarget ia64-*-elf*] \ + && ![istarget ia64-*-linux*] \ + && ![istarget m68k-*-linux*] \ + && ![istarget mips*-*-irix5*] \ + && ![istarget mips*-*-linux*] \ + && ![istarget powerpc-*-elf*] \ + && ![istarget powerpc-*-linux*] \ + && ![istarget powerpc-*-sysv4*] \ + && ![istarget sparc*-*-elf] \ + && ![istarget sparc*-*-solaris2*] \ + && ![istarget sparc*-*-linux*] \ + && ![istarget arm*-*-linux*] \ + && ![istarget alpha*-*-linux*] \ + && ![istarget s390*-*-linux*] \ + && ![istarget x86_64-*-linux*] } { + return 0 + } + + if { [istarget *-*-linux*aout*] \ + || [istarget *-*-linux*oldld*] } { + return 0 + } + + return 1 +} + +# Return gcc option to compile .o file for shared library. + +proc get-compile-shared-library-option { } { + set picflag "-fPIC" + return $picflag +} + +# Return gcc option to build shared library. + +proc get-build-shared-library-option { } { + set ldflag "-shared" + return $ldflag +} diff -Nurp gcc-3.4.4.orig/gcc/tree.c gcc-3.4.4/gcc/tree.c --- gcc-3.4.4.orig/gcc/tree.c 2004-08-23 14:02:41.000000000 -0400 +++ gcc-3.4.4/gcc/tree.c 2006-02-10 01:38:12.000000000 -0500 @@ -2563,6 +2563,11 @@ build_decl (enum tree_code code, tree na layout_decl (t, 0); else if (code == FUNCTION_DECL) DECL_MODE (t) = FUNCTION_MODE; + + /* Set default visibility to whatever the user supplied with + visibility_specified depending on #pragma GCC visibility. */ + DECL_VISIBILITY (t) = default_visibility; + DECL_VISIBILITY_SPECIFIED (t) = visibility_options.inpragma; return t; } diff -Nurp gcc-3.4.4.orig/gcc/tree.h gcc-3.4.4/gcc/tree.h --- gcc-3.4.4.orig/gcc/tree.h 2005-01-16 11:01:19.000000000 -0500 +++ gcc-3.4.4/gcc/tree.h 2006-02-10 01:38:12.000000000 -0500 @@ -1499,6 +1499,10 @@ struct tree_type GTY(()) /* Value of the decls's visibility attribute */ #define DECL_VISIBILITY(NODE) (DECL_CHECK (NODE)->decl.visibility) +/* Nonzero means that the decl had its visibility specified rather than + being inferred. */ +#define DECL_VISIBILITY_SPECIFIED(NODE) (DECL_CHECK (NODE)->decl.visibility_specified) + /* In a FUNCTION_DECL, nonzero if the function cannot be inlined. */ #define DECL_UNINLINABLE(NODE) (FUNCTION_DECL_CHECK (NODE)->decl.uninlinable) @@ -1633,7 +1637,8 @@ struct tree_type GTY(()) || TREE_CODE (DECL_CONTEXT (EXP)) == TRANSLATION_UNIT_DECL) /* Enumerate visibility settings. */ - +#ifndef SYMBOL_VISIBILITY_DEFINED +#define SYMBOL_VISIBILITY_DEFINED enum symbol_visibility { VISIBILITY_DEFAULT, @@ -1641,6 +1646,7 @@ enum symbol_visibility VISIBILITY_HIDDEN, VISIBILITY_PROTECTED }; +#endif struct function; @@ -1684,8 +1690,7 @@ struct tree_decl GTY(()) unsigned thread_local_flag : 1; unsigned declared_inline_flag : 1; ENUM_BITFIELD(symbol_visibility) visibility : 2; - unsigned unused : 1; - /* one unused bit. */ + unsigned visibility_specified : 1; unsigned lang_flag_0 : 1; unsigned lang_flag_1 : 1; diff -Nurp gcc-3.4.4.orig/gcc/varasm.c gcc-3.4.4/gcc/varasm.c --- gcc-3.4.4.orig/gcc/varasm.c 2005-03-02 15:57:48.000000000 -0500 +++ gcc-3.4.4/gcc/varasm.c 2006-02-10 01:38:12.000000000 -0500 @@ -5211,8 +5211,8 @@ default_binds_local_p_1 (tree exp, int s /* Static variables are always local. */ else if (! TREE_PUBLIC (exp)) local_p = true; - /* A variable is local if the user tells us so. */ - else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) + /* A variable is local if the user explicitly tells us so. */ + else if (DECL_VISIBILITY_SPECIFIED (exp) && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) local_p = true; /* Otherwise, variables defined outside this object may not be local. */ else if (DECL_EXTERNAL (exp)) @@ -5220,6 +5220,9 @@ default_binds_local_p_1 (tree exp, int s /* Linkonce and weak data are never local. */ else if (DECL_ONE_ONLY (exp) || DECL_WEAK (exp)) local_p = false; + /* If none of the above and visibility is not default, make local. */ + else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) + local_p = true; /* If PIC, then assume that any global name can be overridden by symbols resolved from other modules. */ else if (shlib) diff -Nurp gcc-3.4.4.orig/libstdc++-v3/include/bits/allocator.h gcc-3.4.4/libstdc++-v3/include/bits/allocator.h --- gcc-3.4.4.orig/libstdc++-v3/include/bits/allocator.h 2004-03-18 12:36:46.000000000 -0500 +++ gcc-3.4.4/libstdc++-v3/include/bits/allocator.h 2006-02-10 01:38:24.000000000 -0500 @@ -51,6 +51,8 @@ // Define the base class to std::allocator. #include +#pragma GCC visibility push(default) + namespace std { template @@ -127,4 +129,6 @@ namespace std #undef ___glibcxx_base_allocator } // namespace std +#pragma GCC visibility pop + #endif diff -Nurp gcc-3.4.4.orig/libstdc++-v3/include/bits/basic_string.h gcc-3.4.4/libstdc++-v3/include/bits/basic_string.h --- gcc-3.4.4.orig/libstdc++-v3/include/bits/basic_string.h 2005-04-25 07:02:01.000000000 -0400 +++ gcc-3.4.4/libstdc++-v3/include/bits/basic_string.h 2006-02-10 01:38:24.000000000 -0500 @@ -45,6 +45,8 @@ #include #include +#pragma GCC visibility push(default) + namespace std { /** @@ -2362,4 +2364,6 @@ namespace std basic_string<_CharT, _Traits, _Alloc>& __str); } // namespace std +#pragma GCC visibility pop + #endif /* _BASIC_STRING_H */ diff -Nurp gcc-3.4.4.orig/libstdc++-v3/include/std/std_fstream.h gcc-3.4.4/libstdc++-v3/include/std/std_fstream.h --- gcc-3.4.4.orig/libstdc++-v3/include/std/std_fstream.h 2004-09-19 07:26:46.000000000 -0400 +++ gcc-3.4.4/libstdc++-v3/include/std/std_fstream.h 2006-02-10 01:38:24.000000000 -0500 @@ -49,6 +49,8 @@ #include #include +#pragma GCC visibility push(default) + namespace std { // [27.8.1.1] template class basic_filebuf @@ -840,4 +842,6 @@ namespace std # include #endif +#pragma GCC visibility pop + #endif /* _GLIBCXX_FSTREAM */ diff -Nurp gcc-3.4.4.orig/libstdc++-v3/include/std/std_istream.h gcc-3.4.4/libstdc++-v3/include/std/std_istream.h --- gcc-3.4.4.orig/libstdc++-v3/include/std/std_istream.h 2004-02-11 10:02:03.000000000 -0500 +++ gcc-3.4.4/libstdc++-v3/include/std/std_istream.h 2006-02-10 01:38:24.000000000 -0500 @@ -45,6 +45,8 @@ #include #include // For numeric_limits +#pragma GCC visibility push(default) + namespace std { // [27.6.1.1] Template class basic_istream @@ -771,4 +773,6 @@ namespace std # include #endif +#pragma GCC visibility pop + #endif /* _GLIBCXX_ISTREAM */ diff -Nurp gcc-3.4.4.orig/libstdc++-v3/include/std/std_ostream.h gcc-3.4.4/libstdc++-v3/include/std/std_ostream.h --- gcc-3.4.4.orig/libstdc++-v3/include/std/std_ostream.h 2004-02-11 10:02:03.000000000 -0500 +++ gcc-3.4.4/libstdc++-v3/include/std/std_ostream.h 2006-02-10 01:38:24.000000000 -0500 @@ -44,6 +44,8 @@ #include +#pragma GCC visibility push(default) + namespace std { // [27.6.2.1] Template class basic_ostream @@ -545,4 +547,6 @@ namespace std # include #endif +#pragma GCC visibility pop + #endif /* _GLIBCXX_OSTREAM */