[libdispatch-changes] [40] trunk

source_changes at macosforge.org source_changes at macosforge.org
Fri Sep 25 02:53:32 PDT 2009


Revision: 40
          http://trac.macosforge.org/projects/libdispatch/changeset/40
Author:   robert at fledge.watson.org
Date:     2009-09-25 02:53:30 -0700 (Fri, 25 Sep 2009)
Log Message:
-----------
Rather than hard-code -march in order to enable gcc built-in atomics on
i386, which caused build problems for other architectures, add configure
support for detecting the requirement.  This proves somewhat subtle: gcc
is sometimes able to partially implement built-in atomics even with
reduced instruction sets and will only fall back to unimplemented library
symbols.  As such, we must specifically not just test for
__sync_add_and_fetch linking, but also with it used with a return value.

Arguably, we should only try -march=i486 on i386 systems.

Submitted by:	Peter O'Gorman (earlier version)

Modified Paths:
--------------
    trunk/configure.ac
    trunk/src/Makefile.am

Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac	2009-09-25 08:44:52 UTC (rev 39)
+++ trunk/configure.ac	2009-09-25 09:53:30 UTC (rev 40)
@@ -109,6 +109,32 @@
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 
 #
+# This is a bit subtle: on i386 systems without at least -march=i486 defined,
+# certain built-in atomics fall back to depending on undefined symbols if
+# their return values are used.
+#
+AC_CACHE_CHECK([for gcc atomic builtins],[dispatch_cv_atomic],
+[AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[
+int i, x =0;
+i = __sync_add_and_fetch(&x,1);
+return x;]])],[dispatch_cv_atomic=yes],
+  [saveCFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -march=i486"
+  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[
+  int i, x =0;
+  i = __sync_add_and_fetch(&x,1);
+  return x;]])],[CFLAGS="$saveCFLAGS"
+dispatch_cv_atomic="-march=i486"
+])])])
+
+case $dispatch_cv_atomic in
+  yes) ;;
+  -march*) MARCH_FLAGS="$dispatch_cv_atomic"
+         AC_SUBST([MARCH_FLAGS]) ;;
+  *) AC_MSG_ERROR([No gcc builtin atomic operations available]) ;;
+esac
+
+#
 # Find libraries we will need
 #
 AC_SEARCH_LIBS(clock_gettime, rt)

Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am	2009-09-25 08:44:52 UTC (rev 39)
+++ trunk/src/Makefile.am	2009-09-25 09:53:30 UTC (rev 40)
@@ -19,13 +19,7 @@
 INCLUDES=-I$(top_builddir) -I$(top_srcdir) \
 	@APPLE_LIBC_SOURCE_PATH@ @APPLE_XNU_SOURCE_PATH@
 
-#
-# This will need some refinement: gcc requires a minimum of -march=i486 on
-# x86 in order to implement built-in atomic operations.  But when should we
-# define this optional argument?  We need appropriate configure parts to make
-# this conditional.
-#
-libdispatch_la_CFLAGS+=-march=i686
+libdispatch_la_CFLAGS+=$(MARCH_FLAGS)
 
 if USE_LEGACY_API
 libdispatch_la_SOURCES+=	\
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-changes/attachments/20090925/623e5524/attachment.html>


More information about the libdispatch-changes mailing list