This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Support Sun as visibility syntax
Janis Johnson <janis.marie.johnson@gmail.com> writes:
>> Ok for mainline? ?I only need approval for the testsuite changes (which
>> are almost obvious).
>
> Don't change the expected expressions for all targets. Instead, use the
> new one only for solaris and the existing one for non-Solaris.
Updated patch below. Ok now?
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University
2010-03-07 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
gcc:
* config.gcc (sparc*-*-solaris2*) [$gas=yes]: Add usegas.h to
tm_file.
* 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.
diff -r 32a340001702 gcc/config.gcc
--- a/gcc/config.gcc Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/config.gcc Mon Mar 22 20:55:18 2010 +0100
@@ -2415,6 +2415,9 @@
else
tmake_file="$tmake_file t-slibgcc-sld"
fi
+ if test x$gas = xyes; then
+ tm_file="usegas.h ${tm_file}"
+ fi
c_target_objs="sol2-c.o"
cxx_target_objs="sol2-c.o"
extra_objs="sol2.o"
diff -r 32a340001702 gcc/config/sol2-protos.h
--- a/gcc/config/sol2-protos.h Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/config/sol2-protos.h Mon Mar 22 20:55:18 2010 +0100
@@ -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 @@
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);
diff -r 32a340001702 gcc/config/sol2.c
--- a/gcc/config/sol2.c Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/config/sol2.c Mon Mar 22 20:55:18 2010 +0100
@@ -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 @@
#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 @@
}
}
+/* 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
+}
diff -r 32a340001702 gcc/config/sol2.h
--- a/gcc/config/sol2.h Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/config/sol2.h Mon Mar 22 20:55:18 2010 +0100
@@ -284,6 +284,11 @@
} \
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;
diff -r 32a340001702 gcc/config/t-sol2
--- a/gcc/config/t-sol2 Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/config/t-sol2 Mon Mar 22 20:55:18 2010 +0100
@@ -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 @@
# 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
diff -r 32a340001702 gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C
--- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override1.C Mon Mar 22 20:55:18 2010 +0100
@@ -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
diff -r 32a340001702 gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C
--- a/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C Mon Mar 22 20:55:04 2010 +0100
+++ b/gcc/testsuite/g++.dg/ext/visibility/pragma-override2.C Mon Mar 22 20:55:18 2010 +0100
@@ -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