gcc: new fvisibility-ms-compat option

Obtained from:	gcc 4.3 (rev. 126088; GPLv2)
MFC after:	3 weeks
This commit is contained in:
Pedro F. Giffuni 2013-12-08 03:02:44 +00:00
parent a8e2866ccd
commit 5dab84a07c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=259092
6 changed files with 68 additions and 0 deletions

View File

@ -45,6 +45,12 @@
* flags.h (force_align_functions_log): Delete.
* toplev.c (force_align_functions_log): Delete.
2007-06-28 Geoffrey Keating <geoffk@apple.com> (r126088)
* doc/invoke.texi (C++ Dialect Options): Document
fvisibility-ms-compat.
* c.opt (fvisibility-ms-compat): New.
2007-06-05 Joerg Wunsch <j.gnu@uriah.heep.sax.de> (r125346)
PR preprocessor/23479

View File

@ -741,6 +741,10 @@ fvisibility-inlines-hidden
C++ ObjC++
Marks all inlined methods as having hidden visibility
fvisibility-ms-compat
C++ ObjC++ Var(flag_visibility_ms_compat)
Changes visibility to match Microsoft Visual Studio by default
fvtable-gc
C++ ObjC++
Discard unused virtual functions

View File

@ -7,6 +7,13 @@
* typeck.c (cxx_alignof_expr): When alignof is used on a plain
FUNCTION_DECL, return its alignment.
2007-06-28 Geoffrey Keating <geoffk@apple.com> (r126088)
* decl2.c (determine_visibility): Implement
flag_visibility_ms_compat effect on type info.
* decl.c (cxx_init_decl_processing): Implement
global effect of flag_visibility_ms_compat.
2007-06-28 Geoffrey Keating <geoffk@apple.com> (r126080)
* decl2.c (start_objects): Mark constructor-runnning function

View File

@ -3157,6 +3157,9 @@ cxx_init_decl_processing (void)
}
if (flag_inline_functions)
flag_inline_trees = 2;
if (flag_visibility_ms_compat)
default_visibility = VISIBILITY_HIDDEN;
/* Initially, C. */
current_lang_name = lang_name_c;

View File

@ -1726,6 +1726,19 @@ determine_visibility (tree decl)
but have no TEMPLATE_INFO, so don't try to check it. */
use_template = 0;
}
else if (TREE_CODE (decl) == VAR_DECL && DECL_TINFO_P (decl)
&& flag_visibility_ms_compat)
{
/* Under -fvisibility-ms-compat, types are visible by default,
even though their contents aren't. */
tree underlying_type = TREE_TYPE (DECL_NAME (decl));
int underlying_vis = type_visibility (underlying_type);
if (underlying_vis == VISIBILITY_ANON
|| CLASSTYPE_VISIBILITY_SPECIFIED (underlying_type))
constrain_visibility (decl, underlying_vis);
else
DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
}
else if (TREE_CODE (decl) == VAR_DECL && DECL_TINFO_P (decl))
{
/* tinfo visibility is based on the type it's for. */

View File

@ -186,6 +186,7 @@ in the following sections.
-frepo -fno-rtti -fstats -ftemplate-depth-@var{n} @gol
-fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ @gol
-fno-default-inline -fvisibility-inlines-hidden @gol
-fvisibility-ms-compat @gol
-Wabi -Wctor-dtor-privacy @gol
-Wnon-virtual-dtor -Wreorder @gol
-Weffc++ -Wno-deprecated -Wstrict-null-sentinel @gol
@ -1626,6 +1627,40 @@ Explicitly instantiated inline methods are unaffected by this option
as their linkage might otherwise cross a shared library boundary.
@xref{Template Instantiation}.
@item -fvisibility-ms-compat
@opindex fvisibility-ms-compat
This flag attempts to use visibility settings to make GCC's C++
linkage model compatible with that of Microsoft Visual Studio.
The flag makes these changes to GCC's linkage model:
@enumerate
@item
It sets the default visibility to @code{hidden}, like
@option{-fvisibility=hidden}.
@item
Types, but not their members, are not hidden by default.
@item
The One Definition Rule is relaxed for types without explicit
visibility specifications which are defined in more than one different
shared object: those declarations are permitted if they would have
been permitted when this option was not used.
@end enumerate
In new code it is better to use @option{-fvisibility=hidden} and
export those classes which are intended to be externally visible.
Unfortunately it is possible for code to rely, perhaps accidentally,
on the Visual Studio behaviour.
Among the consequences of these changes are that static data members
of the same type with the same name but defined in different shared
objects will be different, so changing one will not change the other;
and that pointers to function members defined in different shared
objects may not compare equal. When this flag is given, it is a
violation of the ODR to define types with the same name differently.
@item -fno-weak
@opindex fno-weak
Do not use weak symbol support, even if it is provided by the linker.