gcc:
authorro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 09:19:20 +0000 (09:19 +0000)
committerro <ro@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 31 Mar 2010 09:19:20 +0000 (09:19 +0000)
* config/sol2.c: Include output.h.
(solaris_assemble_visibility): New function.
* config/t-sol2 (sol2.o): Add output.h dependency.
* config/sol2-protos.h (solaris_assemble_visibility): Declare.
* config/sol2.h [!USE_GAS] (TARGET_ASM_ASSEMBLE_VISIBILITY):
Redefine.

gcc/testsuite:
* g++.dg/ext/visibility/pragma-override1.C: Allow for .hidden in
assembler output on *-*-solaris2*.
* g++.dg/ext/visibility/pragma-override2.C: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@157856 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/sol2-protos.h
gcc/config/sol2.c
gcc/config/sol2.h
gcc/config/t-sol2
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C

index 0deb3bd..e1fd302 100644 (file)
@@ -1,3 +1,12 @@
+2010-03-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * config/sol2.c: Include output.h.
+       (solaris_assemble_visibility): New function.
+       * config/t-sol2 (sol2.o): Add output.h dependency.
+       * config/sol2-protos.h (solaris_assemble_visibility): Declare.
+       * config/sol2.h [!USE_GAS] (TARGET_ASM_ASSEMBLE_VISIBILITY):
+       Redefine.
+
 2010-03-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/43580
index 45d5bcc..800629a 100644 (file)
@@ -1,6 +1,6 @@
 /* Operating system specific prototypes to be used when targeting GCC for any
    Solaris 2 system.
-   Copyright 2004, 2007 Free Software Foundation, Inc.
+   Copyright 2004, 2007, 2010 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -21,3 +21,4 @@ along with GCC; see the file COPYING3.  If not see
 extern void solaris_insert_attributes (tree, tree *);
 extern void solaris_register_pragmas (void);
 extern void solaris_output_init_fini (FILE *, tree);
+extern void solaris_assemble_visibility (tree, int);
index 493816c..3531e79 100644 (file)
@@ -1,5 +1,5 @@
 /* General Solaris system support.
-   Copyright (C) 2004, 2005 , 2007 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005 , 2007, 2010 Free Software Foundation, Inc.
    Contributed by CodeSourcery, LLC.
 
 This file is part of GCC.
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
+#include "output.h"
 #include "tm.h"
 #include "rtl.h"
 #include "tm_p.h"
@@ -117,3 +118,42 @@ solaris_output_init_fini (FILE *file, tree decl)
     }
 }
 
+/* Emit an assembler directive to set symbol for DECL visibility to
+   the visibility type VIS, which must not be VISIBILITY_DEFAULT.  */
+
+void
+solaris_assemble_visibility (tree decl, int vis)
+{
+  /* Sun as uses .symbolic for STV_PROTECTED.  STV_INTERNAL is marked as
+     `currently reserved', but the linker treats it like STV_HIDDEN.  Sun
+     Studio 12.1 cc emits .hidden instead.
+
+     There are 3 Sun extensions GCC doesn't yet know about: STV_EXPORTED,
+     STV_SINGLETON, and STV_ELIMINATE.
+
+     See Linker and Libraries Guide, Ch. 2, Link-Editor, Defining
+     Additional Symbols with a mapfile,
+     http://docs.sun.com/app/docs/doc/819-0690/gdzmc?a=view
+     and Ch. 7, Object-File Format, Symbol Table Section,
+     http://docs.sun.com/app/docs/doc/819-0690/chapter6-79797?a=view  */
+
+  static const char * const visibility_types[] = {
+    NULL, "symbolic", "hidden", "hidden"
+  };
+
+  const char *name, *type;
+
+  name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+  type = visibility_types[vis];
+
+  /* .hidden dates back before Solaris 2.5, but .symbolic was only added in
+     Solaris 9 12/02.  */
+#ifdef HAVE_GAS_HIDDEN
+  fprintf (asm_out_file, "\t.%s\t", type);
+  assemble_name (asm_out_file, name);
+  fprintf (asm_out_file, "\n");
+#else
+  warning (OPT_Wattributes, "visibility attribute not supported "
+          "in this configuration; ignored");
+#endif
+}
index a20c3b9..d77c0f8 100644 (file)
@@ -284,6 +284,11 @@ __enable_execute_stack (void *addr)                                        \
     }                                                                  \
   while (0)
 
+#ifndef USE_GAS
+#undef TARGET_ASM_ASSEMBLE_VISIBILITY
+#define TARGET_ASM_ASSEMBLE_VISIBILITY solaris_assemble_visibility
+#endif
+
 extern GTY(()) tree solaris_pending_aligns;
 extern GTY(()) tree solaris_pending_inits;
 extern GTY(()) tree solaris_pending_finis;
index 28aa865..526ae40 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2004, 2008, 2009 Free Software Foundation, Inc.
+# Copyright (C) 2004, 2008, 2009, 2010 Free Software Foundation, Inc.
 #
 # This file is part of GCC.
 #
@@ -25,6 +25,6 @@ sol2-c.o: $(srcdir)/config/sol2-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
 
 # Solaris-specific attributes
 sol2.o: $(srcdir)/config/sol2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-  tree.h $(TM_H) $(TM_P_H) toplev.h $(GGC_H)
+  tree.h output.h $(TM_H) $(TM_P_H) toplev.h $(GGC_H)
        $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
          $(srcdir)/config/sol2.c
index 1dcabdf..3e9329a 100644 (file)
@@ -1,3 +1,9 @@
+2010-03-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
+
+       * g++.dg/ext/visibility/pragma-override1.C: Allow for .hidden in
+       assembler output on *-*-solaris2*.
+       * g++.dg/ext/visibility/pragma-override2.C: Likewise.
+
 2010-03-31  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/43557
index e292df4..4300d1a 100644 (file)
@@ -1,7 +1,8 @@
 /* Test that #pragma GCC visibility does not override class member specific settings. */
 /* { dg-do compile } */
 /* { dg-require-visibility "internal" } */
-/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */
+/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! *-*-solaris2* } } } } */
+/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */
 
 #pragma GCC visibility push(hidden)
 class __attribute__ ((visibility ("internal"))) Foo
index fe6c47f..f566cd2 100644 (file)
@@ -1,7 +1,8 @@
 /* Test that #pragma GCC visibility does not override class member specific settings. */
 /* { dg-do compile } */
 /* { dg-require-visibility "internal" } */
-/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" } } */
+/* { dg-final { scan-assembler "\\.internal.*Foo.methodEv" { target { ! *-*-solaris2* } } } } */
+/* { dg-final { scan-assembler "\\.(internal|hidden).*Foo.methodEv" { target *-*-solaris2* } } } */
 
 #pragma GCC visibility push(hidden)
 class Foo