1 dnl ----------------------------------------------------------------------
2 dnl This whole bit snagged from libgfortran.
4 dnl Check whether the target supports __sync_*_compare_and_swap.
5 AC_DEFUN([LIBITM_CHECK_SYNC_BUILTINS], [
6 AC_CACHE_CHECK([whether the target supports __sync_*_compare_and_swap],
7 libitm_cv_have_sync_builtins, [
8 AC_TRY_LINK([], [int foo, bar; bar = __sync_val_compare_and_swap(&foo, 0, 1);],
9 libitm_cv_have_sync_builtins=yes, libitm_cv_have_sync_builtins=no)])
10 if test $libitm_cv_have_sync_builtins = yes; then
11 AC_DEFINE(HAVE_SYNC_BUILTINS, 1,
12 [Define to 1 if the target supports __sync_*_compare_and_swap])
15 dnl Check whether the target supports 64-bit __sync_*_compare_and_swap.
16 AC_DEFUN([LIBITM_CHECK_64BIT_SYNC_BUILTINS], [
17 AC_CACHE_CHECK([whether the target supports 64-bit __sync_*_compare_and_swap],
18 libitm_cv_have_64bit_sync_builtins, [
19 AC_TRY_LINK([#include <stdint.h>],
21 bar = __sync_val_compare_and_swap(&foo, 0, 1);],
22 libitm_cv_have_64bit_sync_builtins=yes,
23 libitm_cv_have_64bit_sync_builtins=no)])
24 if test $libitm_cv_have_64bit_sync_builtins = yes; then
25 AC_DEFINE(HAVE_64BIT_SYNC_BUILTINS, 1,
26 [Define to 1 if the target supports 64-bit __sync_*_compare_and_swap])
29 dnl Check whether the target supports hidden visibility.
30 AC_DEFUN([LIBITM_CHECK_ATTRIBUTE_VISIBILITY], [
31 AC_CACHE_CHECK([whether the target supports hidden visibility],
32 libitm_cv_have_attribute_visibility, [
34 CFLAGS="$CFLAGS -Werror"
35 AC_TRY_COMPILE([void __attribute__((visibility("hidden"))) foo(void) { }],
36 [], libitm_cv_have_attribute_visibility=yes,
37 libitm_cv_have_attribute_visibility=no)
38 CFLAGS="$save_CFLAGS"])
39 if test $libitm_cv_have_attribute_visibility = yes; then
40 AC_DEFINE(HAVE_ATTRIBUTE_VISIBILITY, 1,
41 [Define to 1 if the target supports __attribute__((visibility(...))).])
44 dnl Check whether the target supports dllexport
45 AC_DEFUN([LIBITM_CHECK_ATTRIBUTE_DLLEXPORT], [
46 AC_CACHE_CHECK([whether the target supports dllexport],
47 libitm_cv_have_attribute_dllexport, [
49 CFLAGS="$CFLAGS -Werror"
50 AC_TRY_COMPILE([void __attribute__((dllexport)) foo(void) { }],
51 [], libitm_cv_have_attribute_dllexport=yes,
52 libitm_cv_have_attribute_dllexport=no)
53 CFLAGS="$save_CFLAGS"])
54 if test $libitm_cv_have_attribute_dllexport = yes; then
55 AC_DEFINE(HAVE_ATTRIBUTE_DLLEXPORT, 1,
56 [Define to 1 if the target supports __attribute__((dllexport)).])
59 dnl Check whether the target supports symbol aliases.
60 AC_DEFUN([LIBITM_CHECK_ATTRIBUTE_ALIAS], [
61 AC_CACHE_CHECK([whether the target supports symbol aliases],
62 libitm_cv_have_attribute_alias, [
65 extern void bar(void) __attribute__((alias("foo")));],
66 [bar();], libitm_cv_have_attribute_alias=yes, libitm_cv_have_attribute_alias=no)])
67 if test $libitm_cv_have_attribute_alias = yes; then
68 AC_DEFINE(HAVE_ATTRIBUTE_ALIAS, 1,
69 [Define to 1 if the target supports __attribute__((alias(...))).])
72 dnl Check how size_t is mangled.
73 AC_DEFUN([LIBITM_CHECK_SIZE_T_MANGLING], [
74 AC_CACHE_CHECK([how size_t is mangled],
75 libitm_cv_size_t_mangling, [
76 AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned long x;],
77 [libitm_cv_size_t_mangling=m], [
78 AC_TRY_COMPILE([], [extern __SIZE_TYPE__ x; extern unsigned int x;],
79 [libitm_cv_size_t_mangling=j], [
81 [extern __SIZE_TYPE__ x; extern unsigned long long x;],
82 [libitm_cv_size_t_mangling=y], [
84 [extern __SIZE_TYPE__ x; extern unsigned short x;],
85 [libitm_cv_size_t_mangling=t],
86 [libitm_cv_size_t_mangling=x])
91 if test $libitm_cv_size_t_mangling = x; then
92 AC_MSG_ERROR([Unknown underlying type for size_t])
94 AC_DEFINE_UNQUOTED(MANGLE_SIZE_T, [$libitm_cv_size_t_mangling],
95 [Define to the letter to which size_t is mangled.])
98 dnl Check if as supports AVX instructions.
99 AC_DEFUN([LIBITM_CHECK_AS_AVX], [
100 case "${target_cpu}" in
101 i[[34567]]86 | x86_64)
102 AC_CACHE_CHECK([if the assembler supports AVX], libitm_cv_as_avx, [
103 AC_TRY_COMPILE([], [asm("vzeroupper");],
104 [libitm_cv_as_avx=yes], [libitm_cv_as_avx=no])
106 if test x$libitm_cv_as_avx = xyes; then
107 AC_DEFINE(HAVE_AS_AVX, 1, [Define to 1 if the assembler supports AVX.])
112 dnl Check if as supports RTM instructions.
113 AC_DEFUN([LIBITM_CHECK_AS_RTM], [
114 case "${target_cpu}" in
115 i[[34567]]86 | x86_64)
116 AC_CACHE_CHECK([if the assembler supports RTM], libitm_cv_as_rtm, [
117 AC_TRY_COMPILE([], [asm("1: xbegin 1b; xend");],
118 [libitm_cv_as_rtm=yes], [libitm_cv_as_rtm=no])
120 if test x$libitm_cv_as_rtm = xyes; then
121 AC_DEFINE(HAVE_AS_RTM, 1, [Define to 1 if the assembler supports RTM.])
126 sinclude(../libtool.m4)
127 dnl The lines below arrange for aclocal not to bring an installed
128 dnl libtool.m4 into aclocal.m4, while still arranging for automake to
129 dnl add a definition of LIBTOOL to Makefile.in.
130 ifelse(,,,[AC_SUBST(LIBTOOL)
131 AC_DEFUN([AM_PROG_LIBTOOL])
132 AC_DEFUN([AC_LIBTOOL_DLOPEN])
133 AC_DEFUN([AC_PROG_LD])
136 dnl ----------------------------------------------------------------------
137 dnl This whole bit snagged from libstdc++-v3.
141 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING)
142 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c)
143 dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER)
145 dnl See docs/html/17_intro/configury.html#enable for documentation.
147 m4_define([LIBITM_ENABLE],[dnl
148 m4_define([_g_switch],[--enable-$1])dnl
149 m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl
150 AC_ARG_ENABLE($1,_g_help,
155 m4_bpatsubst([$5],[permit ])) ;;
156 *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;;
157 dnl Idea for future: generate a URL pointing to
158 dnl "onlinedocs/configopts.html#whatever"
165 *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;;
169 [enable_]m4_bpatsubst([$1],-,_)[=][$2])
170 m4_undefine([_g_switch])dnl
171 m4_undefine([_g_help])dnl
176 dnl If GNU ld is in use, check to see if tricky linker opts can be used. If
177 dnl the native linker is in use, all variables will be defined to something
178 dnl safe (like an empty string).
181 dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible
182 dnl OPT_LDFLAGS='-Wl,-O1' if possible
183 dnl LD (as a side effect of testing)
186 dnl libitm_ld_is_gold (possibly)
187 dnl libitm_gnu_ld_version (possibly)
189 dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will
190 dnl set libitm_gnu_ld_version to 12345. Zeros cause problems.
192 AC_DEFUN([LIBITM_CHECK_LINKER_FEATURES], [
193 # If we're not using GNU ld, then there's no point in even trying these
194 # tests. Check for that first. We should have already tested for gld
195 # by now (in libtool), but require it now just to be safe...
196 test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS=''
197 test -z "$OPT_LDFLAGS" && OPT_LDFLAGS=''
198 AC_REQUIRE([AC_PROG_LD])
199 AC_REQUIRE([AC_PROG_AWK])
201 # The name set by libtool depends on the version of libtool. Shame on us
202 # for depending on an impl detail, but c'est la vie. Older versions used
203 # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on
204 # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually
205 # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't
206 # set (hence we're using an older libtool), then set it.
207 if test x${with_gnu_ld+set} != xset; then
208 if test x${ac_cv_prog_gnu_ld+set} != xset; then
209 # We got through "ac_require(ac_prog_ld)" and still not set? Huh?
212 with_gnu_ld=$ac_cv_prog_gnu_ld
216 # Start by getting the version number. I think the libtool test already
217 # does some of this, but throws away the result.
219 if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then
220 libitm_ld_is_gold=yes
223 ldver=`$LD --version 2>/dev/null |
224 sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'`
226 libitm_gnu_ld_version=`echo $ldver | \
227 $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
230 if test "$with_gnu_ld" = "notbroken"; then
231 # GNU ld it is! Joy and bunny rabbits!
233 # All these tests are for C++; save the language and the compiler flags.
234 # Need to do this so that g++ won't try to link in libstdc++
235 ac_test_CFLAGS="${CFLAGS+set}"
236 ac_save_CFLAGS="$CFLAGS"
237 CFLAGS='-x c++ -Wl,--gc-sections'
239 # Check for -Wl,--gc-sections
240 # XXX This test is broken at the moment, as symbols required for linking
241 # are now in libsupc++ (not built yet). In addition, this test has
242 # cored on solaris in the past. In addition, --gc-sections doesn't
243 # really work at the moment (keeps on discarding used sections, first
244 # .eh_frame and now some of the glibc sections for iconv).
245 # Bzzzzt. Thanks for playing, maybe next time.
246 AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
254 ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes])
255 if test "$ac_test_CFLAGS" = set; then
256 CFLAGS="$ac_save_CFLAGS"
258 # this is the suspicious part
261 if test "$ac_sectionLDflags" = "yes"; then
262 SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS"
264 AC_MSG_RESULT($ac_sectionLDflags)
267 # Set linker optimization flags.
268 if test x"$with_gnu_ld" = x"yes"; then
269 OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS"
272 AC_SUBST(SECTION_LDFLAGS)
273 AC_SUBST(OPT_LDFLAGS)
278 dnl Check if the linker used supports linker maps to clear hardware
279 dnl capabilities. This is only supported by Sun ld at the moment.
282 dnl HWCAP_LDFLAGS='-Wl,-M,clearcap.map' if possible
283 dnl LD (as a side effect of testing)
285 AC_DEFUN([LIBITM_CHECK_LINKER_HWCAP], [
286 test -z "$HWCAP_LDFLAGS" && HWCAP_LDFLAGS=''
287 AC_REQUIRE([AC_PROG_LD])
289 ac_save_LDFLAGS="$LDFLAGS"
290 LDFLAGS="$LFLAGS -Wl,-M,$srcdir/clearcap.map"
292 AC_MSG_CHECKING([for ld that supports -Wl,-M,mapfile])
293 AC_TRY_LINK([], [return 0;], [ac_hwcap_ldflags=yes],[ac_hwcap_ldflags=no])
294 if test "$ac_hwcap_ldflags" = "yes"; then
295 HWCAP_LDFLAGS="-Wl,-M,$srcdir/clearcap.map $HWCAP_LDFLAGS"
297 AC_MSG_RESULT($ac_hwcap_ldflags)
299 LDFLAGS="$ac_save_LDFLAGS"
301 AC_SUBST(HWCAP_LDFLAGS)
303 AM_CONDITIONAL(HAVE_HWCAP, test $ac_hwcap_ldflags != no)
308 dnl Add version tags to symbols in shared library (or not), additionally
309 dnl marking other symbols as private/local (or not).
311 dnl --enable-symvers=style adds a version script to the linker call when
312 dnl creating the shared library. The choice of version script is
313 dnl controlled by 'style'.
314 dnl --disable-symvers does not.
315 dnl + Usage: LIBITM_ENABLE_SYMVERS[(DEFAULT)]
316 dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to
317 dnl choose a default style based on linker characteristics. Passing
318 dnl 'no' disables versioning.
320 AC_DEFUN([LIBITM_ENABLE_SYMVERS], [
322 LIBITM_ENABLE(symvers,yes,[=STYLE],
323 [enables symbol versioning of the shared library],
324 [permit yes|no|gnu*|sun])
326 # If we never went through the LIBITM_CHECK_LINKER_FEATURES macro, then we
327 # don't know enough about $LD to do tricks...
328 AC_REQUIRE([LIBITM_CHECK_LINKER_FEATURES])
330 # Turn a 'yes' into a suitable default.
331 if test x$enable_symvers = xyes ; then
332 # FIXME The following test is too strict, in theory.
333 if test $enable_shared = no || test "x$LD" = x; then
336 if test $with_gnu_ld = yes ; then
340 # Sun symbol versioning exists since Solaris 2.5.
341 solaris2.[[5-9]]* | solaris2.1[[0-9]]*)
342 enable_symvers=sun ;;
350 # Check if 'sun' was requested on non-Solaris 2 platforms.
351 if test x$enable_symvers = xsun ; then
358 AC_MSG_WARN([=== You have requested Sun symbol versioning, but])
359 AC_MSG_WARN([=== you are not targetting Solaris 2.])
360 AC_MSG_WARN([=== Symbol versioning will be disabled.])
366 # Check to see if libgcc_s exists, indicating that shared libgcc is possible.
367 if test $enable_symvers != no; then
368 AC_MSG_CHECKING([for shared libgcc])
369 ac_save_CFLAGS="$CFLAGS"
371 AC_TRY_LINK(, [return 0;], libitm_shared_libgcc=yes, libitm_shared_libgcc=no)
372 CFLAGS="$ac_save_CFLAGS"
373 if test $libitm_shared_libgcc = no; then
374 cat > conftest.c <<EOF
375 int main (void) { return 0; }
378 libitm_libgcc_s_suffix=`${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS \
379 -shared -shared-libgcc -o conftest.so \
380 conftest.c -v 2>&1 >/dev/null \
381 | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'`
383 rm -f conftest.c conftest.so
384 if test x${libitm_libgcc_s_suffix+set} = xset; then
385 CFLAGS=" -lgcc_s$libitm_libgcc_s_suffix"
386 AC_TRY_LINK(, [return 0;], libitm_shared_libgcc=yes)
387 CFLAGS="$ac_save_CFLAGS"
390 AC_MSG_RESULT($libitm_shared_libgcc)
393 # For GNU ld, we need at least this version. The format is described in
394 # LIBITM_CHECK_LINKER_FEATURES above.
395 libitm_min_gnu_ld_version=21400
396 # XXXXXXXXXXX libitm_gnu_ld_version=21390
398 # Check to see if unspecified "yes" value can win, given results above.
399 # Change "yes" into either "no" or a style name.
400 if test $enable_symvers != no && test $libitm_shared_libgcc = yes; then
401 if test $with_gnu_ld = yes; then
402 if test $libitm_gnu_ld_version -ge $libitm_min_gnu_ld_version ; then
404 elif test $libitm_ld_is_gold = yes ; then
407 # The right tools, the right setup, but too old. Fallbacks?
408 AC_MSG_WARN(=== Linker version $libitm_gnu_ld_version is too old for)
409 AC_MSG_WARN(=== full symbol versioning support in this release of GCC.)
410 AC_MSG_WARN(=== You would need to upgrade your binutils to version)
411 AC_MSG_WARN(=== $libitm_min_gnu_ld_version or later and rebuild GCC.)
412 if test $libitm_gnu_ld_version -ge 21200 ; then
413 # Globbing fix is present, proper block support is not.
414 dnl AC_MSG_WARN([=== Dude, you are soooo close. Maybe we can fake it.])
415 dnl enable_symvers=???
416 AC_MSG_WARN([=== Symbol versioning will be disabled.])
420 AC_MSG_WARN([=== Symbol versioning will be disabled.])
424 elif test $enable_symvers = sun; then
425 : All interesting versions of Sun ld support sun style symbol versioning.
428 AC_MSG_WARN([=== You have requested some kind of symbol versioning, but])
429 AC_MSG_WARN([=== either you are not using a supported linker, or you are])
430 AC_MSG_WARN([=== not building a shared libgcc_s (which is required).])
431 AC_MSG_WARN([=== Symbol versioning will be disabled.])
436 AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB, test $enable_symvers != no)
437 AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu)
438 AM_CONDITIONAL(LIBITM_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun)
439 AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers)