Disconnect -Wabi=<n> from -fabi-compat-version=<n>.
authorJason Merrill <jason@redhat.com>
Tue, 22 Sep 2015 15:18:26 +0000 (11:18 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 22 Sep 2015 15:18:26 +0000 (11:18 -0400)
gcc/c-family/
* 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.
gcc/cp/
* 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.

From-SVN: r228017

gcc/c-family/ChangeLog
gcc/c-family/c-common.c
gcc/c-family/c-common.h
gcc/c-family/c-opts.c
gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/doc/invoke.texi

index 5fa1a727c374d8838a5a3d84ef1e00ada5ba77c9..bccbbfaffc6188864203d93afd3a3f5fddcf955f 100644 (file)
@@ -1,3 +1,11 @@
+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.
index 4b922bfbce1b3fafd65e1499c369b334cc7bff10..879f4db86b1ad2c3699fc4dac9fea81c32c09b00 100644 (file)
@@ -239,6 +239,9 @@ const char *constant_string_class_name;
 
 /* 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.  */
index 74d1bc149e3b2cfc7b0b34ec1ea0e4da7b78417e..0b4d993c3c9cbaac40c027a29df2cfb3776c1b0b 100644 (file)
@@ -648,14 +648,24 @@ extern const char *constant_string_class_name;
 
 /* 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.  */
 
index f358b62a908aca29d8478bd5dc408b452cfb0aa7..bf2e6b07e07e162f84148ef2cdcddb3dcac0298b 100644 (file)
@@ -397,7 +397,9 @@ c_common_handle_option (size_t scode, const char *arg, int value,
          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:
@@ -870,6 +872,14 @@ c_common_post_options (const char **pfilename)
   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");
@@ -877,13 +887,9 @@ c_common_post_options (const char **pfilename)
     }
   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
index 279d2f1acd4555c0f8b58fc46a89dcabd8ee522f..e9a21f42eb3d988975cba07f79eafde3e5b768c4 100644 (file)
@@ -1,3 +1,9 @@
+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.
index 2640d522034b06c6645877b799e867785cde3735..248d280a3fd76c1949a3621784e236cef8e716d2 100644 (file)
@@ -94,6 +94,11 @@ along with GCC; see the file COPYING3.  If not see
        || (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
@@ -829,7 +834,7 @@ write_name (tree decl, const int ignore_local_scope)
 
   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;
@@ -1918,7 +1923,7 @@ write_type (tree type)
            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
@@ -2027,7 +2032,7 @@ write_type (tree type)
                   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))
@@ -2073,7 +2078,7 @@ write_type (tree type)
                }
              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;
@@ -2110,7 +2115,7 @@ write_type (tree type)
 
                  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))
                        {
@@ -2135,7 +2140,7 @@ write_type (tree type)
              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;
 
@@ -2207,7 +2212,7 @@ write_CV_qualifiers_for_type (const tree type)
              && !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))
        {
@@ -2747,7 +2752,7 @@ write_expression (tree expr)
              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');
@@ -2989,7 +2994,7 @@ write_expression (tree expr)
       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;
@@ -3063,7 +3068,7 @@ write_expression (tree expr)
        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.  */
 
@@ -3200,7 +3205,7 @@ write_template_arg (tree node)
     {
       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;
     }
@@ -3214,7 +3219,7 @@ write_template_arg (tree node)
        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));
@@ -3238,7 +3243,7 @@ write_template_arg (tree node)
        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');
@@ -3627,32 +3632,41 @@ mangle_decl (const tree decl)
        }
 
       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;
     }
 }
 
index 5525e59849217c262fef4648319d745703a63421..f0b7cc4089e6a666816960ea0d64dde19de156bf 100644 (file)
@@ -2130,6 +2130,13 @@ scope.
 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}
@@ -2139,10 +2146,15 @@ works around mangling changes by creating an alias with the correct
 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
@@ -2555,13 +2567,25 @@ have meanings only for C++ programs:
 @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,
@@ -2573,13 +2597,7 @@ You should rewrite your code to avoid these warnings if you are
 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
@@ -2631,7 +2649,24 @@ When mangling a function type with function-cv-qualifiers, the
 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