+2015-09-22 Jason Merrill <jason@redhat.com>
+
+ * c-common.h (abi_compat_version_crosses): New.
+ (warn_abi_version): Declare.
+ * c-common.c: Define it.
+ * c-opts.c (c_common_post_options): Handle it.
+ flag_abi_compat_version defaults to 8.
+
2015-09-21 Ville Voutilainen <ville.voutilainen@gmail.com>
Complete the implementation of N4230, Nested namespace definition.
/* C++ language option variables. */
+/* The reference version of the ABI for -Wabi. */
+
+int warn_abi_version = -1;
/* Nonzero means generate separate instantiation control files and
juggle them at link time. */
/* C++ language option variables. */
+/* The reference version of the ABI for -Wabi. */
+
+extern int warn_abi_version;
/* Return TRUE if one of {flag_abi_version,flag_abi_compat_version} is
- less than N and the other is at least N, for use by -Wabi. */
-#define abi_version_crosses(N) \
+ less than N and the other is at least N. */
+#define abi_compat_version_crosses(N) \
(abi_version_at_least(N) \
!= (flag_abi_compat_version == 0 \
|| flag_abi_compat_version >= (N)))
+/* Return TRUE if one of {flag_abi_version,warn_abi_version} is
+ less than N and the other is at least N, for use by -Wabi. */
+#define abi_version_crosses(N) \
+ (abi_version_at_least(N) \
+ != (warn_abi_version == 0 \
+ || warn_abi_version >= (N)))
+
/* Nonzero means generate separate instantiation control files and
juggle them at link time. */
warning (0, "%<-Wabi=1%> is not supported, using =2");
value = 2;
}
- flag_abi_compat_version = value;
+ warn_abi_version = value;
+ if (flag_abi_compat_version == -1)
+ flag_abi_compat_version = value;
break;
case OPT_fcanonical_system_headers:
if (flag_declone_ctor_dtor == -1)
flag_declone_ctor_dtor = optimize_size;
+ if (warn_abi_version == -1)
+ {
+ if (flag_abi_compat_version != -1)
+ warn_abi_version = flag_abi_compat_version;
+ else
+ warn_abi_version = 0;
+ }
+
if (flag_abi_compat_version == 1)
{
warning (0, "%<-fabi-compat-version=1%> is not supported, using =2");
}
else if (flag_abi_compat_version == -1)
{
- /* Generate compatibility aliases for ABI v2 (3.4-4.9) by default. */
- flag_abi_compat_version = (flag_abi_version == 0 ? 2 : 0);
-
- /* But don't warn about backward compatibility unless explicitly
- requested with -Wabi=n. */
- if (flag_abi_version == 0)
- warn_abi = false;
+ /* Generate compatibility aliases for ABI v8 (5.1) by default. */
+ flag_abi_compat_version
+ = (flag_abi_version == 0 ? 8 : 0);
}
/* Change flag_abi_version to be the actual current ABI level for the
+2015-09-22 Jason Merrill <jason@redhat.com>
+
+ * mangle.c (abi_warn_or_compat_version_crosses): New.
+ Use it instead of abi_version_crosses.
+ (mangle_decl): Deal with -fabi-compat-version and -Wabi separately.
+
2015-09-21 Ville Voutilainen <ville.voutilainen@gmail.com>
Complete the implementation of N4230, Nested namespace definition.
|| (CLASSTYPE_TEMPLATE_INFO (NODE) != NULL \
&& (PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (NODE))))))
+/* For deciding whether to set G.need_abi_warning, we need to consider both
+ warn_abi_version and flag_abi_compat_version. */
+#define abi_warn_or_compat_version_crosses(N) \
+ (abi_version_crosses (N) || abi_compat_version_crosses (N))
+
/* Things we only need one of. This module is not reentrant. */
struct GTY(()) globals {
/* An array of the current substitution candidates, in the order
gcc_assert (context != NULL_TREE);
- if (abi_version_crosses (7)
+ if (abi_warn_or_compat_version_crosses (7)
&& ignore_local_scope
&& TREE_CODE (context) == PARM_DECL)
G.need_abi_warning = 1;
write_function_type (t);
else
write_type (t);
- if (abi_version_crosses (8))
+ if (abi_warn_or_compat_version_crosses (8))
G.need_abi_warning = 1;
}
else
but you can't have a pointer/reference to such a type. */
if (TREE_CODE (target) == FUNCTION_TYPE)
{
- if (abi_version_crosses (5)
+ if (abi_warn_or_compat_version_crosses (5)
&& TYPE_QUALS (target) != TYPE_UNQUALIFIED)
G.need_abi_warning = 1;
if (abi_version_at_least (5))
}
else
write_string ("U8__vector");
- if (abi_version_crosses (4))
+ if (abi_warn_or_compat_version_crosses (4))
G.need_abi_warning = 1;
write_type (TREE_TYPE (type));
break;
if (etype && !type_uses_auto (etype))
{
- if (abi_version_crosses (5))
+ if (abi_warn_or_compat_version_crosses (5))
G.need_abi_warning = 1;
if (!abi_version_at_least (5))
{
write_string ("Dn");
if (abi_version_at_least (7))
++is_builtin_type;
- if (abi_version_crosses (7))
+ if (abi_warn_or_compat_version_crosses (7))
G.need_abi_warning = 1;
break;
&& !is_attribute_p ("abi_tag", name))
vec.safe_push (a);
}
- if (abi_version_crosses (10) && !vec.is_empty ())
+ if (abi_warn_or_compat_version_crosses (10) && !vec.is_empty ())
G.need_abi_warning = true;
if (abi_version_at_least (10))
{
write_char ('L');
write_unsigned_number (delta - 1);
}
- if (abi_version_crosses (5))
+ if (abi_warn_or_compat_version_crosses (5))
G.need_abi_warning = true;
}
write_char ('p');
if (code == CONST_CAST_EXPR
|| code == STATIC_CAST_EXPR)
{
- if (abi_version_crosses (6))
+ if (abi_warn_or_compat_version_crosses (6))
G.need_abi_warning = 1;
if (!abi_version_at_least (6))
name = operator_name_info[CAST_EXPR].mangled_name;
case PREDECREMENT_EXPR:
if (abi_version_at_least (6))
write_char ('_');
- if (abi_version_crosses (6))
+ if (abi_warn_or_compat_version_crosses (6))
G.need_abi_warning = 1;
/* Fall through. */
{
if (abi_version_at_least (6))
node = BASELINK_FUNCTIONS (node);
- if (abi_version_crosses (6))
+ if (abi_warn_or_compat_version_crosses (6))
/* We wrongly wrapped a class-scope function in X/E. */
G.need_abi_warning = 1;
}
write_char ('J');
else
write_char ('I');
- if (abi_version_crosses (6))
+ if (abi_warn_or_compat_version_crosses (6))
G.need_abi_warning = 1;
for (i = 0; i < length; ++i)
write_template_arg (TREE_VEC_ELT (args, i));
write_char ('Z');
else
write_string ("_Z");
- if (abi_version_crosses (3))
+ if (abi_warn_or_compat_version_crosses (3))
G.need_abi_warning = 1;
write_encoding (node);
write_char ('E');
}
save_ver = flag_abi_version;
+
flag_abi_version = flag_abi_compat_version;
id2 = mangle_decl_string (decl);
id2 = targetm.mangle_decl_assembler_name (decl, id2);
- flag_abi_version = save_ver;
- if (id2 == id)
- return;
+ if (id2 != id)
+ note_mangling_alias (decl, id2);
if (warn_abi)
{
- if (flag_abi_compat_version != 0
- && abi_version_at_least (flag_abi_compat_version))
+ if (flag_abi_compat_version != warn_abi_version)
+ {
+ flag_abi_version = warn_abi_version;
+ id2 = mangle_decl_string (decl);
+ id2 = targetm.mangle_decl_assembler_name (decl, id2);
+ }
+
+ if (id2 == id)
+ /* OK. */;
+ else if (warn_abi_version != 0
+ && abi_version_at_least (warn_abi_version))
warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi,
"the mangled name of %qD changed between "
"-fabi-version=%d (%D) and -fabi-version=%d (%D)",
- G.entity, flag_abi_compat_version, id2,
+ G.entity, warn_abi_version, id2,
flag_abi_version, id);
else
warning_at (DECL_SOURCE_LOCATION (G.entity), OPT_Wabi,
"the mangled name of %qD changes between "
"-fabi-version=%d (%D) and -fabi-version=%d (%D)",
G.entity, flag_abi_version, id,
- flag_abi_compat_version, id2);
+ warn_abi_version, id2);
}
- note_mangling_alias (decl, id2);
+ flag_abi_version = save_ver;
}
}
Version 8, which first appeared in G++ 4.9, corrects the substitution
behavior of function types with function-cv-qualifiers.
+Version 9, which first appeared in G++ 5.2, corrects the alignment of
+@code{nullptr_t}.
+
+Version 10, which first appeared in G++ 6.1, adds mangling of
+attributes that affect type identity, such as ia32 calling convention
+attributes (e.g. @samp{stdcall}).
+
See also @option{-Wabi}.
@item -fabi-compat-version=@var{n}
mangled name when defining a symbol with an incorrect mangled name.
This switch specifies which ABI version to use for the alias.
-With @option{-fabi-version=0} (the default), this defaults to 2. If
-another ABI version is explicitly selected, this defaults to 0.
+With @option{-fabi-version=0} (the default), this defaults to 8 (GCC 5
+compatibility). If another ABI version is explicitly selected, this
+defaults to 0. For compatibility with GCC versions 3.2 through 4.9,
+use @option{-fabi-compat-version=2}.
-The compatibility version is also set by @option{-Wabi=@var{n}}.
+If this option is not provided but @option{-Wabi=@var{n}} is, that
+version is used for compatibility aliases. If this option is provided
+along with @option{-Wabi} (without the version), the version from this
+option is used for the warning.
@item -fno-access-control
@opindex fno-access-control
@item -Wabi @r{(C, Objective-C, C++ and Objective-C++ only)}
@opindex Wabi
@opindex Wno-abi
-When an explicit @option{-fabi-version=@var{n}} option is used, causes
-G++ to warn when it generates code that is probably not compatible with the
-vendor-neutral C++ ABI@. Since G++ now defaults to
-@option{-fabi-version=0}, @option{-Wabi} has no effect unless either
-an older ABI version is selected (with @option{-fabi-version=@var{n}})
-or an older compatibility version is selected (with
-@option{-Wabi=@var{n}} or @option{-fabi-compat-version=@var{n}}).
+Warn when G++ it generates code that is probably not compatible with
+the vendor-neutral C++ ABI@. Since G++ now defaults to updating the
+ABI with each major release, normally @option{-Wabi} will warn only if
+there is a check added later in a release series for an ABI issue
+discovered since the initial release. @option{-Wabi} will warn about
+more things if an older ABI version is selected (with
+@option{-fabi-version=@var{n}}).
+
+@option{-Wabi} can also be used with an explicit version number to
+warn about compatibility with a particular @option{-fabi-version}
+level, e.g. @option{-Wabi=2} to warn about changes relative to
+@option{-fabi-version=2}.
+
+If an explicit version number is provided and
+@option{-fabi-compat-version} is not specified, the version number
+from this option is used for compatibility aliases. If no explicit
+version number is provided with this option, but
+@option{-fabi-compat-version} is specified, that version number is
+used for ABI warnings.
Although an effort has been made to warn about
all such cases, there are probably some cases that are not warned about,
concerned about the fact that code generated by G++ may not be binary
compatible with code generated by other compilers.
-@option{-Wabi} can also be used with an explicit version number to
-warn about compatibility with a particular @option{-fabi-version}
-level, e.g. @option{-Wabi=2} to warn about changes relative to
-@option{-fabi-version=2}. Specifying a version number also sets
-@option{-fabi-compat-version=@var{n}}.
-
-The known incompatibilities in @option{-fabi-version=2} (which was the
+Known incompatibilities in @option{-fabi-version=2} (which was the
default from GCC 3.4 to 4.9) include:
@itemize @bullet
un-qualified function type was incorrectly treated as a substitution
candidate.
-This was fixed in @option{-fabi-version=8}.
+This was fixed in @option{-fabi-version=8}, the default for GCC 5.1.
+
+@item
+@code{decltype(nullptr)} incorrectly had an alignment of 1, leading to
+unaligned accesses. Note that this did not affect the ABI of a
+function with a @code{nullptr_t} parameter, as parameters have a
+minimum alignment.
+
+This was fixed in @option{-fabi-version=9}, the default for GCC 5.2.
+
+@item
+Target-specific attributes that affect the identity of a type, such as
+ia32 calling conventions on a function type (stdcall, regparm, etc.),
+did not affect the mangled name, leading to name collisions when
+function pointers were used as template arguments.
+
+This was fixed in @option{-fabi-version=10}, the default for GCC 6.1.
+
@end itemize
It also warns about psABI-related changes. The known psABI changes at this