diff options
author | Mark Mitchell <mark@codesourcery.com> | 2004-09-19 23:18:19 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2004-09-19 23:18:19 +0000 |
commit | 5bd916325a042777aa2fc925818c6f514979505f (patch) | |
tree | 577a94bc0d146df6b1608a58c7009c59ed67479d /gcc/cp/decl2.c | |
parent | 6775f1f3a749256c99544d13f7ea581edba6a585 (diff) | |
download | gcc-5bd916325a042777aa2fc925818c6f514979505f.zip gcc-5bd916325a042777aa2fc925818c6f514979505f.tar.gz gcc-5bd916325a042777aa2fc925818c6f514979505f.tar.bz2 |
decl2.c (determine_visibility): Allow class visibility directives to override targetm.cxx.export_class_data.
* decl2.c (determine_visibility): Allow class visibility
directives to override targetm.cxx.export_class_data.
[[Split portion of a mixed commit.]]
From-SVN: r87735.2
Diffstat (limited to 'gcc/cp/decl2.c')
-rw-r--r-- | gcc/cp/decl2.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 92233c7..c6b8f51 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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; } } } |