Fix libiberty link failures in LTO mode for MinGW
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 4 May 2021 10:40:42 +0000 (12:40 +0200)
committerEric Botcazou <ebotcazou@adacore.com>
Tue, 4 May 2021 10:53:21 +0000 (12:53 +0200)
The test for the presence of variables (really symbols) does not work
when you add -Ox -flto to CFLAGS:

  for v in $vars; do
    AC_MSG_CHECKING([for $v])
    AC_CACHE_VAL(libiberty_cv_var_$v,
      [AC_LINK_IFELSE([AC_LANG_PROGRAM([[int *p;]],[[extern int $v [];
                                         p = $v;]])],
                      [eval "libiberty_cv_var_$v=yes"],
                      [eval "libiberty_cv_var_$v=no"])])
    if eval "test \"`echo '$libiberty_cv_var_'$v`\" = yes"; then
      AC_MSG_RESULT(yes)
      AC_DEFINE_UNQUOTED($n)
    else
      AC_MSG_RESULT(no)
    fi
  done

because the assignment to 'p' is optimized away by LTO.  This is visible
on MinGW platforms in the form of a link failure for sys_siglist.

There is another link failures for stpcpy: the symbol is both referenced
by libiberty's pex-win32.c and provided by libiberty's stpcpy.c, so it
needs to have a linkage to be resolved in LTO mode.

libiberty/
* configure.ac: Make test for variables more robust.
* configure: Regenerate.
gcc/
* builtins.c (builtin_with_linkage_p): Return true for stp[n]cpy.
* symtab.c (symtab_node::output_to_lto_symbol_table_p): Tidy up.

gcc/builtins.c
gcc/symtab.c
libiberty/configure
libiberty/configure.ac

index 14cfa57..0db4090 100644 (file)
@@ -14480,8 +14480,8 @@ target_char_cst_p (tree t, char *p)
 }
 
 /* Return true if the builtin DECL is implemented in a standard library.
-   Otherwise returns false which doesn't guarantee it is not (thus the list of
-   handled builtins below may be incomplete).  */
+   Otherwise return false which doesn't guarantee it is not (thus the list
+   of handled builtins below may be incomplete).  */
 
 bool
 builtin_with_linkage_p (tree decl)
@@ -14560,6 +14560,14 @@ builtin_with_linkage_p (tree decl)
       CASE_FLT_FN (BUILT_IN_TRUNC):
       CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC):
        return true;
+
+      case BUILT_IN_STPCPY:
+      case BUILT_IN_STPNCPY:
+       /* stpcpy is both referenced in libiberty's pex-win32.c and provided
+          by libiberty's stpcpy.c for MinGW targets so we need to return true
+          in order to be able to build libiberty in LTO mode for them.  */
+       return true;
+
       default:
        break;
     }
index 2135b34..8c4cb70 100644 (file)
@@ -2526,10 +2526,7 @@ symtab_node::output_to_lto_symbol_table_p (void)
         in libraries so make sure to output references into the symbol table to
         make those libraries referenced.  Note this is incomplete handling for
         now and only covers math functions.  */
-      if (builtin_with_linkage_p (decl))
-       return true;
-      else
-       return false;
+      return builtin_with_linkage_p (decl);
     }
 
   /* We have real symbol that should be in symbol table.  However try to trim
index fc0c953..57498d8 100755 (executable)
@@ -7049,11 +7049,11 @@ else
 fi
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-int *p;
+extern int $v [];
 int
 main ()
 {
-extern int $v []; p = $v;
+if ($v [0]) return 1;
   ;
   return 0;
 }
index ad95296..3c03f24 100644 (file)
@@ -665,7 +665,7 @@ if test -z "${setobjs}"; then
   for v in $vars; do
     AC_MSG_CHECKING([for $v])
     AC_CACHE_VAL(libiberty_cv_var_$v,
-      [AC_LINK_IFELSE([AC_LANG_PROGRAM([[int *p;]],[[extern int $v []; p = $v;]])],
+      [AC_LINK_IFELSE([AC_LANG_PROGRAM([[extern int $v [];]],[[if ($v [0]) return 1;]])],
                      [eval "libiberty_cv_var_$v=yes"],
                      [eval "libiberty_cv_var_$v=no"])])
     if eval "test \"`echo '$libiberty_cv_var_'$v`\" = yes"; then