host-cpu-c-abi.m4 (22480B)
1 # host-cpu-c-abi.m4 serial 15 2 dnl Copyright (C) 2002-2022 Free Software Foundation, Inc. 3 dnl This file is free software; the Free Software Foundation 4 dnl gives unlimited permission to copy and/or distribute it, 5 dnl with or without modifications, as long as this notice is preserved. 6 7 dnl From Bruno Haible and Sam Steingold. 8 9 dnl Sets the HOST_CPU variable to the canonical name of the CPU. 10 dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its 11 dnl C language ABI (application binary interface). 12 dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in 13 dnl config.h. 14 dnl 15 dnl This canonical name can be used to select a particular assembly language 16 dnl source file that will interoperate with C code on the given host. 17 dnl 18 dnl For example: 19 dnl * 'i386' and 'sparc' are different canonical names, because code for i386 20 dnl will not run on SPARC CPUs and vice versa. They have different 21 dnl instruction sets. 22 dnl * 'sparc' and 'sparc64' are different canonical names, because code for 23 dnl 'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code 24 dnl contains 32-bit instructions, whereas 'sparc64' code contains 64-bit 25 dnl instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit 26 dnl mode, but not both. 27 dnl * 'mips' and 'mipsn32' are different canonical names, because they use 28 dnl different argument passing and return conventions for C functions, and 29 dnl although the instruction set of 'mips' is a large subset of the 30 dnl instruction set of 'mipsn32'. 31 dnl * 'mipsn32' and 'mips64' are different canonical names, because they use 32 dnl different sizes for the C types like 'int' and 'void *', and although 33 dnl the instruction sets of 'mipsn32' and 'mips64' are the same. 34 dnl * The same canonical name is used for different endiannesses. You can 35 dnl determine the endianness through preprocessor symbols: 36 dnl - 'arm': test __ARMEL__. 37 dnl - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL. 38 dnl - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN. 39 dnl * The same name 'i386' is used for CPUs of type i386, i486, i586 40 dnl (Pentium), AMD K7, Pentium II, Pentium IV, etc., because 41 dnl - Instructions that do not exist on all of these CPUs (cmpxchg, 42 dnl MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your 43 dnl assembly language source files use such instructions, you will 44 dnl need to make the distinction. 45 dnl - Speed of execution of the common instruction set is reasonable across 46 dnl the entire family of CPUs. If you have assembly language source files 47 dnl that are optimized for particular CPU types (like GNU gmp has), you 48 dnl will need to make the distinction. 49 dnl See <https://en.wikipedia.org/wiki/X86_instruction_listings>. 50 AC_DEFUN([gl_HOST_CPU_C_ABI], 51 [ 52 AC_REQUIRE([AC_CANONICAL_HOST]) 53 AC_REQUIRE([gl_C_ASM]) 54 AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi], 55 [case "$host_cpu" in 56 57 changequote(,)dnl 58 i[34567]86 ) 59 changequote([,])dnl 60 gl_cv_host_cpu_c_abi=i386 61 ;; 62 63 x86_64 ) 64 # On x86_64 systems, the C compiler may be generating code in one of 65 # these ABIs: 66 # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. 67 # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 68 # with native Windows (mingw, MSVC). 69 # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. 70 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. 71 AC_COMPILE_IFELSE( 72 [AC_LANG_SOURCE( 73 [[#if (defined __x86_64__ || defined __amd64__ \ 74 || defined _M_X64 || defined _M_AMD64) 75 int ok; 76 #else 77 error fail 78 #endif 79 ]])], 80 [AC_COMPILE_IFELSE( 81 [AC_LANG_SOURCE( 82 [[#if defined __ILP32__ || defined _ILP32 83 int ok; 84 #else 85 error fail 86 #endif 87 ]])], 88 [gl_cv_host_cpu_c_abi=x86_64-x32], 89 [gl_cv_host_cpu_c_abi=x86_64])], 90 [gl_cv_host_cpu_c_abi=i386]) 91 ;; 92 93 changequote(,)dnl 94 alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] ) 95 changequote([,])dnl 96 gl_cv_host_cpu_c_abi=alpha 97 ;; 98 99 arm* | aarch64 ) 100 # Assume arm with EABI. 101 # On arm64 systems, the C compiler may be generating code in one of 102 # these ABIs: 103 # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. 104 # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. 105 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. 106 AC_COMPILE_IFELSE( 107 [AC_LANG_SOURCE( 108 [[#ifdef __aarch64__ 109 int ok; 110 #else 111 error fail 112 #endif 113 ]])], 114 [AC_COMPILE_IFELSE( 115 [AC_LANG_SOURCE( 116 [[#if defined __ILP32__ || defined _ILP32 117 int ok; 118 #else 119 error fail 120 #endif 121 ]])], 122 [gl_cv_host_cpu_c_abi=arm64-ilp32], 123 [gl_cv_host_cpu_c_abi=arm64])], 124 [# Don't distinguish little-endian and big-endian arm, since they 125 # don't require different machine code for simple operations and 126 # since the user can distinguish them through the preprocessor 127 # defines __ARMEL__ vs. __ARMEB__. 128 # But distinguish arm which passes floating-point arguments and 129 # return values in integer registers (r0, r1, ...) - this is 130 # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which 131 # passes them in float registers (s0, s1, ...) and double registers 132 # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer 133 # sets the preprocessor defines __ARM_PCS (for the first case) and 134 # __ARM_PCS_VFP (for the second case), but older GCC does not. 135 echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c 136 # Look for a reference to the register d0 in the .s file. 137 AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1 138 if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then 139 gl_cv_host_cpu_c_abi=armhf 140 else 141 gl_cv_host_cpu_c_abi=arm 142 fi 143 rm -f conftest* 144 ]) 145 ;; 146 147 hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) 148 # On hppa, the C compiler may be generating 32-bit code or 64-bit 149 # code. In the latter case, it defines _LP64 and __LP64__. 150 AC_COMPILE_IFELSE( 151 [AC_LANG_SOURCE( 152 [[#ifdef __LP64__ 153 int ok; 154 #else 155 error fail 156 #endif 157 ]])], 158 [gl_cv_host_cpu_c_abi=hppa64], 159 [gl_cv_host_cpu_c_abi=hppa]) 160 ;; 161 162 ia64* ) 163 # On ia64 on HP-UX, the C compiler may be generating 64-bit code or 164 # 32-bit code. In the latter case, it defines _ILP32. 165 AC_COMPILE_IFELSE( 166 [AC_LANG_SOURCE( 167 [[#ifdef _ILP32 168 int ok; 169 #else 170 error fail 171 #endif 172 ]])], 173 [gl_cv_host_cpu_c_abi=ia64-ilp32], 174 [gl_cv_host_cpu_c_abi=ia64]) 175 ;; 176 177 mips* ) 178 # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this 179 # at 32. 180 AC_COMPILE_IFELSE( 181 [AC_LANG_SOURCE( 182 [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) 183 int ok; 184 #else 185 error fail 186 #endif 187 ]])], 188 [gl_cv_host_cpu_c_abi=mips64], 189 [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but 190 # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32. 191 # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but 192 # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32. 193 AC_COMPILE_IFELSE( 194 [AC_LANG_SOURCE( 195 [[#if (_MIPS_SIM == _ABIN32) 196 int ok; 197 #else 198 error fail 199 #endif 200 ]])], 201 [gl_cv_host_cpu_c_abi=mipsn32], 202 [gl_cv_host_cpu_c_abi=mips])]) 203 ;; 204 205 powerpc* ) 206 # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. 207 # No need to distinguish them here; the caller may distinguish 208 # them based on the OS. 209 # On powerpc64 systems, the C compiler may still be generating 210 # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may 211 # be generating 64-bit code. 212 AC_COMPILE_IFELSE( 213 [AC_LANG_SOURCE( 214 [[#if defined __powerpc64__ || defined __LP64__ 215 int ok; 216 #else 217 error fail 218 #endif 219 ]])], 220 [# On powerpc64, there are two ABIs on Linux: The AIX compatible 221 # one and the ELFv2 one. The latter defines _CALL_ELF=2. 222 AC_COMPILE_IFELSE( 223 [AC_LANG_SOURCE( 224 [[#if defined _CALL_ELF && _CALL_ELF == 2 225 int ok; 226 #else 227 error fail 228 #endif 229 ]])], 230 [gl_cv_host_cpu_c_abi=powerpc64-elfv2], 231 [gl_cv_host_cpu_c_abi=powerpc64]) 232 ], 233 [gl_cv_host_cpu_c_abi=powerpc]) 234 ;; 235 236 rs6000 ) 237 gl_cv_host_cpu_c_abi=powerpc 238 ;; 239 240 riscv32 | riscv64 ) 241 # There are 2 architectures (with variants): rv32* and rv64*. 242 AC_COMPILE_IFELSE( 243 [AC_LANG_SOURCE( 244 [[#if __riscv_xlen == 64 245 int ok; 246 #else 247 error fail 248 #endif 249 ]])], 250 [cpu=riscv64], 251 [cpu=riscv32]) 252 # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. 253 # Size of 'long' and 'void *': 254 AC_COMPILE_IFELSE( 255 [AC_LANG_SOURCE( 256 [[#if defined __LP64__ 257 int ok; 258 #else 259 error fail 260 #endif 261 ]])], 262 [main_abi=lp64], 263 [main_abi=ilp32]) 264 # Float ABIs: 265 # __riscv_float_abi_double: 266 # 'float' and 'double' are passed in floating-point registers. 267 # __riscv_float_abi_single: 268 # 'float' are passed in floating-point registers. 269 # __riscv_float_abi_soft: 270 # No values are passed in floating-point registers. 271 AC_COMPILE_IFELSE( 272 [AC_LANG_SOURCE( 273 [[#if defined __riscv_float_abi_double 274 int ok; 275 #else 276 error fail 277 #endif 278 ]])], 279 [float_abi=d], 280 [AC_COMPILE_IFELSE( 281 [AC_LANG_SOURCE( 282 [[#if defined __riscv_float_abi_single 283 int ok; 284 #else 285 error fail 286 #endif 287 ]])], 288 [float_abi=f], 289 [float_abi='']) 290 ]) 291 gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}" 292 ;; 293 294 s390* ) 295 # On s390x, the C compiler may be generating 64-bit (= s390x) code 296 # or 31-bit (= s390) code. 297 AC_COMPILE_IFELSE( 298 [AC_LANG_SOURCE( 299 [[#if defined __LP64__ || defined __s390x__ 300 int ok; 301 #else 302 error fail 303 #endif 304 ]])], 305 [gl_cv_host_cpu_c_abi=s390x], 306 [gl_cv_host_cpu_c_abi=s390]) 307 ;; 308 309 sparc | sparc64 ) 310 # UltraSPARCs running Linux have `uname -m` = "sparc64", but the 311 # C compiler still generates 32-bit code. 312 AC_COMPILE_IFELSE( 313 [AC_LANG_SOURCE( 314 [[#if defined __sparcv9 || defined __arch64__ 315 int ok; 316 #else 317 error fail 318 #endif 319 ]])], 320 [gl_cv_host_cpu_c_abi=sparc64], 321 [gl_cv_host_cpu_c_abi=sparc]) 322 ;; 323 324 *) 325 gl_cv_host_cpu_c_abi="$host_cpu" 326 ;; 327 esac 328 ]) 329 330 dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same. 331 HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'` 332 HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi" 333 AC_SUBST([HOST_CPU]) 334 AC_SUBST([HOST_CPU_C_ABI]) 335 336 # This was 337 # AC_DEFINE_UNQUOTED([__${HOST_CPU}__]) 338 # AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__]) 339 # earlier, but KAI C++ 3.2d doesn't like this. 340 sed -e 's/-/_/g' >> confdefs.h <<EOF 341 #ifndef __${HOST_CPU}__ 342 #define __${HOST_CPU}__ 1 343 #endif 344 #ifndef __${HOST_CPU_C_ABI}__ 345 #define __${HOST_CPU_C_ABI}__ 1 346 #endif 347 EOF 348 AH_TOP([/* CPU and C ABI indicator */ 349 #ifndef __i386__ 350 #undef __i386__ 351 #endif 352 #ifndef __x86_64_x32__ 353 #undef __x86_64_x32__ 354 #endif 355 #ifndef __x86_64__ 356 #undef __x86_64__ 357 #endif 358 #ifndef __alpha__ 359 #undef __alpha__ 360 #endif 361 #ifndef __arm__ 362 #undef __arm__ 363 #endif 364 #ifndef __armhf__ 365 #undef __armhf__ 366 #endif 367 #ifndef __arm64_ilp32__ 368 #undef __arm64_ilp32__ 369 #endif 370 #ifndef __arm64__ 371 #undef __arm64__ 372 #endif 373 #ifndef __hppa__ 374 #undef __hppa__ 375 #endif 376 #ifndef __hppa64__ 377 #undef __hppa64__ 378 #endif 379 #ifndef __ia64_ilp32__ 380 #undef __ia64_ilp32__ 381 #endif 382 #ifndef __ia64__ 383 #undef __ia64__ 384 #endif 385 #ifndef __loongarch64__ 386 #undef __loongarch64__ 387 #endif 388 #ifndef __m68k__ 389 #undef __m68k__ 390 #endif 391 #ifndef __mips__ 392 #undef __mips__ 393 #endif 394 #ifndef __mipsn32__ 395 #undef __mipsn32__ 396 #endif 397 #ifndef __mips64__ 398 #undef __mips64__ 399 #endif 400 #ifndef __powerpc__ 401 #undef __powerpc__ 402 #endif 403 #ifndef __powerpc64__ 404 #undef __powerpc64__ 405 #endif 406 #ifndef __powerpc64_elfv2__ 407 #undef __powerpc64_elfv2__ 408 #endif 409 #ifndef __riscv32__ 410 #undef __riscv32__ 411 #endif 412 #ifndef __riscv64__ 413 #undef __riscv64__ 414 #endif 415 #ifndef __riscv32_ilp32__ 416 #undef __riscv32_ilp32__ 417 #endif 418 #ifndef __riscv32_ilp32f__ 419 #undef __riscv32_ilp32f__ 420 #endif 421 #ifndef __riscv32_ilp32d__ 422 #undef __riscv32_ilp32d__ 423 #endif 424 #ifndef __riscv64_ilp32__ 425 #undef __riscv64_ilp32__ 426 #endif 427 #ifndef __riscv64_ilp32f__ 428 #undef __riscv64_ilp32f__ 429 #endif 430 #ifndef __riscv64_ilp32d__ 431 #undef __riscv64_ilp32d__ 432 #endif 433 #ifndef __riscv64_lp64__ 434 #undef __riscv64_lp64__ 435 #endif 436 #ifndef __riscv64_lp64f__ 437 #undef __riscv64_lp64f__ 438 #endif 439 #ifndef __riscv64_lp64d__ 440 #undef __riscv64_lp64d__ 441 #endif 442 #ifndef __s390__ 443 #undef __s390__ 444 #endif 445 #ifndef __s390x__ 446 #undef __s390x__ 447 #endif 448 #ifndef __sh__ 449 #undef __sh__ 450 #endif 451 #ifndef __sparc__ 452 #undef __sparc__ 453 #endif 454 #ifndef __sparc64__ 455 #undef __sparc64__ 456 #endif 457 ]) 458 459 ]) 460 461 462 dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI 463 dnl (application binary interface) is a 32-bit one, to 'no' if it is a 64-bit 464 dnl one, or to 'unknown' if unknown. 465 dnl This is a simplified variant of gl_HOST_CPU_C_ABI. 466 AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT], 467 [ 468 AC_REQUIRE([AC_CANONICAL_HOST]) 469 AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit], 470 [if test -n "$gl_cv_host_cpu_c_abi"; then 471 case "$gl_cv_host_cpu_c_abi" in 472 i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc) 473 gl_cv_host_cpu_c_abi_32bit=yes ;; 474 x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 ) 475 gl_cv_host_cpu_c_abi_32bit=no ;; 476 *) 477 gl_cv_host_cpu_c_abi_32bit=unknown ;; 478 esac 479 else 480 case "$host_cpu" in 481 482 # CPUs that only support a 32-bit ABI. 483 arc \ 484 | bfin \ 485 | cris* \ 486 | csky \ 487 | epiphany \ 488 | ft32 \ 489 | h8300 \ 490 | m68k \ 491 | microblaze | microblazeel \ 492 | nds32 | nds32le | nds32be \ 493 | nios2 | nios2eb | nios2el \ 494 | or1k* \ 495 | or32 \ 496 | sh | sh[1234] | sh[1234]e[lb] \ 497 | tic6x \ 498 | xtensa* ) 499 gl_cv_host_cpu_c_abi_32bit=yes 500 ;; 501 502 # CPUs that only support a 64-bit ABI. 503 changequote(,)dnl 504 alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \ 505 | mmix ) 506 changequote([,])dnl 507 gl_cv_host_cpu_c_abi_32bit=no 508 ;; 509 510 changequote(,)dnl 511 i[34567]86 ) 512 changequote([,])dnl 513 gl_cv_host_cpu_c_abi_32bit=yes 514 ;; 515 516 x86_64 ) 517 # On x86_64 systems, the C compiler may be generating code in one of 518 # these ABIs: 519 # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64. 520 # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64 521 # with native Windows (mingw, MSVC). 522 # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32. 523 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386. 524 AC_COMPILE_IFELSE( 525 [AC_LANG_SOURCE( 526 [[#if (defined __x86_64__ || defined __amd64__ \ 527 || defined _M_X64 || defined _M_AMD64) \ 528 && !(defined __ILP32__ || defined _ILP32) 529 int ok; 530 #else 531 error fail 532 #endif 533 ]])], 534 [gl_cv_host_cpu_c_abi_32bit=no], 535 [gl_cv_host_cpu_c_abi_32bit=yes]) 536 ;; 537 538 arm* | aarch64 ) 539 # Assume arm with EABI. 540 # On arm64 systems, the C compiler may be generating code in one of 541 # these ABIs: 542 # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64. 543 # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32. 544 # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf. 545 AC_COMPILE_IFELSE( 546 [AC_LANG_SOURCE( 547 [[#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32) 548 int ok; 549 #else 550 error fail 551 #endif 552 ]])], 553 [gl_cv_host_cpu_c_abi_32bit=no], 554 [gl_cv_host_cpu_c_abi_32bit=yes]) 555 ;; 556 557 hppa1.0 | hppa1.1 | hppa2.0* | hppa64 ) 558 # On hppa, the C compiler may be generating 32-bit code or 64-bit 559 # code. In the latter case, it defines _LP64 and __LP64__. 560 AC_COMPILE_IFELSE( 561 [AC_LANG_SOURCE( 562 [[#ifdef __LP64__ 563 int ok; 564 #else 565 error fail 566 #endif 567 ]])], 568 [gl_cv_host_cpu_c_abi_32bit=no], 569 [gl_cv_host_cpu_c_abi_32bit=yes]) 570 ;; 571 572 ia64* ) 573 # On ia64 on HP-UX, the C compiler may be generating 64-bit code or 574 # 32-bit code. In the latter case, it defines _ILP32. 575 AC_COMPILE_IFELSE( 576 [AC_LANG_SOURCE( 577 [[#ifdef _ILP32 578 int ok; 579 #else 580 error fail 581 #endif 582 ]])], 583 [gl_cv_host_cpu_c_abi_32bit=yes], 584 [gl_cv_host_cpu_c_abi_32bit=no]) 585 ;; 586 587 mips* ) 588 # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this 589 # at 32. 590 AC_COMPILE_IFELSE( 591 [AC_LANG_SOURCE( 592 [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64) 593 int ok; 594 #else 595 error fail 596 #endif 597 ]])], 598 [gl_cv_host_cpu_c_abi_32bit=no], 599 [gl_cv_host_cpu_c_abi_32bit=yes]) 600 ;; 601 602 powerpc* ) 603 # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD. 604 # No need to distinguish them here; the caller may distinguish 605 # them based on the OS. 606 # On powerpc64 systems, the C compiler may still be generating 607 # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may 608 # be generating 64-bit code. 609 AC_COMPILE_IFELSE( 610 [AC_LANG_SOURCE( 611 [[#if defined __powerpc64__ || defined __LP64__ 612 int ok; 613 #else 614 error fail 615 #endif 616 ]])], 617 [gl_cv_host_cpu_c_abi_32bit=no], 618 [gl_cv_host_cpu_c_abi_32bit=yes]) 619 ;; 620 621 rs6000 ) 622 gl_cv_host_cpu_c_abi_32bit=yes 623 ;; 624 625 riscv32 | riscv64 ) 626 # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d. 627 # Size of 'long' and 'void *': 628 AC_COMPILE_IFELSE( 629 [AC_LANG_SOURCE( 630 [[#if defined __LP64__ 631 int ok; 632 #else 633 error fail 634 #endif 635 ]])], 636 [gl_cv_host_cpu_c_abi_32bit=no], 637 [gl_cv_host_cpu_c_abi_32bit=yes]) 638 ;; 639 640 s390* ) 641 # On s390x, the C compiler may be generating 64-bit (= s390x) code 642 # or 31-bit (= s390) code. 643 AC_COMPILE_IFELSE( 644 [AC_LANG_SOURCE( 645 [[#if defined __LP64__ || defined __s390x__ 646 int ok; 647 #else 648 error fail 649 #endif 650 ]])], 651 [gl_cv_host_cpu_c_abi_32bit=no], 652 [gl_cv_host_cpu_c_abi_32bit=yes]) 653 ;; 654 655 sparc | sparc64 ) 656 # UltraSPARCs running Linux have `uname -m` = "sparc64", but the 657 # C compiler still generates 32-bit code. 658 AC_COMPILE_IFELSE( 659 [AC_LANG_SOURCE( 660 [[#if defined __sparcv9 || defined __arch64__ 661 int ok; 662 #else 663 error fail 664 #endif 665 ]])], 666 [gl_cv_host_cpu_c_abi_32bit=no], 667 [gl_cv_host_cpu_c_abi_32bit=yes]) 668 ;; 669 670 *) 671 gl_cv_host_cpu_c_abi_32bit=unknown 672 ;; 673 esac 674 fi 675 ]) 676 677 HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit" 678 ])