1 dnl GMP specific autoconf macros
4 dnl Copyright 2000-2006, 2009, 2011, 2013-2015 Free Software Foundation, Inc.
6 dnl This file is part of the GNU MP Library.
8 dnl The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl it under the terms of either:
11 dnl * the GNU Lesser General Public License as published by the Free
12 dnl Software Foundation; either version 3 of the License, or (at your
13 dnl option) any later version.
17 dnl * the GNU General Public License as published by the Free Software
18 dnl Foundation; either version 2 of the License, or (at your option) any
21 dnl or both in parallel, as here.
23 dnl The GNU MP Library is distributed in the hope that it will be useful, but
24 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
25 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
28 dnl You should have received copies of the GNU General Public License and the
29 dnl GNU Lesser General Public License along with the GNU MP Library. If not,
30 dnl see https://www.gnu.org/licenses/.
33 dnl Some tests use, or must delete, the default compiler output. The
34 dnl possible filenames are based on what autoconf looks for, namely
36 dnl a.out - normal unix style
37 dnl b.out - i960 systems, including gcc there
39 dnl a_out.exe - OpenVMS DEC C called via GNV wrapper (gnv.sourceforge.net)
40 dnl conftest.exe - various DOS compilers
44 [[ia64*-*-* | itanium-*-* | itanium2-*-*]])
46 dnl Need to be careful not to match m6811, m6812, m68hc11 and m68hc12, all
47 dnl of which config.sub accepts. (Though none of which are likely to work
51 [[m68k-*-* | m68[0-9][0-9][0-9]-*-*]])
53 define(POWERPC64_PATTERN,
54 [[powerpc64-*-* | powerpc64le-*-* | powerpc620-*-* | powerpc630-*-* | powerpc970-*-* | power[3-9]-*-*]])
57 [[s390-*-* | z900esa-*-* | z990esa-*-* | z9esa-*-* | z10esa-*-* | z196esa-*-*]])
60 [[s390x-*-* | z900-*-* | z990-*-* | z9-*-* | z10-*-* | z196-*-*]])
63 [[i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-* | geode*-*-* | atom-*-*]])
65 define(X86_64_PATTERN,
66 [[athlon64-*-* | k8-*-* | k10-*-* | bobcat-*-* | jaguar*-*-* | bulldozer*-*-* | piledriver*-*-* | steamroller*-*-* | excavator*-*-* | pentium4-*-* | atom-*-* | silvermont-*-* | goldmont-*-* | core2-*-* | corei*-*-* | x86_64-*-* | nano-*-* | nehalem*-*-* | westmere*-*-* | sandybridge*-*-* | ivybridge*-*-* | haswell*-*-* | broadwell*-*-* | skylake*-*-* | kabylake*-*-*]])
68 dnl GMP_FAT_SUFFIX(DSTVAR, DIRECTORY)
69 dnl ---------------------------------
70 dnl Emit code to set shell variable DSTVAR to the suffix for a fat binary
71 dnl routine from DIRECTORY. DIRECTORY can be a shell expression like $foo
74 dnl The suffix is directory separators / or \ changed to underscores, and
75 dnl if there's more than one directory part, then the first is dropped.
81 dnl x86/k6/mmx -> k6_mmx
83 define(GMP_FAT_SUFFIX,
84 [[$1=`echo $2 | sed -e '/\//s:^[^/]*/::' -e 's:[\\/]:_:g'`]])
87 dnl GMP_REMOVE_FROM_LIST(listvar,item)
88 dnl ----------------------------------
89 dnl Emit code to remove any occurrence of ITEM from $LISTVAR. ITEM can be a
90 dnl shell expression like $foo if desired.
92 define(GMP_REMOVE_FROM_LIST,
93 [remove_from_list_tmp=
94 for remove_from_list_i in $[][$1]; do
95 if test $remove_from_list_i = [$2]; then :;
97 remove_from_list_tmp="$remove_from_list_tmp $remove_from_list_i"
100 [$1]=$remove_from_list_tmp
104 dnl GMP_STRIP_PATH(subdir)
105 dnl ----------------------
106 dnl Strip entries */subdir from $path and $fat_path.
108 define(GMP_STRIP_PATH,
109 [GMP_STRIP_PATH_VAR(path, [$1])
110 GMP_STRIP_PATH_VAR(fat_path, [$1])
113 define(GMP_STRIP_PATH_VAR,
118 *) tmp_path="$tmp_path $i" ;;
125 dnl GMP_INCLUDE_GMP_H
126 dnl -----------------
127 dnl Expand to the right way to #include gmp-h.in. This must be used
128 dnl instead of gmp.h, since that file isn't generated until the end of the
131 dnl Dummy value for GMP_LIMB_BITS is enough
132 dnl for all current configure-time uses of gmp.h.
134 define(GMP_INCLUDE_GMP_H,
135 [[#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */
136 #define GMP_NAIL_BITS $GMP_NAIL_BITS
137 #define GMP_LIMB_BITS 123
139 #include "$srcdir/gmp-h.in"]
143 dnl GMP_HEADER_GETVAL(NAME,FILE)
144 dnl ----------------------------
145 dnl Expand at autoconf time to the value of a "#define NAME" from the given
146 dnl FILE. The regexps here aren't very rugged, but are enough for gmp.
147 dnl /dev/null as a parameter prevents a hang if $2 is accidentally omitted.
149 define(GMP_HEADER_GETVAL,
151 esyscmd([grep "^#define $1 " $2 /dev/null 2>/dev/null]),
159 dnl The gmp version number, extracted from the #defines in gmp-h.in at
160 dnl autoconf time. Two digits like 3.0 if patchlevel <= 0, or three digits
161 dnl like 3.0.1 if patchlevel > 0.
164 [GMP_HEADER_GETVAL(__GNU_MP_VERSION,gmp-h.in)[]dnl
165 .GMP_HEADER_GETVAL(__GNU_MP_VERSION_MINOR,gmp-h.in)[]dnl
166 .GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp-h.in)])
169 dnl GMP_SUBST_CHECK_FUNCS(func,...)
170 dnl ------------------------------
171 dnl Setup an AC_SUBST of HAVE_FUNC_01 for each argument.
173 AC_DEFUN([GMP_SUBST_CHECK_FUNCS],
175 [_GMP_SUBST_CHECK_FUNCS(ac_cv_func_[$1],HAVE_[]m4_translit([$1],[a-z],[A-Z])_01)
176 GMP_SUBST_CHECK_FUNCS(m4_shift($@))])])
178 dnl Called: _GMP_SUBST_CHECK_FUNCS(cachevar,substvar)
179 AC_DEFUN([_GMP_SUBST_CHECK_FUNCS],
181 yes) AC_SUBST([$2],1) ;;
187 dnl GMP_SUBST_CHECK_HEADERS(foo.h,...)
188 dnl ----------------------------------
189 dnl Setup an AC_SUBST of HAVE_FOO_H_01 for each argument.
191 AC_DEFUN([GMP_SUBST_CHECK_HEADERS],
193 [_GMP_SUBST_CHECK_HEADERS(ac_cv_header_[]m4_translit([$1],[./],[__]),
194 HAVE_[]m4_translit([$1],[a-z./],[A-Z__])_01)
195 GMP_SUBST_CHECK_HEADERS(m4_shift($@))])])
197 dnl Called: _GMP_SUBST_CHECK_HEADERS(cachevar,substvar)
198 AC_DEFUN([_GMP_SUBST_CHECK_HEADERS],
200 yes) AC_SUBST([$2],1) ;;
206 dnl GMP_COMPARE_GE(A1,B1, A2,B2, ...)
207 dnl ---------------------------------
208 dnl Compare two version numbers A1.A2.etc and B1.B2.etc. Set
209 dnl $gmp_compare_ge to yes or no according to the result. The A parts
210 dnl should be variables, the B parts fixed numbers. As many parts as
211 dnl desired can be included. An empty string in an A part is taken to be
212 dnl zero, the B parts should be non-empty and non-zero.
216 dnl GMP_COMPARE($major,10, $minor,3, $subminor,1)
218 dnl would test whether $major.$minor.$subminor is greater than or equal to
221 AC_DEFUN([GMP_COMPARE_GE],
223 GMP_COMPARE_GE_INTERNAL($@)
226 AC_DEFUN([GMP_COMPARE_GE_INTERNAL],
228 [if test -n "$1" && test "$1" -ge $2; then
231 [if test -n "$1"; then
232 if test "$1" -gt $2; then
235 if test "$1" -eq $2; then
236 GMP_COMPARE_GE_INTERNAL(m4_shift(m4_shift($@)))
245 dnl GMP additions to $AR.
247 dnl A cross-"ar" may be necessary when cross-compiling since the build
248 dnl system "ar" might try to interpret the object files to build a symbol
249 dnl table index, hence the use of AC_CHECK_TOOL.
251 dnl A user-selected $AR is always left unchanged. AC_CHECK_TOOL is still
252 dnl run to get the "checking" message printed though.
254 dnl If extra flags are added to AR, then ac_cv_prog_AR and
255 dnl ac_cv_prog_ac_ct_AR are set too, since libtool (cvs 2003-03-31 at
256 dnl least) will do an AC_CHECK_TOOL and that will AR from one of those two
257 dnl cached variables. (ac_cv_prog_AR is used if there's an ac_tool_prefix,
258 dnl or ac_cv_prog_ac_ct_AR is used otherwise.) FIXME: This is highly
259 dnl dependent on autoconf internals, perhaps it'd work to put our extra
260 dnl flags into AR_FLAGS instead.
262 dnl $AR_FLAGS is set to "cq" rather than leaving it to libtool "cru". The
263 dnl latter fails when libtool goes into piecewise mode and is unlucky
264 dnl enough to have two same-named objects in separate pieces, as happens
265 dnl for instance to random.o (and others) on vax-dec-ultrix4.5. Naturally
266 dnl a user-selected $AR_FLAGS is left unchanged.
268 dnl For reference, $ARFLAGS is used by automake (1.8) for its ".a" archive
269 dnl file rules. This doesn't get used by the piecewise linking, so we
270 dnl leave it at the default "cru".
272 dnl FIXME: Libtool 1.5.2 has its own arrangements for "cq", but that version
273 dnl is broken in other ways. When we can upgrade, remove the forcible
276 AC_DEFUN([GMP_PROG_AR],
277 [dnl Want to establish $AR before libtool initialization.
278 AC_BEFORE([$0],[AC_PROG_LIBTOOL])
280 AC_CHECK_TOOL(AR, ar, ar)
281 if test -z "$gmp_user_AR"; then
282 eval arflags=\"\$ar${abi1}_flags\"
283 test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\"
284 if test -n "$arflags"; then
285 AC_MSG_CHECKING([for extra ar flags])
287 ac_cv_prog_AR="$AR $arflags"
288 ac_cv_prog_ac_ct_AR="$AR $arflags"
289 AC_MSG_RESULT([$arflags])
292 if test -z "$AR_FLAGS"; then
300 dnl Find a working m4, either in $PATH or likely locations, and setup $M4
301 dnl and an AC_SUBST accordingly. If $M4 is already set then it's a user
302 dnl choice and is accepted with no checks. GMP_PROG_M4 is like
303 dnl AC_PATH_PROG or AC_CHECK_PROG, but tests each m4 found to see if it's
306 dnl See mpn/asm-defs.m4 for details on the known bad m4s.
308 AC_DEFUN([GMP_PROG_M4],
309 [AC_ARG_VAR(M4,[m4 macro processor])
310 AC_CACHE_CHECK([for suitable m4],
312 [if test -n "$M4"; then
315 cat >conftest.m4 <<\EOF
316 dnl Must protect this against being expanded during autoconf m4!
317 dnl Dont put "dnl"s in this as autoconf will flag an error for unexpanded
319 [define(dollarhash,``$][#'')ifelse(dollarhash(x),1,`define(t1,Y)',
320 ``bad: $][# not supported (SunOS /usr/bin/m4)
321 '')ifelse(eval(89),89,`define(t2,Y)',
322 `bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4)
323 ')ifelse(eval(9,9),10,`define(t3,Y)',
324 `bad: eval() doesnt support radix in eval (FreeBSD 8.x,9.0,9.1,9.2 m4)
325 ')ifelse(t1`'t2`'t3,YYY,`good
328 dnl ' <- balance the quotes for emacs sh-mode
329 echo "trying m4" >&AC_FD_CC
330 gmp_tmp_val=`(m4 conftest.m4) 2>&AC_FD_CC`
331 echo "$gmp_tmp_val" >&AC_FD_CC
332 if test "$gmp_tmp_val" = good; then
335 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
336 dnl $ac_dummy forces splitting on constant user-supplied paths.
337 dnl POSIX.2 word splitting is done only on the output of word expansions,
338 dnl not every word. This closes a longstanding sh security hole.
339 ac_dummy="$PATH:/usr/5bin"
340 for ac_dir in $ac_dummy; do
341 test -z "$ac_dir" && ac_dir=.
342 echo "trying $ac_dir/m4" >&AC_FD_CC
343 gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC`
344 echo "$gmp_tmp_val" >&AC_FD_CC
345 if test "$gmp_tmp_val" = good; then
346 gmp_cv_prog_m4="$ac_dir/m4"
351 if test -z "$gmp_cv_prog_m4"; then
352 AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).])
362 dnl GMP_M4_M4WRAP_SPURIOUS
363 dnl ----------------------
364 dnl Check for spurious output from m4wrap(), as described in mpn/asm-defs.m4.
366 dnl The following systems have been seen with the problem.
368 dnl - Unicos alpha, but its assembler doesn't seem to mind.
369 dnl - MacOS X Darwin, its assembler fails.
370 dnl - NetBSD 1.4.1 m68k, and gas 1.92.3 there gives a warning and ignores
371 dnl the bad last line since it doesn't have a newline.
372 dnl - NetBSD 1.4.2 alpha, but its assembler doesn't seem to mind.
375 dnl Enhancement: Maybe this could be in GMP_PROG_M4, and attempt to prefer
376 dnl an m4 with a working m4wrap, if it can be found.
378 AC_DEFUN([GMP_M4_M4WRAP_SPURIOUS],
379 [AC_REQUIRE([GMP_PROG_M4])
380 AC_CACHE_CHECK([if m4wrap produces spurious output],
381 gmp_cv_m4_m4wrap_spurious,
382 [# hide the d-n-l from autoconf's error checking
384 cat >conftest.m4 <<EOF
385 [changequote({,})define(x,)m4wrap({x})$tmp_d_n_l]
387 echo test input is >&AC_FD_CC
388 cat conftest.m4 >&AC_FD_CC
389 tmp_chars=`$M4 conftest.m4 | wc -c`
390 echo produces $tmp_chars chars output >&AC_FD_CC
392 if test $tmp_chars = 0; then
393 gmp_cv_m4_m4wrap_spurious=no
395 gmp_cv_m4_m4wrap_spurious=yes
398 GMP_DEFINE_RAW(["define(<M4WRAP_SPURIOUS>,<$gmp_cv_m4_m4wrap_spurious>)"])
404 dnl GMP additions to libtool AC_PROG_NM.
406 dnl Note that if AC_PROG_NM can't find a working nm it still leaves
407 dnl $NM set to "nm", so $NM can't be assumed to actually work.
409 dnl A user-selected $NM is always left unchanged. AC_PROG_NM is still run
410 dnl to get the "checking" message printed though.
412 dnl Perhaps it'd be worthwhile checking that nm works, by running it on an
413 dnl actual object file. For instance on sparcv9 solaris old versions of
414 dnl GNU nm don't recognise 64-bit objects. Checking would give a better
415 dnl error message than just a failure in later tests like GMP_ASM_W32 etc.
417 dnl On the other hand it's not really normal autoconf practice to take too
418 dnl much trouble over detecting a broken set of tools. And libtool doesn't
419 dnl do anything at all for say ranlib or strip. So for now we're inclined
420 dnl to just demand that the user provides a coherent environment.
422 AC_DEFUN([GMP_PROG_NM],
423 [dnl Make sure we're the first to call AC_PROG_NM, so our extra flags are
424 dnl used by everyone.
425 AC_BEFORE([$0],[AC_PROG_NM])
429 # FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool
430 # defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this
431 # case run it again to try the native "nm", firstly so that likely locations
432 # are searched, secondly so that -B or -p are added if necessary for BSD
433 # format. This is necessary for instance on OSF with "./configure
434 # --build=alphaev5-dec-osf --host=alphaev6-dec-osf".
436 if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then
437 $as_unset lt_cv_path_NM
438 gmp_save_ac_tool_prefix=$ac_tool_prefix
442 ac_tool_prefix=$gmp_save_ac_tool_prefix
445 if test -z "$gmp_user_NM"; then
446 eval nmflags=\"\$nm${abi1}_flags\"
447 test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\"
448 if test -n "$nmflags"; then
449 AC_MSG_CHECKING([for extra nm flags])
451 AC_MSG_RESULT([$nmflags])
457 dnl GMP_PROG_CC_WORKS(cc+cflags,[ACTION-IF-WORKS][,ACTION-IF-NOT-WORKS])
458 dnl --------------------------------------------------------------------
459 dnl Check if cc+cflags can compile and link.
461 dnl This test is designed to be run repeatedly with different cc+cflags
462 dnl selections, so the result is not cached.
464 dnl For a native build, meaning $cross_compiling == no, we require that the
465 dnl generated program will run. This is the same as AC_PROG_CC does in
466 dnl _AC_COMPILER_EXEEXT_WORKS, and checking here will ensure we don't pass
467 dnl a CC/CFLAGS combination that it rejects.
469 dnl sparc-*-solaris2.7 can compile ABI=64 but won't run it if the kernel
470 dnl was booted in 32-bit mode. The effect of requiring the compiler output
471 dnl will run is that a plain native "./configure" falls back on ABI=32, but
472 dnl ABI=64 is still available as a cross-compile.
474 dnl The various specific problems we try to detect are done in separate
475 dnl compiles. Although this is probably a bit slower than one test
476 dnl program, it makes it easy to indicate the problem in AC_MSG_RESULT,
477 dnl hence giving the user a clue about why we rejected the compiler.
479 AC_DEFUN([GMP_PROG_CC_WORKS],
480 [AC_MSG_CHECKING([compiler $1])
481 gmp_prog_cc_works=yes
483 # first see a simple "main()" works, then go on to other checks
484 GMP_PROG_CC_WORKS_PART([$1], [])
486 GMP_PROG_CC_WORKS_PART([$1], [function pointer return],
487 [/* The following provokes an internal error from gcc 2.95.2 -mpowerpc64
488 (without -maix64), hence detecting an unusable compiler */
489 void *g() { return (void *) 0; }
490 void *f() { return g(); }
493 GMP_PROG_CC_WORKS_PART([$1], [cmov instruction],
494 [/* The following provokes an invalid instruction syntax from i386 gcc
495 -march=pentiumpro on Solaris 2.8. The native sun assembler
496 requires a non-standard syntax for cmov which gcc (as of 2.95.2 at
497 least) doesn't know. */
499 int cmov () { return (n >= 0 ? n : 0); }
502 GMP_PROG_CC_WORKS_PART([$1], [double -> ulong conversion],
503 [/* The following provokes a linker invocation problem with gcc 3.0.3
504 on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630
505 option causes gcc to incorrectly select the 32-bit libgcc.a, not
506 the 64-bit one, and consequently it misses out on the __fixunsdfdi
507 helper (double -> uint64 conversion). */
509 unsigned long gcc303 () { return (unsigned long) d; }
512 GMP_PROG_CC_WORKS_PART([$1], [double negation],
513 [/* The following provokes an error from hppa gcc 2.95 under -mpa-risc-2-0 if
514 the assembler doesn't know hppa 2.0 instructions. fneg is a 2.0
515 instruction, and a negation like this comes out using it. */
517 unsigned long fneg () { return -fneg_data; }
520 GMP_PROG_CC_WORKS_PART([$1], [double -> float conversion],
521 [/* The following makes gcc 3.3 -march=pentium4 generate an SSE2 xmm insn
522 (cvtsd2ss) which will provoke an error if the assembler doesn't recognise
523 those instructions. Not sure how much of the gmp code will come out
524 wanting sse2, but it's easiest to reject an option we know is bad. */
526 float ftod () { return (float) ftod_data; }
529 GMP_PROG_CC_WORKS_PART([$1], [gnupro alpha ev6 char spilling],
530 [/* The following provokes an internal compiler error from gcc version
531 "2.9-gnupro-99r1" under "-O2 -mcpu=ev6", apparently relating to char
532 values being spilled into floating point registers. The problem doesn't
533 show up all the time, but has occurred enough in GMP for us to reject
534 this compiler+flags. */
535 #include <string.h> /* for memcpy */
540 long d0, d1, d2, d3, d4, d5, d6;
543 struct try_t param[6];
548 memcpy (p, ¶m[ 2 ], sizeof (*p));
549 memcpy (p, ¶m[ 2 ], sizeof (*p));
551 memcpy (p, ¶m[ 1 ], sizeof (*p));
554 memcpy (p, ¶m[ 3 ], sizeof (*p));
557 memcpy (p, ¶m[ 4 ], sizeof (*p));
558 memcpy (p, ¶m[ 4 ], sizeof (*p));
560 memcpy (p, ¶m[ 5 ], sizeof (*p));
561 memcpy (p, ¶m[ 5 ], sizeof (*p));
562 memcpy (p, ¶m[ 5 ], sizeof (*p));
567 # __builtin_alloca is not available everywhere, check it exists before
568 # seeing that it works
569 GMP_PROG_CC_WORKS_PART_TEST([$1],[__builtin_alloca availability],
570 [int k; int foo () { __builtin_alloca (k); }],
571 [GMP_PROG_CC_WORKS_PART([$1], [alloca array],
572 [/* The following provokes an internal compiler error from Itanium HP-UX cc
573 under +O2 or higher. We use this sort of code in mpn/generic/mul_fft.c. */
578 a = __builtin_alloca (k);
579 for (i = 0; i <= k; i++)
580 a[i] = __builtin_alloca (1 << i);
584 GMP_PROG_CC_WORKS_PART([$1], [abs int -> double conversion],
585 [/* The following provokes an internal error from the assembler on
586 power2-ibm-aix4.3.1.0. gcc -mrios2 compiles to nabs+fcirz, and this
587 results in "Internal error related to the source program domain".
589 For reference it seems to be the combination of nabs+fcirz which is bad,
590 not either alone. This sort of thing occurs in mpz/get_str.c with the
591 way double chars_per_bit_exactly is applied in MPN_SIZEINBASE. Perhaps
592 if that code changes to a scaled-integer style then we won't need this
600 a = (x >= 0 ? x : -x);
605 GMP_PROG_CC_WORKS_PART([$1], [long long reliability test 1],
606 [/* The following provokes a segfault in the compiler on powerpc-apple-darwin.
607 Extracted from tests/mpn/t-iord_u.c. Causes Apple's gcc 3.3 build 1640 and
608 1666 to segfault with e.g., -O2 -mpowerpc64. */
610 #if defined (__GNUC__) && ! defined (__cplusplus)
611 typedef unsigned long long t1;typedef t1*t2;
614 static __inline__ t1 e(t2 rp,t2 up,int n,t1 v0)
615 {t1 c,x,r;int i;if(v0){c=1;for(i=1;i<n;i++){x=up[i];r=x+1;rp[i]=r;}}return c;}
616 void f(){static const struct{t1 n;t1 src[9];t1 want[9];}d[]={{1,{0},{1}},};t1 got[9];int i;
617 for(i=0;i<1;i++){if(e(got,got,9,d[i].n)==0)h();g(i,d[i].src,d[i].n,got,d[i].want,9);if(d[i].n)h();}}
623 GMP_PROG_CC_WORKS_PART([$1], [long long reliability test 2],
624 [/* The following provokes an internal compiler error on powerpc-apple-darwin.
625 Extracted from mpz/cfdiv_q_2exp.c. Causes Apple's gcc 3.3 build 1640 and
626 1666 to get an ICE with -O1 -mpowerpc64. */
628 #if defined (__GNUC__) && ! defined (__cplusplus)
630 void f(int u){int i;long long x;x=u?~0:0;if(x)for(i=0;i<9;i++);x&=g();if(x)g();}
637 GMP_PROG_CC_WORKS_PART([$1], [freebsd hacked gcc],
638 [/* Provokes an ICE on i386-freebsd with the FreeBSD-hacked gcc, under
639 -O2 -march=amdfam10. We call helper functions here "open" and "close" in
640 order for linking to succeed. */
642 #if defined (__GNUC__) && ! defined (__cplusplus)
643 int open(int*,int*,int);void*close(int);void g(int*rp,int*up,int un){
644 __builtin_expect(un<=0x7f00,1)?__builtin_alloca(un):close(un);if(__builtin_clzl
645 (up[un])){open(rp,up,un);while(1){if(rp[un-1]!=0)break;un--;}}}
651 GMP_PROG_CC_WORKS_PART_MAIN([$1], [mpn_lshift_com optimization],
652 [/* The following is mis-compiled by HP ia-64 cc version
653 cc: HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]
654 under "cc +O3", both in +DD32 and +DD64 modes. The mpn_lshift_com gets
655 inlined and its return value somehow botched to be 0 instead of 1. This
656 arises in the real mpn_lshift_com in mul_fft.c. A lower optimization
657 level, like +O2 seems ok. This code needs to be run to show the problem,
658 but that's fine, the offending cc is a native-only compiler so we don't
659 have to worry about cross compiling. */
661 #if ! defined (__cplusplus)
663 lshift_com (rp, up, n, cnt)
669 unsigned long retval, high_limb, low_limb;
672 tnc = 8 * sizeof (unsigned long) - cnt;
674 retval = low_limb >> tnc;
675 high_limb = low_limb << cnt;
676 for (i = n - 1; i != 0; i--)
679 *rp++ = ~(high_limb | (low_limb >> tnc));
680 high_limb = low_limb << cnt;
687 unsigned long cy, rp[2], up[2];
690 cy = lshift_com (rp, up, 2L, 1);
704 GMP_PROG_CC_WORKS_PART_MAIN([$1], [mpn_lshift_com optimization 2],
705 [/* The following is mis-compiled by Intel ia-64 icc version 1.8 under
706 "icc -O3", After several calls, the function writes partial garbage to
707 the result vector. Perhaps relates to the chk.a.nc insn. This code needs
708 to be run to show the problem, but that's fine, the offending cc is a
709 native-only compiler so we don't have to worry about cross compiling. */
711 #if ! defined (__cplusplus)
714 lshift_com (rp, up, n, cnt)
720 unsigned long high_limb, low_limb;
725 tnc = 8 * sizeof (unsigned long) - cnt;
727 high_limb = low_limb << cnt;
728 for (i = n - 1; i != 0; i--)
731 *--rp = ~(high_limb | (low_limb >> tnc));
732 high_limb = low_limb << cnt;
739 unsigned long *r, *r2;
740 unsigned long a[88 + 1];
742 for (i = 0; i < 88 + 1; i++)
744 r = malloc (10000 * sizeof (unsigned long));
746 for (i = 0; i < 528; i += 23)
749 i / (8 * sizeof (unsigned long)) + 1,
750 i % (8 * sizeof (unsigned long)));
753 if (r[2048] != 0 || r[2049] != 0 || r[2050] != 0 || r[2051] != 0 ||
754 r[2052] != 0 || r[2053] != 0 || r[2054] != 0)
769 # A certain _GLOBAL_OFFSET_TABLE_ problem in past versions of gas, tickled
770 # by recent versions of gcc.
772 if test "$gmp_prog_cc_works" = yes; then
775 # this problem only arises in PIC code, so don't need to test when
776 # --disable-shared. We don't necessarily have $enable_shared set to
777 # yes at this point, it will still be unset for the default (which is
778 # yes); hence the use of "!= no".
779 if test "$enable_shared" != no; then
780 GMP_PROG_CC_X86_GOT_EAX_EMITTED([$1],
781 [GMP_ASM_X86_GOT_EAX_OK([$1],,
782 [gmp_prog_cc_works="no, bad gas GOT with eax"])])
788 AC_MSG_RESULT($gmp_prog_cc_works)
789 case $gmp_prog_cc_works in
799 dnl Called: GMP_PROG_CC_WORKS_PART(CC+CFLAGS,FAIL-MESSAGE [,CODE])
800 dnl A dummy main() is appended to the CODE given.
802 AC_DEFUN([GMP_PROG_CC_WORKS_PART],
803 [GMP_PROG_CC_WORKS_PART_MAIN([$1],[$2],
805 [int main () { return 0; }])
808 dnl Called: GMP_PROG_CC_WORKS_PART_MAIN(CC+CFLAGS,FAIL-MESSAGE,CODE)
809 dnl CODE must include a main().
811 AC_DEFUN([GMP_PROG_CC_WORKS_PART_MAIN],
812 [GMP_PROG_CC_WORKS_PART_TEST([$1],[$2],[$3],
814 gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2]",
815 gmp_prog_cc_works="no[]m4_if([$2],,,[[, ]])[$2][[, program does not run]]")
818 dnl Called: GMP_PROG_CC_WORKS_PART_TEST(CC+CFLAGS,TITLE,[CODE],
819 dnl [ACTION-GOOD],[ACTION-BAD][ACTION-NORUN])
821 AC_DEFUN([GMP_PROG_CC_WORKS_PART_TEST],
822 [if test "$gmp_prog_cc_works" = yes; then
823 # remove anything that might look like compiler output to our "||" expression
824 rm -f conftest* a.out b.out a.exe a_out.exe
825 cat >conftest.c <<EOF
828 echo "Test compile: [$2]" >&AC_FD_CC
829 gmp_compile="$1 conftest.c >&AC_FD_CC"
830 if AC_TRY_EVAL(gmp_compile); then
832 if test "$cross_compiling" = no; then
833 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :;
841 if test "$cc_works_part" != yes; then
842 echo "failed program was:" >&AC_FD_CC
843 cat conftest.c >&AC_FD_CC
845 rm -f conftest* a.out b.out a.exe a_out.exe
846 case $cc_works_part in
861 dnl GMP_PROG_CC_WORKS_LONGLONG(cc+cflags,[ACTION-YES][,ACTION-NO])
862 dnl --------------------------------------------------------------
863 dnl Check that cc+cflags accepts "long long".
865 dnl This test is designed to be run repeatedly with different cc+cflags
866 dnl selections, so the result is not cached.
868 AC_DEFUN([GMP_PROG_CC_WORKS_LONGLONG],
869 [AC_MSG_CHECKING([compiler $1 has long long])
870 cat >conftest.c <<EOF
872 long long bar () { return foo; }
873 int main () { return 0; }
876 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
877 if AC_TRY_EVAL(gmp_compile); then
878 gmp_prog_cc_works=yes
880 echo "failed program was:" >&AC_FD_CC
881 cat conftest.c >&AC_FD_CC
883 rm -f conftest* a.out b.out a.exe a_out.exe
884 AC_MSG_RESULT($gmp_prog_cc_works)
885 if test $gmp_prog_cc_works = yes; then
893 dnl GMP_C_TEST_SIZEOF(cc/cflags,test,[ACTION-GOOD][,ACTION-BAD])
894 dnl ------------------------------------------------------------
895 dnl The given cc/cflags compiler is run to check the size of a type
896 dnl specified by the "test" argument. "test" can either be a string, or a
897 dnl variable like $foo. The value should be for instance "sizeof-long-4",
898 dnl to test that sizeof(long)==4.
900 dnl This test is designed to be run for different compiler and/or flags
901 dnl combinations, so the result is not cached.
903 dnl The idea for making an array that has a negative size if the desired
904 dnl condition test is false comes from autoconf AC_CHECK_SIZEOF. The cast
905 dnl to "long" in the array dimension also follows autoconf, apparently it's
906 dnl a workaround for a HP compiler bug.
908 AC_DEFUN([GMP_C_TEST_SIZEOF],
909 [echo "configure: testlist $2" >&AC_FD_CC
910 [gmp_sizeof_type=`echo "$2" | sed 's/sizeof-\([a-z]*\).*/\1/'`]
911 [gmp_sizeof_want=`echo "$2" | sed 's/sizeof-[a-z]*-\([0-9]*\).*/\1/'`]
912 AC_MSG_CHECKING([compiler $1 has sizeof($gmp_sizeof_type)==$gmp_sizeof_want])
913 cat >conftest.c <<EOF
917 static int test_array [1 - 2 * (long) (sizeof ($gmp_sizeof_type) != $gmp_sizeof_want)];
922 gmp_c_testlist_sizeof=no
923 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
924 if AC_TRY_EVAL(gmp_compile); then
925 gmp_c_testlist_sizeof=yes
928 AC_MSG_RESULT($gmp_c_testlist_sizeof)
929 if test $gmp_c_testlist_sizeof = yes; then
937 dnl GMP_PROG_CC_IS_GNU(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO])
938 dnl -------------------------------------------------------
939 dnl Determine whether the given compiler is GNU C.
941 dnl This test is the same as autoconf _AC_LANG_COMPILER_GNU, but doesn't
942 dnl cache the result. The same "ifndef" style test is used, to avoid
943 dnl problems with syntax checking cpp's used on NeXT and Apple systems.
945 AC_DEFUN([GMP_PROG_CC_IS_GNU],
946 [cat >conftest.c <<EOF
947 #if ! defined (__GNUC__) || defined (__INTEL_COMPILER)
951 gmp_compile="$1 -c conftest.c >&AC_FD_CC"
952 if AC_TRY_EVAL(gmp_compile); then
954 AC_MSG_CHECKING([whether $1 is gcc])
964 dnl GMP_PROG_CC_IS_XLC(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO])
965 dnl -------------------------------------------------------
966 dnl Determine whether the given compiler is IBM xlc (on AIX).
968 dnl There doesn't seem to be a preprocessor symbol to test for this, or if
969 dnl there is one then it's well hidden in xlc 3.1 on AIX 4.3, so just grep
970 dnl the man page printed when xlc is invoked with no arguments.
972 AC_DEFUN([GMP_PROG_CC_IS_XLC],
973 [gmp_command="$1 2>&1 | grep xlc >/dev/null"
974 if AC_TRY_EVAL(gmp_command); then
975 AC_MSG_CHECKING([whether $1 is xlc])
984 dnl GMP_PROG_CC_X86_GOT_EAX_EMITTED(CC+CFLAGS, [ACTION-YES] [, ACTION-NO])
985 dnl ----------------------------------------------------------------------
986 dnl Determine whether CC+CFLAGS emits instructions using %eax with
987 dnl _GLOBAL_OFFSET_TABLE_. This test is for use on x86 systems.
989 dnl Recent versions of gcc will use %eax for the GOT in leaf functions, for
990 dnl instance gcc 3.3.3 with -O3. This avoids having to save and restore
991 dnl %ebx which otherwise usually holds the GOT, and is what gcc used in the
994 dnl %ecx and %edx are also candidates for this sort of optimization, and
995 dnl are used under lesser optimization levels, like -O2 in 3.3.3. FIXME:
996 dnl It's not quite clear what the conditions for using %eax are, we might
997 dnl need more test code to provoke it.
999 dnl The motivation for this test is that past versions of gas have bugs
1000 dnl affecting this usage, see GMP_ASM_X86_GOT_EAX_OK.
1002 dnl This test is not specific to gcc, other compilers might emit %eax GOT
1003 dnl insns like this, though we've not investigated that.
1005 dnl This is for use by compiler probing in GMP_PROG_CC_WORKS, so we doesn't
1006 dnl cache the result.
1008 dnl -fPIC is hard coded here, because this test is for use before libtool
1009 dnl has established the pic options. It's right for gcc, but perhaps not
1010 dnl other compilers.
1012 AC_DEFUN([GMP_PROG_CC_X86_GOT_EAX_EMITTED],
1013 [echo "Testing gcc GOT with eax emitted" >&AC_FD_CC
1014 cat >conftest.c <<\EOF
1016 int bar () { return foo; }
1019 gmp_compile="$1 -fPIC -S conftest.c >&AC_FD_CC 2>&1"
1020 if AC_TRY_EVAL(gmp_compile); then
1021 if grep "addl.*_GLOBAL_OFFSET_TABLE_.*eax" conftest.s >/dev/null; then
1026 echo "Result: $tmp_got_emitted" >&AC_FD_CC
1027 if test "$tmp_got_emitted" = yes; then
1028 ifelse([$2],,:,[$2])
1030 ifelse([$3],,:,[$3])
1035 dnl GMP_HPC_HPPA_2_0(cc,[ACTION-IF-GOOD][,ACTION-IF-BAD])
1036 dnl ---------------------------------------------------------
1037 dnl Find out whether a HP compiler is good enough to generate hppa 2.0.
1039 dnl This test might be repeated for different compilers, so the result is
1042 AC_DEFUN([GMP_HPC_HPPA_2_0],
1043 [AC_MSG_CHECKING([whether HP compiler $1 is good for 64-bits])
1044 # Bad compiler output:
1045 # ccom: HP92453-01 G.10.32.05 HP C Compiler
1046 # Good compiler output:
1047 # ccom: HP92453-01 A.10.32.30 HP C Compiler
1048 # Let A.10.32.30 or higher be ok.
1050 gmp_tmp_vs=`$1 $2 -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"`
1051 echo "Version string: $gmp_tmp_vs" >&AC_FD_CC
1053 gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\([[0-9]]*\).*/\1/'`
1054 gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'`
1055 gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'`
1056 echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&AC_FD_CC
1057 if test -z "$gmp_tmp_v1"; then
1058 gmp_hpc_64bit=not-applicable
1060 GMP_COMPARE_GE($gmp_tmp_v1, 10, $gmp_tmp_v2, 32, $gmp_tmp_v3, 30)
1061 gmp_hpc_64bit=$gmp_compare_ge
1063 AC_MSG_RESULT($gmp_hpc_64bit)
1064 if test $gmp_hpc_64bit = yes; then
1065 ifelse([$2],,:,[$2])
1067 ifelse([$3],,:,[$3])
1072 dnl GMP_GCC_ARM_UMODSI(CC,[ACTIONS-IF-GOOD][,ACTIONS-IF-BAD])
1073 dnl ---------------------------------------------------------
1074 dnl gcc 2.95.3 and earlier on arm has a bug in the libgcc __umodsi routine
1075 dnl making "%" give wrong results for some operands, eg. "0x90000000 % 3".
1076 dnl We're hoping it'll be fixed in 2.95.4, and we know it'll be fixed in
1079 dnl There's only a couple of places gmp cares about this, one is the
1080 dnl size==1 case in mpn/generic/mode1o.c, and this shows up in
1081 dnl tests/mpz/t-jac.c as a wrong result from mpz_kronecker_ui.
1083 AC_DEFUN([GMP_GCC_ARM_UMODSI],
1084 [AC_MSG_CHECKING([whether ARM gcc unsigned division works])
1085 tmp_version=`$1 --version`
1086 echo "$tmp_version" >&AC_FD_CC
1087 case $tmp_version in
1088 [2.95 | 2.95.[123]])
1089 ifelse([$3],,:,[$3])
1090 gmp_gcc_arm_umodsi_result=["no, gcc 2.95.[0123]"] ;;
1092 ifelse([$2],,:,[$2])
1093 gmp_gcc_arm_umodsi_result=yes ;;
1095 AC_MSG_RESULT([$gmp_gcc_arm_umodsi_result])
1099 dnl GMP_GCC_MIPS_O32(gcc,[actions-yes][,[actions-no]])
1100 dnl -------------------------------------------------
1101 dnl Test whether gcc supports o32.
1103 dnl gcc 2.7.2.2 only does o32, and doesn't accept -mabi=32.
1105 dnl gcc 2.95 accepts -mabi=32 but it only works on irix5, on irix6 it gives
1106 dnl "cc1: The -mabi=32 support does not work yet".
1108 AC_DEFUN([GMP_GCC_MIPS_O32],
1109 [AC_MSG_CHECKING([whether gcc supports o32])
1110 echo 'int x;' >conftest.c
1111 echo "$1 -mabi=32 -c conftest.c" >&AC_FD_CC
1112 if $1 -mabi=32 -c conftest.c >conftest.out 2>&1; then
1115 cat conftest.out >&AC_FD_CC
1116 if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then
1123 AC_MSG_RESULT($result)
1124 if test $result = yes; then
1125 ifelse([$2],,:,[$2])
1127 ifelse([$3],,:,[$3])
1132 dnl GMP_GCC_NO_CPP_PRECOMP(CCBASE,CC,CFLAGS,[ACTIONS-YES][,ACTIONS-NO])
1133 dnl -------------------------------------------------------------------
1134 dnl Check whether -no-cpp-precomp should be used on this compiler, and
1135 dnl execute the corresponding ACTIONS-YES or ACTIONS-NO.
1137 dnl -no-cpp-precomp is only meant for Apple's hacked version of gcc found
1138 dnl on powerpc*-*-darwin*, but we can give it a try on any gcc. Normal gcc
1139 dnl (as of 3.0 at least) only gives a warning, not an actual error, and we
1140 dnl watch for that and decide against the option in that case, to avoid
1141 dnl confusing the user.
1143 AC_DEFUN([GMP_GCC_NO_CPP_PRECOMP],
1144 [if test "$ccbase" = gcc; then
1145 AC_MSG_CHECKING([compiler $2 $3 -no-cpp-precomp])
1147 cat >conftest.c <<EOF
1148 int main () { return 0; }
1150 gmp_compile="$2 $3 -no-cpp-precomp conftest.c >conftest.out 2>&1"
1151 if AC_TRY_EVAL(gmp_compile); then
1152 if grep "unrecognized option.*-no-cpp-precomp" conftest.out >/dev/null; then : ;
1157 cat conftest.out >&AC_FD_CC
1158 rm -f conftest* a.out b.out a.exe a_out.exe
1159 AC_MSG_RESULT($result)
1160 if test "$result" = yes; then
1161 ifelse([$4],,:,[$4])
1163 ifelse([$5],,:,[$5])
1169 dnl GMP_GCC_PENTIUM4_SSE2(CC+CFLAGS,[ACTION-IF-YES][,ACTION-IF-NO])
1170 dnl ---------------------------------------------------------------
1171 dnl Determine whether gcc CC+CFLAGS is a good enough version for
1172 dnl -march=pentium4 with sse2.
1174 dnl Gcc 3.2.1 was seen generating incorrect code for raw double -> int
1175 dnl conversions through a union. We believe the problem is in all 3.1 and
1176 dnl 3.2 versions, but that it's fixed in 3.3.
1178 AC_DEFUN([GMP_GCC_PENTIUM4_SSE2],
1179 [AC_MSG_CHECKING([whether gcc is good for sse2])
1180 case `$1 -dumpversion` in
1181 [3.[012] | 3.[012].*]) result=no ;;
1184 AC_MSG_RESULT($result)
1185 if test "$result" = yes; then
1186 ifelse([$2],,:,[$2])
1188 ifelse([$3],,:,[$3])
1193 dnl GMP_GCC_WA_MCPU(CC+CFLAGS, NEWFLAG [,ACTION-YES [,ACTION-NO]])
1194 dnl --------------------------------------------------------------
1195 dnl Check whether gcc (or gas rather) accepts a flag like "-Wa,-mev67".
1197 dnl Gas doesn't give an error for an unknown cpu, it only prints a warning
1198 dnl like "Warning: Unknown CPU identifier `ev78'".
1200 dnl This is intended for use on alpha, since only recent versions of gas
1201 dnl accept -mev67, but there's nothing here that's alpha specific.
1203 AC_DEFUN([GMP_GCC_WA_MCPU],
1204 [AC_MSG_CHECKING([assembler $1 $2])
1206 cat >conftest.c <<EOF
1209 gmp_compile="$1 $2 -c conftest.c >conftest.out 2>&1"
1210 if AC_TRY_EVAL(gmp_compile); then
1211 if grep "Unknown CPU identifier" conftest.out >/dev/null; then : ;
1216 cat conftest.out >&AC_FD_CC
1218 AC_MSG_RESULT($result)
1219 if test "$result" = yes; then
1220 ifelse([$3],,:,[$3])
1222 ifelse([$4],,:,[$4])
1227 dnl GMP_GCC_WA_OLDAS(CC+CFLAGS [,ACTION-YES [,ACTION-NO]])
1228 dnl ------------------------------------------------------
1229 dnl Check whether gcc should be run with "-Wa,-oldas".
1231 dnl On systems alpha*-*-osf* (or maybe just osf5), apparently there's a
1232 dnl newish Compaq "as" which doesn't work with the gcc mips-tfile.
1233 dnl Compiling an empty file with "gcc -c foo.c" produces for instance
1235 dnl mips-tfile, /tmp/ccaqUNnF.s:7 Segmentation fault
1237 dnl The fix is to pass "-oldas" to that assembler, as noted by
1239 dnl http://gcc.gnu.org/install/specific.html#alpha*-dec-osf*
1241 dnl The test here tries to compile an empty file, and if that fails but
1242 dnl adding -Wa,-oldas makes it succeed, then that flag is considered
1245 dnl We look for the failing case specifically, since it may not be a good
1246 dnl idea to use -Wa,-oldas in other circumstances. For instance gas takes
1247 dnl "-oldas" to mean the "-o" option and will write a file called "ldas" as
1248 dnl its output. Normally gcc puts its own "-o" after any -Wa options, so
1249 dnl -oldas ends up being harmless, but clearly that's only through good
1252 dnl This macro is designed for use while probing for a good compiler, and
1253 dnl so doesn't cache it's result.
1255 AC_DEFUN([GMP_GCC_WA_OLDAS],
1256 [AC_MSG_CHECKING([for $1 -Wa,-oldas])
1258 cat >conftest.c <<EOF
1260 echo "with empty conftest.c" >&AC_FD_CC
1261 gmp_compile="$1 -c conftest.c >&AC_FD_CC 2>&1"
1262 if AC_TRY_EVAL(gmp_compile); then : ;
1265 gmp_compile="$1 -Wa,-oldas -c conftest.c >&AC_FD_CC 2>&1"
1266 if AC_TRY_EVAL(gmp_compile); then
1267 # but with -Wa,-oldas it works
1272 AC_MSG_RESULT($result)
1273 if test "$result" = yes; then
1274 ifelse([$2],,:,[$2])
1276 ifelse([$3],,:,[$3])
1281 dnl GMP_OS_X86_XMM(CC+CFLAGS,[ACTION-IF-YES][,ACTION-IF-NO])
1282 dnl --------------------------------------------------------
1283 dnl Determine whether the operating system supports XMM registers.
1285 dnl If build==host then a test program is run, executing an SSE2
1286 dnl instruction using an XMM register. This will give a SIGILL if the
1287 dnl system hasn't set the OSFXSR bit in CR4 to say it knows it must use
1288 dnl fxsave/fxrestor in a context switch (to save xmm registers).
1290 dnl If build!=host, we can fallback on:
1292 dnl - FreeBSD version 4 is the first supporting xmm.
1294 dnl - Linux kernel 2.4 might be the first stable series supporting xmm
1295 dnl (not sure). But there's no version number in the GNU/Linux
1296 dnl config tuple to test anyway.
1298 dnl The default is to allow xmm. This might seem rash, but it's likely
1299 dnl most systems know xmm by now, so this will normally be what's wanted.
1300 dnl And cross compiling is a bit hairy anyway, so hopefully anyone doing it
1301 dnl will be smart enough to know what to do.
1303 dnl In the test program, .text and .globl are hard coded because this macro
1304 dnl is wanted before GMP_ASM_TEXT and GMP_ASM_GLOBL are run. A .byte
1305 dnl sequence is used (for xorps %xmm0, %xmm0) to make us independent of
1306 dnl tests for whether the assembler supports sse2/xmm. Obviously we need
1307 dnl both assembler and OS support, but this means we don't force the order
1308 dnl in which we test.
1310 dnl FIXME: Maybe we should use $CCAS to assemble, if it's set. (Would
1311 dnl still want $CC/$CFLAGS for the link.) But this test is used before
1312 dnl AC_PROG_CC sets $OBJEXT, so we'd need to check for various object file
1313 dnl suffixes ourselves.
1315 AC_DEFUN([GMP_OS_X86_XMM],
1316 [AC_CACHE_CHECK([whether the operating system supports XMM registers],
1318 [if test "$build" = "$host"; then
1319 # remove anything that might look like compiler output to our "||" expression
1320 rm -f conftest* a.out b.out a.exe a_out.exe
1321 cat >conftest.s <<EOF
1327 .byte 0x0f, 0x57, 0xc0
1331 gmp_compile="$1 conftest.s -o conftest >&AC_FD_CC"
1332 if AC_TRY_EVAL(gmp_compile); then
1333 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then
1334 gmp_cv_os_x86_xmm=yes
1336 gmp_cv_os_x86_xmm=no
1339 AC_MSG_WARN([Oops, cannot compile test program])
1344 if test -z "$gmp_cv_os_x86_xmm"; then
1346 [freebsd[123] | freebsd[123].*])
1347 gmp_cv_os_x86_xmm=no ;;
1349 gmp_cv_os_x86_xmm=yes ;;
1351 gmp_cv_os_x86_xmm=probably ;;
1356 if test "$gmp_cv_os_x86_xmm" = probably; then
1357 AC_MSG_WARN([Not certain of OS support for xmm when cross compiling.])
1358 AC_MSG_WARN([Will assume it's ok, expect a SIGILL if this is wrong.])
1361 case $gmp_cv_os_x86_xmm in
1372 dnl GMP_CRAY_HOST_TYPES(C90/T90-IEEE, C90/T90-CFP, J90/SV1)
1373 dnl -------------------------------------------------------
1374 dnl Execute the actions in the arguments on the respective Cray vector
1375 dnl systems. For other hosts, do nothing.
1377 dnl This macro should be used after the C compiler has been chosen, since
1378 dnl on c90 and t90 we ask the compiler whether we're in IEEE or CFP float
1381 dnl This code is in a macro so that any AC_REQUIRE pre-requisites of
1382 dnl AC_EGREP_CPP will be expanded at the top-level, ie. for all hosts not
1383 dnl merely c90 and t90. In autoconf 2.57 for instance this means
1384 dnl AC_PROG_EGREP, which is needed by various other macros.
1386 AC_DEFUN([GMP_CRAY_OPTIONS],
1403 dnl GMP_HPPA_LEVEL_20(cc/cflags [, ACTION-GOOD [,ACTION-BAD]])
1404 dnl ----------------------------------------------------------
1405 dnl Check that the given cc/cflags accepts HPPA 2.0n assembler code.
1407 dnl Old versions of gas don't know 2.0 instructions. It rejects ".level
1408 dnl 2.0" for a start, so just test that.
1410 dnl This test is designed to be run for various different compiler and
1411 dnl flags combinations, and hence doesn't cache its result.
1413 AC_DEFUN([GMP_HPPA_LEVEL_20],
1414 [AC_MSG_CHECKING([$1 assembler knows hppa 2.0])
1416 cat >conftest.s <<EOF
1419 gmp_compile="$1 -c conftest.s >&AC_FD_CC 2>&1"
1420 if AC_TRY_EVAL(gmp_compile); then
1423 echo "failed program was" >&AC_FD_CC
1424 cat conftest.s >&AC_FD_CC
1427 AC_MSG_RESULT($result)
1428 if test "$result" = yes; then
1429 ifelse([$2],,:,[$2])
1431 ifelse([$3],,:,[$3])
1436 dnl GMP_PROG_CXX_WORKS(cxx/cxxflags [, ACTION-YES [,ACTION-NO]])
1437 dnl ------------------------------------------------------------
1438 dnl Check whether cxx/cxxflags can compile and link.
1440 dnl This test is designed to be run repeatedly with different cxx/cxxflags
1441 dnl selections, so the result is not cached.
1443 dnl For a native build, we insist on being able to run the program, so as
1444 dnl to detect any problems with the standard C++ library. During
1445 dnl development various systems with broken or incomplete C++ installations
1448 dnl The various features and problems we try to detect are done in separate
1449 dnl compiles. Although this is probably a bit slower than one test
1450 dnl program, it makes it easy to indicate the problem in AC_MSG_RESULT,
1451 dnl hence giving the user a clue about why we rejected the compiler.
1453 AC_DEFUN([GMP_PROG_CXX_WORKS],
1454 [AC_MSG_CHECKING([C++ compiler $1])
1455 gmp_prog_cxx_works=yes
1457 # start with a plain "main()", then go on to further checks
1458 GMP_PROG_CXX_WORKS_PART([$1], [])
1460 GMP_PROG_CXX_WORKS_PART([$1], [namespace],
1462 using namespace foo;
1465 # GMP requires the standard C++ iostream classes
1466 GMP_PROG_CXX_WORKS_PART([$1], [std iostream],
1467 [/* This test rejects g++ 2.7.2 which doesn't have <iostream>, only a
1468 pre-standard iostream.h. */
1471 /* This test rejects OSF 5.1 Compaq C++ in its default pre-standard iostream
1472 mode, since that mode puts cout in the global namespace, not "std". */
1473 void someoutput (void) { std::cout << 123; }
1476 AC_MSG_RESULT($gmp_prog_cxx_works)
1477 case $gmp_prog_cxx_works in
1487 dnl Called: GMP_PROG_CXX_WORKS_PART(CXX+CXXFLAGS, FAIL-MESSAGE [,CODE])
1489 AC_DEFUN([GMP_PROG_CXX_WORKS_PART],
1490 [if test "$gmp_prog_cxx_works" = yes; then
1491 # remove anything that might look like compiler output to our "||" expression
1492 rm -f conftest* a.out b.out a.exe a_out.exe
1493 cat >conftest.cc <<EOF
1495 int main (void) { return 0; }
1497 echo "Test compile: [$2]" >&AC_FD_CC
1498 gmp_cxxcompile="$1 conftest.cc >&AC_FD_CC"
1499 if AC_TRY_EVAL(gmp_cxxcompile); then
1500 if test "$cross_compiling" = no; then
1501 if AC_TRY_COMMAND([./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest]); then :;
1503 gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2], program does not run"
1507 gmp_prog_cxx_works="no[]m4_if([$2],,,[, ])[$2]"
1509 case $gmp_prog_cxx_works in
1511 echo "failed program was:" >&AC_FD_CC
1512 cat conftest.cc >&AC_FD_CC
1515 rm -f conftest* a.out b.out a.exe a_out.exe
1520 dnl GMP_INIT([M4-DEF-FILE])
1521 dnl -----------------------
1522 dnl Initializations for GMP config.m4 generation.
1524 dnl FIXME: The generated config.m4 doesn't get recreated by config.status.
1525 dnl Maybe the relevant "echo"s should go through AC_CONFIG_COMMANDS.
1527 AC_DEFUN([GMP_INIT],
1528 [ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]")
1529 gmp_tmpconfigm4=cnfm4.tmp
1530 gmp_tmpconfigm4i=cnfm4i.tmp
1531 gmp_tmpconfigm4p=cnfm4p.tmp
1532 rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p
1534 # CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir.
1535 # The pattern here tests for an absolute path the same way as
1536 # _AC_OUTPUT_FILES in autoconf acgeneral.m4.
1538 [[\\/]]* | ?:[[\\/]]* ) tmp="$srcdir" ;;
1539 *) tmp="../$srcdir" ;;
1541 echo ["define(<CONFIG_TOP_SRCDIR>,<\`$tmp'>)"] >>$gmp_tmpconfigm4
1543 # All CPUs use asm-defs.m4
1544 echo ["include][(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"] >>$gmp_tmpconfigm4i
1550 dnl Create config.m4 from its accumulated parts.
1552 dnl __CONFIG_M4_INCLUDED__ is used so that a second or subsequent include
1553 dnl of config.m4 is harmless.
1555 dnl A separate ifdef on the angle bracket quoted part ensures the quoting
1556 dnl style there is respected. The basic defines from gmp_tmpconfigm4 are
1557 dnl fully quoted but are still put under an ifdef in case any have been
1558 dnl redefined by one of the m4 include files.
1560 dnl Doing a big ifdef within asm-defs.m4 and/or other macro files wouldn't
1561 dnl work, since it'd interpret parentheses and quotes in dnl comments, and
1562 dnl having a whole file as a macro argument would overflow the string space
1565 AC_DEFUN([GMP_FINISH],
1566 [AC_REQUIRE([GMP_INIT])
1567 echo "creating $gmp_configm4"
1568 echo ["d""nl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4
1569 if test -f $gmp_tmpconfigm4; then
1570 echo ["changequote(<,>)"] >> $gmp_configm4
1571 echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4
1572 cat $gmp_tmpconfigm4 >> $gmp_configm4
1573 echo [">)"] >> $gmp_configm4
1574 echo ["changequote(\`,')"] >> $gmp_configm4
1577 echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4
1578 if test -f $gmp_tmpconfigm4i; then
1579 cat $gmp_tmpconfigm4i >> $gmp_configm4
1580 rm $gmp_tmpconfigm4i
1582 if test -f $gmp_tmpconfigm4p; then
1583 cat $gmp_tmpconfigm4p >> $gmp_configm4
1584 rm $gmp_tmpconfigm4p
1586 echo ["')"] >> $gmp_configm4
1587 echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4
1591 dnl GMP_INCLUDE_MPN(FILE)
1592 dnl ---------------------
1593 dnl Add an include_mpn(`FILE') to config.m4. FILE should be a path
1594 dnl relative to the mpn source directory, for example
1596 dnl GMP_INCLUDE_MPN(`x86/x86-defs.m4')
1599 AC_DEFUN([GMP_INCLUDE_MPN],
1600 [AC_REQUIRE([GMP_INIT])
1601 echo ["include_mpn(\`$1')"] >> $gmp_tmpconfigm4i
1605 dnl GMP_DEFINE(MACRO, DEFINITION [, LOCATION])
1606 dnl ------------------------------------------
1607 dnl Define M4 macro MACRO as DEFINITION in temporary file.
1609 dnl If LOCATION is `POST', the definition will appear after any include()
1610 dnl directives inserted by GMP_INCLUDE. Mind the quoting! No shell
1611 dnl variables will get expanded. Don't forget to invoke GMP_FINISH to
1612 dnl create file config.m4. config.m4 uses `<' and '>' as quote characters
1613 dnl for all defines.
1615 AC_DEFUN([GMP_DEFINE],
1616 [AC_REQUIRE([GMP_INIT])
1617 echo ['define(<$1>, <$2>)'] >>ifelse([$3], [POST],
1618 $gmp_tmpconfigm4p, $gmp_tmpconfigm4)
1622 dnl GMP_DEFINE_RAW(STRING [, LOCATION])
1623 dnl ------------------------------------
1624 dnl Put STRING into config.m4 file.
1626 dnl If LOCATION is `POST', the definition will appear after any include()
1627 dnl directives inserted by GMP_INCLUDE. Don't forget to invoke GMP_FINISH
1628 dnl to create file config.m4.
1630 AC_DEFUN([GMP_DEFINE_RAW],
1631 [AC_REQUIRE([GMP_INIT])
1632 echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4)
1636 dnl GMP_TRY_ASSEMBLE(asm-code,[action-success][,action-fail])
1637 dnl ----------------------------------------------------------
1638 dnl Attempt to assemble the given code.
1639 dnl Do "action-success" if this succeeds, "action-fail" if not.
1641 dnl conftest.o and conftest.out are available for inspection in
1642 dnl "action-success". If either action does a "break" out of a loop then
1643 dnl an explicit "rm -f conftest*" will be necessary.
1645 dnl This is not unlike AC_TRY_COMPILE, but there's no default includes or
1646 dnl anything in "asm-code", everything wanted must be given explicitly.
1648 AC_DEFUN([GMP_TRY_ASSEMBLE],
1649 [cat >conftest.s <<EOF
1652 gmp_assemble="$CCAS $CFLAGS $CPPFLAGS conftest.s >conftest.out 2>&1"
1653 if AC_TRY_EVAL(gmp_assemble); then
1654 cat conftest.out >&AC_FD_CC
1655 ifelse([$2],,:,[$2])
1657 cat conftest.out >&AC_FD_CC
1658 echo "configure: failed program was:" >&AC_FD_CC
1659 cat conftest.s >&AC_FD_CC
1660 ifelse([$3],,:,[$3])
1666 dnl Checks whether the stack can be marked nonexecutable by passing an option
1667 dnl to the C-compiler when acting on .s files. Appends that option to ASMFLAGS.
1668 dnl This macro is adapted from one found in GLIBC-2.3.5.
1669 dnl FIXME: This test looks broken. It tests that a file with .note.GNU-stack...
1670 dnl can be compiled/assembled with -Wa,--noexecstack. It does not determine
1671 dnl if that command-line option has any effect on general asm code.
1672 AC_DEFUN([CL_AS_NOEXECSTACK],[
1673 dnl AC_REQUIRE([AC_PROG_CC]) GMP uses something else
1674 AC_CACHE_CHECK([whether assembler supports --noexecstack option],
1675 cl_cv_as_noexecstack, [dnl
1676 cat > conftest.c <<EOF
1679 if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS
1680 -S -o conftest.s conftest.c >/dev/null]) \
1681 && grep .note.GNU-stack conftest.s >/dev/null \
1682 && AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -Wa,--noexecstack
1683 -c -o conftest.o conftest.s >/dev/null])
1685 cl_cv_as_noexecstack=yes
1687 cl_cv_as_noexecstack=no
1690 if test "$cl_cv_as_noexecstack" = yes; then
1691 ASMFLAGS="$ASMFLAGS -Wa,--noexecstack"
1697 dnl GMP_ASM_LABEL_SUFFIX
1698 dnl --------------------
1700 dnl empty - hppa on HP-UX doesn't use a :, just the label name
1702 dnl Note that it's necessary to test the empty case first, since HP "as"
1703 dnl will accept "somelabel:", and take it to mean a label with a name that
1704 dnl happens to end in a colon.
1706 AC_DEFUN([GMP_ASM_LABEL_SUFFIX],
1707 [AC_REQUIRE([GMP_ASM_TEXT])
1708 AC_CACHE_CHECK([for assembler label suffix],
1709 gmp_cv_asm_label_suffix,
1710 [gmp_cv_asm_label_suffix=unknown
1712 echo "trying $i" >&AC_FD_CC
1716 [gmp_cv_asm_label_suffix=$i
1719 [cat conftest.out >&AC_FD_CC])
1721 if test "$gmp_cv_asm_label_suffix" = "unknown"; then
1722 AC_MSG_ERROR([Cannot determine label suffix])
1725 echo ["define(<LABEL_SUFFIX>, <$gmp_cv_asm_label_suffix>)"] >> $gmp_tmpconfigm4
1729 dnl GMP_ASM_UNDERSCORE
1730 dnl ------------------
1731 dnl Determine whether global symbols need to be prefixed with an underscore.
1732 dnl The output from "nm" is grepped to see what a typical symbol looks like.
1734 dnl This test used to grep the .o file directly, but that failed with greps
1735 dnl that don't like binary files (eg. SunOS 4).
1737 dnl This test also used to construct an assembler file with and without an
1738 dnl underscore and try to link that to a C file, to see which worked.
1739 dnl Although that's what will happen in the real build we don't really want
1740 dnl to depend on creating asm files within configure for every possible CPU
1741 dnl (or at least we don't want to do that more than we have to).
1743 dnl The fallback on no underscore is based on the assumption that the world
1744 dnl is moving towards non-underscore systems. There should actually be no
1745 dnl good reason for nm to fail though.
1747 AC_DEFUN([GMP_ASM_UNDERSCORE],
1748 [AC_REQUIRE([GMP_PROG_NM])
1749 AC_CACHE_CHECK([if globals are prefixed by underscore],
1750 gmp_cv_asm_underscore,
1751 [gmp_cv_asm_underscore="unknown"
1752 cat >conftest.c <<EOF
1755 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC"
1756 if AC_TRY_EVAL(gmp_compile); then
1757 $NM conftest.$OBJEXT >conftest.out
1758 if grep "[[ ]]_gurkmacka" conftest.out >/dev/null; then
1759 gmp_cv_asm_underscore=yes
1760 elif grep "[[ ]]gurkmacka" conftest.out >/dev/null; then
1761 gmp_cv_asm_underscore=no
1763 echo "configure: $NM doesn't have gurkmacka:" >&AC_FD_CC
1764 cat conftest.out >&AC_FD_CC
1767 echo "configure: failed program was:" >&AC_FD_CC
1768 cat conftest.c >&AC_FD_CC
1772 case $gmp_cv_asm_underscore in
1774 GMP_DEFINE(GSYM_PREFIX, [_]) ;;
1776 GMP_DEFINE(GSYM_PREFIX, []) ;;
1778 AC_MSG_WARN([+----------------------------------------------------------])
1779 AC_MSG_WARN([| Cannot determine global symbol prefix.])
1780 AC_MSG_WARN([| $NM output doesn't contain a global data symbol.])
1781 AC_MSG_WARN([| Will proceed with no underscore.])
1782 AC_MSG_WARN([| If this is wrong then you'll get link errors referring])
1783 AC_MSG_WARN([| to ___gmpn_add_n (note three underscores).])
1784 AC_MSG_WARN([| In this case do a fresh build with an override,])
1785 AC_MSG_WARN([| ./configure gmp_cv_asm_underscore=yes])
1786 AC_MSG_WARN([+----------------------------------------------------------])
1787 GMP_DEFINE(GSYM_PREFIX, [])
1793 dnl GMP_ASM_ALIGN_LOG
1794 dnl -----------------
1795 dnl Is parameter to `.align' logarithmic?
1797 AC_DEFUN([GMP_ASM_ALIGN_LOG],
1798 [AC_REQUIRE([GMP_ASM_GLOBL])
1799 AC_REQUIRE([GMP_ASM_BYTE])
1800 AC_REQUIRE([GMP_ASM_DATA])
1801 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1802 AC_REQUIRE([GMP_PROG_NM])
1803 AC_CACHE_CHECK([if .align assembly directive is logarithmic],
1804 gmp_cv_asm_align_log,
1808 $gmp_cv_asm_globl foo
1811 foo$gmp_cv_asm_label_suffix
1812 $gmp_cv_asm_byte 2],
1813 [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \
1814 sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`]
1815 if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then
1816 gmp_cv_asm_align_log=yes
1818 gmp_cv_asm_align_log=no
1820 [AC_MSG_ERROR([cannot assemble alignment test])])])
1822 GMP_DEFINE_RAW(["define(<ALIGN_LOGARITHMIC>,<$gmp_cv_asm_align_log>)"])
1826 dnl GMP_ASM_ALIGN_FILL_0x90
1827 dnl -----------------------
1828 dnl Determine whether a ",0x90" suffix works on a .align directive.
1829 dnl This is only meant for use on x86, 0x90 being a "nop".
1831 dnl Old gas, eg. 1.92.3
1832 dnl Needs ",0x90" or else the fill is 0x00, which can't be executed
1835 dnl New gas, eg. 2.91
1836 dnl Generates multi-byte nop fills even when ",0x90" is given.
1839 dnl ",0x90" is not allowed, causes a fatal error.
1842 dnl ",0x90" does nothing, generates a warning that it's being ignored.
1844 dnl SCO OpenServer 5 as
1845 dnl Second parameter is max bytes to fill, not a fill pattern.
1846 dnl ",0x90" is an error due to being bigger than the first parameter.
1847 dnl Multi-byte nop fills are generated in text segments.
1849 dnl Note that both solaris "as"s only care about ",0x90" if they actually
1850 dnl have to use it to fill something, hence the .byte in the test. It's
1851 dnl the second .align which provokes the error or warning.
1853 dnl The warning from solaris 2.8 is suppressed to stop anyone worrying that
1854 dnl something might be wrong.
1856 AC_DEFUN([GMP_ASM_ALIGN_FILL_0x90],
1857 [AC_REQUIRE([GMP_ASM_TEXT])
1858 AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text],
1859 gmp_cv_asm_align_fill_0x90,
1865 [if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then
1866 echo "Suppressing this warning by omitting 0x90" 1>&AC_FD_CC
1867 gmp_cv_asm_align_fill_0x90=no
1869 gmp_cv_asm_align_fill_0x90=yes
1871 [gmp_cv_asm_align_fill_0x90=no])])
1873 GMP_DEFINE_RAW(["define(<ALIGN_FILL_0x90>,<$gmp_cv_asm_align_fill_0x90>)"])
1879 dnl .byte - is usual.
1880 dnl data1 - required by ia64 (on hpux at least).
1882 dnl This macro is just to support other configure tests, not any actual asm
1885 AC_DEFUN([GMP_ASM_BYTE],
1886 [AC_REQUIRE([GMP_ASM_TEXT])
1887 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1888 AC_CACHE_CHECK([for assembler byte directive],
1890 [for i in .byte data1; do
1891 echo "trying $i" >&AC_FD_CC
1899 [cat conftest.out >&AC_FD_CC])
1901 if test -z "$gmp_cv_asm_byte"; then
1902 AC_MSG_ERROR([Cannot determine how to emit a data byte])
1910 dnl .text - is usual.
1911 dnl .code - is needed by the hppa on HP-UX (but ia64 HP-UX uses .text)
1912 dnl .csect .text[PR] - is for AIX.
1914 AC_DEFUN([GMP_ASM_TEXT],
1915 [AC_CACHE_CHECK([how to switch to text section],
1917 [for i in ".text" ".code" [".csect .text[PR]"]; do
1918 echo "trying $i" >&AC_FD_CC
1919 GMP_TRY_ASSEMBLE([ $i],
1924 if test -z "$gmp_cv_asm_text"; then
1925 AC_MSG_ERROR([Cannot determine text section directive])
1928 echo ["define(<TEXT>, <$gmp_cv_asm_text>)"] >> $gmp_tmpconfigm4
1934 dnl Can we say `.data'?
1936 AC_DEFUN([GMP_ASM_DATA],
1937 [AC_CACHE_CHECK([how to switch to data section],
1940 *-*-aix*) gmp_cv_asm_data=[".csect .data[RW]"] ;;
1941 *) gmp_cv_asm_data=".data" ;;
1944 echo ["define(<DATA>, <$gmp_cv_asm_data>)"] >> $gmp_tmpconfigm4
1950 dnl Find out how to switch to the read-only data section.
1952 dnl The compiler output is grepped for the right directive. It's not
1953 dnl considered wise to just probe for ".section .rodata" or whatever works,
1954 dnl since arbitrary section names might be accepted, but not necessarily do
1955 dnl the right thing when they get to the linker.
1957 dnl Only a few asm files use RODATA, so this code is perhaps a bit
1958 dnl excessive right now, but should find more uses in the future.
1960 dnl FIXME: gcc on aix generates something like ".csect _foo.ro_c[RO],3"
1961 dnl where foo is the object file. Might need to check for that if we use
1964 AC_DEFUN([GMP_ASM_RODATA],
1965 [AC_REQUIRE([GMP_ASM_TEXT])
1966 AC_REQUIRE([GMP_ASM_DATA])
1967 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
1968 AC_REQUIRE([GMP_ASM_UNDERSCORE])
1969 AC_CACHE_CHECK([how to switch to read-only data section],
1972 dnl Default to DATA on CPUs with split code/data caching, and TEXT
1973 dnl elsewhere. i386 means generic x86, so use DATA on it.
1975 X86_PATTERN | x86_64-*-*)
1976 gmp_cv_asm_rodata="$gmp_cv_asm_data" ;;
1978 gmp_cv_asm_rodata="$gmp_cv_asm_text" ;;
1981 cat >conftest.c <<EOF
1982 extern const int foo[[]]; /* Suppresses C++'s suppression of foo */
1983 const int foo[[]] = {1,2,3};
1985 echo "Test program:" >&AC_FD_CC
1986 cat conftest.c >&AC_FD_CC
1987 gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC"
1988 if AC_TRY_EVAL(gmp_compile); then
1989 echo "Compiler output:" >&AC_FD_CC
1990 cat conftest.s >&AC_FD_CC
1991 if test $gmp_cv_asm_underscore = yes; then
1996 # must see our label
1997 if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&AC_FD_CC; then
1998 # take the last directive before our label (hence skipping segments
1999 # getting debugging info etc)
2000 tmp_match=`sed -n ["/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q
2006 /^[. ]*CSECT/p"] conftest.s | sed -n '$p'`
2007 echo "Match: $tmp_match" >&AC_FD_CC
2008 if test -n "$tmp_match"; then
2009 gmp_cv_asm_rodata=$tmp_match
2012 echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&AC_FD_CC
2017 echo ["define(<RODATA>, <$gmp_cv_asm_rodata>)"] >> $gmp_tmpconfigm4
2023 dnl The assembler directive to mark a label as a global symbol.
2025 dnl ia64 - .global is standard, according to the Intel documentation.
2027 dnl hppa - ".export foo,entry" is demanded by HP hppa "as". ".global" is a
2030 dnl other - .globl is usual.
2032 dnl "gas" tends to accept .globl everywhere, in addition to .export or
2033 dnl .global or whatever the system assembler demands.
2035 AC_DEFUN([GMP_ASM_GLOBL],
2036 [AC_REQUIRE([GMP_ASM_TEXT])
2037 AC_CACHE_CHECK([for assembler global directive],
2040 hppa*-*-*) gmp_cv_asm_globl=.export ;;
2041 IA64_PATTERN) gmp_cv_asm_globl=.global ;;
2042 *) gmp_cv_asm_globl=.globl ;;
2045 echo ["define(<GLOBL>, <$gmp_cv_asm_globl>)"] >> $gmp_tmpconfigm4
2049 dnl GMP_ASM_GLOBL_ATTR
2050 dnl ------------------
2051 dnl Do we need something after `GLOBL symbol'?
2053 AC_DEFUN([GMP_ASM_GLOBL_ATTR],
2054 [AC_REQUIRE([GMP_ASM_GLOBL])
2055 AC_CACHE_CHECK([for assembler global directive attribute],
2056 gmp_cv_asm_globl_attr,
2057 [case $gmp_cv_asm_globl in
2058 .export) gmp_cv_asm_globl_attr=",entry" ;;
2059 *) gmp_cv_asm_globl_attr="" ;;
2062 echo ["define(<GLOBL_ATTR>, <$gmp_cv_asm_globl_attr>)"] >> $gmp_tmpconfigm4
2068 dnl Can we say ".type", and how?
2070 dnl For i386 GNU/Linux ELF systems, and very likely other ELF systems,
2071 dnl .type and .size are important on functions in shared libraries. If
2072 dnl .type is omitted and the mainline program references that function then
2073 dnl the code will be copied down to the mainline at load time like a piece
2074 dnl of data. If .size is wrong or missing (it defaults to 4 bytes or some
2075 dnl such) then incorrect bytes will be copied and a segv is the most likely
2076 dnl result. In any case such copying is not what's wanted, a .type
2077 dnl directive will ensure a PLT entry is used.
2079 dnl In GMP the assembler functions are normally only used from within the
2080 dnl library (since most programs are not interested in the low level
2081 dnl routines), and in those circumstances a missing .type isn't fatal,
2082 dnl letting the problem go unnoticed. tests/mpn/t-asmtype.c aims to check
2085 AC_DEFUN([GMP_ASM_TYPE],
2086 [AC_CACHE_CHECK([for assembler .type directive],
2089 for gmp_tmp_prefix in @ \# %; do
2090 GMP_TRY_ASSEMBLE([ .type sym,${gmp_tmp_prefix}function],
2091 [if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ;
2093 gmp_cv_asm_type=".type \$][1,${gmp_tmp_prefix}\$][2"
2099 echo ["define(<TYPE>, <$gmp_cv_asm_type>)"] >> $gmp_tmpconfigm4
2105 dnl Can we say `.size'?
2107 AC_DEFUN([GMP_ASM_SIZE],
2108 [AC_CACHE_CHECK([for assembler .size directive],
2111 GMP_TRY_ASSEMBLE([ .size sym,1],
2112 [if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ;
2114 gmp_cv_asm_size=".size \$][1,\$][2"
2117 echo ["define(<SIZE>, <$gmp_cv_asm_size>)"] >> $gmp_tmpconfigm4
2121 dnl GMP_ASM_COFF_TYPE
2122 dnl -----------------
2123 dnl Determine whether the assembler supports COFF type information.
2125 dnl Currently this is only needed for mingw (and cygwin perhaps) and so is
2126 dnl run only on the x86s, but it ought to work anywhere.
2128 dnl On MINGW, recent versions of the linker have an automatic import scheme
2129 dnl for data in a DLL which is referenced by a mainline but without
2130 dnl __declspec (__dllimport__) on the prototype. It seems functions
2131 dnl without type information are treated as data, or something, and calls
2132 dnl to them from the mainline will crash. gcc puts type information on the
2133 dnl C functions it generates, we need to do the same for assembler
2136 dnl This applies only to functions without __declspec(__dllimport__),
2137 dnl ie. without __GMP_DECLSPEC in the case of libgmp, so it also works just
2138 dnl to ensure all assembler functions used from outside libgmp have
2139 dnl __GMP_DECLSPEC on their prototypes. But this isn't an ideal situation,
2140 dnl since we don't want perfectly valid calls going wrong just because
2141 dnl there wasn't a prototype in scope.
2143 dnl When an auto-import takes place, the following warning is given by the
2144 dnl linker. This shouldn't be seen for any functions.
2146 dnl Info: resolving _foo by linking to __imp__foo (auto-import)
2149 dnl COFF type directives look like the following
2156 dnl _foo is the symbol with GSYM_PREFIX (_). .scl is the storage class, 2
2157 dnl for external, 3 for static. .type is the object type, 32 for a
2160 dnl On an ELF system, this is (correctly) rejected due to .def, .endef and
2161 dnl .scl being invalid, and .type not having enough arguments.
2163 AC_DEFUN([GMP_ASM_COFF_TYPE],
2164 [AC_REQUIRE([GMP_ASM_TEXT])
2165 AC_REQUIRE([GMP_ASM_GLOBL])
2166 AC_REQUIRE([GMP_ASM_GLOBL_ATTR])
2167 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2168 AC_REQUIRE([GMP_ASM_UNDERSCORE])
2169 AC_CACHE_CHECK([for assembler COFF type directives],
2170 gmp_cv_asm_x86_coff_type,
2173 $gmp_cv_asm_globl ${tmp_gsym_prefix}foo$gmp_cv_asm_globl_attr
2174 .def ${tmp_gsym_prefix}foo
2178 ${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix
2180 [gmp_cv_asm_x86_coff_type=yes],
2181 [gmp_cv_asm_x86_coff_type=no])
2183 echo ["define(<HAVE_COFF_TYPE>, <$gmp_cv_asm_x86_coff_type>)"] >> $gmp_tmpconfigm4
2187 dnl GMP_ASM_LSYM_PREFIX
2188 dnl -------------------
2189 dnl What is the prefix for a local label?
2191 dnl The prefixes tested are,
2193 dnl L - usual for underscore systems
2194 dnl .L - usual for non-underscore systems
2195 dnl $ - alpha (gas and OSF system assembler)
2196 dnl L$ - hppa (gas and HP-UX system assembler)
2198 dnl The default is "L" if the tests fail for any reason. There's a good
2199 dnl chance this will be adequate, since on most systems labels are local
2200 dnl anyway unless given a ".globl", and an "L" will avoid clashes with
2201 dnl other identifers.
2203 dnl For gas, ".L" is normally purely local to the assembler, it doesn't get
2204 dnl put into the object file at all. This style is preferred, to keep the
2205 dnl object files nice and clean.
2207 dnl BSD format nm produces a line like
2209 dnl 00000000 t Lgurkmacka
2211 dnl The symbol code is normally "t" for text, but any lower case letter
2212 dnl indicates a local definition.
2214 dnl Code "n" is for a debugging symbol, OSF "nm -B" gives that as an upper
2215 dnl case "N" for a local.
2217 dnl HP-UX nm prints an error message (though seems to give a 0 exit) if
2218 dnl there's no symbols at all in an object file, hence the use of "dummy".
2220 AC_DEFUN([GMP_ASM_LSYM_PREFIX],
2221 [AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2222 AC_REQUIRE([GMP_ASM_TEXT])
2223 AC_REQUIRE([GMP_PROG_NM])
2224 AC_CACHE_CHECK([for assembler local label prefix],
2225 gmp_cv_asm_lsym_prefix,
2226 [gmp_tmp_pre_appears=yes
2227 for gmp_tmp_pre in L .L $L $ L$; do
2228 echo "Trying $gmp_tmp_pre" >&AC_FD_CC
2231 dummy${gmp_cv_asm_label_suffix}
2232 ${gmp_tmp_pre}gurkmacka${gmp_cv_asm_label_suffix}],
2233 [if $NM conftest.$OBJEXT >conftest.nm 2>&AC_FD_CC; then : ; else
2234 cat conftest.nm >&AC_FD_CC
2235 AC_MSG_WARN(["$NM" failure])
2238 cat conftest.nm >&AC_FD_CC
2239 if grep gurkmacka conftest.nm >/dev/null; then : ; else
2240 # no mention of the symbol, this is good
2241 echo "$gmp_tmp_pre label doesn't appear in object file at all (good)" >&AC_FD_CC
2242 gmp_cv_asm_lsym_prefix="$gmp_tmp_pre"
2243 gmp_tmp_pre_appears=no
2246 if grep [' [a-zN] .*gurkmacka'] conftest.nm >/dev/null; then
2247 # symbol mentioned as a local, use this if nothing better
2248 echo "$gmp_tmp_pre label is local but still in object file" >&AC_FD_CC
2249 if test -z "$gmp_cv_asm_lsym_prefix"; then
2250 gmp_cv_asm_lsym_prefix="$gmp_tmp_pre"
2253 echo "$gmp_tmp_pre label is something unknown" >&AC_FD_CC
2258 if test -z "$gmp_cv_asm_lsym_prefix"; then
2259 gmp_cv_asm_lsym_prefix=L
2260 AC_MSG_WARN([cannot determine local label, using default $gmp_cv_asm_lsym_prefix])
2262 # for development purposes, note whether we got a purely temporary local label
2263 echo "Local label appears in object files: $gmp_tmp_pre_appears" >&AC_FD_CC
2265 echo ["define(<LSYM_PREFIX>, <${gmp_cv_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4
2266 AC_DEFINE_UNQUOTED(LSYM_PREFIX, "$gmp_cv_asm_lsym_prefix",
2267 [Assembler local label prefix])
2273 dnl How to define a 32-bit word.
2275 dnl FIXME: This test is not right for ia64-*-hpux*. The directive should
2276 dnl be "data4", but the W32 macro is not currently used by the mpn/ia64 asm
2279 AC_DEFUN([GMP_ASM_W32],
2280 [AC_REQUIRE([GMP_ASM_DATA])
2281 AC_REQUIRE([GMP_ASM_BYTE])
2282 AC_REQUIRE([GMP_ASM_GLOBL])
2283 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2284 AC_REQUIRE([GMP_PROG_NM])
2285 AC_CACHE_CHECK([how to define a 32-bit word],
2289 # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption
2290 # that it's at 0x0. We'll have to declare another symbol before the
2291 # .long/.word and look at the distance between the two symbols. The
2292 # only problem is that the sed expression(s) barfs (on Solaris, for
2293 # example) for the symbol with value 0. For now, HPUX uses .word.
2294 gmp_cv_asm_w32=".word"
2298 for gmp_tmp_op in .long .word data4; do
2301 $gmp_cv_asm_globl foo
2303 foo$gmp_cv_asm_label_suffix
2304 $gmp_cv_asm_byte 0],
2305 [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \
2306 sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`]
2307 if test "$gmp_tmp_val" = 4; then
2308 gmp_cv_asm_w32="$gmp_tmp_op"
2315 if test -z "$gmp_cv_asm_w32"; then
2316 AC_MSG_ERROR([cannot determine how to define a 32-bit word])
2319 echo ["define(<W32>, <$gmp_cv_asm_w32>)"] >> $gmp_tmpconfigm4
2323 dnl GMP_X86_ASM_GOT_UNDERSCORE
2324 dnl --------------------------
2325 dnl Determine whether i386 _GLOBAL_OFFSET_TABLE_ needs an additional
2326 dnl underscore prefix.
2328 dnl SVR4 - the standard is _GLOBAL_OFFSET_TABLE_
2329 dnl GNU/Linux - follows SVR4
2330 dnl OpenBSD - an a.out underscore system, uses __GLOBAL_OFFSET_TABLE_
2331 dnl NetBSD - also an a.out underscore system, but _GLOBAL_OFFSET_TABLE_
2333 dnl The test attempts to link a program using _GLOBAL_OFFSET_TABLE_ or
2334 dnl __GLOBAL_OFFSET_TABLE_ to see which works.
2336 dnl $lt_prog_compiler_pic is included in the compile because old versions
2337 dnl of gas wouldn't accept PIC idioms without the right option (-K). This
2338 dnl is the same as what libtool and mpn/Makeasm.am will do.
2340 dnl $lt_prog_compiler_pic is also included in the link because OpenBSD ld
2341 dnl won't accept an R_386_GOTPC relocation without the right options. This
2342 dnl is not what's done by the Makefiles when building executables, but
2343 dnl let's hope it's ok (it works fine with gcc).
2345 dnl The fallback is no additional underscore, on the basis that this will
2346 dnl suit SVR4/ELF style systems, which should be much more common than
2347 dnl a.out systems with shared libraries.
2349 dnl Note that it's not an error for the tests to fail, since for instance
2350 dnl cygwin, mingw and djgpp don't have a _GLOBAL_OFFSET_TABLE_ scheme at
2353 dnl Perhaps $CCAS could be asked to do the linking as well as the
2354 dnl assembling, but in the Makefiles it's only used for assembling, so lets
2355 dnl keep it that way.
2357 dnl The test here is run even under --disable-shared, so that PIC objects
2358 dnl can be built and tested by the tune/many.pl development scheme. The
2359 dnl tests will be reasonably quick and won't give a fatal error, so this
2360 dnl arrangement is ok. AC_LIBTOOL_PROG_COMPILER_PIC does its
2361 dnl $lt_prog_compiler_pic setups even for --disable-shared too.
2363 AC_DEFUN([GMP_ASM_X86_GOT_UNDERSCORE],
2364 [AC_REQUIRE([GMP_ASM_TEXT])
2365 AC_REQUIRE([GMP_ASM_GLOBL])
2366 AC_REQUIRE([GMP_ASM_GLOBL_ATTR])
2367 AC_REQUIRE([GMP_ASM_LABEL_SUFFIX])
2368 AC_REQUIRE([GMP_ASM_UNDERSCORE])
2369 AC_REQUIRE([AC_LIBTOOL_PROG_COMPILER_PIC])
2370 AC_CACHE_CHECK([if _GLOBAL_OFFSET_TABLE_ is prefixed by underscore],
2371 gmp_cv_asm_x86_got_underscore,
2372 [gmp_cv_asm_x86_got_underscore="not applicable"
2373 if test $gmp_cv_asm_underscore = yes; then
2378 for tmp_underscore in "" "_"; do
2379 cat >conftest.s <<EOF
2381 $gmp_cv_asm_globl ${tmp_gsym_prefix}main$gmp_cv_asm_globl_attr
2382 ${tmp_gsym_prefix}main$gmp_cv_asm_label_suffix
2383 addl $ ${tmp_underscore}_GLOBAL_OFFSET_TABLE_, %ebx
2385 gmp_compile="$CCAS $CFLAGS $CPPFLAGS $lt_prog_compiler_pic conftest.s >&AC_FD_CC && $CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic conftest.$OBJEXT >&AC_FD_CC"
2386 if AC_TRY_EVAL(gmp_compile); then
2387 if test "$tmp_underscore" = "_"; then
2388 gmp_cv_asm_x86_got_underscore=yes
2390 gmp_cv_asm_x86_got_underscore=no
2395 rm -f conftest* a.out b.out a.exe a_out.exe
2397 if test "$gmp_cv_asm_x86_got_underscore" = "yes"; then
2398 GMP_DEFINE(GOT_GSYM_PREFIX, [_])
2400 GMP_DEFINE(GOT_GSYM_PREFIX, [])
2405 dnl GMP_ASM_X86_GOT_EAX_OK(CC+CFLAGS, [ACTION-YES] [, ACTION-NO])
2406 dnl -------------------------------------------------------------
2407 dnl Determine whether _GLOBAL_OFFSET_TABLE_ used with %eax is ok.
2411 dnl addl $_GLOBAL_OFFSET_TABLE_, %eax
2413 dnl is incorrectly assembled by gas 2.12 (or thereabouts) and earlier. It
2414 dnl puts an addend 2 into the R_386_GOTPC relocation, but it should be 1
2415 dnl for this %eax form being a 1 byte opcode (with other registers it's 2
2416 dnl opcode bytes). See note about this in mpn/x86/README too.
2418 dnl We assemble this, surrounded by some unlikely byte sequences as
2419 dnl delimiters, and check for the bad output.
2421 dnl This is for use by compiler probing in GMP_PROG_CC_WORKS, so the result
2424 dnl This test is not specific to gas, but old gas is the only assembler we
2425 dnl know of with this problem. The Solaris has been seen coming out ok.
2427 dnl ".text" is hard coded because this macro is wanted before GMP_ASM_TEXT.
2428 dnl This should be fine, ".text" is normal on x86 systems, and certainly
2429 dnl will be fine with the offending gas.
2431 dnl If an error occurs when assembling, we consider the assembler ok, since
2432 dnl the bad output does not occur. This happens for instance on mingw,
2433 dnl where _GLOBAL_OFFSET_TABLE_ results in a bfd error, since there's no
2434 dnl GOT etc in PE object files.
2436 dnl This test is used before the object file extension has been determined,
2437 dnl so we force output to conftest.o. Using -o with -c is not portable,
2438 dnl but we think all x86 compilers will accept -o with -c, certainly gcc
2441 dnl -fPIC is hard coded here, because this test is for use before libtool
2442 dnl has established the pic options. It's right for gcc, but perhaps not
2443 dnl other compilers.
2445 AC_DEFUN([GMP_ASM_X86_GOT_EAX_OK],
2446 [echo "Testing gas GOT with eax good" >&AC_FD_CC
2447 cat >conftest.awk <<\EOF
2476 for (f = 2; f <= NF; f++)
2478 for (i = 0; i < 20; i++)
2483 for (i = 0; i < 21; i++)
2484 if (got[i] != want[i])
2500 cat >conftest.s <<\EOF
2502 .byte 1, 35, 69, 103, 137, 171, 205, 239
2503 addl $_GLOBAL_OFFSET_TABLE_, %eax
2504 .byte 254, 220, 186, 152, 118, 84, 50, 16
2507 gmp_compile="$1 -fPIC -o conftest.o -c conftest.s >&AC_FD_CC 2>&1"
2508 if AC_TRY_EVAL(gmp_compile); then
2509 tmp_got_good=`od -b conftest.o | $AWK -f conftest.awk`
2512 echo "Result: $tmp_got_good" >&AC_FD_CC
2513 if test "$tmp_got_good" = no; then
2514 ifelse([$3],,:,[$3])
2516 ifelse([$2],,:,[$2])
2521 dnl GMP_ASM_X86_MMX([ACTION-IF-YES][,ACTION-IF-NO])
2522 dnl -----------------------------------------------
2523 dnl Determine whether the assembler supports MMX instructions.
2525 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2526 dnl here. ".text" is believed to be correct on all x86 systems. Actually
2527 dnl ".text" probably isn't needed at all, at least for just checking
2528 dnl instruction syntax.
2530 dnl "movq %mm0, %mm1" should assemble to "0f 6f c8", but Solaris 2.6 and
2531 dnl 2.7 wrongly assemble it to "0f 6f c1" (that being the reverse "movq
2532 dnl %mm1, %mm0"). It seems more trouble than it's worth to work around
2533 dnl this in the code, so just detect and reject.
2535 AC_DEFUN([GMP_ASM_X86_MMX],
2536 [AC_CACHE_CHECK([if the assembler knows about MMX instructions],
2541 [gmp_cv_asm_x86_mmx=yes
2544 if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then
2545 if grep "0f 6f c1" conftest.out >/dev/null; then
2546 gmp_cv_asm_x86_mmx=movq-bug
2549 AC_MSG_WARN(["dis" not available to check for "as" movq bug])
2552 [gmp_cv_asm_x86_mmx=no])])
2554 case $gmp_cv_asm_x86_mmx in
2556 AC_MSG_WARN([+----------------------------------------------------------])
2557 AC_MSG_WARN([| WARNING WARNING WARNING])
2558 AC_MSG_WARN([| Host CPU has MMX code, but the assembler])
2559 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2560 AC_MSG_WARN([| has the Solaris 2.6 and 2.7 bug where register to register])
2561 AC_MSG_WARN([| movq operands are reversed.])
2562 AC_MSG_WARN([| Non-MMX replacements will be used.])
2563 AC_MSG_WARN([| This will be an inferior build.])
2564 AC_MSG_WARN([+----------------------------------------------------------])
2567 AC_MSG_WARN([+----------------------------------------------------------])
2568 AC_MSG_WARN([| WARNING WARNING WARNING])
2569 AC_MSG_WARN([| Host CPU has MMX code, but it can't be assembled by])
2570 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2571 AC_MSG_WARN([| Non-MMX replacements will be used.])
2572 AC_MSG_WARN([| This will be an inferior build.])
2573 AC_MSG_WARN([+----------------------------------------------------------])
2576 if test "$gmp_cv_asm_x86_mmx" = yes; then
2577 ifelse([$1],,:,[$1])
2579 ifelse([$2],,:,[$2])
2584 dnl GMP_ASM_X86_SHLDL_CL
2585 dnl --------------------
2587 AC_DEFUN([GMP_ASM_X86_SHLDL_CL],
2588 [AC_REQUIRE([GMP_ASM_TEXT])
2589 AC_CACHE_CHECK([if the assembler takes cl with shldl],
2590 gmp_cv_asm_x86_shldl_cl,
2593 shldl %cl, %eax, %ebx],
2594 gmp_cv_asm_x86_shldl_cl=yes,
2595 gmp_cv_asm_x86_shldl_cl=no)
2597 if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then
2598 GMP_DEFINE(WANT_SHLDL_CL,1)
2600 GMP_DEFINE(WANT_SHLDL_CL,0)
2605 dnl GMP_ASM_X86_SSE2([ACTION-IF-YES][,ACTION-IF-NO])
2606 dnl ------------------------------------------------
2607 dnl Determine whether the assembler supports SSE2 instructions.
2609 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2610 dnl here. ".text" is believed to be correct on all x86 systems, certainly
2611 dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't
2612 dnl needed at all, at least for just checking instruction syntax.
2614 AC_DEFUN([GMP_ASM_X86_SSE2],
2615 [AC_CACHE_CHECK([if the assembler knows about SSE2 instructions],
2616 gmp_cv_asm_x86_sse2,
2620 [gmp_cv_asm_x86_sse2=yes],
2621 [gmp_cv_asm_x86_sse2=no])
2623 case $gmp_cv_asm_x86_sse2 in
2625 ifelse([$1],,:,[$1])
2628 AC_MSG_WARN([+----------------------------------------------------------])
2629 AC_MSG_WARN([| WARNING WARNING WARNING])
2630 AC_MSG_WARN([| Host CPU has SSE2 code, but it can't be assembled by])
2631 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2632 AC_MSG_WARN([| Non-SSE2 replacements will be used.])
2633 AC_MSG_WARN([| This will be an inferior build.])
2634 AC_MSG_WARN([+----------------------------------------------------------])
2635 ifelse([$2],,:,[$2])
2641 dnl GMP_ASM_X86_MULX([ACTION-IF-YES][,ACTION-IF-NO])
2642 dnl ------------------------------------------------
2643 dnl Determine whether the assembler supports the mulx instruction which debut
2646 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2647 dnl here. ".text" is believed to be correct on all x86 systems, certainly
2648 dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't
2649 dnl needed at all, at least for just checking instruction syntax.
2651 AC_DEFUN([GMP_ASM_X86_MULX],
2652 [AC_CACHE_CHECK([if the assembler knows about the mulx instruction],
2653 gmp_cv_asm_x86_mulx,
2656 mulx %r8, %r9, %r10],
2657 [gmp_cv_asm_x86_mulx=yes],
2658 [gmp_cv_asm_x86_mulx=no])
2660 case $gmp_cv_asm_x86_mulx in
2662 ifelse([$1],,:,[$1])
2665 AC_MSG_WARN([+----------------------------------------------------------])
2666 AC_MSG_WARN([| WARNING WARNING WARNING])
2667 AC_MSG_WARN([| Host CPU has the mulx instruction, but it can't be])
2668 AC_MSG_WARN([| assembled by])
2669 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2670 AC_MSG_WARN([| Older x86 instructions will be used.])
2671 AC_MSG_WARN([| This will be an inferior build.])
2672 AC_MSG_WARN([+----------------------------------------------------------])
2673 ifelse([$2],,:,[$2])
2679 dnl GMP_ASM_X86_ADX([ACTION-IF-YES][,ACTION-IF-NO])
2680 dnl ------------------------------------------------
2681 dnl Determine whether the assembler supports the adcx and adox instructions
2682 dnl which debut with the Haswell shrink Broadwell.
2684 dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded
2685 dnl here. ".text" is believed to be correct on all x86 systems, certainly
2686 dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't
2687 dnl needed at all, at least for just checking instruction syntax.
2689 AC_DEFUN([GMP_ASM_X86_ADX],
2690 [AC_CACHE_CHECK([if the assembler knows about the adox instruction],
2696 [gmp_cv_asm_x86_adx=yes],
2697 [gmp_cv_asm_x86_adx=no])
2699 case $gmp_cv_asm_x86_adx in
2701 ifelse([$1],,:,[$1])
2704 AC_MSG_WARN([+----------------------------------------------------------])
2705 AC_MSG_WARN([| WARNING WARNING WARNING])
2706 AC_MSG_WARN([| Host CPU has the adcx and adox instructions, but they])
2707 AC_MSG_WARN([| can't be assembled by])
2708 AC_MSG_WARN([| $CCAS $CFLAGS $CPPFLAGS])
2709 AC_MSG_WARN([| Older x86 instructions will be used.])
2710 AC_MSG_WARN([| This will be an inferior build.])
2711 AC_MSG_WARN([+----------------------------------------------------------])
2712 ifelse([$2],,:,[$2])
2718 dnl GMP_ASM_X86_MCOUNT
2719 dnl ------------------
2720 dnl Find out how to call mcount for profiling on an x86 system.
2722 dnl A dummy function is compiled and the ".s" output examined. The pattern
2723 dnl matching might be a bit fragile, but should work at least with gcc on
2724 dnl sensible systems. Certainly it's better than hard coding a table of
2727 dnl For non-PIC, any ".data" is taken to mean a counter might be passed.
2728 dnl It's assumed a movl will set it up, and the right register is taken
2729 dnl from that movl. Any movl involving %esp is ignored (a frame pointer
2730 dnl setup normally).
2732 dnl For PIC, any ".data" is similarly interpreted, but a GOTOFF identifies
2733 dnl the line setting up the right register.
2735 dnl In both cases a line with "mcount" identifies the call and that line is
2738 dnl On some systems (eg. FreeBSD 3.5) gcc emits ".data" but doesn't use it,
2739 dnl so it's not an error to have .data but then not find a register.
2741 dnl Variations in mcount conventions on different x86 systems can be found
2742 dnl in gcc config/i386. mcount can have a "_" prefix or be .mcount or
2743 dnl _mcount_ptr, and for PIC it can be called through a GOT entry, or via
2744 dnl the PLT. If a pointer to a counter is required it's passed in %eax or
2747 dnl Flags to specify PIC are taken from $lt_prog_compiler_pic set by
2748 dnl AC_PROG_LIBTOOL.
2750 dnl Enhancement: Cache the values determined here. But what's the right way
2751 dnl to get two variables (mcount_nonpic_reg and mcount_nonpic_call say) set
2752 dnl from one block of commands?
2754 AC_DEFUN([GMP_ASM_X86_MCOUNT],
2755 [AC_REQUIRE([AC_ENABLE_SHARED])
2756 AC_REQUIRE([AC_PROG_LIBTOOL])
2757 AC_MSG_CHECKING([how to call x86 mcount])
2758 cat >conftest.c <<EOF
2762 if test "$enable_static" = yes; then
2763 gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c 1>&AC_FD_CC"
2764 if AC_TRY_EVAL(gmp_asmout_compile); then
2765 if grep '\.data' conftest.s >/dev/null; then
2766 mcount_nonpic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2770 mcount_nonpic_call=`grep 'call.*mcount' conftest.s`
2771 if test -z "$mcount_nonpic_call"; then
2772 AC_MSG_ERROR([Cannot find mcount call for non-PIC])
2775 AC_MSG_ERROR([Cannot compile test program for non-PIC])
2779 if test "$enable_shared" = yes; then
2780 gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&AC_FD_CC"
2781 if AC_TRY_EVAL(gmp_asmout_compile); then
2782 if grep '\.data' conftest.s >/dev/null; then
2783 case $lt_prog_compiler_pic in
2785 # Windows DLLs have non-PIC style mcount
2786 mcount_pic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2789 mcount_pic_reg=`sed -n ['s/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p'] conftest.s`
2795 mcount_pic_call=`grep 'call.*mcount' conftest.s`
2796 if test -z "$mcount_pic_call"; then
2797 AC_MSG_ERROR([Cannot find mcount call for PIC])
2800 AC_MSG_ERROR([Cannot compile test program for PIC])
2804 GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_REG>, <\`$mcount_nonpic_reg'>)"])
2805 GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_CALL>,<\`$mcount_nonpic_call'>)"])
2806 GMP_DEFINE_RAW(["define(<MCOUNT_PIC_REG>, <\`$mcount_pic_reg'>)"])
2807 GMP_DEFINE_RAW(["define(<MCOUNT_PIC_CALL>, <\`$mcount_pic_call'>)"])
2810 AC_MSG_RESULT([determined])
2814 dnl GMP_ASM_IA64_ALIGN_OK
2815 dnl ---------------------
2816 dnl Determine whether .align correctly pads with nop instructions in a text
2819 dnl gas 2.14 and earlier byte swaps its padding bundle on big endian
2820 dnl systems, which is incorrect (endianness only changes data). What
2821 dnl should be "nop.m / nop.f / nop.i" comes out as "break" instructions.
2823 dnl The test here detects the bad case, and assumes anything else is ok
2824 dnl (there are many sensible nop bundles, so it'd be impractical to try to
2825 dnl match everything good).
2827 AC_DEFUN([GMP_ASM_IA64_ALIGN_OK],
2828 [AC_CACHE_CHECK([whether assembler .align padding is good],
2829 gmp_cv_asm_ia64_align_ok,
2830 [cat >conftest.awk <<\EOF
2886 for (f = 2; f <= NF; f++)
2888 for (i = 0; i < 47; i++)
2893 for (i = 0; i < 48; i++)
2894 if (got[i] != want[i])
2913 { .mmi; add r14 = r15, r16
2915 add r20 = r21, r22 ;; }
2917 { .mmi; add r23 = r24, r25
2919 add r29 = r30, r31 ;; }
2921 [gmp_cv_asm_ia64_align_ok=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`],
2922 [AC_MSG_WARN([oops, cannot compile test program])
2923 gmp_cv_asm_ia64_align_ok=yes])
2925 GMP_DEFINE_RAW(["define(<IA64_ALIGN_OK>, <\`$gmp_cv_asm_ia64_align_ok'>)"])
2931 dnl GMP_ASM_M68K_INSTRUCTION
2932 dnl ------------------------
2933 dnl Not sure if ".l" and "%" are independent settings, but it doesn't hurt
2934 dnl to try all four possibilities. Note that the % ones must be first, so
2935 dnl "d0" won't be interpreted as a label.
2937 dnl gas 1.92.3 on NetBSD 1.4 needs to be tested with a two operand
2938 dnl instruction. It takes registers without "%", but a single operand
2939 dnl "clrl %d0" only gives a warning, not an error.
2941 AC_DEFUN([GMP_ASM_M68K_INSTRUCTION],
2942 [AC_REQUIRE([GMP_ASM_TEXT])
2943 AC_CACHE_CHECK([assembler instruction and register style],
2944 gmp_cv_asm_m68k_instruction,
2945 [for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do
2949 [gmp_cv_asm_m68k_instruction=$i
2953 if test -z "$gmp_cv_asm_m68k_instruction"; then
2954 AC_MSG_ERROR([cannot determine assembler instruction and register style])
2957 case $gmp_cv_asm_m68k_instruction in
2958 "addl d0,d1") want_dot_size=no; want_register_percent=no ;;
2959 "addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;;
2960 "add.l d0,d1") want_dot_size=yes; want_register_percent=no ;;
2961 "add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;;
2962 *) AC_MSG_ERROR([oops, unrecognised instruction and register style]) ;;
2964 GMP_DEFINE_RAW(["define(<WANT_REGISTER_PERCENT>, <\`$want_register_percent'>)"])
2965 GMP_DEFINE_RAW(["define(<WANT_DOT_SIZE>, <\`$want_dot_size'>)"])
2969 dnl GMP_ASM_M68K_ADDRESSING
2970 dnl -----------------------
2972 AC_DEFUN([GMP_ASM_M68K_ADDRESSING],
2973 [AC_REQUIRE([GMP_ASM_TEXT])
2974 AC_REQUIRE([GMP_ASM_M68K_INSTRUCTION])
2975 AC_CACHE_CHECK([assembler addressing style],
2976 gmp_cv_asm_m68k_addressing,
2977 [case $gmp_cv_asm_m68k_instruction in
2978 addl*) movel=movel ;;
2979 add.l*) movel=move.l ;;
2980 *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;;
2982 case $gmp_cv_asm_m68k_instruction in
2983 *"%d0,%d1") dreg=%d0; areg=%a0 ;;
2984 *"d0,d1") dreg=d0; areg=a0 ;;
2985 *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;;
2989 $movel $dreg, $areg@-],
2990 [gmp_cv_asm_m68k_addressing=mit],
2993 $movel $dreg, -($areg)],
2994 [gmp_cv_asm_m68k_addressing=motorola],
2995 [AC_MSG_ERROR([cannot determine assembler addressing style])])])
2997 GMP_DEFINE_RAW(["define(<WANT_ADDRESSING>, <\`$gmp_cv_asm_m68k_addressing'>)"])
3001 dnl GMP_ASM_M68K_BRANCHES
3002 dnl ---------------------
3003 dnl "bra" is the standard branch instruction. "jra" or "jbra" are
3004 dnl preferred where available, since on gas for instance they give a
3005 dnl displacement only as big as it needs to be, whereas "bra" is always
3006 dnl 16-bits. This applies to the conditional branches "bcc" etc too.
3007 dnl However "dbcc" etc on gas are already only as big as they need to be.
3009 AC_DEFUN([GMP_ASM_M68K_BRANCHES],
3010 [AC_REQUIRE([GMP_ASM_TEXT])
3011 AC_CACHE_CHECK([assembler shortest branches],
3012 gmp_cv_asm_m68k_branches,
3013 [for i in jra jbra bra; do
3016 foo$gmp_cv_asm_label_suffix
3018 [gmp_cv_asm_m68k_branches=$i
3022 if test -z "$gmp_cv_asm_m68k_branches"; then
3023 AC_MSG_ERROR([cannot determine assembler branching style])
3026 GMP_DEFINE_RAW(["define(<WANT_BRANCHES>, <\`$gmp_cv_asm_m68k_branches'>)"])
3030 dnl GMP_ASM_POWERPC_PIC_ALWAYS
3031 dnl --------------------------
3032 dnl Determine whether PIC is the default compiler output.
3034 dnl SVR4 style "foo@ha" addressing is interpreted as non-PIC, and anything
3035 dnl else is assumed to require PIC always (Darwin or AIX). SVR4 is the
3036 dnl only non-PIC addressing syntax the asm files have at the moment anyway.
3038 dnl Libtool does this by taking "*-*-aix* | *-*-darwin* | *-*-rhapsody*" to
3039 dnl mean PIC always, but it seems more reliable to grep the compiler
3042 dnl The next paragraph is untrue for Tiger. Was it ever true? For tiger,
3043 dnl "cc -fast" makes non-PIC the default (and the binaries do run).
3044 dnl On Darwin "cc -static" is non-PIC with syntax "ha16(_foo)", but that's
3045 dnl apparently only for use in the kernel, which we're not attempting to
3046 dnl target at the moment, so don't look for that.
3048 AC_DEFUN([GMP_ASM_POWERPC_PIC_ALWAYS],
3049 [AC_REQUIRE([AC_PROG_CC])
3050 AC_CACHE_CHECK([whether compiler output is PIC by default],
3051 gmp_cv_asm_powerpc_pic,
3052 [gmp_cv_asm_powerpc_pic=yes
3053 cat >conftest.c <<EOF
3055 int *bar() { return &foo; }
3057 echo "Test program:" >&AC_FD_CC
3058 cat conftest.c >&AC_FD_CC
3059 gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC"
3060 if AC_TRY_EVAL(gmp_compile); then
3061 echo "Compiler output:" >&AC_FD_CC
3062 cat conftest.s >&AC_FD_CC
3063 if grep 'foo@ha' conftest.s >/dev/null 2>&AC_FD_CC; then
3064 gmp_cv_asm_powerpc_pic=no
3066 if grep 'ha16(_foo)' conftest.s >/dev/null 2>&AC_FD_CC; then
3067 gmp_cv_asm_powerpc_pic=no
3072 GMP_DEFINE_RAW(["define(<PIC_ALWAYS>,<$gmp_cv_asm_powerpc_pic>)"])
3076 dnl GMP_ASM_POWERPC_R_REGISTERS
3077 dnl ---------------------------
3078 dnl Determine whether the assembler takes powerpc registers with an "r" as
3079 dnl in "r6", or as plain "6". The latter is standard, but NeXT, Rhapsody,
3080 dnl and MacOS-X require the "r" forms.
3082 dnl See also mpn/powerpc32/powerpc-defs.m4 which uses the result of this
3085 AC_DEFUN([GMP_ASM_POWERPC_R_REGISTERS],
3086 [AC_REQUIRE([GMP_ASM_TEXT])
3087 AC_CACHE_CHECK([if the assembler needs r on registers],
3088 gmp_cv_asm_powerpc_r_registers,
3092 [gmp_cv_asm_powerpc_r_registers=no],
3096 [gmp_cv_asm_powerpc_r_registers=yes],
3097 [AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])])])
3099 GMP_DEFINE_RAW(["define(<WANT_R_REGISTERS>,<$gmp_cv_asm_powerpc_r_registers>)"])
3103 dnl GMP_ASM_SPARC_REGISTER
3104 dnl ----------------------
3105 dnl Determine whether the assembler accepts the ".register" directive.
3106 dnl Old versions of solaris "as" don't.
3108 dnl See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
3110 AC_DEFUN([GMP_ASM_SPARC_REGISTER],
3111 [AC_REQUIRE([GMP_ASM_TEXT])
3112 AC_CACHE_CHECK([if the assembler accepts ".register"],
3113 gmp_cv_asm_sparc_register,
3116 .register %g2,#scratch
3118 [gmp_cv_asm_sparc_register=yes],
3119 [gmp_cv_asm_sparc_register=no])])
3121 GMP_DEFINE_RAW(["define(<HAVE_REGISTER>,<$gmp_cv_asm_sparc_register>)"])
3125 dnl GMP_ASM_SPARC_GOTDATA
3126 dnl ----------------------
3127 dnl Determine whether the assembler accepts gotdata relocations.
3129 dnl See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
3131 AC_DEFUN([GMP_ASM_SPARC_GOTDATA],
3132 [AC_REQUIRE([GMP_ASM_TEXT])
3133 AC_CACHE_CHECK([if the assembler accepts gotdata relocations],
3134 gmp_cv_asm_sparc_gotdata,
3138 sethi %gdop_hix22(symbol), %g1
3139 or %g1, %gdop_lox10(symbol), %g1
3141 [gmp_cv_asm_sparc_gotdata=yes],
3142 [gmp_cv_asm_sparc_gotdata=no])])
3144 GMP_DEFINE_RAW(["define(<HAVE_GOTDATA>,<$gmp_cv_asm_sparc_gotdata>)"])
3148 dnl GMP_ASM_SPARC_SHARED_THUNKS
3149 dnl ----------------------
3150 dnl Determine whether the assembler supports all of the features
3151 dnl necessary in order to emit shared PIC thunks on sparc.
3153 dnl See also mpn/sparc32/sparc-defs.m4 which uses the result of this test.
3155 AC_DEFUN([GMP_ASM_SPARC_SHARED_THUNKS],
3156 [AC_REQUIRE([GMP_ASM_TEXT])
3157 AC_CACHE_CHECK([if the assembler can support shared PIC thunks],
3158 gmp_cv_asm_sparc_shared_thunks,
3161 .section .text.__sparc_get_pc_thunk.l7,"axG",@progbits,__sparc_get_pc_thunk.l7,comdat
3162 .weak __sparc_get_pc_thunk.l7
3163 .hidden __sparc_get_pc_thunk.l7
3164 .type __sparc_get_pc_thunk.l7, #function
3165 __sparc_get_pc_thunk.l7:
3169 [gmp_cv_asm_sparc_shared_thunks=yes],
3170 [gmp_cv_asm_sparc_shared_thunks=no])])
3172 GMP_DEFINE_RAW(["define(<HAVE_SHARED_THUNKS>,<$gmp_cv_asm_sparc_shared_thunks>)"])
3176 dnl GMP_C_ATTRIBUTE_CONST
3177 dnl ---------------------
3179 AC_DEFUN([GMP_C_ATTRIBUTE_CONST],
3180 [AC_CACHE_CHECK([whether gcc __attribute__ ((const)) works],
3181 gmp_cv_c_attribute_const,
3182 [AC_TRY_COMPILE([int foo (int x) __attribute__ ((const));], ,
3183 gmp_cv_c_attribute_const=yes, gmp_cv_c_attribute_const=no)
3185 if test $gmp_cv_c_attribute_const = yes; then
3186 AC_DEFINE(HAVE_ATTRIBUTE_CONST, 1,
3187 [Define to 1 if the compiler accepts gcc style __attribute__ ((const))])
3192 dnl GMP_C_ATTRIBUTE_MALLOC
3193 dnl ----------------------
3194 dnl gcc 2.95.x accepts __attribute__ ((malloc)) but with a warning that
3195 dnl it's ignored. Pretend it doesn't exist in this case, to avoid that
3198 AC_DEFUN([GMP_C_ATTRIBUTE_MALLOC],
3199 [AC_CACHE_CHECK([whether gcc __attribute__ ((malloc)) works],
3200 gmp_cv_c_attribute_malloc,
3201 [cat >conftest.c <<EOF
3202 void *foo (int x) __attribute__ ((malloc));
3204 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >conftest.out 2>&1"
3205 if AC_TRY_EVAL(gmp_compile); then
3206 if grep "attribute directive ignored" conftest.out >/dev/null; then
3207 gmp_cv_c_attribute_malloc=no
3209 gmp_cv_c_attribute_malloc=yes
3212 gmp_cv_c_attribute_malloc=no
3214 cat conftest.out >&AC_FD_CC
3217 if test $gmp_cv_c_attribute_malloc = yes; then
3218 AC_DEFINE(HAVE_ATTRIBUTE_MALLOC, 1,
3219 [Define to 1 if the compiler accepts gcc style __attribute__ ((malloc))])
3224 dnl GMP_C_ATTRIBUTE_MODE
3225 dnl --------------------
3226 dnl Introduced in gcc 2.2, but perhaps not in all Apple derived versions.
3228 AC_DEFUN([GMP_C_ATTRIBUTE_MODE],
3229 [AC_CACHE_CHECK([whether gcc __attribute__ ((mode (XX))) works],
3230 gmp_cv_c_attribute_mode,
3231 [AC_TRY_COMPILE([typedef int SItype __attribute__ ((mode (SI)));], ,
3232 gmp_cv_c_attribute_mode=yes, gmp_cv_c_attribute_mode=no)
3234 if test $gmp_cv_c_attribute_mode = yes; then
3235 AC_DEFINE(HAVE_ATTRIBUTE_MODE, 1,
3236 [Define to 1 if the compiler accepts gcc style __attribute__ ((mode (XX)))])
3241 dnl GMP_C_ATTRIBUTE_NORETURN
3242 dnl ------------------------
3244 AC_DEFUN([GMP_C_ATTRIBUTE_NORETURN],
3245 [AC_CACHE_CHECK([whether gcc __attribute__ ((noreturn)) works],
3246 gmp_cv_c_attribute_noreturn,
3247 [AC_TRY_COMPILE([void foo (int x) __attribute__ ((noreturn));], ,
3248 gmp_cv_c_attribute_noreturn=yes, gmp_cv_c_attribute_noreturn=no)
3250 if test $gmp_cv_c_attribute_noreturn = yes; then
3251 AC_DEFINE(HAVE_ATTRIBUTE_NORETURN, 1,
3252 [Define to 1 if the compiler accepts gcc style __attribute__ ((noreturn))])
3256 dnl GMP_C_HIDDEN_ALIAS
3257 dnl ------------------------
3259 AC_DEFUN([GMP_C_HIDDEN_ALIAS],
3260 [AC_CACHE_CHECK([whether gcc hidden aliases work],
3261 gmp_cv_c_hidden_alias,
3263 [void hid() __attribute__ ((visibility("hidden")));
3265 void pub() __attribute__ ((alias("hid")));],
3266 , gmp_cv_c_hidden_alias=yes, gmp_cv_c_hidden_alias=no)
3268 if test $gmp_cv_c_hidden_alias = yes; then
3269 AC_DEFINE(HAVE_HIDDEN_ALIAS, 1,
3270 [Define to 1 if the compiler accepts gcc style __attribute__ ((visibility))
3271 and __attribute__ ((alias))])
3275 dnl GMP_C_DOUBLE_FORMAT
3276 dnl -------------------
3277 dnl Determine the floating point format.
3279 dnl The object file is grepped, in order to work when cross compiling. A
3280 dnl start and end sequence is included to avoid false matches, and allowance
3281 dnl is made for the desired data crossing an "od -b" line boundary. The test
3282 dnl number is a small integer so it should appear exactly, no rounding or
3285 dnl "od -b", incidentally, is supported even by Unix V7, and the awk script
3286 dnl used doesn't have functions or anything, so even an "old" awk should
3289 dnl The C code here declares the variable foo as extern; without that, some
3290 dnl C++ compilers will not put foo in the object file.
3292 AC_DEFUN([GMP_C_DOUBLE_FORMAT],
3293 [AC_REQUIRE([AC_PROG_CC])
3294 AC_REQUIRE([AC_PROG_AWK])
3295 AC_CACHE_CHECK([format of `double' floating point],
3296 gmp_cv_c_double_format,
3297 [gmp_cv_c_double_format=unknown
3298 cat >conftest.c <<\EOF
3304 extern struct foo foo;
3306 { '\001', '\043', '\105', '\147', '\211', '\253', '\315', '\357' },
3308 { '\376', '\334', '\272', '\230', '\166', '\124', '\062', '\020' },
3311 gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC 2>&1"
3312 if AC_TRY_EVAL(gmp_compile); then
3313 cat >conftest.awk <<\EOF
3320 for (f = 2; f <= NF; f++)
3322 for (i = 0; i < 23; i++)
3326 # match the special begin and end sequences
3327 if (got[0] != "001") continue
3328 if (got[1] != "043") continue
3329 if (got[2] != "105") continue
3330 if (got[3] != "147") continue
3331 if (got[4] != "211") continue
3332 if (got[5] != "253") continue
3333 if (got[6] != "315") continue
3334 if (got[7] != "357") continue
3335 if (got[16] != "376") continue
3336 if (got[17] != "334") continue
3337 if (got[18] != "272") continue
3338 if (got[19] != "230") continue
3339 if (got[20] != "166") continue
3340 if (got[21] != "124") continue
3341 if (got[22] != "062") continue
3342 if (got[23] != "020") continue
3344 saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")"
3346 if (got[8] == "000" && \
3347 got[9] == "000" && \
3348 got[10] == "000" && \
3349 got[11] == "124" && \
3350 got[12] == "064" && \
3351 got[13] == "157" && \
3352 got[14] == "235" && \
3355 print "IEEE little endian"
3360 # Little endian with the two 4-byte halves swapped, as used by ARM
3361 # when the chip is in little endian mode.
3363 if (got[8] == "064" && \
3364 got[9] == "157" && \
3365 got[10] == "235" && \
3366 got[11] == "301" && \
3367 got[12] == "000" && \
3368 got[13] == "000" && \
3369 got[14] == "000" && \
3372 print "IEEE little endian, swapped halves"
3377 # gcc 2.95.4 on one GNU/Linux ARM system was seen generating 000 in
3378 # the last byte, whereas 124 is correct. Not sure where the bug
3379 # actually lies, but a running program didn't seem to get a full
3380 # mantissa worth of working bits.
3382 # We match this case explicitly so we can give a nice result message,
3383 # but we deliberately exclude it from the normal IEEE double setups
3384 # since it's too broken.
3386 if (got[8] == "064" && \
3387 got[9] == "157" && \
3388 got[10] == "235" && \
3389 got[11] == "301" && \
3390 got[12] == "000" && \
3391 got[13] == "000" && \
3392 got[14] == "000" && \
3395 print "bad ARM software floats"
3400 if (got[8] == "301" && \
3401 got[9] == "235" && \
3402 got[10] == "157" && \
3403 got[11] == "064" && \
3404 got[12] == "124" && \
3405 got[13] == "000" && \
3406 got[14] == "000" && \
3409 print "IEEE big endian"
3414 if (got[8] == "353" && \
3415 got[9] == "315" && \
3416 got[10] == "242" && \
3417 got[11] == "171" && \
3418 got[12] == "000" && \
3419 got[13] == "240" && \
3420 got[14] == "000" && \
3428 if (got[8] == "275" && \
3429 got[9] == "301" && \
3430 got[10] == "064" && \
3431 got[11] == "157" && \
3432 got[12] == "000" && \
3433 got[13] == "124" && \
3434 got[14] == "000" && \
3442 if (got[8] == "300" && \
3443 got[9] == "033" && \
3444 got[10] == "353" && \
3445 got[11] == "171" && \
3446 got[12] == "242" && \
3447 got[13] == "240" && \
3448 got[14] == "000" && \
3460 print "unknown", saw
3464 gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk`
3465 case $gmp_cv_c_double_format in
3467 echo "cannot match anything, conftest.$OBJEXT contains" >&AC_FD_CC
3468 od -b conftest.$OBJEXT >&AC_FD_CC
3472 AC_MSG_WARN([oops, cannot compile test program])
3477 AH_VERBATIM([HAVE_DOUBLE],
3478 [/* Define one of the following to 1 for the format of a `double'.
3479 If your format is not among these choices, or you don't know what it is,
3480 then leave all undefined.
3481 IEEE_LITTLE_SWAPPED means little endian, but with the two 4-byte halves
3482 swapped, as used by ARM CPUs in little endian mode. */
3483 #undef HAVE_DOUBLE_IEEE_BIG_ENDIAN
3484 #undef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN
3485 #undef HAVE_DOUBLE_IEEE_LITTLE_SWAPPED
3486 #undef HAVE_DOUBLE_VAX_D
3487 #undef HAVE_DOUBLE_VAX_G
3488 #undef HAVE_DOUBLE_CRAY_CFP])
3490 case $gmp_cv_c_double_format in
3492 AC_DEFINE(HAVE_DOUBLE_IEEE_BIG_ENDIAN, 1)
3493 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_BIG_ENDIAN')", POST)
3495 "IEEE little endian")
3496 AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_ENDIAN, 1)
3497 GMP_DEFINE_RAW("define_not_for_expansion(\`HAVE_DOUBLE_IEEE_LITTLE_ENDIAN')", POST)
3499 "IEEE little endian, swapped halves")
3500 AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_SWAPPED, 1) ;;
3502 AC_DEFINE(HAVE_DOUBLE_VAX_D, 1) ;;
3504 AC_DEFINE(HAVE_DOUBLE_VAX_G, 1) ;;
3506 AC_DEFINE(HAVE_DOUBLE_CRAY_CFP, 1) ;;
3507 "bad ARM software floats")
3510 AC_MSG_WARN([Could not determine float format.])
3511 AC_MSG_WARN([Conversions to and from "double" may be slow.])
3514 AC_MSG_WARN([oops, unrecognised float format: $gmp_cv_c_double_format])
3522 dnl Test whether to use <stdarg.h>.
3524 dnl Notice the AC_DEFINE here is HAVE_STDARG to avoid clashing with
3525 dnl HAVE_STDARG_H which could arise from AC_CHECK_HEADERS.
3527 dnl This test might be slight overkill, after all there's really only going
3528 dnl to be ANSI or K&R and the two can be differentiated by AC_PROG_CC_STDC
3529 dnl or very likely by the setups for _PROTO in gmp.h. On the other hand
3530 dnl this test is nice and direct, being what we're going to actually use.
3532 dnl AC_DEFUN([GMP_C_STDARG],
3533 dnl [AC_CACHE_CHECK([whether <stdarg.h> exists and works],
3534 dnl gmp_cv_c_stdarg,
3535 dnl [AC_TRY_COMPILE(
3536 dnl [#include <stdarg.h>
3537 dnl int foo (int x, ...)
3541 dnl va_start (ap, x);
3542 dnl y = va_arg (ap, int);
3546 dnl gmp_cv_c_stdarg=yes, gmp_cv_c_stdarg=no)
3548 dnl if test $gmp_cv_c_stdarg = yes; then
3549 dnl AC_DEFINE(HAVE_STDARG, 1, [Define to 1 if <stdarg.h> exists and works])
3556 dnl Determine whether "alloca" is available. This is AC_FUNC_ALLOCA from
3557 dnl autoconf, but changed so it doesn't use alloca.c if alloca() isn't
3558 dnl available, and also to use gmp-impl.h for the conditionals detecting
3559 dnl compiler builtin alloca's.
3561 AC_DEFUN([GMP_FUNC_ALLOCA],
3562 [AC_REQUIRE([GMP_HEADER_ALLOCA])
3563 AC_CACHE_CHECK([for alloca (via gmp-impl.h)],
3567 [#include "$srcdir/gmp-impl.h"
3569 [char *p = (char *) alloca (1);],
3570 gmp_cv_func_alloca=yes,
3571 gmp_cv_func_alloca=no)])
3572 if test $gmp_cv_func_alloca = yes; then
3573 AC_DEFINE(HAVE_ALLOCA, 1, [Define to 1 if alloca() works (via gmp-impl.h).])
3577 AC_DEFUN([GMP_HEADER_ALLOCA],
3578 [# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
3579 # for constant arguments. Useless!
3580 AC_CACHE_CHECK([for working alloca.h],
3581 gmp_cv_header_alloca,
3582 [AC_TRY_LINK([#include <alloca.h>],
3583 [char *p = (char *) alloca (2 * sizeof (int));],
3584 gmp_cv_header_alloca=yes,
3585 gmp_cv_header_alloca=no)])
3586 if test $gmp_cv_header_alloca = yes; then
3587 AC_DEFINE(HAVE_ALLOCA_H, 1,
3588 [Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).])
3593 dnl GMP_OPTION_ALLOCA
3594 dnl -----------------
3595 dnl Decide what to do about --enable-alloca from the user.
3596 dnl This is a macro so it can require GMP_FUNC_ALLOCA.
3598 AC_DEFUN([GMP_OPTION_ALLOCA],
3599 [AC_REQUIRE([GMP_FUNC_ALLOCA])
3600 AC_CACHE_CHECK([how to allocate temporary memory],
3601 gmp_cv_option_alloca,
3602 [case $enable_alloca in
3604 gmp_cv_option_alloca=alloca
3607 gmp_cv_option_alloca=malloc-reentrant
3609 reentrant | notreentrant)
3610 case $gmp_cv_func_alloca in
3611 yes) gmp_cv_option_alloca=alloca ;;
3612 *) gmp_cv_option_alloca=malloc-$enable_alloca ;;
3616 gmp_cv_option_alloca=$enable_alloca
3621 AH_VERBATIM([WANT_TMP],
3622 [/* Define one of these to 1 for the desired temporary memory allocation
3623 method, per --enable-alloca. */
3624 #undef WANT_TMP_ALLOCA
3625 #undef WANT_TMP_REENTRANT
3626 #undef WANT_TMP_NOTREENTRANT
3627 #undef WANT_TMP_DEBUG])
3629 case $gmp_cv_option_alloca in
3631 if test $gmp_cv_func_alloca = no; then
3632 AC_MSG_ERROR([--enable-alloca=alloca specified, but alloca not available])
3634 AC_DEFINE(WANT_TMP_ALLOCA)
3635 TAL_OBJECT=tal-reent$U.lo
3638 AC_DEFINE(WANT_TMP_REENTRANT)
3639 TAL_OBJECT=tal-reent$U.lo
3641 malloc-notreentrant)
3642 AC_DEFINE(WANT_TMP_NOTREENTRANT)
3643 TAL_OBJECT=tal-notreent$U.lo
3646 AC_DEFINE(WANT_TMP_DEBUG)
3647 TAL_OBJECT=tal-debug$U.lo
3650 # checks at the start of configure.in should protect us
3651 AC_MSG_ERROR([unrecognised --enable-alloca=$gmp_cv_option_alloca])
3654 AC_SUBST(TAL_OBJECT)
3658 dnl GMP_FUNC_SSCANF_WRITABLE_INPUT
3659 dnl ------------------------------
3660 dnl Determine whether sscanf requires a writable input string.
3662 dnl It might be nicer to run a program to determine this when doing a
3663 dnl native build, but the systems afflicted are few and far between these
3664 dnl days, so it seems good enough just to list them.
3666 AC_DEFUN([GMP_FUNC_SSCANF_WRITABLE_INPUT],
3667 [AC_CACHE_CHECK([whether sscanf needs writable input],
3668 gmp_cv_func_sscanf_writable_input,
3670 *-*-hpux9 | *-*-hpux9.*)
3671 gmp_cv_func_sscanf_writable_input=yes ;;
3672 *) gmp_cv_func_sscanf_writable_input=no ;;
3675 case $gmp_cv_func_sscanf_writable_input in
3676 yes) AC_DEFINE(SSCANF_WRITABLE_INPUT, 1,
3677 [Define to 1 if sscanf requires writable inputs]) ;;
3679 *) AC_MSG_ERROR([unrecognised \$gmp_cv_func_sscanf_writable_input]) ;;
3684 dnl GMP_FUNC_VSNPRINTF
3685 dnl ------------------
3686 dnl Check whether vsnprintf exists, and works properly.
3688 dnl Systems without vsnprintf include mingw32, OSF 4.
3690 dnl Sparc Solaris 2.7 in 64-bit mode doesn't always truncate, making
3691 dnl vsnprintf like vsprintf, and hence completely useless. On one system a
3692 dnl literal string is enough to provoke the problem, on another a "%n" was
3693 dnl needed. There seems to be something weird going on with the optimizer
3694 dnl or something, since on the first system adding a second check with
3695 dnl "%n", or even just an initialized local variable, makes it work. In
3696 dnl any case, without bothering to get to the bottom of this, the two
3697 dnl program runs in the code below end up successfully detecting the
3700 dnl glibc 2.0.x returns either -1 or bufsize-1 for an overflow (both seen,
3701 dnl not sure which 2.0.x does which), but still puts the correct null
3702 dnl terminated result into the buffer.
3704 AC_DEFUN([GMP_FUNC_VSNPRINTF],
3705 [AC_CHECK_FUNC(vsnprintf,
3706 [gmp_vsnprintf_exists=yes],
3707 [gmp_vsnprintf_exists=no])
3708 if test "$gmp_vsnprintf_exists" = no; then
3709 gmp_cv_func_vsnprintf=no
3711 AC_CACHE_CHECK([whether vsnprintf works],
3712 gmp_cv_func_vsnprintf,
3713 [gmp_cv_func_vsnprintf=yes
3714 for i in 'return check ("hello world");' 'int n; return check ("%nhello world", &n);'; do
3716 #include <string.h> /* for strcmp */
3717 #include <stdio.h> /* for vsnprintf */
3722 check (const char *fmt, ...)
3724 static char buf[128];
3730 ret = vsnprintf (buf, 4, fmt, ap);
3732 if (strcmp (buf, "hel") != 0)
3735 /* allowed return values */
3736 if (ret != -1 && ret != 3 && ret != 11)
3749 [gmp_cv_func_vsnprintf=no; break],
3750 [gmp_cv_func_vsnprintf=probably; break])
3753 if test "$gmp_cv_func_vsnprintf" = probably; then
3754 AC_MSG_WARN([cannot check for properly working vsnprintf when cross compiling, will assume it's ok])
3756 if test "$gmp_cv_func_vsnprintf" != no; then
3757 AC_DEFINE(HAVE_VSNPRINTF,1,
3758 [Define to 1 if you have the `vsnprintf' function and it works properly.])
3764 dnl GMP_H_EXTERN_INLINE
3765 dnl -------------------
3766 dnl If the compiler has an "inline" of some sort, check whether the
3767 dnl #ifdef's in gmp.h recognise it.
3769 AC_DEFUN([GMP_H_EXTERN_INLINE],
3770 [AC_REQUIRE([AC_C_INLINE])
3771 case $ac_cv_c_inline in
3775 [#define __GMP_WITHIN_CONFIGURE_INLINE 1
3777 #ifndef __GMP_EXTERN_INLINE
3781 [case $ac_cv_c_inline in
3782 yes) tmp_inline=inline ;;
3783 *) tmp_inline=$ac_cv_c_inline ;;
3785 AC_MSG_WARN([gmp.h doesnt recognise compiler "$tmp_inline", inlines will be unavailable])])
3793 dnl Check whether the #ifdef's in gmp.h recognise when stdio.h has been
3794 dnl included to get FILE.
3796 AC_DEFUN([GMP_H_HAVE_FILE],
3798 [#include <stdio.h>]
3800 [#if ! _GMP_H_HAVE_FILE
3804 [AC_MSG_WARN([gmp.h doesnt recognise <stdio.h>, FILE prototypes will be unavailable])])
3808 dnl GMP_PROG_CC_FOR_BUILD
3809 dnl ---------------------
3810 dnl Establish CC_FOR_BUILD, a C compiler for the build system.
3812 dnl If CC_FOR_BUILD is set then it's expected to work, likewise the old
3813 dnl style HOST_CC, otherwise some likely candidates are tried, the same as
3814 dnl configfsf.guess.
3816 AC_DEFUN([GMP_PROG_CC_FOR_BUILD],
3817 [AC_REQUIRE([AC_PROG_CC])
3818 if test -n "$CC_FOR_BUILD"; then
3819 GMP_PROG_CC_FOR_BUILD_WORKS($CC_FOR_BUILD,,
3820 [AC_MSG_ERROR([Specified CC_FOR_BUILD doesn't seem to work])])
3821 elif test -n "$HOST_CC"; then
3822 GMP_PROG_CC_FOR_BUILD_WORKS($HOST_CC,
3823 [CC_FOR_BUILD=$HOST_CC],
3824 [AC_MSG_ERROR([Specified HOST_CC doesn't seem to work])])
3826 for i in "$CC" "$CC $CFLAGS $CPPFLAGS" cc gcc c89 c99; do
3827 GMP_PROG_CC_FOR_BUILD_WORKS($i,
3831 if test -z "$CC_FOR_BUILD"; then
3832 AC_MSG_ERROR([Cannot find a build system compiler])
3836 AC_ARG_VAR(CC_FOR_BUILD,[build system C compiler])
3837 AC_SUBST(CC_FOR_BUILD)
3841 dnl GMP_PROG_CC_FOR_BUILD_WORKS(cc/cflags[,[action-if-good][,action-if-bad]])
3842 dnl -------------------------------------------------------------------------
3843 dnl See if the given cc/cflags works on the build system.
3845 dnl It seems easiest to just use the default compiler output, rather than
3846 dnl figuring out the .exe or whatever at this stage.
3848 AC_DEFUN([GMP_PROG_CC_FOR_BUILD_WORKS],
3849 [AC_MSG_CHECKING([build system compiler $1])
3850 # remove anything that might look like compiler output to our "||" expression
3851 rm -f conftest* a.out b.out a.exe a_out.exe
3852 cat >conftest.c <<EOF
3859 gmp_compile="$1 conftest.c"
3860 cc_for_build_works=no
3861 if AC_TRY_EVAL(gmp_compile); then
3862 if (./a.out || ./b.out || ./a.exe || ./a_out.exe || ./conftest) >&AC_FD_CC 2>&1; then
3863 cc_for_build_works=yes
3866 rm -f conftest* a.out b.out a.exe a_out.exe
3867 AC_MSG_RESULT($cc_for_build_works)
3868 if test "$cc_for_build_works" = yes; then
3869 ifelse([$2],,:,[$2])
3871 ifelse([$3],,:,[$3])
3876 dnl GMP_PROG_CPP_FOR_BUILD
3877 dnl ---------------------
3878 dnl Establish CPP_FOR_BUILD, the build system C preprocessor.
3879 dnl The choices tried here are the same as AC_PROG_CPP, but with
3882 AC_DEFUN([GMP_PROG_CPP_FOR_BUILD],
3883 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3884 AC_MSG_CHECKING([for build system preprocessor])
3885 if test -z "$CPP_FOR_BUILD"; then
3886 AC_CACHE_VAL(gmp_cv_prog_cpp_for_build,
3887 [cat >conftest.c <<EOF
3890 for i in "$CC_FOR_BUILD -E" "$CC_FOR_BUILD -E -traditional-cpp" "/lib/cpp"; do
3891 gmp_compile="$i conftest.c"
3892 if AC_TRY_EVAL(gmp_compile) >&AC_FD_CC 2>&1; then
3893 gmp_cv_prog_cpp_for_build=$i
3897 rm -f conftest* a.out b.out a.exe a_out.exe
3898 if test -z "$gmp_cv_prog_cpp_for_build"; then
3899 AC_MSG_ERROR([Cannot find build system C preprocessor.])
3902 CPP_FOR_BUILD=$gmp_cv_prog_cpp_for_build
3904 AC_MSG_RESULT([$CPP_FOR_BUILD])
3906 AC_ARG_VAR(CPP_FOR_BUILD,[build system C preprocessor])
3907 AC_SUBST(CPP_FOR_BUILD)
3911 dnl GMP_PROG_EXEEXT_FOR_BUILD
3912 dnl -------------------------
3913 dnl Determine EXEEXT_FOR_BUILD, the build system executable suffix.
3915 dnl The idea is to find what "-o conftest$foo" will make it possible to run
3916 dnl the program with ./conftest. On Unix-like systems this is of course
3917 dnl nothing, for DOS it's ".exe", or for a strange RISC OS foreign file
3918 dnl system cross compile it can be ",ff8" apparently. Not sure if the
3919 dnl latter actually applies to a build-system executable, maybe it doesn't,
3920 dnl but it won't hurt to try.
3922 AC_DEFUN([GMP_PROG_EXEEXT_FOR_BUILD],
3923 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3924 AC_CACHE_CHECK([for build system executable suffix],
3925 gmp_cv_prog_exeext_for_build,
3926 [cat >conftest.c <<EOF
3933 for i in .exe ,ff8 ""; do
3934 gmp_compile="$CC_FOR_BUILD conftest.c -o conftest$i"
3935 if AC_TRY_EVAL(gmp_compile); then
3936 if (./conftest) 2>&AC_FD_CC; then
3937 gmp_cv_prog_exeext_for_build=$i
3943 if test "${gmp_cv_prog_exeext_for_build+set}" != set; then
3944 AC_MSG_ERROR([Cannot determine executable suffix])
3947 AC_SUBST(EXEEXT_FOR_BUILD,$gmp_cv_prog_exeext_for_build)
3951 dnl GMP_C_FOR_BUILD_ANSI
3952 dnl --------------------
3953 dnl Determine whether CC_FOR_BUILD is ANSI, and establish U_FOR_BUILD
3956 dnl FIXME: Use AC_PROG_CC sets ac_cv_prog_cc_c89 which could be used instead
3958 AC_DEFUN([GMP_C_FOR_BUILD_ANSI],
3959 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3960 AC_CACHE_CHECK([whether build system compiler is ANSI],
3961 gmp_cv_c_for_build_ansi,
3962 [cat >conftest.c <<EOF
3964 main (int argc, char **argv)
3969 gmp_compile="$CC_FOR_BUILD conftest.c"
3970 if AC_TRY_EVAL(gmp_compile); then
3971 gmp_cv_c_for_build_ansi=yes
3973 gmp_cv_c_for_build_ansi=no
3975 rm -f conftest* a.out b.out a.exe a_out.exe
3977 if test "$gmp_cv_c_for_build_ansi" = yes; then
3980 AC_SUBST(U_FOR_BUILD,_)
3985 dnl GMP_CHECK_LIBM_FOR_BUILD
3986 dnl ------------------------
3987 dnl Establish LIBM_FOR_BUILD as -lm, if that seems to work.
3989 dnl Libtool AC_CHECK_LIBM also uses -lmw on *-ncr-sysv4.3*, if it works.
3990 dnl Don't know what that does, lets assume it's not needed just for log().
3992 AC_DEFUN([GMP_CHECK_LIBM_FOR_BUILD],
3993 [AC_REQUIRE([GMP_PROG_CC_FOR_BUILD])
3994 AC_CACHE_CHECK([for build system compiler math library],
3995 gmp_cv_check_libm_for_build,
3996 [cat >conftest.c <<EOF
4010 gmp_compile="$CC_FOR_BUILD conftest.c -lm"
4011 if AC_TRY_EVAL(gmp_compile); then
4012 gmp_cv_check_libm_for_build=-lm
4014 gmp_cv_check_libm_for_build=no
4016 rm -f conftest* a.out b.out a.exe a_out.exe
4018 case $gmp_cv_check_libm_for_build in
4019 yes) AC_SUBST(LIBM_FOR_BUILD,-lm) ;;
4020 no) LIBM_FOR_BUILD= ;;
4021 *) LIBM_FOR_BUILD=$gmp_cv_check_libm_for_build ;;