contrib/gcc34/gcc-3.4.6-visibility.patch
2007-05-05 16:48:54 +10:00

2033 lines
76 KiB
Diff
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<typename CharT>
+struct VisTest
+{
+ inline VisTest ();
+};
+template<typename CharT>
+inline VisTest<CharT>::VisTest()
+{}
+extern template class VisTest<char>;
+#pragma GCC visibility pop
+int some_function( int do_something )
+{
+ VisTest<char> 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<typename CharT>
+struct VisTest
+{
+ inline VisTest ();
+};
+template<typename CharT>
+inline VisTest<CharT>::VisTest()
+{}
+extern template class VisTest<char>;
+int some_function( int do_something )
+{
+ VisTest<char> 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<typename CharT>
+struct VisTest
+{
+ inline VisTest ();
+};
+template<typename CharT>
+inline VisTest<CharT>::VisTest()
+{}
+extern template class VisTest<char>;
+int some_function( int do_something )
+{
+ VisTest<char> 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<typename CharT>
+struct VisTest
+{
+ inline VisTest ();
+};
+template<typename CharT>
+inline VisTest<CharT>::VisTest()
+{}
+template class VisTest<char>;
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 <bits/c++allocator.h>
+#pragma GCC visibility push(default)
+
namespace std
{
template<typename _Tp>
@@ -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 <bits/atomicity.h>
#include <debug/debug.h>
+#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 <bits/basic_file.h>
#include <bits/gthr.h>
+#pragma GCC visibility push(default)
+
namespace std
{
// [27.8.1.1] template class basic_filebuf
@@ -840,4 +842,6 @@ namespace std
# include <bits/fstream.tcc>
#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 <ios>
#include <limits> // 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 <bits/istream.tcc>
#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 <ios>
+#pragma GCC visibility push(default)
+
namespace std
{
// [27.6.2.1] Template class basic_ostream
@@ -545,4 +547,6 @@ namespace std
# include <bits/ostream.tcc>
#endif
+#pragma GCC visibility pop
+
#endif /* _GLIBCXX_OSTREAM */