OSDN Git Service

* decl2.c (determine_visibility): Allow class visibility
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Sep 2004 23:18:19 +0000 (23:18 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Sep 2004 23:18:19 +0000 (23:18 +0000)
directives to override targetm.cxx.export_class_data.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@87735 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl2.c

index 7cb83b5..c94a8cc 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-19  Mark Mitchell  <mark@codesourcery.com>
+
+       * decl2.c (determine_visibility): Allow class visibility
+       directives to override targetm.cxx.export_class_data.
+
 2004-09-18  Kazu Hirata  <kazu@cs.umass.edu>
 
        * call.c, semantics.c: Follow spelling conventions.
index 92233c7..c6b8f51 100644 (file)
@@ -1655,18 +1655,8 @@ determine_visibility (tree decl)
      the visibility of their containing class.  */
   if (class_type)
     {
-      if (TREE_CODE (decl) == VAR_DECL
-         && 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)))
+      if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+         && lookup_attribute ("dllexport", TYPE_ATTRIBUTES (class_type)))
        {
          DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
          DECL_VISIBILITY_SPECIFIED (decl) = 1;
@@ -1678,11 +1668,28 @@ determine_visibility (tree decl)
          DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
          DECL_VISIBILITY_SPECIFIED (decl) = 1;
        }
+      else if (CLASSTYPE_VISIBILITY_SPECIFIED (class_type))
+       {
+         DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
+         DECL_VISIBILITY_SPECIFIED (decl) = 1;
+       }
+      /* If no explicit visibility information has been provided for
+        this class, some targets require that class data be
+        exported.  */
+      else if (TREE_CODE (decl) == VAR_DECL
+              && 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
        {
          DECL_VISIBILITY (decl) = CLASSTYPE_VISIBILITY (class_type);
-         DECL_VISIBILITY_SPECIFIED (decl)
-           = CLASSTYPE_VISIBILITY_SPECIFIED (class_type);
+         DECL_VISIBILITY_SPECIFIED (decl) = 0;
        }
     }
 }