aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Brown <julian@codesourcery.com>2008-07-17 14:03:50 +0000
committerJulian Brown <jules@gcc.gnu.org>2008-07-17 14:03:50 +0000
commit711b299844b8eb77451d96a360f4525fc005279e (patch)
tree227fab594ab803abac56d2e5bd12c689005f8eac
parent0eae6babe5d9101e825cb8f32bba494642db45af (diff)
downloadgcc-711b299844b8eb77451d96a360f4525fc005279e.zip
gcc-711b299844b8eb77451d96a360f4525fc005279e.tar.gz
gcc-711b299844b8eb77451d96a360f4525fc005279e.tar.bz2
decl2.c (determine_visibility): Allow target to override visibility of class data.
gcc/cp/ * decl2.c (determine_visibility): Allow target to override visibility of class data. gcc/ * config/arm/arm.c (arm_cxx_determine_class_data_visibility): Make no-op for targets which don't use DLLs. gcc/testsuite/ * g++.dg/ext/visibility/arm3.C: Add explanatory text. Skip on non-DLL targets. * g++.dg/ext/visibility/arm1.C: Skip on non-DLL targets. Co-Authored-By: Mark Mitchell <mark@codesourcery.com> From-SVN: r137922
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/arm/arm.c3
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/decl2.c8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/arm1.C1
-rw-r--r--gcc/testsuite/g++.dg/ext/visibility/arm3.C26
7 files changed, 54 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 53e1131..41b5a49 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-07-17 Julian Brown <julian@codesourcery.com>
+
+ * config/arm/arm.c (arm_cxx_determine_class_data_visibility): Make
+ no-op for targets which don't use DLLs.
+
2008-07-17 Martin Jambor <mjambor@suse.cz>
* ipa-cp.c (ipcp_print_all_lattices): New variable info, check
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 0ce531bb..d64b6fd 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -18318,7 +18318,8 @@ arm_cxx_key_method_may_be_inline (void)
static void
arm_cxx_determine_class_data_visibility (tree decl)
{
- if (!TARGET_AAPCS_BASED)
+ if (!TARGET_AAPCS_BASED
+ || !TARGET_DLLIMPORT_DECL_ATTRIBUTES)
return;
/* In general, \S 3.2.5.5 of the ARM EABI requires that class data
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 0e537b8..a664d0f 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2008-07-17 Julian Brown <julian@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * decl2.c (determine_visibility): Allow target to override
+ visibility of class data.
+
2008-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36855
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index a5ece9a..f14f94d 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -1963,6 +1963,14 @@ determine_visibility (tree decl)
/* tinfo visibility is based on the type it's for. */
constrain_visibility
(decl, type_visibility (TREE_TYPE (DECL_NAME (decl))));
+
+ /* Give the target a chance to override the visibility associated
+ with DECL. */
+ if (TREE_PUBLIC (decl)
+ && !DECL_REALLY_EXTERN (decl)
+ && CLASS_TYPE_P (TREE_TYPE (DECL_NAME (decl)))
+ && !CLASSTYPE_VISIBILITY_SPECIFIED (TREE_TYPE (DECL_NAME (decl))))
+ targetm.cxx.determine_class_data_visibility (decl);
}
else if (use_template)
/* Template instantiations and specializations get visibility based
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 528a111..55d0839 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2008-07-17 Julian Brown <julian@codesourcery.com>
+ Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/ext/visibility/arm3.C: Add explanatory text. Skip on
+ non-DLL targets.
+ * g++.dg/ext/visibility/arm1.C: Skip on non-DLL targets.
+
2008-07-17 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/36855
diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm1.C b/gcc/testsuite/g++.dg/ext/visibility/arm1.C
index 8b49494..2c2e3d0 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/arm1.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/arm1.C
@@ -1,4 +1,5 @@
// { dg-do compile { target arm*-*-eabi* arm*-*-symbianelf* } }
+// { dg-require-dll "" }
// { dg-options "-fvisibility=hidden" }
// Most class data should be exported.
// { dg-final { scan-not-hidden "_ZTV1S" } }
diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm3.C b/gcc/testsuite/g++.dg/ext/visibility/arm3.C
index f97813d..9be7082 100644
--- a/gcc/testsuite/g++.dg/ext/visibility/arm3.C
+++ b/gcc/testsuite/g++.dg/ext/visibility/arm3.C
@@ -1,6 +1,30 @@
// { dg-do compile { target arm*-*-*eabi* } }
+// { dg-require-dll "" }
// { dg-options "-fvisibility=hidden" }
-// Class data should be exported.
+
+/* From ARM C++ ABI \S 3.2.5.5:
+
+ A class should be exported unless explicitly tagged otherwise.
+
+ This admonition applies even on DLL-based systems where hidden
+ visibility is the default. We want -fvisibility=hidden to behave
+ identically to the situation where hidden visibility is the
+ hard-wired default. So, both A and B are exported classes.
+
+ Furthermore:
+
+ If CAG symbol Y names one of the impedimenta associated with an
+ exported class X:
+
+ ...
+
+ * Otherwise, if X has no key function:
+
+ - Y is exported from ... each DLL that refers to X and uses Y.
+
+ So, the type-info and virtual-table symbols associated with A and B
+ must be exported. */
+
// { dg-final { scan-not-hidden "_ZTI1A" } }
// { dg-final { scan-not-hidden "_ZTS1A" } }
// { dg-final { scan-not-hidden "_ZTV1B" } }