aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2004-11-05 00:18:51 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2004-11-05 00:18:51 +0000
commit04fb56d5990d68f903b15b367e23be9a27d27673 (patch)
tree2c7b87865b69a5a634daf74740d623e77960bef0 /gcc
parent30a8b5f807de4e90d2420b1b36b79db174395be4 (diff)
downloadgcc-04fb56d5990d68f903b15b367e23be9a27d27673.zip
gcc-04fb56d5990d68f903b15b367e23be9a27d27673.tar.gz
gcc-04fb56d5990d68f903b15b367e23be9a27d27673.tar.bz2
arm.c (arm_handle_notshared_attribute): New function.
* config/arm/arm.c (arm_handle_notshared_attribute): New function. * doc/extend.texi: Document "notshared" attribute. * testsuite/g++.dg/ext/visibility/symbian1.C: New test. From-SVN: r90099
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c25
-rw-r--r--gcc/doc/extend.texi23
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/symbian1.C22
5 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 59b2a1b..239dcec 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-11-04 Mark Mitchell <mark@codesourcery.com>
+
+ * config/arm/arm.c (arm_handle_notshared_attribute): New function.
+ * doc/extend.texi: Document "notshared" attribute.
+
2004-11-04 Kazu Hirata <kazu@cs.umass.edu>
* tree-phinodes.c (make_phi_node): Make it static.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 498218d..730877b 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -114,6 +114,7 @@ static unsigned long arm_isr_value (tree);
static unsigned long arm_compute_func_type (void);
static tree arm_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
static tree arm_handle_isr_attribute (tree *, tree, tree, int, bool *);
+static tree arm_handle_notshared_attribute (tree *, tree, tree, int, bool *);
static void arm_output_function_epilogue (FILE *, HOST_WIDE_INT);
static void arm_output_function_prologue (FILE *, HOST_WIDE_INT);
static void thumb_output_function_prologue (FILE *, HOST_WIDE_INT);
@@ -2589,6 +2590,7 @@ const struct attribute_spec arm_attribute_table[] =
#elif TARGET_DLLIMPORT_DECL_ATTRIBUTES
{ "dllimport", 0, 0, false, false, false, handle_dll_attribute },
{ "dllexport", 0, 0, false, false, false, handle_dll_attribute },
+ { "notshared", 0, 0, false, true, false, arm_handle_notshared_attribute },
#endif
{ NULL, 0, 0, false, false, false, NULL }
};
@@ -2668,6 +2670,29 @@ arm_handle_isr_attribute (tree *node, tree name, tree args, int flags,
return NULL_TREE;
}
+/* Handle the "notshared" attribute. This attribute is another way of
+ requesting hidden visibility. ARM's compiler supports
+ "__declspec(notshared)"; we support the same thing via an
+ attribute. */
+
+static tree
+arm_handle_notshared_attribute (tree *node,
+ tree name ATTRIBUTE_UNUSED,
+ tree args ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED,
+ bool *no_add_attrs)
+{
+ tree decl = TYPE_NAME (*node);
+
+ if (decl)
+ {
+ DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
+ DECL_VISIBILITY_SPECIFIED (decl) = 1;
+ *no_add_attrs = false;
+ }
+ return NULL_TREE;
+}
+
/* Return 0 if the attributes for two types are incompatible, 1 if they
are compatible, and 2 if they are nearly compatible (which causes a
warning to be generated). */
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index a4cbb2f..0e5e970 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -3307,6 +3307,29 @@ declaration, the above program would abort when compiled with
@option{-fstrict-aliasing}, which is on by default at @option{-O2} or
above in recent GCC versions.
+@subsection ARM Type Attributes
+
+On those ARM targets that support @code{dllimport} (such as Symbian
+OS), you can use the @code{notshared} attribute to indicate that the
+virtual table and other similar data for a class should not be
+exported from a DLL. For example:
+
+@smallexample
+class __declspec(notshared) C @{
+public:
+ __declspec(dllimport) C();
+ virtual void f();
+@}
+
+__declspec(dllexport)
+C::C() @{@}
+@end smallexample
+
+In this code, @code{C::C} is exported from the current DLL, but the
+virtual table for @code{C} is not exported. (You can use
+@code{__attribute__} instead of @code{__declspec} if you prefer, but
+most Symbian OS code uses @code{__declspec}.)
+
@subsection i386 Type Attributes
Two attributes are currently defined for i386 configurations:
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4e27d51..69f4038 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-11-04 Mark Mitchell <mark@codesourcery.com>
+
+ * testsuite/g++.dg/ext/visibility/symbian1.C: New test.
+
2004-11-04 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/pragma-align.c (sixteen): Use 8-byte alignment
diff --git a/gcc/testsuite/g++.dg/ext/visibility/symbian1.C b/gcc/testsuite/g++.dg/ext/visibility/symbian1.C
new file mode 100644
index 0000000..864ab2b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/visibility/symbian1.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target arm*-*-symbianelf* } }
+// Class data should not be exported.
+// { dg-final { scan-hidden "_ZTV2K3" } }
+// But the constructor and destructor should be exported.
+// { dg-final { scan-not-hidden "_ZN2K3C2Ev" } }
+// { dg-final { scan-not-hidden "_ZN2K3D0Ev" } }
+
+class __declspec(notshared) K3 {
+public:
+ __declspec(dllimport) K3();
+ __declspec(dllimport) virtual ~K3();
+ virtual int m1();
+};
+
+__declspec(dllexport)
+ K3::K3(){}
+
+__declspec(dllexport)
+ K3::~K3(){}
+
+int K3::m1() { return 1; }
+