1 | dnl GMP specific autoconf macros |
---|
2 | |
---|
3 | |
---|
4 | dnl Copyright 2000, 2001, 2002 Free Software Foundation, Inc. |
---|
5 | dnl |
---|
6 | dnl This file is part of the GNU MP Library. |
---|
7 | dnl |
---|
8 | dnl The GNU MP Library is free software; you can redistribute it and/or modify |
---|
9 | dnl it under the terms of the GNU Lesser General Public License as published |
---|
10 | dnl by the Free Software Foundation; either version 2.1 of the License, or (at |
---|
11 | dnl your option) any later version. |
---|
12 | dnl |
---|
13 | dnl The GNU MP Library is distributed in the hope that it will be useful, but |
---|
14 | dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
---|
15 | dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
---|
16 | dnl License for more details. |
---|
17 | dnl |
---|
18 | dnl You should have received a copy of the GNU Lesser General Public License |
---|
19 | dnl along with the GNU MP Library; see the file COPYING.LIB. If not, write to |
---|
20 | dnl the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, |
---|
21 | dnl MA 02111-1307, USA. |
---|
22 | |
---|
23 | |
---|
24 | define(X86_PATTERN, |
---|
25 | [[i?86*-*-* | k[5-8]*-*-* | pentium*-*-* | athlon-*-* | viac3*-*-*]]) |
---|
26 | |
---|
27 | define(POWERPC64_PATTERN, |
---|
28 | [[powerpc64-*-* | powerpc64le-*-* | powerpc620-*-* | powerpc630-*-*]]) |
---|
29 | |
---|
30 | |
---|
31 | dnl GMP_STRIP_PATH(subdir) |
---|
32 | dnl ---------------------- |
---|
33 | dnl Strip entries */subdir from $path. |
---|
34 | |
---|
35 | define(GMP_STRIP_PATH, |
---|
36 | [tmp_path= |
---|
37 | for i in $path; do |
---|
38 | case $i in |
---|
39 | */$1) ;; |
---|
40 | *) tmp_path="$tmp_path $i" ;; |
---|
41 | esac |
---|
42 | done |
---|
43 | path="$tmp_path" |
---|
44 | ]) |
---|
45 | |
---|
46 | |
---|
47 | dnl GMP_INCLUDE_GMP_H |
---|
48 | dnl ----------------- |
---|
49 | dnl Expand to the right way to #include gmp-h.in. This must be used |
---|
50 | dnl instead of gmp.h, since that file isn't generated until the end of the |
---|
51 | dnl configure. |
---|
52 | dnl |
---|
53 | dnl GMP_INCLUDE_GMP_H_BITS_PER_MP_LIMB starts as a dummy, but gets |
---|
54 | dnl redefined in GMP_C_SIZES when the right value is known. |
---|
55 | |
---|
56 | define(GMP_INCLUDE_GMP_H, |
---|
57 | [[#define __GMP_WITHIN_CONFIGURE 1 /* ignore template stuff */ |
---|
58 | #define GMP_NAIL_BITS $GMP_NAIL_BITS] |
---|
59 | GMP_INCLUDE_GMP_H_BITS_PER_MP_LIMB |
---|
60 | [$DEFN_LONG_LONG_LIMB |
---|
61 | #include "$srcdir/gmp-h.in"] |
---|
62 | ]) |
---|
63 | |
---|
64 | define(GMP_INCLUDE_GMP_H_BITS_PER_MP_LIMB, |
---|
65 | [[#define __GMP_BITS_PER_MP_LIMB 123 /* dummy for GMP_NUMB_BITS etc */ |
---|
66 | #define GMP_LIMB_BITS 123]]) |
---|
67 | |
---|
68 | |
---|
69 | dnl GMP_HEADER_GETVAL(NAME,FILE) |
---|
70 | dnl ---------------------------- |
---|
71 | dnl Expand at autoconf time to the value of a "#define NAME" from the given |
---|
72 | dnl FILE. The regexps here aren't very rugged, but are enough for gmp. |
---|
73 | dnl /dev/null as a parameter prevents a hang if $2 is accidentally omitted. |
---|
74 | |
---|
75 | define(GMP_HEADER_GETVAL, |
---|
76 | [patsubst(patsubst( |
---|
77 | esyscmd([grep "^#define $1 " $2 /dev/null 2>/dev/null]), |
---|
78 | [^.*$1[ ]+],[]), |
---|
79 | [[ |
---|
80 | ]*$],[])]) |
---|
81 | |
---|
82 | |
---|
83 | dnl GMP_VERSION |
---|
84 | dnl ----------- |
---|
85 | dnl The gmp version number, extracted from the #defines in gmp-h.in at |
---|
86 | dnl autoconf time. Two digits like 3.0 if patchlevel <= 0, or three digits |
---|
87 | dnl like 3.0.1 if patchlevel > 0. |
---|
88 | |
---|
89 | define(GMP_VERSION, |
---|
90 | [GMP_HEADER_GETVAL(__GNU_MP_VERSION,gmp-h.in)[]dnl |
---|
91 | .GMP_HEADER_GETVAL(__GNU_MP_VERSION_MINOR,gmp-h.in)[]dnl |
---|
92 | ifelse(m4_eval(GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp-h.in) > 0),1, |
---|
93 | [.GMP_HEADER_GETVAL(__GNU_MP_VERSION_PATCHLEVEL,gmp-h.in)])]) |
---|
94 | |
---|
95 | |
---|
96 | dnl GMP_SUBST_CHECK_FUNCS(func,...) |
---|
97 | dnl ------------------------------ |
---|
98 | dnl Setup an AC_SUBST of HAVE_FUNC_01 for each argument. |
---|
99 | |
---|
100 | AC_DEFUN(GMP_SUBST_CHECK_FUNCS, |
---|
101 | [m4_if([$1],,, |
---|
102 | [_GMP_SUBST_CHECK_FUNCS(ac_cv_func_[$1],HAVE_[]m4_translit([$1],[a-z],[A-Z])_01) |
---|
103 | GMP_SUBST_CHECK_FUNCS(m4_shift($@))])]) |
---|
104 | |
---|
105 | dnl Called: _GMP_SUBST_CHECK_FUNCS(cachvar,substvar) |
---|
106 | AC_DEFUN(_GMP_SUBST_CHECK_FUNCS, |
---|
107 | [case $[$1] in |
---|
108 | yes) AC_SUBST([$2],1) ;; |
---|
109 | no) [$2]=0 ;; |
---|
110 | esac |
---|
111 | ]) |
---|
112 | |
---|
113 | |
---|
114 | dnl GMP_SUBST_CHECK_HEADERS(foo.h,...) |
---|
115 | dnl ---------------------------------- |
---|
116 | dnl Setup an AC_SUBST of HAVE_FOO_H_01 for each argument. |
---|
117 | |
---|
118 | AC_DEFUN(GMP_SUBST_CHECK_HEADERS, |
---|
119 | [m4_if([$1],,, |
---|
120 | [_GMP_SUBST_CHECK_HEADERS(ac_cv_header_[]m4_translit([$1],[./],[__]), |
---|
121 | HAVE_[]m4_translit([$1],[a-z./],[A-Z__])_01) |
---|
122 | GMP_SUBST_CHECK_HEADERS(m4_shift($@))])]) |
---|
123 | |
---|
124 | dnl Called: _GMP_SUBST_CHECK_HEADERS(cachvar,substvar) |
---|
125 | AC_DEFUN(_GMP_SUBST_CHECK_HEADERS, |
---|
126 | [case $[$1] in |
---|
127 | yes) AC_SUBST([$2],1) ;; |
---|
128 | no) [$2]=0 ;; |
---|
129 | esac |
---|
130 | ]) |
---|
131 | |
---|
132 | |
---|
133 | dnl GMP_COMPARE_GE(A1,B1, A2,B2, ...) |
---|
134 | dnl --------------------------------- |
---|
135 | dnl Compare two version numbers A1.A2.etc and B1.B2.etc. Set |
---|
136 | dnl $gmp_compare_ge to yes or no accoring to the result. The A parts |
---|
137 | dnl should be variables, the B parts fixed numbers. As many parts as |
---|
138 | dnl desired can be included. An empty string in an A part is taken to be |
---|
139 | dnl zero, the B parts should be non-empty and non-zero. |
---|
140 | dnl |
---|
141 | dnl For example, |
---|
142 | dnl |
---|
143 | dnl GMP_COMPARE($major,10, $minor,3, $subminor,1) |
---|
144 | dnl |
---|
145 | dnl would test whether $major.$minor.$subminor is greater than or equal to |
---|
146 | dnl 10.3.1. |
---|
147 | |
---|
148 | AC_DEFUN(GMP_COMPARE_GE, |
---|
149 | [gmp_compare_ge=no |
---|
150 | GMP_COMPARE_GE_INTERNAL($@) |
---|
151 | ]) |
---|
152 | |
---|
153 | AC_DEFUN(GMP_COMPARE_GE_INTERNAL, |
---|
154 | [ifelse(len([$3]),0, |
---|
155 | [if test -n "$1" && test "$1" -ge $2; then |
---|
156 | gmp_compare_ge=yes |
---|
157 | fi], |
---|
158 | [if test -n "$1"; then |
---|
159 | if test "$1" -gt $2; then |
---|
160 | gmp_compare_ge=yes |
---|
161 | else |
---|
162 | if test "$1" -eq $2; then |
---|
163 | GMP_COMPARE_GE_INTERNAL(m4_shift(m4_shift($@))) |
---|
164 | fi |
---|
165 | fi |
---|
166 | fi]) |
---|
167 | ]) |
---|
168 | |
---|
169 | |
---|
170 | dnl GMP_PROG_AR |
---|
171 | dnl ----------- |
---|
172 | dnl GMP additions to $AR. |
---|
173 | dnl |
---|
174 | dnl A cross-"ar" may be necessary when cross-compiling since the build |
---|
175 | dnl system "ar" might try to interpret the object files to build a symbol |
---|
176 | dnl table index, hence the use of AC_CHECK_TOOL. |
---|
177 | dnl |
---|
178 | dnl A user-selected $AR is always left unchanged. AC_CHECK_TOOL is still |
---|
179 | dnl run to get the "checking" message printed though. |
---|
180 | dnl |
---|
181 | dnl $AR_FLAGS is set to "cq" rather than leaving it to libtool "cru". The |
---|
182 | dnl latter fails when libtool goes into piecewise mode and is unlucky |
---|
183 | dnl enough to have two same-named objects in separate pieces, as happens |
---|
184 | dnl for instance to random.o (and others) on vax-dec-ultrix4.5. Naturally |
---|
185 | dnl a user-selected $AR_FLAGS is left unchanged. |
---|
186 | |
---|
187 | AC_DEFUN(GMP_PROG_AR, |
---|
188 | [dnl Want to establish $AR before libtool initialization. |
---|
189 | AC_BEFORE([$0],[AC_PROG_LIBTOOL]) |
---|
190 | gmp_user_AR=$AR |
---|
191 | AC_CHECK_TOOL(AR, ar, ar) |
---|
192 | if test -z "$gmp_user_AR"; then |
---|
193 | eval arflags=\"\$ar${abi1}_flags\" |
---|
194 | test -n "$arflags" || eval arflags=\"\$ar${abi2}_flags\" |
---|
195 | if test -n "$arflags"; then |
---|
196 | AC_MSG_CHECKING([for extra ar flags]) |
---|
197 | AR="$AR $arflags" |
---|
198 | AC_MSG_RESULT([$arflags]) |
---|
199 | fi |
---|
200 | fi |
---|
201 | if test -z "$AR_FLAGS"; then |
---|
202 | AR_FLAGS=cq |
---|
203 | fi |
---|
204 | ]) |
---|
205 | |
---|
206 | |
---|
207 | dnl GMP_PROG_HOST_CC |
---|
208 | dnl ---------------- |
---|
209 | dnl Establish a value for $HOST_CC. |
---|
210 | dnl |
---|
211 | dnl Any HOST_CC already set is used without testing. Likewise any |
---|
212 | dnl CC_FOR_BUILD is used without testing. CC_FOR_BUILD is the new name for |
---|
213 | dnl a build system compiler, see configfsf.guess. |
---|
214 | |
---|
215 | AC_DEFUN(GMP_PROG_HOST_CC, |
---|
216 | [AC_BEFORE([$0],[AC_PROG_LIBTOOL]) |
---|
217 | AC_REQUIRE([AC_PROG_CC]) |
---|
218 | AC_CACHE_CHECK([for HOST_CC build system compiler], |
---|
219 | gmp_cv_prog_host_cc, |
---|
220 | [if test -n "$HOST_CC"; then |
---|
221 | gmp_cv_prog_host_cc=$HOST_CC |
---|
222 | else |
---|
223 | if test -n "$CC_FOR_BUILD"; then |
---|
224 | gmp_cv_prog_host_cc=$CC_FOR_BUILD |
---|
225 | else |
---|
226 | cat >conftest.c <<EOF |
---|
227 | int main () { exit(0); } |
---|
228 | EOF |
---|
229 | for c in "$CC" cc gcc c89; do |
---|
230 | echo "trying $c" >&AC_FD_CC |
---|
231 | if ($c conftest.c -o conftest) >&AC_FD_CC 2>&1; then |
---|
232 | if (./conftest) >&AC_FD_CC 2>&1; then |
---|
233 | gmp_cv_prog_host_cc=$c |
---|
234 | break |
---|
235 | fi |
---|
236 | fi |
---|
237 | done |
---|
238 | rm -f conftest* |
---|
239 | if test -z "$gmp_cv_prog_host_cc"; then |
---|
240 | AC_MSG_ERROR([cannot find a build system compiler]) |
---|
241 | fi |
---|
242 | fi |
---|
243 | fi |
---|
244 | ]) |
---|
245 | HOST_CC=$gmp_cv_prog_host_cc |
---|
246 | ]) |
---|
247 | |
---|
248 | |
---|
249 | dnl GMP_PROG_LEX |
---|
250 | dnl ------------ |
---|
251 | dnl AC_PROG_LEX bombs if $LEX is set to ${am_missing_run}flex by |
---|
252 | dnl AM_PROG_LEX. It needs to see LEX=: if lex is missing. Avoid this by |
---|
253 | dnl running AC_PROG_LEX first and then using "missing". |
---|
254 | dnl |
---|
255 | dnl FIXME: This can be removed and just AM_PROG_LEX used, one that macro |
---|
256 | dnl works properly. |
---|
257 | |
---|
258 | AC_DEFUN(GMP_PROG_LEX, |
---|
259 | [AC_REQUIRE([AC_PROG_LEX]) |
---|
260 | if test "$LEX" = :; then |
---|
261 | LEX=${am_missing_run}flex |
---|
262 | fi |
---|
263 | ]) |
---|
264 | |
---|
265 | |
---|
266 | dnl GMP_PROG_M4 |
---|
267 | dnl ----------- |
---|
268 | dnl Find a working m4, either in $PATH or likely locations, and setup $M4 |
---|
269 | dnl and an AC_SUBST accordingly. If $M4 is already set then it's a user |
---|
270 | dnl choice and is accepted with no checks. GMP_PROG_M4 is like |
---|
271 | dnl AC_PATH_PROG or AC_CHECK_PROG, but tests each m4 found to see if it's |
---|
272 | dnl good enough. |
---|
273 | dnl |
---|
274 | dnl See mpn/asm-defs.m4 for details on the known bad m4s. |
---|
275 | |
---|
276 | AC_DEFUN(GMP_PROG_M4, |
---|
277 | [AC_ARG_VAR(M4,[m4 macro processor]) |
---|
278 | AC_CACHE_CHECK([for suitable m4], |
---|
279 | gmp_cv_prog_m4, |
---|
280 | [if test -n "$M4"; then |
---|
281 | gmp_cv_prog_m4="$M4" |
---|
282 | else |
---|
283 | cat >conftest.m4 <<\EOF |
---|
284 | dnl Must protect this against being expanded during autoconf m4! |
---|
285 | dnl Dont put "dnl"s in this as autoconf will flag an error for unexpanded |
---|
286 | dnl macros. |
---|
287 | [define(dollarhash,``$][#'')ifelse(dollarhash(x),1,`define(t1,Y)', |
---|
288 | ``bad: $][# not supported (SunOS /usr/bin/m4) |
---|
289 | '')ifelse(eval(89),89,`define(t2,Y)', |
---|
290 | `bad: eval() doesnt support 8 or 9 in a constant (OpenBSD 2.6 m4) |
---|
291 | ')ifelse(t1`'t2,YY,`good |
---|
292 | ')] |
---|
293 | EOF |
---|
294 | dnl ' <- balance the quotes for emacs sh-mode |
---|
295 | echo "trying m4" >&AC_FD_CC |
---|
296 | gmp_tmp_val=`(m4 conftest.m4) 2>&AC_FD_CC` |
---|
297 | echo "$gmp_tmp_val" >&AC_FD_CC |
---|
298 | if test "$gmp_tmp_val" = good; then |
---|
299 | gmp_cv_prog_m4="m4" |
---|
300 | else |
---|
301 | IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" |
---|
302 | dnl $ac_dummy forces splitting on constant user-supplied paths. |
---|
303 | dnl POSIX.2 word splitting is done only on the output of word expansions, |
---|
304 | dnl not every word. This closes a longstanding sh security hole. |
---|
305 | ac_dummy="$PATH:/usr/5bin" |
---|
306 | for ac_dir in $ac_dummy; do |
---|
307 | test -z "$ac_dir" && ac_dir=. |
---|
308 | echo "trying $ac_dir/m4" >&AC_FD_CC |
---|
309 | gmp_tmp_val=`($ac_dir/m4 conftest.m4) 2>&AC_FD_CC` |
---|
310 | echo "$gmp_tmp_val" >&AC_FD_CC |
---|
311 | if test "$gmp_tmp_val" = good; then |
---|
312 | gmp_cv_prog_m4="$ac_dir/m4" |
---|
313 | break |
---|
314 | fi |
---|
315 | done |
---|
316 | IFS="$ac_save_ifs" |
---|
317 | if test -z "$gmp_cv_prog_m4"; then |
---|
318 | AC_MSG_ERROR([No usable m4 in \$PATH or /usr/5bin (see config.log for reasons).]) |
---|
319 | fi |
---|
320 | fi |
---|
321 | rm -f conftest.m4 |
---|
322 | fi]) |
---|
323 | M4="$gmp_cv_prog_m4" |
---|
324 | AC_SUBST(M4) |
---|
325 | ]) |
---|
326 | |
---|
327 | |
---|
328 | dnl GMP_M4_M4WRAP_SPURIOUS |
---|
329 | dnl ---------------------- |
---|
330 | dnl Check for spurious output from m4wrap(), as described in mpn/asm-defs.m4. |
---|
331 | dnl |
---|
332 | dnl The following systems have been seen with the problem. |
---|
333 | dnl |
---|
334 | dnl - Unicos alpha, but its assembler doesn't seem to mind. |
---|
335 | dnl - MacOS X Darwin, its assembler fails. |
---|
336 | dnl - NetBSD 1.4.1 m68k, and gas 1.92.3 there gives a warning and ignores |
---|
337 | dnl the bad last line since it doesn't have a newline. |
---|
338 | dnl - NetBSD 1.4.2 alpha, but its assembler doesn't seem to mind. |
---|
339 | dnl |
---|
340 | dnl Enhancement: Maybe this could be in GMP_PROG_M4, and attempt to prefer |
---|
341 | dnl an m4 with a working m4wrap, if it can be found. |
---|
342 | |
---|
343 | AC_DEFUN(GMP_M4_M4WRAP_SPURIOUS, |
---|
344 | [AC_REQUIRE([GMP_PROG_M4]) |
---|
345 | AC_CACHE_CHECK([if m4wrap produces spurious output], |
---|
346 | gmp_cv_m4_m4wrap_spurious, |
---|
347 | [# hide the d-n-l from autoconf's error checking |
---|
348 | tmp_d_n_l=d""nl |
---|
349 | cat >conftest.m4 <<EOF |
---|
350 | [changequote({,})define(x,)m4wrap({x})$tmp_d_n_l] |
---|
351 | EOF |
---|
352 | echo test input is >&AC_FD_CC |
---|
353 | cat conftest.m4 >&AC_FD_CC |
---|
354 | tmp_chars=`$M4 conftest.m4 | wc -c` |
---|
355 | echo produces $tmp_chars chars output >&AC_FD_CC |
---|
356 | rm -f conftest.m4 |
---|
357 | if test $tmp_chars = 0; then |
---|
358 | gmp_cv_m4_m4wrap_spurious=no |
---|
359 | else |
---|
360 | gmp_cv_m4_m4wrap_spurious=yes |
---|
361 | fi |
---|
362 | ]) |
---|
363 | GMP_DEFINE_RAW(["define(<M4WRAP_SPURIOUS>,<$gmp_cv_m4_m4wrap_spurious>)"]) |
---|
364 | ]) |
---|
365 | |
---|
366 | |
---|
367 | dnl GMP_PROG_NM |
---|
368 | dnl ----------- |
---|
369 | dnl GMP additions to libtool AC_PROG_NM. |
---|
370 | dnl |
---|
371 | dnl Note that if AC_PROG_NM can't find a working nm it still leaves |
---|
372 | dnl $NM set to "nm", so $NM can't be assumed to actually work. |
---|
373 | dnl |
---|
374 | dnl A user-selected $NM is always left unchanged. AC_PROG_NM is still run |
---|
375 | dnl to get the "checking" message printed though. |
---|
376 | |
---|
377 | AC_DEFUN(GMP_PROG_NM, |
---|
378 | [dnl Make sure we're the first to call AC_PROG_NM, so our extra flags are |
---|
379 | dnl used by everyone. |
---|
380 | AC_BEFORE([$0],[AC_PROG_NM]) |
---|
381 | gmp_user_NM=$NM |
---|
382 | AC_PROG_NM |
---|
383 | |
---|
384 | # FIXME: When cross compiling (ie. $ac_tool_prefix not empty), libtool |
---|
385 | # defaults to plain "nm" if a "${ac_tool_prefix}nm" is not found. In this |
---|
386 | # case run it again to try the native "nm", firstly so that likely locations |
---|
387 | # are searched, secondly so that -B or -p are added if necessary for BSD |
---|
388 | # format. This is necessary for instance on OSF with "./configure |
---|
389 | # --build=alphaev5-dec-osf --host=alphaev6-dec-osf". |
---|
390 | # |
---|
391 | if test -z "$gmp_user_NM" && test -n "$ac_tool_prefix" && test "$NM" = nm; then |
---|
392 | $as_unset lt_cv_path_NM |
---|
393 | gmp_save_ac_tool_prefix=$ac_tool_prefix |
---|
394 | ac_tool_prefix= |
---|
395 | NM= |
---|
396 | AC_PROG_NM |
---|
397 | ac_tool_prefix=$gmp_save_ac_tool_prefix |
---|
398 | fi |
---|
399 | |
---|
400 | if test -z "$gmp_user_NM"; then |
---|
401 | eval nmflags=\"\$nm${abi1}_flags\" |
---|
402 | test -n "$nmflags" || eval nmflags=\"\$nm${abi2}_flags\" |
---|
403 | if test -n "$nmflags"; then |
---|
404 | AC_MSG_CHECKING([for extra nm flags]) |
---|
405 | NM="$NM $nmflags" |
---|
406 | AC_MSG_RESULT([$nmflags]) |
---|
407 | fi |
---|
408 | fi |
---|
409 | ]) |
---|
410 | |
---|
411 | |
---|
412 | dnl GMP_PROG_CC_WORKS(cc+cflags,[ACTION-IF-WORKS][,ACTION-IF-NOT-WORKS]) |
---|
413 | dnl -------------------------------------------------------------------- |
---|
414 | dnl Check if cc+cflags can compile and link. |
---|
415 | dnl |
---|
416 | dnl This test is designed to be run repeatedly with different cc+cflags |
---|
417 | dnl selections, so the result is not cached. |
---|
418 | dnl |
---|
419 | dnl For a native build, meaning $cross_compiling == no, we require that the |
---|
420 | dnl generated program will run. This is the same as AC_PROG_CC does in |
---|
421 | dnl _AC_COMPILER_EXEEXT_WORKS, and checking here will ensure we don't pass |
---|
422 | dnl a CC/CFLAGS combination that it rejects. |
---|
423 | dnl |
---|
424 | dnl sparc-*-solaris2.7 can compile ABI=64 but won't run it if the kernel |
---|
425 | dnl was booted in 32-bit mode. The effect of requiring the compiler output |
---|
426 | dnl will run is that a plain native "./configure" falls back on ABI=32, but |
---|
427 | dnl ABI=64 is still available as a cross-compile. |
---|
428 | |
---|
429 | AC_DEFUN(GMP_PROG_CC_WORKS, |
---|
430 | [AC_MSG_CHECKING([compiler $1]) |
---|
431 | cat >conftest.c <<EOF |
---|
432 | |
---|
433 | /* The following provokes an internal error from gcc 2.95.2 -mpowerpc64 |
---|
434 | (without -maix64), hence detecting an unusable compiler */ |
---|
435 | void *g() { return (void *) 0; } |
---|
436 | void *f() { return g(); } |
---|
437 | |
---|
438 | /* The following provokes an invalid instruction syntax from i386 gcc |
---|
439 | -march=pentiumpro on Solaris 2.8. The native sun assembler |
---|
440 | requires a non-standard syntax for cmov which gcc (as of 2.95.2 at |
---|
441 | least) doesn't know. */ |
---|
442 | int n; |
---|
443 | int cmov () { return (n >= 0 ? n : 0); } |
---|
444 | |
---|
445 | /* The following provokes a linker invocation problem with gcc 3.0.3 |
---|
446 | on AIX 4.3 under "-maix64 -mpowerpc64 -mcpu=630". The -mcpu=630 |
---|
447 | option causes gcc to incorrectly select the 32-bit libgcc.a, not |
---|
448 | the 64-bit one, and consequently it misses out on the __fixunsdfdi |
---|
449 | helper (double -> uint64 conversion). */ |
---|
450 | double d; |
---|
451 | unsigned long gcc303 () { return (unsigned long) d; } |
---|
452 | |
---|
453 | int main () { return 0; } |
---|
454 | EOF |
---|
455 | gmp_prog_cc_works=no |
---|
456 | gmp_compile="$1 conftest.c >&AC_FD_CC" |
---|
457 | if AC_TRY_EVAL(gmp_compile); then |
---|
458 | if test "$cross_compiling" = no; then |
---|
459 | if AC_TRY_COMMAND([./a.out || ./a.exe || ./conftest]); then |
---|
460 | gmp_prog_cc_works=yes |
---|
461 | fi |
---|
462 | else |
---|
463 | gmp_prog_cc_works=yes |
---|
464 | fi |
---|
465 | fi |
---|
466 | rm -f conftest* a.out a.exe |
---|
467 | AC_MSG_RESULT($gmp_prog_cc_works) |
---|
468 | if test $gmp_prog_cc_works = yes; then |
---|
469 | ifelse([$2],,:,[$2]) |
---|
470 | else |
---|
471 | ifelse([$3],,:,[$3]) |
---|
472 | fi |
---|
473 | ]) |
---|
474 | |
---|
475 | |
---|
476 | dnl GMP_PROG_CC_IS_GNU(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO]) |
---|
477 | dnl ------------------------------------------------------- |
---|
478 | dnl Determine whether the given compiler is GNU C. |
---|
479 | dnl |
---|
480 | dnl This test is the same as autoconf _AC_LANG_COMPILER_GNU, but doesn't |
---|
481 | dnl cache the result. The same "ifndef" style test is used, to avoid |
---|
482 | dnl problems with syntax checking cpp's used on NeXT and Apple systems. |
---|
483 | |
---|
484 | AC_DEFUN(GMP_PROG_CC_IS_GNU, |
---|
485 | [cat >conftest.c <<EOF |
---|
486 | #ifndef __GNUC__ |
---|
487 | choke me |
---|
488 | #endif |
---|
489 | EOF |
---|
490 | gmp_compile="$1 -c conftest.c >&AC_FD_CC" |
---|
491 | if AC_TRY_EVAL(gmp_compile); then |
---|
492 | rm -f conftest* |
---|
493 | AC_MSG_CHECKING([whether $1 is gcc]) |
---|
494 | AC_MSG_RESULT(yes) |
---|
495 | ifelse([$2],,:,[$2]) |
---|
496 | else |
---|
497 | rm -f conftest* |
---|
498 | ifelse([$3],,:,[$3]) |
---|
499 | fi |
---|
500 | ]) |
---|
501 | |
---|
502 | |
---|
503 | dnl GMP_PROG_CC_IS_XLC(CC,[ACTIONS-IF-YES][,ACTIONS-IF-NO]) |
---|
504 | dnl ------------------------------------------------------- |
---|
505 | dnl Determine whether the given compiler is IBM xlc (on AIX). |
---|
506 | dnl |
---|
507 | dnl There doesn't seem to be a preprocessor symbol to test for this, or if |
---|
508 | dnl there is one then it's well hidden in xlc 3.1 on AIX 4.3, so just grep |
---|
509 | dnl the man page printed when xlc is invoked with no arguments. |
---|
510 | |
---|
511 | AC_DEFUN(GMP_PROG_CC_IS_XLC, |
---|
512 | [gmp_command="$1 2>&1 | grep xlc >/dev/null" |
---|
513 | if AC_TRY_EVAL(gmp_command); then |
---|
514 | AC_MSG_CHECKING([whether $1 is xlc]) |
---|
515 | AC_MSG_RESULT(yes) |
---|
516 | ifelse([$2],,:,[$2]) |
---|
517 | else |
---|
518 | ifelse([$3],,:,[$3]) |
---|
519 | fi |
---|
520 | ]) |
---|
521 | |
---|
522 | |
---|
523 | dnl GMP_HPC_HPPA_2_0(cc,[ACTION-IF-GOOD][,ACTION-IF-BAD]) |
---|
524 | dnl --------------------------------------------------------- |
---|
525 | dnl Find out whether a HP compiler is good enough to generate hppa 2.0. |
---|
526 | dnl |
---|
527 | dnl This test might be repeated for different compilers, so the result is |
---|
528 | dnl not cached. |
---|
529 | |
---|
530 | AC_DEFUN(GMP_HPC_HPPA_2_0, |
---|
531 | [AC_MSG_CHECKING([whether HP compiler $1 is good for 64-bits]) |
---|
532 | # Bad compiler output: |
---|
533 | # ccom: HP92453-01 G.10.32.05 HP C Compiler |
---|
534 | # Good compiler output: |
---|
535 | # ccom: HP92453-01 A.10.32.30 HP C Compiler |
---|
536 | # Let A.10.32.30 or higher be ok. |
---|
537 | echo >conftest.c |
---|
538 | gmp_tmp_vs=`$1 $2 -V -c -o conftest.$OBJEXT conftest.c 2>&1 | grep "^ccom:"` |
---|
539 | echo "Version string: $gmp_tmp_vs" >&AC_FD_CC |
---|
540 | rm conftest* |
---|
541 | gmp_tmp_v1=`echo $gmp_tmp_vs | sed 's/.* .\.\(.*\)\..*\..* HP C.*/\1/'` |
---|
542 | gmp_tmp_v2=`echo $gmp_tmp_vs | sed 's/.* .\..*\.\(.*\)\..* HP C.*/\1/'` |
---|
543 | gmp_tmp_v3=`echo $gmp_tmp_vs | sed 's/.* .\..*\..*\.\(.*\) HP C.*/\1/'` |
---|
544 | echo "Version number: $gmp_tmp_v1.$gmp_tmp_v2.$gmp_tmp_v3" >&AC_FD_CC |
---|
545 | if test -z "$gmp_tmp_v1"; then |
---|
546 | gmp_hpc_64bit=not-applicable |
---|
547 | else |
---|
548 | GMP_COMPARE_GE($gmp_tmp_v1, 10, $gmp_tmp_v2, 32, $gmp_tmp_v3, 30) |
---|
549 | gmp_hpc_64bit=$gmp_compare_ge |
---|
550 | fi |
---|
551 | AC_MSG_RESULT($gmp_hpc_64bit) |
---|
552 | if test $gmp_hpc_64bit = yes; then |
---|
553 | ifelse([$2],,:,[$2]) |
---|
554 | else |
---|
555 | ifelse([$3],,:,[$3]) |
---|
556 | fi |
---|
557 | ]) |
---|
558 | |
---|
559 | |
---|
560 | dnl GMP_GCC_VERSION_GE(CC,MAJOR[,MINOR[,SUBMINOR]]) |
---|
561 | dnl ----------------------------------------------- |
---|
562 | dnl Test whether the version of CC (which must be GNU C) is >= |
---|
563 | dnl MAJOR.MINOR.SUBMINOR. Set $gmp_compare_ge to "yes" or "no" |
---|
564 | dnl accordingly, or to "error" if the version number string can't be |
---|
565 | dnl parsed. |
---|
566 | dnl |
---|
567 | dnl gcc --version is normally just "2.7.2.3" or "2.95.3" or whatever, but |
---|
568 | dnl egcs gives something like "egcs-2.91". "[a-z-]*" is used to match that |
---|
569 | dnl (Solaris 8 sed doesn't support "?" or "*" of a group, like "\(...\)?" |
---|
570 | dnl or "\(...\)*".) |
---|
571 | dnl |
---|
572 | dnl There's no caching here, so that different CC's can be tested. |
---|
573 | |
---|
574 | AC_DEFUN(GMP_GCC_VERSION_GE, |
---|
575 | [tmp_version=`($1 --version) 2>&AC_FD_CC` |
---|
576 | echo "$1 --version '$tmp_version'" >&AC_FD_CC |
---|
577 | |
---|
578 | major=`(echo "$tmp_version" | sed -n ['s/^[a-z-]*\([0-9][0-9]*\).*/\1/p']) 2>&AC_FD_CC` |
---|
579 | echo " major '$major'" >&AC_FD_CC |
---|
580 | |
---|
581 | ifelse([$3],,, |
---|
582 | [minor=`(echo "$tmp_version" | sed -n ['s/^[a-z-]*[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/p']) 2>&AC_FD_CC` |
---|
583 | echo " minor '$minor'" >&AC_FD_CC]) |
---|
584 | |
---|
585 | ifelse([$4],,, |
---|
586 | [subminor=`(echo "$tmp_version" | sed -n ['s/^[a-z-]*[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/p']) 2>&AC_FD_CC` |
---|
587 | echo " subminor '$subminor'" >&AC_FD_CC]) |
---|
588 | |
---|
589 | if test -z "$major"; then |
---|
590 | AC_MSG_WARN([unrecognised gcc version string: $tmp_version]) |
---|
591 | gmp_compare_ge=error |
---|
592 | else |
---|
593 | ifelse([$3],, [GMP_COMPARE_GE($major, $2)], |
---|
594 | [ifelse([$4],,[GMP_COMPARE_GE($major, $2, $minor, $3)], |
---|
595 | [GMP_COMPARE_GE($major, $2, $minor, $3, $subminor, $4)])]) |
---|
596 | fi |
---|
597 | ]) |
---|
598 | |
---|
599 | |
---|
600 | dnl GMP_GCC_ARM_UMODSI(CC,[ACTIONS-IF-GOOD][,ACTIONS-IF-BAD]) |
---|
601 | dnl --------------------------------------------------------- |
---|
602 | dnl gcc 2.95.3 and earlier on arm has a bug in the libgcc __umodsi routine |
---|
603 | dnl making "%" give wrong results for some operands, eg. "0x90000000 % 3". |
---|
604 | dnl We're hoping it'll be fixed in 2.95.4, and we know it'll be fixed in |
---|
605 | dnl gcc 3. |
---|
606 | dnl |
---|
607 | dnl There's only a couple of places gmp cares about this, one is the |
---|
608 | dnl size==1 case in mpn/generic/mode1o.c, and this shows up in |
---|
609 | dnl tests/mpz/t-jac.c as a wrong result from mpz_kronecker_ui. |
---|
610 | |
---|
611 | AC_DEFUN(GMP_GCC_ARM_UMODSI, |
---|
612 | [AC_MSG_CHECKING([whether ARM gcc unsigned division works]) |
---|
613 | tmp_version=`$1 --version` |
---|
614 | echo "$tmp_version" >&AC_FD_CC |
---|
615 | case $tmp_version in |
---|
616 | [2.95 | 2.95.[123]]) |
---|
617 | ifelse([$3],,:,[$3]) |
---|
618 | gmp_gcc_arm_umodsi_result="no, gcc 2.95.[0123]" ;; |
---|
619 | *) |
---|
620 | ifelse([$2],,:,[$2]) |
---|
621 | gmp_gcc_arm_umodsi_result=yes ;; |
---|
622 | esac |
---|
623 | AC_MSG_RESULT([$gmp_gcc_arm_umodsi_result]) |
---|
624 | ]) |
---|
625 | |
---|
626 | |
---|
627 | dnl GMP_GCC_MARCH_PENTIUMPRO(CC,[ACTIONS-IF-GOOD][,ACTIONS-IF-BAD]) |
---|
628 | dnl --------------------------------------------------------------- |
---|
629 | dnl mpz/powm.c swox cvs rev 1.4 tickled a bug in gcc 2.95.2 and 2.95.3 when |
---|
630 | dnl -march=pentiumpro was used. The bug was wrong handling of the input to |
---|
631 | dnl an ABSIZ(z) expression in mpz_redc(). Fixed in 2.95.4 and pre-release |
---|
632 | dnl 3.0, and didn't seem to occur in unofficial 2.96, so test for 2.95.4 |
---|
633 | dnl and up. |
---|
634 | dnl |
---|
635 | dnl This macro is used only once, after finalizing a choice of CC, so the |
---|
636 | dnl result is cached. |
---|
637 | |
---|
638 | AC_DEFUN(GMP_GCC_MARCH_PENTIUMPRO, |
---|
639 | [AC_CACHE_CHECK([whether gcc -march=pentiumpro is good], |
---|
640 | gmp_cv_gcc_march_pentiumpro, |
---|
641 | [GMP_GCC_VERSION_GE([$1], 2,95,4) |
---|
642 | case $gmp_compare_ge in |
---|
643 | yes|no) gmp_cv_gcc_march_pentiumpro=$gmp_compare_ge ;; |
---|
644 | error|*) gmp_cv_gcc_march_pentiumpro=no ;; |
---|
645 | esac]) |
---|
646 | if test $gmp_cv_gcc_march_pentiumpro = yes; then |
---|
647 | ifelse([$2],,:,[$2]) |
---|
648 | else |
---|
649 | ifelse([$3],,:,[$3]) |
---|
650 | fi |
---|
651 | ]) |
---|
652 | |
---|
653 | |
---|
654 | dnl GMP_GCC_M68K_OPTIMIZE(CCBASE,CC,FLAG-VARIABLE) |
---|
655 | dnl ---------------------------------------------- |
---|
656 | dnl m68k gcc 2.95.x gets an internal compiler error when compiling the |
---|
657 | dnl current mpn/generic/gcdext.c (swox cvs rev 1.20) under -O2 or higher, |
---|
658 | dnl so just use -O for the offending gcc versions. Naturally if gcdext.c |
---|
659 | dnl gets rearranged or rewritten so the ICE doesn't happen then this can be |
---|
660 | dnl removed. |
---|
661 | |
---|
662 | AC_DEFUN(GMP_GCC_M68K_OPTIMIZE, |
---|
663 | [case $host in |
---|
664 | m68*-*-*) |
---|
665 | if test $1 = gcc; then |
---|
666 | case `$2 --version` in |
---|
667 | 2.95*) $3=-O ;; |
---|
668 | esac |
---|
669 | fi |
---|
670 | ;; |
---|
671 | esac |
---|
672 | ]) |
---|
673 | |
---|
674 | |
---|
675 | dnl GMP_GCC_MIPS_O32(gcc,[actions-yes][,[actions-no]]) |
---|
676 | dnl ------------------------------------------------- |
---|
677 | dnl Test whether gcc supports o32. |
---|
678 | dnl |
---|
679 | dnl gcc 2.7.2.2 only does o32, and doesn't accept -mabi=32. |
---|
680 | dnl |
---|
681 | dnl gcc 2.95 accepts -mabi=32 but it only works on irix5, on irix6 it gives |
---|
682 | dnl "cc1: The -mabi=32 support does not work yet". |
---|
683 | |
---|
684 | AC_DEFUN(GMP_GCC_MIPS_O32, |
---|
685 | [AC_MSG_CHECKING([whether gcc supports o32]) |
---|
686 | echo 'int x;' >conftest.c |
---|
687 | echo "$1 -mabi=32 -c conftest.c" >&AC_FD_CC |
---|
688 | if $1 -mabi=32 -c conftest.c >conftest.out 2>&1; then |
---|
689 | result=yes |
---|
690 | else |
---|
691 | cat conftest.out >&AC_FD_CC |
---|
692 | if grep "cc1: Invalid option \`abi=32'" conftest.out >/dev/null; then |
---|
693 | result=yes |
---|
694 | else |
---|
695 | result=no |
---|
696 | fi |
---|
697 | fi |
---|
698 | rm -f conftest.* |
---|
699 | AC_MSG_RESULT($result) |
---|
700 | if test $result = yes; then |
---|
701 | ifelse([$2],,:,[$2]) |
---|
702 | else |
---|
703 | ifelse([$3],,:,[$3]) |
---|
704 | fi |
---|
705 | ]) |
---|
706 | |
---|
707 | |
---|
708 | dnl GMP_GCC_NO_CPP_PRECOMP(CCBASE,CC,CFLAGS,[ACTIONS-YES][,ACTIONS-NO]) |
---|
709 | dnl ------------------------------------------------------------------- |
---|
710 | dnl Check whether -no-cpp-precomp should be used on this compiler, and |
---|
711 | dnl execute the corresponding ACTIONS-YES or ACTIONS-NO. |
---|
712 | dnl |
---|
713 | dnl -no-cpp-precomp is only meant for Apple's hacked version of gcc found |
---|
714 | dnl on powerpc*-*-darwin*, but we can give it a try on any gcc. Normal gcc |
---|
715 | dnl (as of 3.0 at least) only gives a warning, not an actual error, and we |
---|
716 | dnl watch for that and decide against the option in that case, to avoid |
---|
717 | dnl confusing the user. |
---|
718 | |
---|
719 | AC_DEFUN(GMP_GCC_NO_CPP_PRECOMP, |
---|
720 | [if test "$ccbase" = gcc; then |
---|
721 | AC_MSG_CHECKING([compiler $2 $3 -no-cpp-precomp]) |
---|
722 | result=no |
---|
723 | cat >conftest.c <<EOF |
---|
724 | int main () { return 0; } |
---|
725 | EOF |
---|
726 | gmp_compile="$2 $3 -no-cpp-precomp conftest.c >conftest.out 2>&1" |
---|
727 | if AC_TRY_EVAL(gmp_compile); then |
---|
728 | if grep "unrecognized option.*-no-cpp-precomp" conftest.out >/dev/null; then : ; |
---|
729 | else |
---|
730 | result=yes |
---|
731 | fi |
---|
732 | fi |
---|
733 | cat conftest.out >&AC_FD_CC |
---|
734 | rm -f conftest* a.out |
---|
735 | AC_MSG_RESULT($result) |
---|
736 | if test "$result" = yes; then |
---|
737 | ifelse([$4],,:,[$4]) |
---|
738 | else |
---|
739 | ifelse([$5],,:,[$5]) |
---|
740 | fi |
---|
741 | fi |
---|
742 | ]) |
---|
743 | |
---|
744 | |
---|
745 | dnl GMP_GCC_WA_MCPU(CC+CFLAGS, NEWFLAG [,ACTION-YES [,ACTION-NO]]) |
---|
746 | dnl -------------------------------------------------------------- |
---|
747 | dnl Check whether gcc (or gas rather) accepts a flag like "-Wa,-mev67". |
---|
748 | dnl |
---|
749 | dnl Gas doesn't give an error for an unknown cpu, it only prints a warning |
---|
750 | dnl like "Warning: Unknown CPU identifier `ev78'". |
---|
751 | dnl |
---|
752 | dnl This is intended for use on alpha, since only recent versions of gas |
---|
753 | dnl accept -mev67, but there's nothing here that's alpha specific. |
---|
754 | |
---|
755 | AC_DEFUN(GMP_GCC_WA_MCPU, |
---|
756 | [AC_MSG_CHECKING([assembler $1 $2]) |
---|
757 | result=no |
---|
758 | cat >conftest.c <<EOF |
---|
759 | int main () {} |
---|
760 | EOF |
---|
761 | gmp_compile="$1 $2 -c conftest.c >conftest.out 2>&1" |
---|
762 | if AC_TRY_EVAL(gmp_compile); then |
---|
763 | if grep "Unknown CPU identifier" conftest.out >/dev/null; then : ; |
---|
764 | else |
---|
765 | result=yes |
---|
766 | fi |
---|
767 | fi |
---|
768 | cat conftest.out >&AC_FD_CC |
---|
769 | rm -f conftest* |
---|
770 | AC_MSG_RESULT($result) |
---|
771 | if test "$result" = yes; then |
---|
772 | ifelse([$3],,:,[$3]) |
---|
773 | else |
---|
774 | ifelse([$4],,:,[$4]) |
---|
775 | fi |
---|
776 | ]) |
---|
777 | |
---|
778 | |
---|
779 | dnl GMP_PROG_CXX_WORKS(cxx/cxxflags [, ACTION-YES [,ACTION-NO]]) |
---|
780 | dnl ------------------------------------------------------------ |
---|
781 | dnl Check whether cxx/cxxflags can compile and link. |
---|
782 | dnl |
---|
783 | dnl This test is designed to be run repeatedly with different cxx/cxxflags |
---|
784 | dnl selections, so the result is not cached. |
---|
785 | |
---|
786 | AC_DEFUN(GMP_PROG_CXX_WORKS, |
---|
787 | [AC_MSG_CHECKING([C++ compiler $1]) |
---|
788 | cat >conftest.cc <<EOF |
---|
789 | #include <iostream> |
---|
790 | using namespace std; |
---|
791 | int |
---|
792 | main (void) |
---|
793 | { |
---|
794 | cout.setf (ios::hex); |
---|
795 | cout << 123; |
---|
796 | return 0; |
---|
797 | } |
---|
798 | EOF |
---|
799 | |
---|
800 | gmp_cxxcompile="$1 conftest.cc -o conftest >&AC_FD_CC" |
---|
801 | if AC_TRY_EVAL(gmp_cxxcompile); then |
---|
802 | rm -f conftest* |
---|
803 | AC_MSG_RESULT(yes) |
---|
804 | ifelse([$2],,:,[$2]) |
---|
805 | else |
---|
806 | rm -f conftest* |
---|
807 | AC_MSG_RESULT(no) |
---|
808 | ifelse([$3],,:,[$3]) |
---|
809 | fi |
---|
810 | ]) |
---|
811 | |
---|
812 | |
---|
813 | dnl GMP_INIT([M4-DEF-FILE]) |
---|
814 | dnl ----------------------- |
---|
815 | dnl Initializations for GMP config.m4 generation. |
---|
816 | dnl |
---|
817 | dnl FIXME: The generated config.m4 doesn't get recreated by config.status. |
---|
818 | dnl Maybe the relevant "echo"s should go through AC_CONFIG_COMMANDS. |
---|
819 | |
---|
820 | AC_DEFUN(GMP_INIT, |
---|
821 | [ifelse([$1], , gmp_configm4=config.m4, gmp_configm4="[$1]") |
---|
822 | gmp_tmpconfigm4=cnfm4.tmp |
---|
823 | gmp_tmpconfigm4i=cnfm4i.tmp |
---|
824 | gmp_tmpconfigm4p=cnfm4p.tmp |
---|
825 | rm -f $gmp_tmpconfigm4 $gmp_tmpconfigm4i $gmp_tmpconfigm4p |
---|
826 | |
---|
827 | # CONFIG_TOP_SRCDIR is a path from the mpn builddir to the top srcdir. |
---|
828 | # The pattern here tests for an absolute path the same way as |
---|
829 | # _AC_OUTPUT_FILES in autoconf acgeneral.m4. |
---|
830 | case $srcdir in |
---|
831 | [[\\/]]* | ?:[[\\/]]* ) tmp="$srcdir" ;; |
---|
832 | *) tmp="../$srcdir" ;; |
---|
833 | esac |
---|
834 | echo ["define(<CONFIG_TOP_SRCDIR>,<\`$tmp'>)"] >>$gmp_tmpconfigm4 |
---|
835 | |
---|
836 | # All CPUs use asm-defs.m4 |
---|
837 | echo ["include(CONFIG_TOP_SRCDIR\`/mpn/asm-defs.m4')"] >>$gmp_tmpconfigm4i |
---|
838 | ]) |
---|
839 | |
---|
840 | |
---|
841 | dnl GMP_FINISH |
---|
842 | dnl ---------- |
---|
843 | dnl Create config.m4 from its accumulated parts. |
---|
844 | dnl |
---|
845 | dnl __CONFIG_M4_INCLUDED__ is used so that a second or subsequent include |
---|
846 | dnl of config.m4 is harmless. |
---|
847 | dnl |
---|
848 | dnl A separate ifdef on the angle bracket quoted part ensures the quoting |
---|
849 | dnl style there is respected. The basic defines from gmp_tmpconfigm4 are |
---|
850 | dnl fully quoted but are still put under an ifdef in case any have been |
---|
851 | dnl redefined by one of the m4 include files. |
---|
852 | dnl |
---|
853 | dnl Doing a big ifdef within asm-defs.m4 and/or other macro files wouldn't |
---|
854 | dnl work, since it'd interpret parentheses and quotes in dnl comments, and |
---|
855 | dnl having a whole file as a macro argument would overflow the string space |
---|
856 | dnl on BSD m4. |
---|
857 | |
---|
858 | AC_DEFUN(GMP_FINISH, |
---|
859 | [AC_REQUIRE([GMP_INIT]) |
---|
860 | echo "creating $gmp_configm4" |
---|
861 | echo ["d""nl $gmp_configm4. Generated automatically by configure."] > $gmp_configm4 |
---|
862 | if test -f $gmp_tmpconfigm4; then |
---|
863 | echo ["changequote(<,>)"] >> $gmp_configm4 |
---|
864 | echo ["ifdef(<__CONFIG_M4_INCLUDED__>,,<"] >> $gmp_configm4 |
---|
865 | cat $gmp_tmpconfigm4 >> $gmp_configm4 |
---|
866 | echo [">)"] >> $gmp_configm4 |
---|
867 | echo ["changequote(\`,')"] >> $gmp_configm4 |
---|
868 | rm $gmp_tmpconfigm4 |
---|
869 | fi |
---|
870 | echo ["ifdef(\`__CONFIG_M4_INCLUDED__',,\`"] >> $gmp_configm4 |
---|
871 | if test -f $gmp_tmpconfigm4i; then |
---|
872 | cat $gmp_tmpconfigm4i >> $gmp_configm4 |
---|
873 | rm $gmp_tmpconfigm4i |
---|
874 | fi |
---|
875 | if test -f $gmp_tmpconfigm4p; then |
---|
876 | cat $gmp_tmpconfigm4p >> $gmp_configm4 |
---|
877 | rm $gmp_tmpconfigm4p |
---|
878 | fi |
---|
879 | echo ["')"] >> $gmp_configm4 |
---|
880 | echo ["define(\`__CONFIG_M4_INCLUDED__')"] >> $gmp_configm4 |
---|
881 | ]) |
---|
882 | |
---|
883 | |
---|
884 | dnl GMP_INCLUDE_MPN(FILE) |
---|
885 | dnl --------------------- |
---|
886 | dnl Add an include_mpn(`FILE') to config.m4. FILE should be a path |
---|
887 | dnl relative to the mpn source directory, for example |
---|
888 | dnl |
---|
889 | dnl GMP_INCLUDE_MPN(`x86/x86-defs.m4') |
---|
890 | dnl |
---|
891 | |
---|
892 | AC_DEFUN(GMP_INCLUDE_MPN, |
---|
893 | [AC_REQUIRE([GMP_INIT]) |
---|
894 | echo ["include_mpn(\`$1')"] >> $gmp_tmpconfigm4i |
---|
895 | ]) |
---|
896 | |
---|
897 | |
---|
898 | dnl GMP_DEFINE(MACRO, DEFINITION [, LOCATION]) |
---|
899 | dnl ------------------------------------------ |
---|
900 | dnl Define M4 macro MACRO as DEFINITION in temporary file. |
---|
901 | dnl |
---|
902 | dnl If LOCATION is `POST', the definition will appear after any include() |
---|
903 | dnl directives inserted by GMP_INCLUDE. Mind the quoting! No shell |
---|
904 | dnl variables will get expanded. Don't forget to invoke GMP_FINISH to |
---|
905 | dnl create file config.m4. config.m4 uses `<' and '>' as quote characters |
---|
906 | dnl for all defines. |
---|
907 | |
---|
908 | AC_DEFUN(GMP_DEFINE, |
---|
909 | [AC_REQUIRE([GMP_INIT]) |
---|
910 | echo ['define(<$1>, <$2>)'] >>ifelse([$3], [POST], |
---|
911 | $gmp_tmpconfigm4p, $gmp_tmpconfigm4) |
---|
912 | ]) |
---|
913 | |
---|
914 | |
---|
915 | dnl GMP_DEFINE_RAW(STRING, [, LOCATION]) |
---|
916 | dnl ------------------------------------ |
---|
917 | dnl Put STRING into config.m4 file. |
---|
918 | dnl |
---|
919 | dnl If LOCATION is `POST', the definition will appear after any include() |
---|
920 | dnl directives inserted by GMP_INCLUDE. Don't forget to invoke GMP_FINISH |
---|
921 | dnl to create file config.m4. |
---|
922 | |
---|
923 | AC_DEFUN(GMP_DEFINE_RAW, |
---|
924 | [AC_REQUIRE([GMP_INIT]) |
---|
925 | echo [$1] >> ifelse([$2], [POST], $gmp_tmpconfigm4p, $gmp_tmpconfigm4) |
---|
926 | ]) |
---|
927 | |
---|
928 | |
---|
929 | dnl GMP_TRY_ASSEMBLE(asm-code,[action-success][,action-fail]) |
---|
930 | dnl ---------------------------------------------------------- |
---|
931 | dnl Attempt to assemble the given code. |
---|
932 | dnl Do "action-success" if this succeeds, "action-fail" if not. |
---|
933 | dnl |
---|
934 | dnl conftest.o and conftest.out are available for inspection in |
---|
935 | dnl "action-success". If either action does a "break" out of a loop then |
---|
936 | dnl an explicit "rm -f conftest*" will be necessary. |
---|
937 | dnl |
---|
938 | dnl This is not unlike AC_TRY_COMPILE, but there's no default includes or |
---|
939 | dnl anything in "asm-code", everything wanted must be given explicitly. |
---|
940 | |
---|
941 | AC_DEFUN(GMP_TRY_ASSEMBLE, |
---|
942 | [cat >conftest.s <<EOF |
---|
943 | [$1] |
---|
944 | EOF |
---|
945 | gmp_assemble="$CCAS $CFLAGS conftest.s >conftest.out 2>&1" |
---|
946 | if AC_TRY_EVAL(gmp_assemble); then |
---|
947 | cat conftest.out >&AC_FD_CC |
---|
948 | ifelse([$2],,:,[$2]) |
---|
949 | else |
---|
950 | cat conftest.out >&AC_FD_CC |
---|
951 | echo "configure: failed program was:" >&AC_FD_CC |
---|
952 | cat conftest.s >&AC_FD_CC |
---|
953 | ifelse([$3],,:,[$3]) |
---|
954 | fi |
---|
955 | rm -f conftest* |
---|
956 | ]) |
---|
957 | |
---|
958 | |
---|
959 | dnl GMP_ASM_LABEL_SUFFIX |
---|
960 | dnl -------------------- |
---|
961 | dnl Should a label have a colon or not? |
---|
962 | |
---|
963 | AC_DEFUN(GMP_ASM_LABEL_SUFFIX, |
---|
964 | [AC_CACHE_CHECK([what assembly label suffix to use], |
---|
965 | gmp_cv_asm_label_suffix, |
---|
966 | [case $host in |
---|
967 | # Empty is only for the HP-UX hppa assembler; hppa gas requires a colon. |
---|
968 | *-*-hpux*) gmp_cv_asm_label_suffix= ;; |
---|
969 | *) gmp_cv_asm_label_suffix=: ;; |
---|
970 | esac |
---|
971 | ]) |
---|
972 | echo ["define(<LABEL_SUFFIX>, <\$][1$gmp_cv_asm_label_suffix>)"] >> $gmp_tmpconfigm4 |
---|
973 | ]) |
---|
974 | |
---|
975 | |
---|
976 | dnl GMP_ASM_UNDERSCORE |
---|
977 | dnl ------------------ |
---|
978 | dnl Determine whether global symbols need to be prefixed with an underscore. |
---|
979 | dnl A test program is linked to an assembler module with or without an |
---|
980 | dnl underscore to see which works. |
---|
981 | dnl |
---|
982 | dnl This method should be more reliable than grepping a .o file or using |
---|
983 | dnl nm, since it corresponds to what a real program is going to do. Note |
---|
984 | dnl in particular that grepping doesn't work with SunOS 4 native grep since |
---|
985 | dnl that grep seems to have trouble with '\0's in files. |
---|
986 | |
---|
987 | AC_DEFUN(GMP_ASM_UNDERSCORE, |
---|
988 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
989 | AC_REQUIRE([GMP_ASM_GLOBL]) |
---|
990 | AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) |
---|
991 | AC_CACHE_CHECK([if globals are prefixed by underscore], |
---|
992 | gmp_cv_asm_underscore, |
---|
993 | [cat >conftes1.c <<EOF |
---|
994 | #ifdef __cplusplus |
---|
995 | extern "C" { void underscore_test(); } |
---|
996 | #endif |
---|
997 | main () { underscore_test(); } |
---|
998 | EOF |
---|
999 | for tmp_underscore in "" "_"; do |
---|
1000 | cat >conftes2.s <<EOF |
---|
1001 | $gmp_cv_asm_text |
---|
1002 | $gmp_cv_asm_globl ${tmp_underscore}underscore_test |
---|
1003 | ${tmp_underscore}underscore_test$gmp_cv_asm_label_suffix |
---|
1004 | EOF |
---|
1005 | case $host in |
---|
1006 | *-*-aix*) |
---|
1007 | cat >>conftes2.s <<EOF |
---|
1008 | $gmp_cv_asm_globl .${tmp_underscore}underscore_test |
---|
1009 | .${tmp_underscore}underscore_test$gmp_cv_asm_label_suffix |
---|
1010 | EOF |
---|
1011 | ;; |
---|
1012 | esac |
---|
1013 | gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftes1.c >&AC_FD_CC && $CCAS $CFLAGS conftes2.s >&AC_FD_CC && $CC $CFLAGS conftes1.$OBJEXT conftes2.$OBJEXT >&AC_FD_CC" |
---|
1014 | if AC_TRY_EVAL(gmp_compile); then |
---|
1015 | eval tmp_result$tmp_underscore=yes |
---|
1016 | else |
---|
1017 | eval tmp_result$tmp_underscore=no |
---|
1018 | fi |
---|
1019 | done |
---|
1020 | |
---|
1021 | if test $tmp_result_ = yes; then |
---|
1022 | if test $tmp_result = yes; then |
---|
1023 | AC_MSG_ERROR([Test program unexpectedly links both with and without underscore.]) |
---|
1024 | else |
---|
1025 | gmp_cv_asm_underscore=yes |
---|
1026 | fi |
---|
1027 | else |
---|
1028 | if test $tmp_result = yes; then |
---|
1029 | gmp_cv_asm_underscore=no |
---|
1030 | else |
---|
1031 | AC_MSG_ERROR([Test program links neither with nor without underscore.]) |
---|
1032 | fi |
---|
1033 | fi |
---|
1034 | rm -f conftes1* conftes2* a.out |
---|
1035 | ]) |
---|
1036 | if test "$gmp_cv_asm_underscore" = "yes"; then |
---|
1037 | GMP_DEFINE(GSYM_PREFIX, [_]) |
---|
1038 | else |
---|
1039 | GMP_DEFINE(GSYM_PREFIX, []) |
---|
1040 | fi |
---|
1041 | ]) |
---|
1042 | |
---|
1043 | |
---|
1044 | dnl GMP_ASM_ALIGN_LOG |
---|
1045 | dnl ----------------- |
---|
1046 | dnl Is parameter to `.align' logarithmic? |
---|
1047 | |
---|
1048 | AC_DEFUN(GMP_ASM_ALIGN_LOG, |
---|
1049 | [AC_REQUIRE([GMP_ASM_GLOBL]) |
---|
1050 | AC_REQUIRE([GMP_ASM_DATA]) |
---|
1051 | AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) |
---|
1052 | AC_REQUIRE([GMP_PROG_NM]) |
---|
1053 | AC_CACHE_CHECK([if .align assembly directive is logarithmic], |
---|
1054 | gmp_cv_asm_align_log, |
---|
1055 | [GMP_TRY_ASSEMBLE( |
---|
1056 | [ $gmp_cv_asm_data |
---|
1057 | .align 4 |
---|
1058 | $gmp_cv_asm_globl foo |
---|
1059 | .byte 1 |
---|
1060 | .align 4 |
---|
1061 | foo$gmp_cv_asm_label_suffix |
---|
1062 | .byte 2], |
---|
1063 | [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ |
---|
1064 | sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] |
---|
1065 | if test "$gmp_tmp_val" = "10" || test "$gmp_tmp_val" = "16"; then |
---|
1066 | gmp_cv_asm_align_log=yes |
---|
1067 | else |
---|
1068 | gmp_cv_asm_align_log=no |
---|
1069 | fi], |
---|
1070 | [AC_MSG_ERROR([cannot assemble alignment test])])]) |
---|
1071 | |
---|
1072 | GMP_DEFINE_RAW(["define(<ALIGN_LOGARITHMIC>,<$gmp_cv_asm_align_log>)"]) |
---|
1073 | ]) |
---|
1074 | |
---|
1075 | |
---|
1076 | dnl GMP_ASM_ALIGN_FILL_0x90 |
---|
1077 | dnl ----------------------- |
---|
1078 | dnl Determine whether a ",0x90" suffix works on a .align directive. |
---|
1079 | dnl This is only meant for use on x86, 0x90 being a "nop". |
---|
1080 | dnl |
---|
1081 | dnl Old gas, eg. 1.92.3 |
---|
1082 | dnl Needs ",0x90" or else the fill is 0x00, which can't be executed |
---|
1083 | dnl across. |
---|
1084 | dnl |
---|
1085 | dnl New gas, eg. 2.91 |
---|
1086 | dnl Generates multi-byte nop fills even when ",0x90" is given. |
---|
1087 | dnl |
---|
1088 | dnl Solaris 2.6 as |
---|
1089 | dnl ",0x90" is not allowed, causes a fatal error. |
---|
1090 | dnl |
---|
1091 | dnl Solaris 2.8 as |
---|
1092 | dnl ",0x90" does nothing, generates a warning that it's being ignored. |
---|
1093 | dnl |
---|
1094 | dnl SCO OpenServer 5 as |
---|
1095 | dnl Second parameter is max bytes to fill, not a fill pattern. |
---|
1096 | dnl ",0x90" is an error due to being bigger than the first parameter. |
---|
1097 | dnl Multi-byte nop fills are generated in text segments. |
---|
1098 | dnl |
---|
1099 | dnl Note that both solaris "as"s only care about ",0x90" if they actually |
---|
1100 | dnl have to use it to fill something, hence the .byte in the test. It's |
---|
1101 | dnl the second .align which provokes the error or warning. |
---|
1102 | dnl |
---|
1103 | dnl The warning from solaris 2.8 is supressed to stop anyone worrying that |
---|
1104 | dnl something might be wrong. |
---|
1105 | |
---|
1106 | AC_DEFUN(GMP_ASM_ALIGN_FILL_0x90, |
---|
1107 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1108 | AC_CACHE_CHECK([if the .align directive accepts an 0x90 fill in .text], |
---|
1109 | gmp_cv_asm_align_fill_0x90, |
---|
1110 | [GMP_TRY_ASSEMBLE( |
---|
1111 | [ $gmp_cv_asm_text |
---|
1112 | .align 4, 0x90 |
---|
1113 | .byte 0 |
---|
1114 | .align 4, 0x90], |
---|
1115 | [if grep "Warning: Fill parameter ignored for executable section" conftest.out >/dev/null; then |
---|
1116 | echo "Supressing this warning by omitting 0x90" 1>&AC_FD_CC |
---|
1117 | gmp_cv_asm_align_fill_0x90=no |
---|
1118 | else |
---|
1119 | gmp_cv_asm_align_fill_0x90=yes |
---|
1120 | fi], |
---|
1121 | [gmp_cv_asm_align_fill_0x90=no])]) |
---|
1122 | |
---|
1123 | GMP_DEFINE_RAW(["define(<ALIGN_FILL_0x90>,<$gmp_cv_asm_align_fill_0x90>)"]) |
---|
1124 | ]) |
---|
1125 | |
---|
1126 | |
---|
1127 | dnl GMP_ASM_TEXT |
---|
1128 | dnl ------------ |
---|
1129 | |
---|
1130 | AC_DEFUN(GMP_ASM_TEXT, |
---|
1131 | [AC_CACHE_CHECK([how to switch to text section], |
---|
1132 | gmp_cv_asm_text, |
---|
1133 | [case $host in |
---|
1134 | *-*-aix*) gmp_cv_asm_text=[".csect .text[PR]"] ;; |
---|
1135 | *-*-hpux*) gmp_cv_asm_text=".code" ;; |
---|
1136 | *) gmp_cv_asm_text=".text" ;; |
---|
1137 | esac |
---|
1138 | ]) |
---|
1139 | echo ["define(<TEXT>, <$gmp_cv_asm_text>)"] >> $gmp_tmpconfigm4 |
---|
1140 | ]) |
---|
1141 | |
---|
1142 | |
---|
1143 | dnl GMP_ASM_DATA |
---|
1144 | dnl ------------ |
---|
1145 | dnl Can we say `.data'? |
---|
1146 | |
---|
1147 | AC_DEFUN(GMP_ASM_DATA, |
---|
1148 | [AC_CACHE_CHECK([how to switch to data section], |
---|
1149 | gmp_cv_asm_data, |
---|
1150 | [case $host in |
---|
1151 | *-*-aix*) gmp_cv_asm_data=[".csect .data[RW]"] ;; |
---|
1152 | *) gmp_cv_asm_data=".data" ;; |
---|
1153 | esac |
---|
1154 | ]) |
---|
1155 | echo ["define(<DATA>, <$gmp_cv_asm_data>)"] >> $gmp_tmpconfigm4 |
---|
1156 | ]) |
---|
1157 | |
---|
1158 | |
---|
1159 | dnl GMP_ASM_RODATA |
---|
1160 | dnl -------------- |
---|
1161 | dnl Find out how to switch to the read-only data section. |
---|
1162 | dnl |
---|
1163 | dnl The compiler output is grepped for the right directive. It's not |
---|
1164 | dnl considered wise to just probe for ".section .rodata" or whatever works, |
---|
1165 | dnl since arbitrary section names might be accepted, but not necessarily do |
---|
1166 | dnl the right thing when they get to the linker. |
---|
1167 | dnl |
---|
1168 | dnl Only a few asm files use RODATA, so this code is perhaps a bit |
---|
1169 | dnl excessive right now, but should find more uses in the future. |
---|
1170 | dnl |
---|
1171 | dnl FIXME: gcc on aix generates something like ".csect _foo.ro_c[RO],3" |
---|
1172 | dnl where foo is the object file. Might need to check for that if we use |
---|
1173 | dnl RODATA there. |
---|
1174 | |
---|
1175 | AC_DEFUN(GMP_ASM_RODATA, |
---|
1176 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1177 | AC_REQUIRE([GMP_ASM_DATA]) |
---|
1178 | AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) |
---|
1179 | AC_REQUIRE([GMP_ASM_UNDERSCORE]) |
---|
1180 | AC_CACHE_CHECK([how to switch to read-only data section], |
---|
1181 | gmp_cv_asm_rodata, |
---|
1182 | [ |
---|
1183 | dnl Default to DATA on CPUs with split code/data caching, and TEXT |
---|
1184 | dnl elsewhere. i386 means generic x86, so use DATA on it. |
---|
1185 | case $host in |
---|
1186 | X86_PATTERN) gmp_cv_asm_rodata="$gmp_cv_asm_data" ;; |
---|
1187 | *) gmp_cv_asm_rodata="$gmp_cv_asm_text" ;; |
---|
1188 | esac |
---|
1189 | |
---|
1190 | cat >conftest.c <<EOF |
---|
1191 | const int foo = 123; |
---|
1192 | EOF |
---|
1193 | echo "Test program:" >&AC_FD_CC |
---|
1194 | cat conftest.c >&AC_FD_CC |
---|
1195 | gmp_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c >&AC_FD_CC" |
---|
1196 | if AC_TRY_EVAL(gmp_compile); then |
---|
1197 | echo "Compiler output:" >&AC_FD_CC |
---|
1198 | cat conftest.s >&AC_FD_CC |
---|
1199 | if test $gmp_cv_asm_underscore = yes; then |
---|
1200 | tmp_gsym_prefix=_ |
---|
1201 | else |
---|
1202 | tmp_gsym_prefix= |
---|
1203 | fi |
---|
1204 | # must see our label |
---|
1205 | if grep "^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" conftest.s >/dev/null 2>&AC_FD_CC; then |
---|
1206 | # take the last directive before our label (hence skipping segments |
---|
1207 | # getting debugging info etc) |
---|
1208 | tmp_match=`sed -n ["/^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix/q |
---|
1209 | /^[. ]*data/p |
---|
1210 | /^[. ]*rdata/p |
---|
1211 | /^[. ]*text/p |
---|
1212 | /^[. ]*section/p |
---|
1213 | /^[. ]*csect/p |
---|
1214 | /^[. ]*CSECT/p"] conftest.s | sed -n '$p'` |
---|
1215 | echo "Match: $tmp_match" >&AC_FD_CC |
---|
1216 | if test -n "$tmp_match"; then |
---|
1217 | gmp_cv_asm_rodata=$tmp_match |
---|
1218 | fi |
---|
1219 | else |
---|
1220 | echo "Couldn't find label: ^${tmp_gsym_prefix}foo$gmp_cv_asm_label_suffix" >&AC_FD_CC |
---|
1221 | fi |
---|
1222 | fi |
---|
1223 | ]) |
---|
1224 | echo ["define(<RODATA>, <$gmp_cv_asm_rodata>)"] >> $gmp_tmpconfigm4 |
---|
1225 | ]) |
---|
1226 | |
---|
1227 | |
---|
1228 | dnl GMP_ASM_GLOBL |
---|
1229 | dnl ------------- |
---|
1230 | dnl Can we say `.global'? |
---|
1231 | |
---|
1232 | AC_DEFUN(GMP_ASM_GLOBL, |
---|
1233 | [AC_CACHE_CHECK([how to export a symbol], |
---|
1234 | gmp_cv_asm_globl, |
---|
1235 | [case $host in |
---|
1236 | *-*-hpux*) gmp_cv_asm_globl=".export" ;; |
---|
1237 | *) gmp_cv_asm_globl=".globl" ;; |
---|
1238 | esac |
---|
1239 | ]) |
---|
1240 | echo ["define(<GLOBL>, <$gmp_cv_asm_globl>)"] >> $gmp_tmpconfigm4 |
---|
1241 | ]) |
---|
1242 | |
---|
1243 | |
---|
1244 | dnl GMP_ASM_GLOBL_ATTR |
---|
1245 | dnl ------------------ |
---|
1246 | dnl Do we need something after `.global symbol'? |
---|
1247 | |
---|
1248 | AC_DEFUN(GMP_ASM_GLOBL_ATTR, |
---|
1249 | [AC_CACHE_CHECK([if the export directive needs an attribute], |
---|
1250 | gmp_cv_asm_globl_attr, |
---|
1251 | [case $host in |
---|
1252 | *-*-hpux*) gmp_cv_asm_globl_attr=",entry" ;; |
---|
1253 | *) gmp_cv_asm_globl_attr="" ;; |
---|
1254 | esac |
---|
1255 | ]) |
---|
1256 | echo ["define(<GLOBL_ATTR>, <$gmp_cv_asm_globl_attr>)"] >> $gmp_tmpconfigm4 |
---|
1257 | ]) |
---|
1258 | |
---|
1259 | |
---|
1260 | dnl GMP_ASM_TYPE |
---|
1261 | dnl ------------ |
---|
1262 | dnl Can we say ".type", and how? |
---|
1263 | dnl |
---|
1264 | dnl For i386 GNU/Linux ELF systems, and very likely other ELF systems, |
---|
1265 | dnl .type and .size are important on functions in shared libraries. If |
---|
1266 | dnl .type is omitted and the mainline program references that function then |
---|
1267 | dnl the code will be copied down to the mainline at load time like a piece |
---|
1268 | dnl of data. If .size is wrong or missing (it defaults to 4 bytes or some |
---|
1269 | dnl such) then incorrect bytes will be copied and a segv is the most likely |
---|
1270 | dnl result. In any case such copying is not what's wanted, a .type |
---|
1271 | dnl directive will ensure a PLT entry is used. |
---|
1272 | dnl |
---|
1273 | dnl In GMP the assembler functions are normally only used from within the |
---|
1274 | dnl library (since most programs are not interested in the low level |
---|
1275 | dnl routines), and in those circumstances a missing .type isn't fatal, |
---|
1276 | dnl letting the problem go unnoticed. tests/mpn/t-asmtype.c aims to check |
---|
1277 | dnl for it. |
---|
1278 | |
---|
1279 | AC_DEFUN(GMP_ASM_TYPE, |
---|
1280 | [AC_CACHE_CHECK([for assembler .type directive], |
---|
1281 | gmp_cv_asm_type, |
---|
1282 | [gmp_cv_asm_type= |
---|
1283 | for gmp_tmp_prefix in @ \# %; do |
---|
1284 | GMP_TRY_ASSEMBLE([ .type sym,${gmp_tmp_prefix}function], |
---|
1285 | [if grep "\.type pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; |
---|
1286 | else |
---|
1287 | gmp_cv_asm_type=".type \$][1,${gmp_tmp_prefix}\$][2" |
---|
1288 | break |
---|
1289 | fi]) |
---|
1290 | done |
---|
1291 | rm -f conftest* |
---|
1292 | ]) |
---|
1293 | echo ["define(<TYPE>, <$gmp_cv_asm_type>)"] >> $gmp_tmpconfigm4 |
---|
1294 | ]) |
---|
1295 | |
---|
1296 | |
---|
1297 | dnl GMP_ASM_SIZE |
---|
1298 | dnl ------------ |
---|
1299 | dnl Can we say `.size'? |
---|
1300 | |
---|
1301 | AC_DEFUN(GMP_ASM_SIZE, |
---|
1302 | [AC_CACHE_CHECK([for assembler .size directive], |
---|
1303 | gmp_cv_asm_size, |
---|
1304 | [gmp_cv_asm_size= |
---|
1305 | GMP_TRY_ASSEMBLE([ .size sym,1], |
---|
1306 | [if grep "\.size pseudo-op used outside of \.def/\.endef ignored" conftest.out >/dev/null; then : ; |
---|
1307 | else |
---|
1308 | gmp_cv_asm_size=".size \$][1,\$][2" |
---|
1309 | fi]) |
---|
1310 | ]) |
---|
1311 | echo ["define(<SIZE>, <$gmp_cv_asm_size>)"] >> $gmp_tmpconfigm4 |
---|
1312 | ]) |
---|
1313 | |
---|
1314 | |
---|
1315 | dnl GMP_ASM_LSYM_PREFIX |
---|
1316 | dnl ------------------- |
---|
1317 | dnl What is the prefix for a local label? |
---|
1318 | dnl |
---|
1319 | dnl The prefixes tested are, |
---|
1320 | dnl |
---|
1321 | dnl L - usual for underscore systems |
---|
1322 | dnl .L - usual for non-underscore systems |
---|
1323 | dnl $ - alpha (gas and OSF system assembler) |
---|
1324 | dnl L$ - hppa (gas and HP-UX system assembler) |
---|
1325 | dnl |
---|
1326 | dnl The default is "L" if the tests fail for any reason. There's a good |
---|
1327 | dnl chance this will be adequate, since on most systems labels are local |
---|
1328 | dnl anyway unless given a ".globl", and an "L" will avoid clashes with |
---|
1329 | dnl other identifers. |
---|
1330 | dnl |
---|
1331 | dnl For gas, ".L" is normally purely local to the assembler, it doesn't get |
---|
1332 | dnl put into the object file at all. This style is preferred, to keep the |
---|
1333 | dnl object files nice and clean. |
---|
1334 | dnl |
---|
1335 | dnl BSD format nm produces a line like the following. The lower case "t" |
---|
1336 | dnl indicates a local text segment label. On OSF with "nm -B", an "N" is |
---|
1337 | dnl printed instead. |
---|
1338 | dnl |
---|
1339 | dnl 00000000 t Lgurkmacka |
---|
1340 | dnl |
---|
1341 | dnl HP-UX nm prints an error message (though seems to give a 0 exit) if |
---|
1342 | dnl there's no symbols at all in an object file, hence the use of "dummy". |
---|
1343 | |
---|
1344 | AC_DEFUN(GMP_ASM_LSYM_PREFIX, |
---|
1345 | [AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) |
---|
1346 | AC_REQUIRE([GMP_PROG_NM]) |
---|
1347 | AC_CACHE_CHECK([what prefix to use for a local label], |
---|
1348 | gmp_cv_asm_lsym_prefix, |
---|
1349 | [for gmp_tmp_pre in L .L $ L$; do |
---|
1350 | echo "Trying $gmp_tmp_pre" >&AC_FD_CC |
---|
1351 | GMP_TRY_ASSEMBLE( |
---|
1352 | [dummy${gmp_cv_asm_label_suffix} |
---|
1353 | ${gmp_tmp_pre}gurkmacka${gmp_cv_asm_label_suffix}], |
---|
1354 | [if $NM conftest.$OBJEXT >conftest.nm 2>&AC_FD_CC; then : ; else |
---|
1355 | cat conftest.nm >&AC_FD_CC |
---|
1356 | AC_MSG_WARN(["$NM" failure]) |
---|
1357 | break |
---|
1358 | fi |
---|
1359 | cat conftest.nm >&AC_FD_CC |
---|
1360 | if grep gurkmacka conftest.nm >/dev/null; then : ; else |
---|
1361 | # no mention of the symbol, this is good |
---|
1362 | gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" |
---|
1363 | break |
---|
1364 | fi |
---|
1365 | if grep [' [Nt] .*gurkmacka'] conftest.nm >/dev/null; then |
---|
1366 | # symbol mentioned as a local, use this if nothing better |
---|
1367 | if test -z "$gmp_cv_asm_lsym_prefix"; then |
---|
1368 | gmp_cv_asm_lsym_prefix="$gmp_tmp_pre" |
---|
1369 | fi |
---|
1370 | fi |
---|
1371 | ]) |
---|
1372 | done |
---|
1373 | rm -f conftest* |
---|
1374 | if test -z "$gmp_cv_asm_lsym_prefix"; then |
---|
1375 | gmp_cv_asm_lsym_prefix=L |
---|
1376 | AC_MSG_WARN([cannot determine local label, using default $gmp_cv_asm_lsym_prefix]) |
---|
1377 | fi |
---|
1378 | ]) |
---|
1379 | echo ["define(<LSYM_PREFIX>, <${gmp_cv_asm_lsym_prefix}>)"] >> $gmp_tmpconfigm4 |
---|
1380 | AC_DEFINE_UNQUOTED(LSYM_PREFIX, "$gmp_cv_asm_lsym_prefix", |
---|
1381 | [Assembler local label prefix]) |
---|
1382 | ]) |
---|
1383 | |
---|
1384 | |
---|
1385 | dnl GMP_ASM_W32 |
---|
1386 | dnl ----------- |
---|
1387 | dnl How to define a 32-bit word. |
---|
1388 | |
---|
1389 | AC_DEFUN(GMP_ASM_W32, |
---|
1390 | [AC_REQUIRE([GMP_ASM_DATA]) |
---|
1391 | AC_REQUIRE([GMP_ASM_GLOBL]) |
---|
1392 | AC_REQUIRE([GMP_ASM_LABEL_SUFFIX]) |
---|
1393 | AC_REQUIRE([GMP_PROG_NM]) |
---|
1394 | AC_CACHE_CHECK([how to define a 32-bit word], |
---|
1395 | gmp_cv_asm_w32, |
---|
1396 | [case $host in |
---|
1397 | *-*-hpux*) |
---|
1398 | # FIXME: HPUX puts first symbol at 0x40000000, breaking our assumption |
---|
1399 | # that it's at 0x0. We'll have to declare another symbol before the |
---|
1400 | # .long/.word and look at the distance between the two symbols. The |
---|
1401 | # only problem is that the sed expression(s) barfs (on Solaris, for |
---|
1402 | # example) for the symbol with value 0. For now, HPUX uses .word. |
---|
1403 | gmp_cv_asm_w32=".word" |
---|
1404 | ;; |
---|
1405 | *-*-*) |
---|
1406 | gmp_tmp_val= |
---|
1407 | for gmp_tmp_op in .long .word; do |
---|
1408 | GMP_TRY_ASSEMBLE( |
---|
1409 | [ $gmp_cv_asm_data |
---|
1410 | $gmp_cv_asm_globl foo |
---|
1411 | $gmp_tmp_op 0 |
---|
1412 | foo$gmp_cv_asm_label_suffix |
---|
1413 | .byte 0], |
---|
1414 | [gmp_tmp_val=[`$NM conftest.$OBJEXT | grep foo | \ |
---|
1415 | sed -e 's;[[][0-9][]]\(.*\);\1;' -e 's;[^1-9]*\([0-9]*\).*;\1;'`] |
---|
1416 | if test "$gmp_tmp_val" = 4; then |
---|
1417 | gmp_cv_asm_w32="$gmp_tmp_op" |
---|
1418 | break |
---|
1419 | fi]) |
---|
1420 | done |
---|
1421 | rm -f conftest* |
---|
1422 | ;; |
---|
1423 | esac |
---|
1424 | if test -z "$gmp_cv_asm_w32"; then |
---|
1425 | AC_MSG_ERROR([cannot determine how to define a 32-bit word]) |
---|
1426 | fi |
---|
1427 | ]) |
---|
1428 | echo ["define(<W32>, <$gmp_cv_asm_w32>)"] >> $gmp_tmpconfigm4 |
---|
1429 | ]) |
---|
1430 | |
---|
1431 | |
---|
1432 | dnl GMP_ASM_X86_MMX([ACTION-IF-YES][,ACTION-IF-NO]) |
---|
1433 | dnl ----------------------------------------------- |
---|
1434 | dnl Determine whether the assembler supports MMX instructions. |
---|
1435 | dnl |
---|
1436 | dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded |
---|
1437 | dnl here. ".text" is believed to be correct on all x86 systems, certainly |
---|
1438 | dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't |
---|
1439 | dnl needed at all, at least for just checking instruction syntax. |
---|
1440 | dnl |
---|
1441 | dnl "movq %mm0, %mm1" should assemble to "0f 6f c8", but Solaris 2.6 and |
---|
1442 | dnl 2.7 wrongly assemble it to "0f 6f c1" (that being the reverse "movq |
---|
1443 | dnl %mm1, %mm0"). It seems more trouble than it's worth to work around |
---|
1444 | dnl this in the code, so just detect and reject. |
---|
1445 | |
---|
1446 | AC_DEFUN(GMP_ASM_X86_MMX, |
---|
1447 | [AC_CACHE_CHECK([if the assembler knows about MMX instructions], |
---|
1448 | gmp_cv_asm_x86_mmx, |
---|
1449 | [GMP_TRY_ASSEMBLE( |
---|
1450 | [ .text |
---|
1451 | movq %mm0, %mm1], |
---|
1452 | [gmp_cv_asm_x86_mmx=yes |
---|
1453 | case $host in |
---|
1454 | *-*-solaris*) |
---|
1455 | if (dis conftest.$OBJEXT >conftest.out) 2>/dev/null; then |
---|
1456 | if grep "0f 6f c1" conftest.out >/dev/null; then |
---|
1457 | gmp_cv_asm_x86_mmx=movq-bug |
---|
1458 | fi |
---|
1459 | else |
---|
1460 | AC_MSG_WARN(["dis" not available to check for "as" movq bug]) |
---|
1461 | fi |
---|
1462 | esac], |
---|
1463 | [gmp_cv_asm_x86_mmx=no])]) |
---|
1464 | |
---|
1465 | case $gmp_cv_asm_x86_mmx in |
---|
1466 | movq-bug) |
---|
1467 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1468 | AC_MSG_WARN([| WARNING WARNING WARNING]) |
---|
1469 | AC_MSG_WARN([| Host CPU has MMX code, but the assembler]) |
---|
1470 | AC_MSG_WARN([| $CCAS $CFLAGS]) |
---|
1471 | AC_MSG_WARN([| has the Solaris 2.6 and 2.7 bug where register to register]) |
---|
1472 | AC_MSG_WARN([| movq operands are reversed.]) |
---|
1473 | AC_MSG_WARN([| Non-MMX replacements will be used.]) |
---|
1474 | AC_MSG_WARN([| This will be an inferior build.]) |
---|
1475 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1476 | ;; |
---|
1477 | no) |
---|
1478 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1479 | AC_MSG_WARN([| WARNING WARNING WARNING]) |
---|
1480 | AC_MSG_WARN([| Host CPU has MMX code, but it can't be assembled by]) |
---|
1481 | AC_MSG_WARN([| $CCAS $CFLAGS]) |
---|
1482 | AC_MSG_WARN([| Non-MMX replacements will be used.]) |
---|
1483 | AC_MSG_WARN([| This will be an inferior build.]) |
---|
1484 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1485 | ;; |
---|
1486 | esac |
---|
1487 | if test "$gmp_cv_asm_x86_mmx" = yes; then |
---|
1488 | ifelse([$1],,:,[$1]) |
---|
1489 | else |
---|
1490 | ifelse([$2],,:,[$2]) |
---|
1491 | fi |
---|
1492 | ]) |
---|
1493 | |
---|
1494 | |
---|
1495 | dnl GMP_ASM_X86_SHLDL_CL |
---|
1496 | dnl -------------------- |
---|
1497 | |
---|
1498 | AC_DEFUN(GMP_ASM_X86_SHLDL_CL, |
---|
1499 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1500 | AC_CACHE_CHECK([if the assembler takes cl with shldl], |
---|
1501 | gmp_cv_asm_x86_shldl_cl, |
---|
1502 | [GMP_TRY_ASSEMBLE( |
---|
1503 | [ $gmp_cv_asm_text |
---|
1504 | shldl %cl, %eax, %ebx], |
---|
1505 | gmp_cv_asm_x86_shldl_cl=yes, |
---|
1506 | gmp_cv_asm_x86_shldl_cl=no) |
---|
1507 | ]) |
---|
1508 | if test "$gmp_cv_asm_x86_shldl_cl" = "yes"; then |
---|
1509 | GMP_DEFINE(WANT_SHLDL_CL,1) |
---|
1510 | else |
---|
1511 | GMP_DEFINE(WANT_SHLDL_CL,0) |
---|
1512 | fi |
---|
1513 | ]) |
---|
1514 | |
---|
1515 | |
---|
1516 | dnl GMP_ASM_X86_SSE2([ACTION-IF-YES][,ACTION-IF-NO]) |
---|
1517 | dnl ------------------------------------------------ |
---|
1518 | dnl Determine whether the assembler supports SSE2 instructions. |
---|
1519 | dnl |
---|
1520 | dnl This macro is wanted before GMP_ASM_TEXT, so ".text" is hard coded |
---|
1521 | dnl here. ".text" is believed to be correct on all x86 systems, certainly |
---|
1522 | dnl it's all GMP_ASM_TEXT gives currently. Actually ".text" probably isn't |
---|
1523 | dnl needed at all, at least for just checking instruction syntax. |
---|
1524 | |
---|
1525 | AC_DEFUN(GMP_ASM_X86_SSE2, |
---|
1526 | [AC_CACHE_CHECK([if the assembler knows about SSE2 instructions], |
---|
1527 | gmp_cv_asm_x86_sse2, |
---|
1528 | [GMP_TRY_ASSEMBLE( |
---|
1529 | [ .text |
---|
1530 | paddq %mm0, %mm1], |
---|
1531 | [gmp_cv_asm_x86_sse2=yes], |
---|
1532 | [gmp_cv_asm_x86_sse2=no]) |
---|
1533 | ]) |
---|
1534 | case $gmp_cv_asm_x86_sse2 in |
---|
1535 | yes) |
---|
1536 | ifelse([$1],,:,[$1]) |
---|
1537 | ;; |
---|
1538 | *) |
---|
1539 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1540 | AC_MSG_WARN([| WARNING WARNING WARNING]) |
---|
1541 | AC_MSG_WARN([| Host CPU has SSE2 code, but it can't be assembled by]) |
---|
1542 | AC_MSG_WARN([| $CCAS $CFLAGS]) |
---|
1543 | AC_MSG_WARN([| Non-SSE2 replacements will be used.]) |
---|
1544 | AC_MSG_WARN([| This will be an inferior build.]) |
---|
1545 | AC_MSG_WARN([+----------------------------------------------------------]) |
---|
1546 | ifelse([$2],,:,[$2]) |
---|
1547 | ;; |
---|
1548 | esac |
---|
1549 | ]) |
---|
1550 | |
---|
1551 | |
---|
1552 | dnl GMP_ASM_X86_MCOUNT |
---|
1553 | dnl ------------------ |
---|
1554 | dnl Find out how to call mcount for profiling on an x86 system. |
---|
1555 | dnl |
---|
1556 | dnl A dummy function is compiled and the ".s" output examined. The pattern |
---|
1557 | dnl matching might be a bit fragile, but should work at least with gcc on |
---|
1558 | dnl sensible systems. Certainly it's better than hard coding a table of |
---|
1559 | dnl conventions. |
---|
1560 | dnl |
---|
1561 | dnl For non-PIC, any ".data" is taken to mean a counter might be passed. |
---|
1562 | dnl It's assumed a movl will set it up, and the right register is taken |
---|
1563 | dnl from that movl. Any movl involving %esp is ignored (a frame pointer |
---|
1564 | dnl setup normally). |
---|
1565 | dnl |
---|
1566 | dnl For PIC, any ".data" is similarly interpreted, but a GOTOFF identifies |
---|
1567 | dnl the line setting up the right register. |
---|
1568 | dnl |
---|
1569 | dnl In both cases a line with "mcount" identifies the call and that line is |
---|
1570 | dnl used literally. |
---|
1571 | dnl |
---|
1572 | dnl On some systems (eg. FreeBSD 3.5) gcc emits ".data" but doesn't use it, |
---|
1573 | dnl so it's not an error to have .data but then not find a register. |
---|
1574 | dnl |
---|
1575 | dnl Variations in mcount conventions on different x86 systems can be found |
---|
1576 | dnl in gcc config/i386. mcount can have a "_" prefix or be .mcount or |
---|
1577 | dnl _mcount_ptr, and for PIC it can be called through a GOT entry, or via |
---|
1578 | dnl the PLT. If a pointer to a counter is required it's passed in %eax or |
---|
1579 | dnl %edx. |
---|
1580 | dnl |
---|
1581 | dnl Flags to specify PIC are taken from $lt_prog_compiler_pic set by |
---|
1582 | dnl AC_PROG_LIBTOOL. |
---|
1583 | dnl |
---|
1584 | dnl Enhancement: Cache the values determined here. But what's the right way |
---|
1585 | dnl to get two variables (mcount_nonpic_reg and mcount_nonpic_call say) set |
---|
1586 | dnl from one block of commands? |
---|
1587 | |
---|
1588 | AC_DEFUN(GMP_ASM_X86_MCOUNT, |
---|
1589 | [AC_REQUIRE([AC_ENABLE_SHARED]) |
---|
1590 | AC_REQUIRE([AC_PROG_LIBTOOL]) |
---|
1591 | AC_MSG_CHECKING([how to call x86 mcount]) |
---|
1592 | cat >conftest.c <<EOF |
---|
1593 | foo(){bar();} |
---|
1594 | EOF |
---|
1595 | |
---|
1596 | if test "$enable_static" = yes; then |
---|
1597 | gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS -S conftest.c 1>&AC_FD_CC" |
---|
1598 | if AC_TRY_EVAL(gmp_asmout_compile); then |
---|
1599 | if grep '\.data' conftest.s >/dev/null; then |
---|
1600 | mcount_nonpic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s` |
---|
1601 | else |
---|
1602 | mcount_nonpic_reg= |
---|
1603 | fi |
---|
1604 | mcount_nonpic_call=`grep 'call.*mcount' conftest.s` |
---|
1605 | if test -z "$mcount_nonpic_call"; then |
---|
1606 | AC_MSG_ERROR([Cannot find mcount call for non-PIC]) |
---|
1607 | fi |
---|
1608 | else |
---|
1609 | AC_MSG_ERROR([Cannot compile test program for non-PIC]) |
---|
1610 | fi |
---|
1611 | fi |
---|
1612 | |
---|
1613 | if test "$enable_shared" = yes; then |
---|
1614 | gmp_asmout_compile="$CC $CFLAGS $CPPFLAGS $lt_prog_compiler_pic -S conftest.c 1>&AC_FD_CC" |
---|
1615 | if AC_TRY_EVAL(gmp_asmout_compile); then |
---|
1616 | if grep '\.data' conftest.s >/dev/null; then |
---|
1617 | case $lt_prog_compiler_pic in |
---|
1618 | *-DDLL_EXPORT*) |
---|
1619 | # Windows DLLs have non-PIC style mcount |
---|
1620 | mcount_pic_reg=`sed -n ['/esp/!s/.*movl.*,\(%[a-z]*\).*$/\1/p'] conftest.s` |
---|
1621 | ;; |
---|
1622 | *) |
---|
1623 | mcount_pic_reg=`sed -n ['s/.*GOTOFF.*,\(%[a-z]*\).*$/\1/p'] conftest.s` |
---|
1624 | ;; |
---|
1625 | esac |
---|
1626 | else |
---|
1627 | mcount_pic_reg= |
---|
1628 | fi |
---|
1629 | mcount_pic_call=`grep 'call.*mcount' conftest.s` |
---|
1630 | if test -z "$mcount_pic_call"; then |
---|
1631 | AC_MSG_ERROR([Cannot find mcount call for PIC]) |
---|
1632 | fi |
---|
1633 | else |
---|
1634 | AC_MSG_ERROR([Cannot compile test program for PIC]) |
---|
1635 | fi |
---|
1636 | fi |
---|
1637 | |
---|
1638 | GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_REG>, <\`$mcount_nonpic_reg'>)"]) |
---|
1639 | GMP_DEFINE_RAW(["define(<MCOUNT_NONPIC_CALL>,<\`$mcount_nonpic_call'>)"]) |
---|
1640 | GMP_DEFINE_RAW(["define(<MCOUNT_PIC_REG>, <\`$mcount_pic_reg'>)"]) |
---|
1641 | GMP_DEFINE_RAW(["define(<MCOUNT_PIC_CALL>, <\`$mcount_pic_call'>)"]) |
---|
1642 | |
---|
1643 | rm -f conftest.* |
---|
1644 | AC_MSG_RESULT([determined]) |
---|
1645 | ]) |
---|
1646 | |
---|
1647 | |
---|
1648 | dnl GMP_ASM_M68K_INSTRUCTION |
---|
1649 | dnl ------------------------ |
---|
1650 | dnl Not sure if ".l" and "%" are independent settings, but it doesn't hurt |
---|
1651 | dnl to try all four possibilities. Note that the % ones must be first, so |
---|
1652 | dnl "d0" won't be interpreted as a label. |
---|
1653 | dnl |
---|
1654 | dnl gas 1.92.3 on NetBSD 1.4 needs to be tested with a two operand |
---|
1655 | dnl instruction. It takes registers without "%", but a single operand |
---|
1656 | dnl "clrl %d0" only gives a warning, not an error. |
---|
1657 | |
---|
1658 | AC_DEFUN(GMP_ASM_M68K_INSTRUCTION, |
---|
1659 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1660 | AC_CACHE_CHECK([assembler instruction and register style], |
---|
1661 | gmp_cv_asm_m68k_instruction, |
---|
1662 | [gmp_cv_asm_m68k_instruction=unknown |
---|
1663 | for i in "addl %d0,%d1" "add.l %d0,%d1" "addl d0,d1" "add.l d0,d1"; do |
---|
1664 | GMP_TRY_ASSEMBLE( |
---|
1665 | [ $gmp_cv_asm_text |
---|
1666 | $i], |
---|
1667 | [gmp_cv_asm_m68k_instruction=$i |
---|
1668 | rm -f conftest* |
---|
1669 | break]) |
---|
1670 | done |
---|
1671 | ]) |
---|
1672 | case $gmp_cv_asm_m68k_instruction in |
---|
1673 | "addl d0,d1") want_dot_size=no; want_register_percent=no ;; |
---|
1674 | "addl %d0,%d1") want_dot_size=no; want_register_percent=yes ;; |
---|
1675 | "add.l d0,d1") want_dot_size=yes; want_register_percent=no ;; |
---|
1676 | "add.l %d0,%d1") want_dot_size=yes; want_register_percent=yes ;; |
---|
1677 | *) AC_MSG_ERROR([cannot determine assembler instruction and register style]) ;; |
---|
1678 | esac |
---|
1679 | GMP_DEFINE_RAW(["define(<WANT_REGISTER_PERCENT>, <\`$want_register_percent'>)"]) |
---|
1680 | GMP_DEFINE_RAW(["define(<WANT_DOT_SIZE>, <\`$want_dot_size'>)"]) |
---|
1681 | ]) |
---|
1682 | |
---|
1683 | |
---|
1684 | dnl GMP_ASM_M68K_ADDRESSING |
---|
1685 | dnl ----------------------- |
---|
1686 | |
---|
1687 | AC_DEFUN(GMP_ASM_M68K_ADDRESSING, |
---|
1688 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1689 | AC_REQUIRE([GMP_ASM_M68K_INSTRUCTION]) |
---|
1690 | AC_CACHE_CHECK([assembler addressing style], |
---|
1691 | gmp_cv_asm_m68k_addressing, |
---|
1692 | [case $gmp_cv_asm_m68k_instruction in |
---|
1693 | addl*) movel=movel ;; |
---|
1694 | add.l*) movel=move.l ;; |
---|
1695 | *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;; |
---|
1696 | esac |
---|
1697 | case $gmp_cv_asm_m68k_instruction in |
---|
1698 | *"%d0,%d1") dreg=%d0; areg=%a0 ;; |
---|
1699 | *"d0,d1") dreg=d0; areg=a0 ;; |
---|
1700 | *) AC_MSG_ERROR([oops, unrecognised gmp_cv_asm_m68k_instruction]) ;; |
---|
1701 | esac |
---|
1702 | GMP_TRY_ASSEMBLE( |
---|
1703 | [ $gmp_cv_asm_text |
---|
1704 | $movel $dreg, $areg@-], |
---|
1705 | [gmp_cv_asm_m68k_addressing=mit], |
---|
1706 | [GMP_TRY_ASSEMBLE( |
---|
1707 | [ $gmp_cv_asm_text |
---|
1708 | $movel $dreg, -($areg)], |
---|
1709 | [gmp_cv_asm_m68k_addressing=motorola], |
---|
1710 | [AC_MSG_ERROR([cannot determine assembler addressing style])])]) |
---|
1711 | ]) |
---|
1712 | GMP_DEFINE_RAW(["define(<WANT_ADDRESSING>, <\`$gmp_cv_asm_m68k_addressing'>)"]) |
---|
1713 | ]) |
---|
1714 | |
---|
1715 | |
---|
1716 | dnl GMP_ASM_M68K_BRANCHES |
---|
1717 | dnl --------------------- |
---|
1718 | dnl "bra" is the standard branch instruction. "jra" or "jbra" are |
---|
1719 | dnl preferred where available, since on gas for instance they give a |
---|
1720 | dnl displacement only as big as it needs to be, whereas "bra" is always |
---|
1721 | dnl 16-bits. This applies to the conditional branches "bcc" etc too. |
---|
1722 | dnl However "dbcc" etc on gas are already only as big as they need to be. |
---|
1723 | |
---|
1724 | AC_DEFUN(GMP_ASM_M68K_BRANCHES, |
---|
1725 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1726 | AC_CACHE_CHECK([assembler shortest branches], |
---|
1727 | gmp_cv_asm_m68k_branches, |
---|
1728 | [gmp_cv_asm_m68k_branches=unknown |
---|
1729 | for i in jra jbra bra; do |
---|
1730 | GMP_TRY_ASSEMBLE( |
---|
1731 | [ $gmp_cv_asm_text |
---|
1732 | foo$gmp_cv_asm_label_suffix |
---|
1733 | $i foo], |
---|
1734 | [gmp_cv_asm_m68k_branches=$i |
---|
1735 | rm -f conftest* |
---|
1736 | break]) |
---|
1737 | done |
---|
1738 | ]) |
---|
1739 | if test "$gmp_cv_asm_m68k_branches" = unknown; then |
---|
1740 | AC_MSG_ERROR([cannot determine assembler branching style]) |
---|
1741 | fi |
---|
1742 | GMP_DEFINE_RAW(["define(<WANT_BRANCHES>, <\`$gmp_cv_asm_m68k_branches'>)"]) |
---|
1743 | ]) |
---|
1744 | |
---|
1745 | |
---|
1746 | dnl GMP_ASM_POWERPC_R_REGISTERS |
---|
1747 | dnl --------------------------- |
---|
1748 | dnl Determine whether the assembler takes powerpc registers with an "r" as |
---|
1749 | dnl in "r6", or as plain "6". The latter is standard, but NeXT, Rhapsody, |
---|
1750 | dnl and MacOS-X require the "r" forms. |
---|
1751 | dnl |
---|
1752 | dnl See also mpn/powerpc32/powerpc-defs.m4 which uses the result of this |
---|
1753 | dnl test. |
---|
1754 | |
---|
1755 | AC_DEFUN(GMP_ASM_POWERPC_R_REGISTERS, |
---|
1756 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1757 | AC_CACHE_CHECK([if the assembler needs r on registers], |
---|
1758 | gmp_cv_asm_powerpc_r_registers, |
---|
1759 | [GMP_TRY_ASSEMBLE( |
---|
1760 | [ $gmp_cv_asm_text |
---|
1761 | mtctr 6], |
---|
1762 | [gmp_cv_asm_powerpc_r_registers=no], |
---|
1763 | [GMP_TRY_ASSEMBLE( |
---|
1764 | [ $gmp_cv_asm_text |
---|
1765 | mtctr r6], |
---|
1766 | [gmp_cv_asm_powerpc_r_registers=yes], |
---|
1767 | [AC_MSG_ERROR([neither "mtctr 6" nor "mtctr r6" works])])])]) |
---|
1768 | |
---|
1769 | GMP_DEFINE_RAW(["define(<WANT_R_REGISTERS>,<$gmp_cv_asm_powerpc_r_registers>)"]) |
---|
1770 | ]) |
---|
1771 | |
---|
1772 | |
---|
1773 | dnl GMP_ASM_SPARC_REGISTER |
---|
1774 | dnl ---------------------- |
---|
1775 | dnl Determine whether the assembler accepts the ".register" directive. |
---|
1776 | dnl Old versions of solaris "as" don't. |
---|
1777 | dnl |
---|
1778 | dnl See also mpn/sparc32/sparc-defs.m4 which uses the result of this test. |
---|
1779 | |
---|
1780 | AC_DEFUN(GMP_ASM_SPARC_REGISTER, |
---|
1781 | [AC_REQUIRE([GMP_ASM_TEXT]) |
---|
1782 | AC_CACHE_CHECK([if the assembler accepts ".register"], |
---|
1783 | gmp_cv_asm_sparc_register, |
---|
1784 | [GMP_TRY_ASSEMBLE( |
---|
1785 | [ $gmp_cv_asm_text |
---|
1786 | .register %g2,#scratch |
---|
1787 | ], |
---|
1788 | [gmp_cv_asm_sparc_register=yes], |
---|
1789 | [gmp_cv_asm_sparc_register=no])]) |
---|
1790 | |
---|
1791 | GMP_DEFINE_RAW(["define(<HAVE_REGISTER>,<$gmp_cv_asm_sparc_register>)"]) |
---|
1792 | ]) |
---|
1793 | |
---|
1794 | |
---|
1795 | dnl GMP_C_ATTRIBUTE_CONST |
---|
1796 | dnl --------------------- |
---|
1797 | |
---|
1798 | AC_DEFUN(GMP_C_ATTRIBUTE_CONST, |
---|
1799 | [AC_CACHE_CHECK([whether gcc __attribute__ ((const)) works], |
---|
1800 | gmp_cv_c_attribute_const, |
---|
1801 | [AC_TRY_COMPILE([int foo (int x) __attribute__ ((const));], , |
---|
1802 | gmp_cv_c_attribute_const=yes, gmp_cv_c_attribute_const=no) |
---|
1803 | ]) |
---|
1804 | if test $gmp_cv_c_attribute_const = yes; then |
---|
1805 | AC_DEFINE(HAVE_ATTRIBUTE_CONST, 1, |
---|
1806 | [Define if the compiler accepts gcc style __attribute__ ((const))]) |
---|
1807 | fi |
---|
1808 | ]) |
---|
1809 | |
---|
1810 | |
---|
1811 | dnl GMP_C_ATTRIBUTE_MALLOC |
---|
1812 | dnl ---------------------- |
---|
1813 | dnl gcc 2.95.x accepts __attribute__ ((malloc)) but with a warning that |
---|
1814 | dnl it's ignored. Pretend it doesn't exist in this case, to avoid that |
---|
1815 | dnl warning. |
---|
1816 | |
---|
1817 | AC_DEFUN(GMP_C_ATTRIBUTE_MALLOC, |
---|
1818 | [AC_CACHE_CHECK([whether gcc __attribute__ ((malloc)) works], |
---|
1819 | gmp_cv_c_attribute_malloc, |
---|
1820 | [cat >conftest.c <<EOF |
---|
1821 | void *foo (int x) __attribute__ ((malloc)); |
---|
1822 | EOF |
---|
1823 | gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >conftest.out 2>&1" |
---|
1824 | if AC_TRY_EVAL(gmp_compile); then |
---|
1825 | if grep "attribute directive ignored" conftest.out >/dev/null; then |
---|
1826 | gmp_cv_c_attribute_malloc=no |
---|
1827 | else |
---|
1828 | gmp_cv_c_attribute_malloc=yes |
---|
1829 | fi |
---|
1830 | else |
---|
1831 | gmp_cv_c_attribute_malloc=no |
---|
1832 | fi |
---|
1833 | cat conftest.out >&AC_FD_CC |
---|
1834 | rm -f conftest* |
---|
1835 | ]) |
---|
1836 | if test $gmp_cv_c_attribute_malloc = yes; then |
---|
1837 | AC_DEFINE(HAVE_ATTRIBUTE_MALLOC, 1, |
---|
1838 | [Define if the compiler accepts gcc style __attribute__ ((malloc))]) |
---|
1839 | fi |
---|
1840 | ]) |
---|
1841 | |
---|
1842 | |
---|
1843 | dnl GMP_C_ATTRIBUTE_MODE |
---|
1844 | dnl -------------------- |
---|
1845 | dnl Introduced in gcc 2.2, but perhaps not in all Apple derived versions. |
---|
1846 | |
---|
1847 | AC_DEFUN(GMP_C_ATTRIBUTE_MODE, |
---|
1848 | [AC_CACHE_CHECK([whether gcc __attribute__ ((mode (XX))) works], |
---|
1849 | gmp_cv_c_attribute_mode, |
---|
1850 | [AC_TRY_COMPILE([typedef int SItype __attribute__ ((mode (SI)));], , |
---|
1851 | gmp_cv_c_attribute_mode=yes, gmp_cv_c_attribute_mode=no) |
---|
1852 | ]) |
---|
1853 | if test $gmp_cv_c_attribute_mode = yes; then |
---|
1854 | AC_DEFINE(HAVE_ATTRIBUTE_MODE, 1, |
---|
1855 | [Define if the compiler accepts gcc style __attribute__ ((mode (XX)))]) |
---|
1856 | fi |
---|
1857 | ]) |
---|
1858 | |
---|
1859 | |
---|
1860 | dnl GMP_C_ATTRIBUTE_NORETURN |
---|
1861 | dnl ------------------------ |
---|
1862 | |
---|
1863 | AC_DEFUN(GMP_C_ATTRIBUTE_NORETURN, |
---|
1864 | [AC_CACHE_CHECK([whether gcc __attribute__ ((noreturn)) works], |
---|
1865 | gmp_cv_c_attribute_noreturn, |
---|
1866 | [AC_TRY_COMPILE([void foo (int x) __attribute__ ((noreturn));], , |
---|
1867 | gmp_cv_c_attribute_noreturn=yes, gmp_cv_c_attribute_noreturn=no) |
---|
1868 | ]) |
---|
1869 | if test $gmp_cv_c_attribute_noreturn = yes; then |
---|
1870 | AC_DEFINE(HAVE_ATTRIBUTE_NORETURN, 1, |
---|
1871 | [Define if the compiler accepts gcc style __attribute__ ((noreturn))]) |
---|
1872 | fi |
---|
1873 | ]) |
---|
1874 | |
---|
1875 | |
---|
1876 | dnl GMP_C_DOUBLE_FORMAT |
---|
1877 | dnl ------------------- |
---|
1878 | dnl Determine the floating point format. |
---|
1879 | dnl |
---|
1880 | dnl The object file is grepped, in order to work when cross compiling. A |
---|
1881 | dnl start and end sequence is included to avoid false matches, and |
---|
1882 | dnl allowance is made for the desired data crossing an "od -b" line |
---|
1883 | dnl boundary. The test number is a small integer so it should appear |
---|
1884 | dnl exactly, no rounding or truncation etc. |
---|
1885 | dnl |
---|
1886 | dnl "od -b", incidentally, is supported even by Unix V7, and the awk script |
---|
1887 | dnl used doesn't have functions or anything, so even an "old" awk should |
---|
1888 | dnl suffice. |
---|
1889 | |
---|
1890 | AC_DEFUN(GMP_C_DOUBLE_FORMAT, |
---|
1891 | [AC_REQUIRE([AC_PROG_CC]) |
---|
1892 | AC_REQUIRE([AC_PROG_AWK]) |
---|
1893 | AC_CACHE_CHECK([format of `double' floating point], |
---|
1894 | gmp_cv_c_double_format, |
---|
1895 | [gmp_cv_c_double_format=unknown |
---|
1896 | cat >conftest.c <<\EOF |
---|
1897 | [struct { |
---|
1898 | char before[8]; |
---|
1899 | double x; |
---|
1900 | char after[8]; |
---|
1901 | } foo = { |
---|
1902 | { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, |
---|
1903 | -123456789.0, |
---|
1904 | { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }, |
---|
1905 | };] |
---|
1906 | EOF |
---|
1907 | gmp_compile="$CC $CFLAGS $CPPFLAGS -c conftest.c >&AC_FD_CC 2>&1" |
---|
1908 | if AC_TRY_EVAL(gmp_compile); then |
---|
1909 | cat >conftest.awk <<\EOF |
---|
1910 | [ |
---|
1911 | BEGIN { |
---|
1912 | found = 0 |
---|
1913 | } |
---|
1914 | |
---|
1915 | { |
---|
1916 | for (f = 2; f <= NF; f++) |
---|
1917 | { |
---|
1918 | for (i = 0; i < 23; i++) |
---|
1919 | got[i] = got[i+1]; |
---|
1920 | got[23] = $f; |
---|
1921 | |
---|
1922 | # match the special begin and end sequences |
---|
1923 | if (got[0] != "001") continue |
---|
1924 | if (got[1] != "043") continue |
---|
1925 | if (got[2] != "105") continue |
---|
1926 | if (got[3] != "147") continue |
---|
1927 | if (got[4] != "211") continue |
---|
1928 | if (got[5] != "253") continue |
---|
1929 | if (got[6] != "315") continue |
---|
1930 | if (got[7] != "357") continue |
---|
1931 | if (got[16] != "376") continue |
---|
1932 | if (got[17] != "334") continue |
---|
1933 | if (got[18] != "272") continue |
---|
1934 | if (got[19] != "230") continue |
---|
1935 | if (got[20] != "166") continue |
---|
1936 | if (got[21] != "124") continue |
---|
1937 | if (got[22] != "062") continue |
---|
1938 | if (got[23] != "020") continue |
---|
1939 | |
---|
1940 | saw = " (" got[8] " " got[9] " " got[10] " " got[11] " " got[12] " " got[13] " " got[14] " " got[15] ")" |
---|
1941 | |
---|
1942 | if (got[8] == "000" && \ |
---|
1943 | got[9] == "000" && \ |
---|
1944 | got[10] == "000" && \ |
---|
1945 | got[11] == "124" && \ |
---|
1946 | got[12] == "064" && \ |
---|
1947 | got[13] == "157" && \ |
---|
1948 | got[14] == "235" && \ |
---|
1949 | got[15] == "301") |
---|
1950 | { |
---|
1951 | print "IEEE little endian" |
---|
1952 | found = 1 |
---|
1953 | exit |
---|
1954 | } |
---|
1955 | |
---|
1956 | # ARM style little endian but with the two 4-byte halves swapped |
---|
1957 | if (got[8] == "064" && \ |
---|
1958 | got[9] == "157" && \ |
---|
1959 | got[10] == "235" && \ |
---|
1960 | got[11] == "301" && \ |
---|
1961 | got[12] == "000" && \ |
---|
1962 | got[13] == "000" && \ |
---|
1963 | got[14] == "000" && \ |
---|
1964 | got[15] == "124") |
---|
1965 | { |
---|
1966 | print "IEEE little endian, swapped halves" |
---|
1967 | found = 1 |
---|
1968 | exit |
---|
1969 | } |
---|
1970 | |
---|
1971 | if (got[8] == "301" && \ |
---|
1972 | got[9] == "235" && \ |
---|
1973 | got[10] == "157" && \ |
---|
1974 | got[11] == "064" && \ |
---|
1975 | got[12] == "124" && \ |
---|
1976 | got[13] == "000" && \ |
---|
1977 | got[14] == "000" && \ |
---|
1978 | got[15] == "000") |
---|
1979 | { |
---|
1980 | print "IEEE big endian" |
---|
1981 | found = 1 |
---|
1982 | exit |
---|
1983 | } |
---|
1984 | |
---|
1985 | if (got[8] == "353" && \ |
---|
1986 | got[9] == "315" && \ |
---|
1987 | got[10] == "242" && \ |
---|
1988 | got[11] == "171" && \ |
---|
1989 | got[12] == "000" && \ |
---|
1990 | got[13] == "240" && \ |
---|
1991 | got[14] == "000" && \ |
---|
1992 | got[15] == "000") |
---|
1993 | { |
---|
1994 | print "VAX D" |
---|
1995 | found = 1 |
---|
1996 | exit |
---|
1997 | } |
---|
1998 | |
---|
1999 | if (got[8] == "275" && \ |
---|
2000 | got[9] == "301" && \ |
---|
2001 | got[10] == "064" && \ |
---|
2002 | got[11] == "157" && \ |
---|
2003 | got[12] == "000" && \ |
---|
2004 | got[13] == "124" && \ |
---|
2005 | got[14] == "000" && \ |
---|
2006 | got[15] == "000") |
---|
2007 | { |
---|
2008 | print "VAX G" |
---|
2009 | found = 1 |
---|
2010 | exit |
---|
2011 | } |
---|
2012 | |
---|
2013 | if (got[8] == "300" && \ |
---|
2014 | got[9] == "033" && \ |
---|
2015 | got[10] == "353" && \ |
---|
2016 | got[11] == "171" && \ |
---|
2017 | got[12] == "242" && \ |
---|
2018 | got[13] == "240" && \ |
---|
2019 | got[14] == "000" && \ |
---|
2020 | got[15] == "000") |
---|
2021 | { |
---|
2022 | print "Cray CFP" |
---|
2023 | found = 1 |
---|
2024 | exit |
---|
2025 | } |
---|
2026 | } |
---|
2027 | } |
---|
2028 | |
---|
2029 | END { |
---|
2030 | if (! found) |
---|
2031 | print "unknown", saw |
---|
2032 | } |
---|
2033 | ] |
---|
2034 | EOF |
---|
2035 | gmp_cv_c_double_format=`od -b conftest.$OBJEXT | $AWK -f conftest.awk` |
---|
2036 | case $gmp_cv_c_double_format in |
---|
2037 | unknown*) |
---|
2038 | echo "cannot match anything, conftest.$OBJEXT contains" >&AC_FD_CC |
---|
2039 | od -b conftest.$OBJEXT >&AC_FD_CC |
---|
2040 | ;; |
---|
2041 | esac |
---|
2042 | else |
---|
2043 | AC_MSG_WARN([oops, cannot compile test program]) |
---|
2044 | fi |
---|
2045 | ]) |
---|
2046 | |
---|
2047 | AH_VERBATIM([HAVE_DOUBLE], |
---|
2048 | [/* Define one (and only one) of the following for the format of a `double'. |
---|
2049 | If your format is not among these choices, or you don't know what it is, |
---|
2050 | then leave all of them undefined. |
---|
2051 | "IEEE_LITTLE_SWAPPED" means little endian, but with the two 4-byte halves |
---|
2052 | swapped, as used by ARM CPUs in little endian mode. */ |
---|
2053 | #undef HAVE_DOUBLE_IEEE_BIG_ENDIAN |
---|
2054 | #undef HAVE_DOUBLE_IEEE_LITTLE_ENDIAN |
---|
2055 | #undef HAVE_DOUBLE_IEEE_LITTLE_SWAPPED |
---|
2056 | #undef HAVE_DOUBLE_VAX_D |
---|
2057 | #undef HAVE_DOUBLE_VAX_G |
---|
2058 | #undef HAVE_DOUBLE_CRAY_CFP]) |
---|
2059 | |
---|
2060 | case $gmp_cv_c_double_format in |
---|
2061 | "IEEE big endian") |
---|
2062 | AC_DEFINE(HAVE_DOUBLE_IEEE_BIG_ENDIAN, 1) ;; |
---|
2063 | "IEEE little endian") |
---|
2064 | AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_ENDIAN, 1) ;; |
---|
2065 | "IEEE little endian, swapped halves") |
---|
2066 | AC_DEFINE(HAVE_DOUBLE_IEEE_LITTLE_SWAPPED, 1) ;; |
---|
2067 | "VAX D") |
---|
2068 | AC_DEFINE(HAVE_DOUBLE_VAX_D, 1) ;; |
---|
2069 | "VAX G") |
---|
2070 | AC_DEFINE(HAVE_DOUBLE_VAX_G, 1) ;; |
---|
2071 | "Cray CFP") |
---|
2072 | AC_DEFINE(HAVE_DOUBLE_CRAY_CFP, 1) ;; |
---|
2073 | unknown*) |
---|
2074 | ;; |
---|
2075 | *) |
---|
2076 | AC_MSG_WARN([oops, unrecognised float format: $gmp_cv_c_double_format]) |
---|
2077 | ;; |
---|
2078 | esac |
---|
2079 | ]) |
---|
2080 | |
---|
2081 | |
---|
2082 | dnl GMP_C_INLINE |
---|
2083 | dnl ------------ |
---|
2084 | dnl Establish an "inline" keyword, if possible. |
---|
2085 | dnl |
---|
2086 | dnl This is the same as AC_C_INLINE, but introduing a typedef into the test |
---|
2087 | dnl program. Some versions of HP C succeed when the return value is a |
---|
2088 | dnl plain builtin type like "int", but fail when it's a typedef. |
---|
2089 | dnl |
---|
2090 | dnl FIXME: Hopefully autoconf will do this extra itself one day. |
---|
2091 | |
---|
2092 | AC_DEFUN(GMP_C_INLINE, |
---|
2093 | [AC_CACHE_CHECK([for inline], gmp_cv_c_inline, |
---|
2094 | [gmp_cv_c_inline=no |
---|
2095 | for i in inline __inline__ __inline; do |
---|
2096 | AC_TRY_COMPILE( |
---|
2097 | [#ifndef __cplusplus |
---|
2098 | typedef int foo_t; |
---|
2099 | $i foo_t func1 () { return 0; } |
---|
2100 | static $i foo_t func2 () { return 0; } |
---|
2101 | #endif], , |
---|
2102 | [gmp_cv_c_inline=$i |
---|
2103 | break]) |
---|
2104 | done |
---|
2105 | if test $gmp_cv_c_inline = inline; then |
---|
2106 | gmp_cv_c_inline=yes |
---|
2107 | fi |
---|
2108 | ]) |
---|
2109 | case $gmp_cv_c_inline in |
---|
2110 | inline | yes) ;; |
---|
2111 | no) AC_DEFINE(inline,, |
---|
2112 | [Define as `__inline' if that's what the C compiler calls it, |
---|
2113 | or to nothing if it is not supported.]) ;; |
---|
2114 | *) AC_DEFINE_UNQUOTED(inline, $gmp_cv_c_inline) ;; |
---|
2115 | esac |
---|
2116 | ]) |
---|
2117 | |
---|
2118 | |
---|
2119 | dnl GMP_C_RESTRICT |
---|
2120 | dnl -------------- |
---|
2121 | dnl Establish a "restrict" keyword, if possible, like AC_C_INLINE. |
---|
2122 | dnl |
---|
2123 | dnl If restrict works already, then do nothing. Otherwise AC_DEFINE it to |
---|
2124 | dnl __restrict__ or __restrict if they work, or to empty otherwise. |
---|
2125 | dnl |
---|
2126 | dnl "restrict" is in C99. GCC 2.95 and up has it in c99 mode, and also as |
---|
2127 | dnl __restrict__ and __restrict in all modes. |
---|
2128 | dnl |
---|
2129 | dnl "yes" is used in the cache variable if plain "restrict" works, to make |
---|
2130 | dnl the configure message look nicer. |
---|
2131 | |
---|
2132 | AC_DEFUN(GMP_C_RESTRICT, |
---|
2133 | [AC_CACHE_CHECK([for restrict], gmp_cv_c_restrict, |
---|
2134 | [gmp_cv_c_restrict=no |
---|
2135 | for r in restrict __restrict__ __restrict; do |
---|
2136 | AC_TRY_COMPILE(, [char * $r foo;], |
---|
2137 | [gmp_cv_c_restrict=$r |
---|
2138 | break]) |
---|
2139 | done |
---|
2140 | if test $gmp_cv_c_restrict = restrict; then |
---|
2141 | gmp_cv_c_restrict=yes |
---|
2142 | fi |
---|
2143 | ]) |
---|
2144 | case $gmp_cv_c_restrict in |
---|
2145 | restrict | yes) ;; |
---|
2146 | no) AC_DEFINE(restrict,, |
---|
2147 | [Define as `__restrict' if that's what the C compiler calls it, |
---|
2148 | or to nothing if it is not supported.]) ;; |
---|
2149 | *) AC_DEFINE_UNQUOTED(restrict, $gmp_cv_c_restrict) ;; |
---|
2150 | esac |
---|
2151 | ]) |
---|
2152 | |
---|
2153 | |
---|
2154 | dnl GMP_C_SIZES |
---|
2155 | dnl ----------- |
---|
2156 | dnl Determine some sizes, if not alredy provided by gmp-mparam.h. |
---|
2157 | dnl $gmp_mparam_source is the selected gmp-mparam.h. |
---|
2158 | dnl |
---|
2159 | dnl BITS_PER_MP_LIMB, BYTES_PER_MP_LIMB and BITS_PER_ULONG are needed at |
---|
2160 | dnl preprocessing time when building the library, for use in #if |
---|
2161 | dnl conditionals. |
---|
2162 | dnl |
---|
2163 | dnl BITS_PER_MP_LIMB is also wanted as a plain constant for some macros in |
---|
2164 | dnl the generated gmp.h, and is instantiated as BITS_PER_MP_LIMB. |
---|
2165 | dnl |
---|
2166 | dnl If some assembler code depends on a particular type size it's probably |
---|
2167 | dnl best to put explicit #defines for these in gmp-mparam.h. That way if |
---|
2168 | dnl strange compiler options change the size then a mismatch will be |
---|
2169 | dnl detected by t-constants.c rather than only by the code crashing or |
---|
2170 | dnl giving wrong results. |
---|
2171 | dnl |
---|
2172 | dnl None of the assembler code depends on BITS_PER_ULONG currently, so it's |
---|
2173 | dnl just as easy to let configure find its size as to put explicit values. |
---|
2174 | dnl |
---|
2175 | dnl The tests here assume bits=8*sizeof, but that might not be universally |
---|
2176 | dnl true. It'd be better to probe for how many bits seem to work, like |
---|
2177 | dnl t-constants does. But all currently supported systems have limbs and |
---|
2178 | dnl ulongs with bits=8*sizeof, so it's academic. Strange systems can |
---|
2179 | dnl always have the right values put in gmp-mparam.h explicitly. |
---|
2180 | |
---|
2181 | AC_DEFUN(GMP_C_SIZES, |
---|
2182 | [BITS_PER_MP_LIMB=[`sed -n 's/^#define BITS_PER_MP_LIMB[ ][ ]*\([0-9]*\).*$/\1/p' $gmp_mparam_source`] |
---|
2183 | if test -n "$BITS_PER_MP_LIMB" \ |
---|
2184 | && grep "^#define BYTES_PER_MP_LIMB" $gmp_mparam_source >/dev/null; then : ; |
---|
2185 | else |
---|
2186 | AC_CHECK_SIZEOF(mp_limb_t,, |
---|
2187 | [#include <stdio.h>] |
---|
2188 | GMP_INCLUDE_GMP_H) |
---|
2189 | if test "$ac_cv_sizeof_mp_limb_t" = 0; then |
---|
2190 | AC_MSG_ERROR([some sort of compiler problem, mp_limb_t doesn't seem to work]) |
---|
2191 | fi |
---|
2192 | if test -z "$BITS_PER_MP_LIMB"; then |
---|
2193 | BITS_PER_MP_LIMB="(8*$ac_cv_sizeof_mp_limb_t)" |
---|
2194 | fi |
---|
2195 | if grep "^#define BYTES_PER_MP_LIMB" $gmp_mparam_source >/dev/null; then : ; |
---|
2196 | else |
---|
2197 | AC_DEFINE_UNQUOTED(BYTES_PER_MP_LIMB, $ac_cv_sizeof_mp_limb_t, |
---|
2198 | [bytes per mp_limb_t, if not in gmp-mparam.h]) |
---|
2199 | fi |
---|
2200 | fi |
---|
2201 | AC_SUBST(BITS_PER_MP_LIMB) |
---|
2202 | define([GMP_INCLUDE_GMP_H_BITS_PER_MP_LIMB], |
---|
2203 | [[#define __GMP_BITS_PER_MP_LIMB $BITS_PER_MP_LIMB |
---|
2204 | #define GMP_LIMB_BITS $BITS_PER_MP_LIMB]]) |
---|
2205 | |
---|
2206 | if grep "^#define BITS_PER_ULONG" $gmp_mparam_source >/dev/null; then : ; |
---|
2207 | else |
---|
2208 | case $limb_chosen in |
---|
2209 | longlong) |
---|
2210 | AC_CHECK_SIZEOF(unsigned long) |
---|
2211 | AC_DEFINE_UNQUOTED(BITS_PER_ULONG, (8 * $ac_cv_sizeof_unsigned_long), |
---|
2212 | [bits per unsigned long, if not in gmp-mparam.h]) |
---|
2213 | ;; |
---|
2214 | *) |
---|
2215 | # Copy the limb size when a limb is a ulong |
---|
2216 | AC_DEFINE(BITS_PER_ULONG, BITS_PER_MP_LIMB) |
---|
2217 | ;; |
---|
2218 | esac |
---|
2219 | fi |
---|
2220 | ]) |
---|
2221 | |
---|
2222 | |
---|
2223 | dnl GMP_C_STDARG |
---|
2224 | dnl ------------ |
---|
2225 | dnl Test whether to use <stdarg.h> or <varargs.h>. |
---|
2226 | dnl |
---|
2227 | dnl Notice the AC_DEFINE here is HAVE_STDARG to avoid clashing with |
---|
2228 | dnl HAVE_STDARG_H which could arise from AC_CHECK_HEADERS. |
---|
2229 | dnl |
---|
2230 | dnl This test might be slight overkill, after all there's really only going |
---|
2231 | dnl to be ANSI or K&R and the two can be differentiated by AC_PROG_CC_STDC |
---|
2232 | dnl or very likely by the setups for _PROTO in gmp.h. On the other hand |
---|
2233 | dnl this test is nice and direct, being what we're going to actually use. |
---|
2234 | |
---|
2235 | AC_DEFUN(GMP_C_STDARG, |
---|
2236 | [AC_CACHE_CHECK([whether <stdarg.h> exists and works], |
---|
2237 | gmp_cv_c_stdarg, |
---|
2238 | [AC_TRY_COMPILE( |
---|
2239 | [#include <stdarg.h> |
---|
2240 | int foo (int x, ...) |
---|
2241 | { |
---|
2242 | va_list ap; |
---|
2243 | int y; |
---|
2244 | va_start (ap, x); |
---|
2245 | y = va_arg (ap, int); |
---|
2246 | va_end (ap); |
---|
2247 | return y; |
---|
2248 | }],, |
---|
2249 | gmp_cv_c_stdarg=yes, gmp_cv_c_stdarg=no) |
---|
2250 | ]) |
---|
2251 | if test $gmp_cv_c_stdarg = yes; then |
---|
2252 | AC_DEFINE(HAVE_STDARG, 1, [Define if <stdarg.h> exists and works]) |
---|
2253 | fi |
---|
2254 | ]) |
---|
2255 | |
---|
2256 | |
---|
2257 | dnl GMP_FUNC_ALLOCA |
---|
2258 | dnl --------------- |
---|
2259 | dnl Determine whether "alloca" is available. This is AC_FUNC_ALLOCA from |
---|
2260 | dnl autoconf, but changed so it doesn't use alloca.c if alloca() isn't |
---|
2261 | dnl available, and also to use gmp-impl.h for the conditionals detecting |
---|
2262 | dnl compiler builtin alloca's. |
---|
2263 | |
---|
2264 | AC_DEFUN(GMP_FUNC_ALLOCA, |
---|
2265 | [AC_REQUIRE([GMP_HEADER_ALLOCA]) |
---|
2266 | AC_CACHE_CHECK([for alloca (via gmp-impl.h)], |
---|
2267 | gmp_cv_func_alloca, |
---|
2268 | [AC_TRY_LINK( |
---|
2269 | GMP_INCLUDE_GMP_H |
---|
2270 | [#include "$srcdir/gmp-impl.h" |
---|
2271 | ], |
---|
2272 | [char *p = (char *) alloca (1);], |
---|
2273 | gmp_cv_func_alloca=yes, |
---|
2274 | gmp_cv_func_alloca=no)]) |
---|
2275 | if test $gmp_cv_func_alloca = yes; then |
---|
2276 | AC_DEFINE(HAVE_ALLOCA, 1, |
---|
2277 | [Define if alloca() works (via gmp-impl.h).]) |
---|
2278 | fi |
---|
2279 | ]) |
---|
2280 | |
---|
2281 | AC_DEFUN(GMP_HEADER_ALLOCA, |
---|
2282 | [# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works |
---|
2283 | # for constant arguments. Useless! |
---|
2284 | AC_CACHE_CHECK([for working alloca.h], |
---|
2285 | gmp_cv_header_alloca, |
---|
2286 | [AC_TRY_LINK([#include <alloca.h>], |
---|
2287 | [char *p = (char *) alloca (2 * sizeof (int));], |
---|
2288 | gmp_cv_header_alloca=yes, |
---|
2289 | gmp_cv_header_alloca=no)]) |
---|
2290 | if test $gmp_cv_header_alloca = yes; then |
---|
2291 | AC_DEFINE(HAVE_ALLOCA_H, 1, |
---|
2292 | [Define if you have <alloca.h> and it should be used (not on Ultrix).]) |
---|
2293 | fi |
---|
2294 | ]) |
---|
2295 | |
---|
2296 | |
---|
2297 | dnl GMP_OPTION_ALLOCA |
---|
2298 | dnl ----------------- |
---|
2299 | dnl Decide what to do about --enable-alloca from the user. |
---|
2300 | dnl This is a macro so it can require GMP_FUNC_ALLOCA. |
---|
2301 | |
---|
2302 | AC_DEFUN(GMP_OPTION_ALLOCA, |
---|
2303 | [AC_REQUIRE([GMP_FUNC_ALLOCA]) |
---|
2304 | AC_CACHE_CHECK([how to allocate temporary memory], |
---|
2305 | gmp_cv_option_alloca, |
---|
2306 | [case $enable_alloca in |
---|
2307 | yes) |
---|
2308 | gmp_cv_option_alloca=alloca |
---|
2309 | ;; |
---|
2310 | no) |
---|
2311 | gmp_cv_option_alloca=malloc-reentrant |
---|
2312 | ;; |
---|
2313 | reentrant | notreentrant) |
---|
2314 | case $gmp_cv_func_alloca in |
---|
2315 | yes) gmp_cv_option_alloca=alloca ;; |
---|
2316 | *) gmp_cv_option_alloca=malloc-$enable_alloca ;; |
---|
2317 | esac |
---|
2318 | ;; |
---|
2319 | *) |
---|
2320 | gmp_cv_option_alloca=$enable_alloca |
---|
2321 | ;; |
---|
2322 | esac |
---|
2323 | ]) |
---|
2324 | case $gmp_cv_option_alloca in |
---|
2325 | alloca) |
---|
2326 | if test $gmp_cv_func_alloca = no; then |
---|
2327 | AC_MSG_ERROR([--enable-alloca=alloca specified, but alloca not available]) |
---|
2328 | fi |
---|
2329 | AC_DEFINE(WANT_TMP_ALLOCA, 1, [--enable-alloca=yes]) |
---|
2330 | ;; |
---|
2331 | malloc-reentrant) |
---|
2332 | AC_DEFINE(WANT_TMP_REENTRANT, 1, [--enable-alloca=malloc-reentrant]) |
---|
2333 | TAL_OBJECT=tal-reent$U.lo |
---|
2334 | ;; |
---|
2335 | malloc-notreentrant) |
---|
2336 | AC_DEFINE(WANT_TMP_NOTREENTRANT, 1, [--enable-alloca=malloc-notreentrant]) |
---|
2337 | TAL_OBJECT=tal-notreent$U.lo |
---|
2338 | ;; |
---|
2339 | debug) |
---|
2340 | AC_DEFINE(WANT_TMP_DEBUG, 1, [--enable-alloca=debug]) |
---|
2341 | TAL_OBJECT=tal-debug$U.lo |
---|
2342 | ;; |
---|
2343 | *) |
---|
2344 | # checks at the start of configure.in should protect us |
---|
2345 | AC_MSG_ERROR([unrecognised --enable-alloca=$gmp_cv_option_alloca]) |
---|
2346 | ;; |
---|
2347 | esac |
---|
2348 | AC_SUBST(TAL_OBJECT) |
---|
2349 | ]) |
---|
2350 | |
---|
2351 | |
---|
2352 | dnl GMP_FUNC_SSCANF_WRITABLE_INPUT |
---|
2353 | dnl ------------------------------ |
---|
2354 | dnl Determine whether sscanf requires a writable input string. |
---|
2355 | dnl |
---|
2356 | dnl FIXME: Run a program to try this, when doing a native build. |
---|
2357 | |
---|
2358 | AC_DEFUN(GMP_FUNC_SSCANF_WRITABLE_INPUT, |
---|
2359 | [AC_CACHE_CHECK([whether sscanf needs writable input], |
---|
2360 | gmp_cv_func_sscanf_writable_input, |
---|
2361 | [case $host in |
---|
2362 | *-*-hpux9 | *-*-hpux9.*) |
---|
2363 | gmp_cv_func_sscanf_writable_input=yes ;; |
---|
2364 | *) gmp_cv_func_sscanf_writable_input=no ;; |
---|
2365 | esac |
---|
2366 | ]) |
---|
2367 | case $gmp_cv_func_sscanf_writable_input in |
---|
2368 | yes) AC_DEFINE(SSCANF_WRITABLE_INPUT, 1, |
---|
2369 | [Define if sscanf requires writable inputs]) ;; |
---|
2370 | no) ;; |
---|
2371 | *) AC_MSG_ERROR([unrecognised \$gmp_cv_func_sscanf_writable_input]) ;; |
---|
2372 | esac |
---|
2373 | ]) |
---|
2374 | |
---|
2375 | |
---|
2376 | dnl GMP_FUNC_VSNPRINTF |
---|
2377 | dnl ------------------ |
---|
2378 | dnl Check whether vsnprintf exists, and works properly. |
---|
2379 | dnl |
---|
2380 | dnl Sparc Solaris 2.7 in 64-bit mode doesn't always truncate, making |
---|
2381 | dnl vsnprintf like vsprintf, and hence completely useless. On one system a |
---|
2382 | dnl literal string is enough to provoke the problem, on another a "%n" was |
---|
2383 | dnl needed. There seems to be something weird going on with the optimizer |
---|
2384 | dnl or something, since on the first system adding a second check with |
---|
2385 | dnl "%n", or even just an initialized local variable, makes it work. In |
---|
2386 | dnl any case, without bothering to get to the bottom of this, the two |
---|
2387 | dnl program runs in the code below end up successfully detecting the |
---|
2388 | dnl problem. |
---|
2389 | dnl |
---|
2390 | dnl glibc 2.0.x returns either -1 or bufsize-1 for an overflow (both seen, |
---|
2391 | dnl not sure which 2.0.x does which), but still puts the correct null |
---|
2392 | dnl terminated result into the buffer. |
---|
2393 | |
---|
2394 | AC_DEFUN(GMP_FUNC_VSNPRINTF, |
---|
2395 | [AC_REQUIRE([GMP_C_STDARG]) |
---|
2396 | AC_CHECK_FUNC(vsnprintf, |
---|
2397 | [gmp_vsnprintf_exists=yes], |
---|
2398 | [gmp_vsnprintf_exists=no]) |
---|
2399 | if test "$gmp_vsnprintf_exists" = no; then |
---|
2400 | gmp_cv_func_vsnprintf=no |
---|
2401 | else |
---|
2402 | AC_CACHE_CHECK([whether vsnprintf works], |
---|
2403 | gmp_cv_func_vsnprintf, |
---|
2404 | [gmp_cv_func_vsnprintf=yes |
---|
2405 | for i in 'check ("hello world");' 'int n; check ("%nhello world", &n);'; do |
---|
2406 | AC_TRY_RUN([ |
---|
2407 | #include <string.h> /* for strcmp */ |
---|
2408 | #include <stdio.h> /* for vsnprintf */ |
---|
2409 | |
---|
2410 | #if HAVE_STDARG |
---|
2411 | #include <stdarg.h> |
---|
2412 | #else |
---|
2413 | #include <varargs.h> |
---|
2414 | #endif |
---|
2415 | |
---|
2416 | int |
---|
2417 | #if HAVE_STDARG |
---|
2418 | check (const char *fmt, ...) |
---|
2419 | #else |
---|
2420 | check (va_alist) |
---|
2421 | va_dcl |
---|
2422 | #endif |
---|
2423 | { |
---|
2424 | static char buf[128]; |
---|
2425 | va_list ap; |
---|
2426 | int ret; |
---|
2427 | |
---|
2428 | #if HAVE_STDARG |
---|
2429 | va_start (ap, fmt); |
---|
2430 | #else |
---|
2431 | char *fmt; |
---|
2432 | va_start (ap); |
---|
2433 | fmt = va_arg (ap, char *); |
---|
2434 | #endif |
---|
2435 | |
---|
2436 | ret = vsnprintf (buf, 4, fmt, ap); |
---|
2437 | |
---|
2438 | if (strcmp (buf, "hel") != 0) |
---|
2439 | exit (1); |
---|
2440 | |
---|
2441 | /* allowed return values */ |
---|
2442 | if (ret != -1 && ret != 3 && ret != 11) |
---|
2443 | exit (2); |
---|
2444 | |
---|
2445 | return 0; |
---|
2446 | } |
---|
2447 | |
---|
2448 | int |
---|
2449 | main () |
---|
2450 | { |
---|
2451 | $i |
---|
2452 | exit (0); |
---|
2453 | } |
---|
2454 | ], |
---|
2455 | [:], |
---|
2456 | [gmp_cv_func_vsnprintf=no; break], |
---|
2457 | [gmp_cv_func_vsnprintf=probably; break]) |
---|
2458 | done |
---|
2459 | ]) |
---|
2460 | if test "$gmp_cv_func_vsnprintf" = probably; then |
---|
2461 | AC_MSG_WARN([cannot check for properly working vsnprintf when cross compiling, will assume it's ok]) |
---|
2462 | fi |
---|
2463 | if test "$gmp_cv_func_vsnprintf" != no; then |
---|
2464 | AC_DEFINE(HAVE_VSNPRINTF,1, |
---|
2465 | [Define if you have vsnprintf and it works properly.]) |
---|
2466 | fi |
---|
2467 | fi |
---|
2468 | ]) |
---|
2469 | |
---|
2470 | |
---|
2471 | dnl GMP_H_ANSI |
---|
2472 | dnl ---------- |
---|
2473 | dnl Check whether gmp.h recognises the compiler as ANSI capable. |
---|
2474 | |
---|
2475 | AC_DEFUN(GMP_H_ANSI, |
---|
2476 | [AC_REQUIRE([AC_PROG_CC_STDC]) |
---|
2477 | case $ac_cv_prog_cc_stdc in |
---|
2478 | no) |
---|
2479 | ;; |
---|
2480 | *) |
---|
2481 | AC_TRY_COMPILE( |
---|
2482 | GMP_INCLUDE_GMP_H |
---|
2483 | [#if ! __GMP_HAVE_PROTOTYPES |
---|
2484 | die die die |
---|
2485 | #endif |
---|
2486 | ],,, |
---|
2487 | [AC_MSG_WARN([gmp.h doesnt recognise compiler as ANSI, prototypes and "const" will be unavailable])]) |
---|
2488 | ;; |
---|
2489 | esac |
---|
2490 | ]) |
---|
2491 | |
---|
2492 | |
---|
2493 | dnl GMP_H_EXTERN_INLINE |
---|
2494 | dnl ------------------- |
---|
2495 | dnl If the compiler has an "inline" of some sort, check whether the |
---|
2496 | dnl #ifdef's in gmp.h recognise it. |
---|
2497 | |
---|
2498 | AC_DEFUN(GMP_H_EXTERN_INLINE, |
---|
2499 | [AC_REQUIRE([GMP_C_INLINE]) |
---|
2500 | case $gmp_cv_c_inline in |
---|
2501 | no) ;; |
---|
2502 | *) |
---|
2503 | AC_TRY_COMPILE( |
---|
2504 | [#define __GMP_WITHIN_CONFIGURE_INLINE 1 |
---|
2505 | ]GMP_INCLUDE_GMP_H[ |
---|
2506 | #ifndef __GMP_EXTERN_INLINE |
---|
2507 | die die die |
---|
2508 | #endif |
---|
2509 | ],,, |
---|
2510 | [case $gmp_cv_c_inline in |
---|
2511 | yes) tmp_inline=inline ;; |
---|
2512 | *) tmp_inline=$gmp_cv_c_inline ;; |
---|
2513 | esac |
---|
2514 | AC_MSG_WARN([gmp.h doesnt recognise compiler "$tmp_inline", inlines will be unavailable])]) |
---|
2515 | ;; |
---|
2516 | esac |
---|
2517 | ]) |
---|
2518 | |
---|
2519 | |
---|
2520 | dnl GMP_H_HAVE_FILE |
---|
2521 | dnl --------------- |
---|
2522 | dnl Check whether the #ifdef's in gmp.h recognise when stdio.h has been |
---|
2523 | dnl included to get FILE. |
---|
2524 | |
---|
2525 | AC_DEFUN(GMP_H_HAVE_FILE, |
---|
2526 | [AC_TRY_COMPILE( |
---|
2527 | [#include <stdio.h>] |
---|
2528 | GMP_INCLUDE_GMP_H |
---|
2529 | [#if ! _GMP_H_HAVE_FILE |
---|
2530 | die die die |
---|
2531 | #endif |
---|
2532 | ],,, |
---|
2533 | [AC_MSG_WARN([gmp.h doesnt recognise <stdio.h>, FILE prototypes will be unavailable])]) |
---|
2534 | ]) |
---|
2535 | |
---|
2536 | |
---|
2537 | dnl GMP_IMPL_H_IEEE_FLOATS |
---|
2538 | dnl ---------------------- |
---|
2539 | dnl Check whether the #ifdef's in gmp-impl.h recognise IEEE format and |
---|
2540 | dnl endianness. |
---|
2541 | |
---|
2542 | AC_DEFUN(GMP_IMPL_H_IEEE_FLOATS, |
---|
2543 | [case $host in |
---|
2544 | vax*-*-*) |
---|
2545 | # not IEEE (neither D nor G formats are IEEE) |
---|
2546 | ;; |
---|
2547 | none-*-*) |
---|
2548 | # don't worry about this when CPU "none" |
---|
2549 | ;; |
---|
2550 | *) |
---|
2551 | case $path in |
---|
2552 | *cray/cfp*) |
---|
2553 | # not IEEE |
---|
2554 | ;; |
---|
2555 | *) |
---|
2556 | AC_TRY_COMPILE( |
---|
2557 | [#include <stdio.h>] |
---|
2558 | GMP_INCLUDE_GMP_H |
---|
2559 | [#include "$srcdir/gmp-impl.h" |
---|
2560 | #ifndef _GMP_IEEE_FLOATS |
---|
2561 | die die die |
---|
2562 | #endif |
---|
2563 | ],,,[ |
---|
2564 | AC_MSG_WARN([gmp-impl.h doesnt recognise "double" as IEEE.]) |
---|
2565 | AC_MSG_WARN([If your CPU floats are in fact IEEE then you]) |
---|
2566 | AC_MSG_WARN([might like to augment the tests there.]) |
---|
2567 | ]) |
---|
2568 | ;; |
---|
2569 | esac |
---|
2570 | ;; |
---|
2571 | esac |
---|
2572 | ]) |
---|