diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 53e1131037d..41b5a4924e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-07-17 Julian Brown + + * 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 * 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 0ce531bb802..d64b6fda34f 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 0e537b855c7..a664d0f9bc9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2008-07-17 Julian Brown + Mark Mitchell + + * decl2.c (determine_visibility): Allow target to override + visibility of class data. + 2008-07-17 Paolo Carlini PR c++/36855 diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index a5ece9a6709..f14f94d16b5 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 528a1114b30..55d0839c183 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-07-17 Julian Brown + Mark Mitchell + + * 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 PR c++/36855 diff --git a/gcc/testsuite/g++.dg/ext/visibility/arm1.C b/gcc/testsuite/g++.dg/ext/visibility/arm1.C index 8b4949492a1..2c2e3d0664a 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 f97813d7f21..9be7082ce1d 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" } }