Patchwork Use resolution file, autoconf help needed

login
register
mail settings
Submitter Ralf Wildenhues
Date Oct. 26, 2010, 5:53 p.m.
Message ID <20101026175323.GA13279@gmx.de>
Download mbox | patch
Permalink /patch/69271/
State New
Headers show

Comments

Ralf Wildenhues - Oct. 26, 2010, 5:53 p.m.
Hello Jan,

* Jan Hubicka wrote on Tue, Oct 26, 2010 at 05:25:51PM CEST:
> this patch makes GCC to use LDPR_PREVAILING_DEF_IRONLY.  Plugin
> specification says that all symbols resolved as
> LDPR_PREVAILING_DEF_IRONLY can be removed by the compiler and thus we
> can bring them local.  The patch unfortunately breaks libiberty
> configure since we start to make whole program assumptions by default
> when we know that nothing dynamically binds that leads to optimizing:
> 
> char pstat_getstatic ();
> char (*f) () = pstat_getstatic;
> int
> main ()
> {
>   return f != pstat_getstatic;
> }
> 
> Here we first bring F local, then prove it is read only and the nfold
> f != pstat_getstatic to false.  This makes autoconf to conclude that
> getstatic is available.
> 
> We need to fix the testcase generation by i.e. using volatile var or
> by using test that just calls the function.  I filled in autoconf bug,
> but it probably won't be fixed upstream for this stage 1.
> 
> This is pretty important feature, so I spoke with Richard and we
> concluded that probably we should work around in our autoconf by
> providing our definition of AC_CHECK_FUNC.  I am not sure how to do
> that however, would be there some good soul who can help me?

I already wrote on the bug-autoconf list that this has been fixed in
upstream Autoconf 2.60 already.

I looked more closely now.  The problem is purely libiberty-specific.
It still has an old hunk overriding AC_LANG_FUNC_LINK_TRY(C) in
libiberty/aclocal.m4 (from at a time where it was an improvement over
what Autoconf had).  Just delete that hunk, run autoconf in libiberty,
be done with it.  Below is the full diff, feel free to squash in with
your patch.

Sorry for not seeing that sooner.

Cheers,
Ralf

libiberty/ChangeLog:
2010-10-26  Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>

	* aclocal.m4 (AC_LANG_FUNC_LINK_TRY(C)): Delete.
	* configure: Regenerate.
Paolo Bonzini - Oct. 26, 2010, 6:10 p.m.
On 10/26/2010 07:53 PM, Ralf Wildenhues wrote:
> I already wrote on the bug-autoconf list that this has been fixed in
> upstream Autoconf 2.60 already.
>
> I looked more closely now.  The problem is purely libiberty-specific.
> It still has an old hunk overriding AC_LANG_FUNC_LINK_TRY(C) in
> libiberty/aclocal.m4 (from at a time where it was an improvement over
> what Autoconf had).  Just delete that hunk, run autoconf in libiberty,
> be done with it.  Below is the full diff, feel free to squash in with
> your patch.
>
> Sorry for not seeing that sooner.

I was about to answer the same.

The patch is okay for mainline.

Thanks to both Jan for bringing this to our attention, and Ralf for 
looking at it.

Paolo
Jan Hubicka - Oct. 26, 2010, 6:30 p.m.
Hi,
thanks, I've comitted the change now.  Good to know it is libiberty specific.
I wondered how this issue could have survived in autoconf as I am pretty sure
other compilers do the same optimization.

Honza

Patch

diff --git a/libiberty/aclocal.m4 b/libiberty/aclocal.m4
index 5d050cb..f2091c9 100644
--- a/libiberty/aclocal.m4
+++ b/libiberty/aclocal.m4
@@ -172,52 +172,3 @@  AC_DEFINE_UNQUOTED(STACK_DIRECTION, $ac_cv_c_stack_direction,
         STACK_DIRECTION < 0 => grows toward lower addresses
         STACK_DIRECTION = 0 => direction of growth unknown])
 ])
-
-# AC_LANG_FUNC_LINK_TRY(C)(FUNCTION)
-# ----------------------------------
-# Don't include <ctype.h> because on OSF/1 3.0 it includes
-# <sys/types.h> which includes <sys/select.h> which contains a
-# prototype for select.  Similarly for bzero.
-#
-# This test used to merely assign f=$1 in main(), but that was
-# optimized away by HP unbundled cc A.05.36 for ia64 under +O3,
-# presumably on the basis that there's no need to do that store if the
-# program is about to exit.  Conversely, the AIX linker optimizes an
-# unused external declaration that initializes f=$1.  So this test
-# program has both an external initialization of f, and a use of f in
-# main that affects the exit status.
-#
-m4_define([AC_LANG_FUNC_LINK_TRY(C)],
-[AC_LANG_PROGRAM(
-[/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $1 (); below.
-    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  Under hpux,
-    including <limits.h> includes <sys/time.h> and causes problems
-    checking for functions defined therein.  */
-#if defined (__STDC__) && !defined (_HPUX_SOURCE)
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-/* Override any gcc2 internal prototype to avoid an error.  */
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
-char $1 ();
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$1) || defined (__stub___$1)
-choke me
-#else
-char (*f) () = $1;
-#endif
-#ifdef __cplusplus
-}
-#endif
-], [return f != $1;])])
-
diff --git a/libiberty/configure b/libiberty/configure
index 7579000..142c81c 100755
--- a/libiberty/configure
+++ b/libiberty/configure
@@ -1844,41 +1844,41 @@  else
 fi
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $2 (); below.
     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-    <limits.h> exists even on freestanding compilers.  Under hpux,
-    including <limits.h> includes <sys/time.h> and causes problems
-    checking for functions defined therein.  */
-#if defined (__STDC__) && !defined (_HPUX_SOURCE)
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
 # include <limits.h>
 #else
 # include <assert.h>
 #endif
-/* Override any gcc2 internal prototype to avoid an error.  */
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
 #ifdef __cplusplus
 extern "C"
-{
 #endif
-/* We use char because int might match the return type of a gcc2
-   builtin and then its argument prototype would still apply.  */
 char $2 ();
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
-#if defined (__stub_$2) || defined (__stub___$2)
+#if defined __stub_$2 || defined __stub___$2
 choke me
-#else
-char (*f) () = $2;
-#endif
-#ifdef __cplusplus
-}
 #endif
 
 int
 main ()
 {
-return f != $2;
+return $2 ();
   ;
   return 0;
 }