target-def.h (TARGET_CXX): Add TARGET_CXX_EXPORT_CLASS_DATA.
authorMark Mitchell <mark@codesourcery.com>
Wed, 1 Sep 2004 03:45:30 +0000 (03:45 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Wed, 1 Sep 2004 03:45:30 +0000 (03:45 +0000)
* target-def.h (TARGET_CXX): Add TARGET_CXX_EXPORT_CLASS_DATA.
* target.h (cxx): Add export_class_data.
* config/arm/arm.c (arm_cxx_export_class_data): New function.
(TARGET_CXX_EXPORT_CLASS_DATA): Use it.
* testsuite/g++.dg/ext/visibility/arm1.C: New test.

* cp-tree.h (DECL_CONSTRUCTION_VTABLE_P): New macro.
* class.c (build_ctor_vtbl_group): Set DECL_CONSTRUCTION_VTABLE_P.
* decl2.c (determine_visibility): Honor
TARGET_CXX_EXPORT_CLASS_DATA.

* g++.dg/ext/visibility/arm1.C: New test.

From-SVN: r86867

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/bpabi.h
gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/doc/tm.texi
gcc/target-def.h
gcc/target.h
gcc/testsuite/ChangeLog

index 67301eb815748a27a097ff49fa1b9a77096b3cb0..55d646e834de7ee6294aebfa75f04553d6ff42a8 100644 (file)
@@ -1,3 +1,11 @@
+2004-08-31  Mark Mitchell  <mark@codesourcery.com>
+
+       * target-def.h (TARGET_CXX): Add TARGET_CXX_EXPORT_CLASS_DATA.
+       * target.h (cxx): Add export_class_data.
+       * config/arm/arm.c (arm_cxx_export_class_data): New function.
+       (TARGET_CXX_EXPORT_CLASS_DATA): Use it.
+       * testsuite/g++.dg/ext/visibility/arm1.C: New test.
+
 2004-08-31  Kaz Kojima  <kkojima@gcc.gnu.org>
 
        * config/sh/sh.c (output_branch): Check the insn length possibly
index 9d9acb2d39f07279a7cc0014e5ca65f912321f06..52566be805aed0ffa1ad0ade0182498596b27951 100644 (file)
@@ -172,6 +172,8 @@ static bool arm_cxx_guard_mask_bit (void);
 static tree arm_get_cookie_size (tree);
 static bool arm_cookie_has_size (void);
 static bool arm_cxx_cdtor_returns_this (void);
+static bool arm_cxx_key_method_may_be_inline (void);
+static bool arm_cxx_export_class_data (void);
 static void arm_init_libfuncs (void);
 
 \f
@@ -296,6 +298,12 @@ static void arm_init_libfuncs (void);
 #undef TARGET_CXX_CDTOR_RETURNS_THIS
 #define TARGET_CXX_CDTOR_RETURNS_THIS arm_cxx_cdtor_returns_this
 
+#undef TARGET_CXX_KEY_METHOD_MAY_BE_INLINE
+#define TARGET_CXX_KEY_METHOD_MAY_BE_INLINE arm_cxx_key_method_may_be_inline
+
+#undef TARGET_CXX_EXPORT_CLASS_DATA
+#define TARGET_CXX_EXPORT_CLASS_DATA arm_cxx_export_class_data
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Obstack for minipool constant handling.  */
@@ -14204,6 +14212,25 @@ arm_cxx_cdtor_returns_this (void)
   return TARGET_AAPCS_BASED;
 }
 
+/* The EABI says that an inline function may never be the key
+   method.  */
+
+static bool
+arm_cxx_key_method_may_be_inline (void)
+{
+  return !TARGET_AAPCS_BASED;
+}
+
+/* The EABI says that the virtual table, etc., for a class must be
+   exported if it has a key method.  The EABI does not specific the
+   behavior if there is no key method, but there is no harm in
+   exporting the class data in that case too.  */
+
+static bool
+arm_cxx_export_class_data (void)
+{
+  return TARGET_AAPCS_BASED;
+}
 
 void
 arm_set_return_address (rtx source, rtx scratch)
index 4831dfb61bc5203d312efdc05c0152e37b04ffa7..60d6e75b73a8f71bd94e08e67d50b22a095af8ac 100644 (file)
@@ -46,7 +46,7 @@
   "%{static:-Bstatic} %{shared:-shared} %{symbolic:-Bsymbolic} "       \
   "-X"
 
-#if defined (__thumb__) && !defined (__THUMB_INTERWORK) 
+#if defined (__thumb__) && !defined (__THUMB_INTERWORK__
 #define RENAME_LIBRARY_SET ".thumb_set"
 #else
 #define RENAME_LIBRARY_SET ".set"
index 0a0fdfd4ff52fa9933494c354a83f5e11859e18e..929bde0077ec13417a7d7f4af4a676e9c3746663 100644 (file)
@@ -1,5 +1,10 @@
 2004-08-31  Mark Mitchell  <mark@codesourcery.com>
 
+       * cp-tree.h (DECL_CONSTRUCTION_VTABLE_P): New macro.
+       * class.c (build_ctor_vtbl_group): Set DECL_CONSTRUCTION_VTABLE_P.
+       * decl2.c (determine_visibility): Honor 
+       TARGET_CXX_EXPORT_CLASS_DATA.
+
        * class.c (key_method): Rename to ...
        (determine_key_method): ... this.
        (finish_struct_1): Adjust accordingly.
index 84c758788880a0f5a4e5955b8be403d3c5d21c6c..957151d33ebf0d289e5a1fe0aa03942329360c12 100644 (file)
@@ -6996,6 +6996,7 @@ build_ctor_vtbl_group (tree binfo, tree t)
      constructing the addresses of secondary vtables in the
      construction vtable group.  */
   vtbl = build_vtable (t, id, ptr_type_node);
+  DECL_CONSTRUCTION_VTABLE_P (vtbl) = 1;
   list = build_tree_list (vtbl, NULL_TREE);
   accumulate_vtbl_inits (binfo, TYPE_BINFO (TREE_TYPE (binfo)),
                         binfo, t, list);
index a6db55320235ec5a38242760a2d2e8aef6b50a88..35eb3a7766cf3545815ca3a03dea5deb78aa16a8 100644 (file)
@@ -74,6 +74,7 @@ struct diagnostic_context;
    5: C_IS_RESERVED_WORD (in IDENTIFIER_NODE)
       DECL_VTABLE_OR_VTT_P (in VAR_DECL)
    6: IDENTIFIER_REPO_CHOSEN (in IDENTIFIER_NODE)
+      DECL_CONSTRUCTION_VTABLE_P (in VAR_DECL)
 
    Usage of TYPE_LANG_FLAG_?:
    0: TYPE_DEPENDENT_P
@@ -1992,6 +1993,12 @@ struct lang_decl GTY(())
 /* 1 iff VAR_DECL node NODE is virtual table or VTT.  */
 #define DECL_VTABLE_OR_VTT_P(NODE) TREE_LANG_FLAG_5 (VAR_DECL_CHECK (NODE))
 
+/* Returns 1 iff VAR_DECL is a construction virtual table.
+   DECL_VTABLE_OR_VTT_P will be true in this case and must be checked
+   before using this macro.  */
+#define DECL_CONSTRUCTION_VTABLE_P(NODE) \
+  TREE_LANG_FLAG_6 (VAR_DECL_CHECK (NODE))
+
 /* 1 iff NODE is function-local, but for types.  */
 #define LOCAL_CLASS_P(NODE)                            \
   (decl_function_context (TYPE_MAIN_DECL (NODE)) != NULL_TREE)
index d02180a44aff5fac6913268c3394a5a52913ee08..c26d48fe954e1a5afef00b04bb38b91a7f925a07 100644 (file)
@@ -1655,17 +1655,24 @@ determine_visibility (tree decl)
      the visibility of their containing class.  */
   if (class_type)
     {
-      if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
-         && lookup_attribute ("dllexport", TYPE_ATTRIBUTES (class_type)))
+      if (targetm.cxx.export_class_data ()
+         && (DECL_TINFO_P (decl)
+             || (DECL_VTABLE_OR_VTT_P (decl)
+                 /* Construction virtual tables are not emitted
+                    because they cannot be referred to from other
+                    object files; their name is not standardized by
+                    the ABI.  */
+                 && !DECL_CONSTRUCTION_VTABLE_P (decl))))
+       DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
+      else if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+              && lookup_attribute ("dllexport", TYPE_ATTRIBUTES (class_type)))
        {
          DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
          DECL_VISIBILITY_SPECIFIED (decl) = 1;
-         return;
        }
-
-      if (TREE_CODE (decl) == FUNCTION_DECL
-         && DECL_DECLARED_INLINE_P (decl)
-         && visibility_options.inlines_hidden)
+      else if (TREE_CODE (decl) == FUNCTION_DECL
+              && DECL_DECLARED_INLINE_P (decl)
+              && visibility_options.inlines_hidden)
        {
          DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
          DECL_VISIBILITY_SPECIFIED (decl) = 1;
index d1e59cf424a91220a32ee44c4e1d8e2256b3df8c..bba444c0fbe9f675ba2be2fd9e10991392881ac2 100644 (file)
@@ -8538,6 +8538,14 @@ some variants of the ABI, an inline function can never be the key
 method.  The default is to return @code{true}.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_CXX_EXPORT_CLASS_DATA (void)
+If this hook returns false (the default), then virtual tables and RTTI
+data structures will have the ELF visibility of their containing
+class.  If this hook returns true, then these data structures will
+have ELF ``default'' visibility, independently of the visibility of
+the containing class.
+@end deftypefn
+
 @node Misc
 @section Miscellaneous Parameters
 @cindex parameters, miscellaneous
index e49d05584ed2e4a8f1d616838965bc6a2950f55f..3b4c11b069458feb0e21356d113c2a3b33e4758c 100644 (file)
@@ -441,15 +441,20 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #define TARGET_CXX_KEY_METHOD_MAY_BE_INLINE hook_bool_void_true
 #endif
 
-#define TARGET_CXX             \
-  {                            \
-    TARGET_CXX_GUARD_TYPE,     \
-    TARGET_CXX_GUARD_MASK_BIT, \
-    TARGET_CXX_GET_COOKIE_SIZE,        \
-    TARGET_CXX_COOKIE_HAS_SIZE,        \
-    TARGET_CXX_IMPORT_EXPORT_CLASS,    \
-    TARGET_CXX_CDTOR_RETURNS_THIS,     \
-    TARGET_CXX_KEY_METHOD_MAY_BE_INLINE \
+#ifndef TARGET_CXX_EXPORT_CLASS_DATA
+#define TARGET_CXX_EXPORT_CLASS_DATA hook_bool_void_false
+#endif
+
+#define TARGET_CXX                             \
+  {                                            \
+    TARGET_CXX_GUARD_TYPE,                     \
+    TARGET_CXX_GUARD_MASK_BIT,                 \
+    TARGET_CXX_GET_COOKIE_SIZE,                        \
+    TARGET_CXX_COOKIE_HAS_SIZE,                        \
+    TARGET_CXX_IMPORT_EXPORT_CLASS,            \
+    TARGET_CXX_CDTOR_RETURNS_THIS,             \
+    TARGET_CXX_KEY_METHOD_MAY_BE_INLINE,       \
+    TARGET_CXX_EXPORT_CLASS_DATA               \
   }
 
 /* The whole shebang.  */
index 57b38cf25f460de32e51a0083fbc9a4de796094a..035aeed4426863460d6fa638e35e0f5400ee1d4d 100644 (file)
@@ -521,6 +521,10 @@ struct gcc_target
        itself.  Returning true is the behavior required by the Itanium
        C++ ABI.  */
     bool (*key_method_may_be_inline) (void);
+    /* Returns true if all class data (virtual tables, type info,
+       etc.) should be exported from the current DLL, even when the
+       associated class is not exported.  */
+    bool (*export_class_data) (void);
   } cxx;
 
   /* Leave the boolean fields at the end.  */
index 04f794bcea9c73b9077c9d61197c12d833c9a4d2..203f6a6fffd73db7cbf3611f995129a0d3dc43f3 100644 (file)
@@ -1,3 +1,7 @@
+2004-08-31  Mark Mitchell  <mark@codesourcery.com>
+
+       * g++.dg/ext/visibility/arm1.C: New test.
+
 2004-08-31  Geoffrey Keating  <geoffk@apple.com>
 
        * gcc.dg/funcdef-storage-1.c: Add dg-options to suppress