Blame m4/host-cpu-c-abi.m4

Packit Service 4684c1
# host-cpu-c-abi.m4 serial 13
Packit Service 4684c1
dnl Copyright (C) 2002-2020 Free Software Foundation, Inc.
Packit Service 4684c1
dnl This file is free software; the Free Software Foundation
Packit Service 4684c1
dnl gives unlimited permission to copy and/or distribute it,
Packit Service 4684c1
dnl with or without modifications, as long as this notice is preserved.
Packit Service 4684c1
Packit Service 4684c1
dnl From Bruno Haible and Sam Steingold.
Packit Service 4684c1
Packit Service 4684c1
dnl Sets the HOST_CPU variable to the canonical name of the CPU.
Packit Service 4684c1
dnl Sets the HOST_CPU_C_ABI variable to the canonical name of the CPU with its
Packit Service 4684c1
dnl C language ABI (application binary interface).
Packit Service 4684c1
dnl Also defines __${HOST_CPU}__ and __${HOST_CPU_C_ABI}__ as C macros in
Packit Service 4684c1
dnl config.h.
Packit Service 4684c1
dnl
Packit Service 4684c1
dnl This canonical name can be used to select a particular assembly language
Packit Service 4684c1
dnl source file that will interoperate with C code on the given host.
Packit Service 4684c1
dnl
Packit Service 4684c1
dnl For example:
Packit Service 4684c1
dnl * 'i386' and 'sparc' are different canonical names, because code for i386
Packit Service 4684c1
dnl   will not run on SPARC CPUs and vice versa. They have different
Packit Service 4684c1
dnl   instruction sets.
Packit Service 4684c1
dnl * 'sparc' and 'sparc64' are different canonical names, because code for
Packit Service 4684c1
dnl   'sparc' and code for 'sparc64' cannot be linked together: 'sparc' code
Packit Service 4684c1
dnl   contains 32-bit instructions, whereas 'sparc64' code contains 64-bit
Packit Service 4684c1
dnl   instructions. A process on a SPARC CPU can be in 32-bit mode or in 64-bit
Packit Service 4684c1
dnl   mode, but not both.
Packit Service 4684c1
dnl * 'mips' and 'mipsn32' are different canonical names, because they use
Packit Service 4684c1
dnl   different argument passing and return conventions for C functions, and
Packit Service 4684c1
dnl   although the instruction set of 'mips' is a large subset of the
Packit Service 4684c1
dnl   instruction set of 'mipsn32'.
Packit Service 4684c1
dnl * 'mipsn32' and 'mips64' are different canonical names, because they use
Packit Service 4684c1
dnl   different sizes for the C types like 'int' and 'void *', and although
Packit Service 4684c1
dnl   the instruction sets of 'mipsn32' and 'mips64' are the same.
Packit Service 4684c1
dnl * The same canonical name is used for different endiannesses. You can
Packit Service 4684c1
dnl   determine the endianness through preprocessor symbols:
Packit Service 4684c1
dnl   - 'arm': test __ARMEL__.
Packit Service 4684c1
dnl   - 'mips', 'mipsn32', 'mips64': test _MIPSEB vs. _MIPSEL.
Packit Service 4684c1
dnl   - 'powerpc64': test _BIG_ENDIAN vs. _LITTLE_ENDIAN.
Packit Service 4684c1
dnl * The same name 'i386' is used for CPUs of type i386, i486, i586
Packit Service 4684c1
dnl   (Pentium), AMD K7, Pentium II, Pentium IV, etc., because
Packit Service 4684c1
dnl   - Instructions that do not exist on all of these CPUs (cmpxchg,
Packit Service 4684c1
dnl     MMX, SSE, SSE2, 3DNow! etc.) are not frequently used. If your
Packit Service 4684c1
dnl     assembly language source files use such instructions, you will
Packit Service 4684c1
dnl     need to make the distinction.
Packit Service 4684c1
dnl   - Speed of execution of the common instruction set is reasonable across
Packit Service 4684c1
dnl     the entire family of CPUs. If you have assembly language source files
Packit Service 4684c1
dnl     that are optimized for particular CPU types (like GNU gmp has), you
Packit Service 4684c1
dnl     will need to make the distinction.
Packit Service 4684c1
dnl   See <https://en.wikipedia.org/wiki/X86_instruction_listings>.
Packit Service 4684c1
AC_DEFUN([gl_HOST_CPU_C_ABI],
Packit Service 4684c1
[
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 4684c1
  AC_REQUIRE([gl_C_ASM])
Packit Service 4684c1
  AC_CACHE_CHECK([host CPU and C ABI], [gl_cv_host_cpu_c_abi],
Packit Service 4684c1
    [case "$host_cpu" in
Packit Service 4684c1
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
       i[34567]86 )
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
         gl_cv_host_cpu_c_abi=i386
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       x86_64 )
Packit Service 4684c1
         # On x86_64 systems, the C compiler may be generating code in one of
Packit Service 4684c1
         # these ABIs:
Packit Service 4684c1
         # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
Packit Service 4684c1
         # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
Packit Service 4684c1
         #   with native Windows (mingw, MSVC).
Packit Service 4684c1
         # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
Packit Service 4684c1
         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if (defined __x86_64__ || defined __amd64__ \
Packit Service 4684c1
                     || defined _M_X64 || defined _M_AMD64)
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [AC_COMPILE_IFELSE(
Packit Service 4684c1
              [AC_LANG_SOURCE(
Packit Service 4684c1
                 [[#if defined __ILP32__ || defined _ILP32
Packit Service 4684c1
                    int ok;
Packit Service 4684c1
                   #else
Packit Service 4684c1
                    error fail
Packit Service 4684c1
                   #endif
Packit Service 4684c1
                 ]])],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=x86_64-x32],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=x86_64])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=i386])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
       alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] )
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
         gl_cv_host_cpu_c_abi=alpha
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       arm* | aarch64 )
Packit Service 4684c1
         # Assume arm with EABI.
Packit Service 4684c1
         # On arm64 systems, the C compiler may be generating code in one of
Packit Service 4684c1
         # these ABIs:
Packit Service 4684c1
         # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
Packit Service 4684c1
         # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
Packit Service 4684c1
         # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#ifdef __aarch64__
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [AC_COMPILE_IFELSE(
Packit Service 4684c1
              [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __ILP32__ || defined _ILP32
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=arm64-ilp32],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=arm64])],
Packit Service 4684c1
           [# Don't distinguish little-endian and big-endian arm, since they
Packit Service 4684c1
            # don't require different machine code for simple operations and
Packit Service 4684c1
            # since the user can distinguish them through the preprocessor
Packit Service 4684c1
            # defines __ARMEL__ vs. __ARMEB__.
Packit Service 4684c1
            # But distinguish arm which passes floating-point arguments and
Packit Service 4684c1
            # return values in integer registers (r0, r1, ...) - this is
Packit Service 4684c1
            # gcc -mfloat-abi=soft or gcc -mfloat-abi=softfp - from arm which
Packit Service 4684c1
            # passes them in float registers (s0, s1, ...) and double registers
Packit Service 4684c1
            # (d0, d1, ...) - this is gcc -mfloat-abi=hard. GCC 4.6 or newer
Packit Service 4684c1
            # sets the preprocessor defines __ARM_PCS (for the first case) and
Packit Service 4684c1
            # __ARM_PCS_VFP (for the second case), but older GCC does not.
Packit Service 4684c1
            echo 'double ddd; void func (double dd) { ddd = dd; }' > conftest.c
Packit Service 4684c1
            # Look for a reference to the register d0 in the .s file.
Packit Service 4684c1
            AC_TRY_COMMAND(${CC-cc} $CFLAGS $CPPFLAGS $gl_c_asm_opt conftest.c) >/dev/null 2>&1
Packit Service 4684c1
            if LC_ALL=C grep 'd0,' conftest.$gl_asmext >/dev/null; then
Packit Service 4684c1
              gl_cv_host_cpu_c_abi=armhf
Packit Service 4684c1
            else
Packit Service 4684c1
              gl_cv_host_cpu_c_abi=arm
Packit Service 4684c1
            fi
Packit Service 4684c1
            rm -f conftest*
Packit Service 4684c1
           ])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
Packit Service 4684c1
         # On hppa, the C compiler may be generating 32-bit code or 64-bit
Packit Service 4684c1
         # code. In the latter case, it defines _LP64 and __LP64__.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#ifdef __LP64__
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=hppa64],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=hppa])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       ia64* )
Packit Service 4684c1
         # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
Packit Service 4684c1
         # 32-bit code. In the latter case, it defines _ILP32.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#ifdef _ILP32
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=ia64-ilp32],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=ia64])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       mips* )
Packit Service 4684c1
         # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
Packit Service 4684c1
         # at 32.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=mips64],
Packit Service 4684c1
           [# In the n32 ABI, _ABIN32 is defined, _ABIO32 is not defined (but
Packit Service 4684c1
            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIN32.
Packit Service 4684c1
            # In the 32 ABI, _ABIO32 is defined, _ABIN32 is not defined (but
Packit Service 4684c1
            # may later get defined by <sgidefs.h>), and _MIPS_SIM == _ABIO32.
Packit Service 4684c1
            AC_COMPILE_IFELSE(
Packit Service 4684c1
              [AC_LANG_SOURCE(
Packit Service 4684c1
                 [[#if (_MIPS_SIM == _ABIN32)
Packit Service 4684c1
                    int ok;
Packit Service 4684c1
                   #else
Packit Service 4684c1
                    error fail
Packit Service 4684c1
                   #endif
Packit Service 4684c1
                 ]])],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=mipsn32],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=mips])])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       powerpc* )
Packit Service 4684c1
         # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
Packit Service 4684c1
         # No need to distinguish them here; the caller may distinguish
Packit Service 4684c1
         # them based on the OS.
Packit Service 4684c1
         # On powerpc64 systems, the C compiler may still be generating
Packit Service 4684c1
         # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
Packit Service 4684c1
         # be generating 64-bit code.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined __powerpc64__ || defined _ARCH_PPC64
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [# On powerpc64, there are two ABIs on Linux: The AIX compatible
Packit Service 4684c1
            # one and the ELFv2 one. The latter defines _CALL_ELF=2.
Packit Service 4684c1
            AC_COMPILE_IFELSE(
Packit Service 4684c1
              [AC_LANG_SOURCE(
Packit Service 4684c1
                 [[#if defined _CALL_ELF && _CALL_ELF == 2
Packit Service 4684c1
                    int ok;
Packit Service 4684c1
                   #else
Packit Service 4684c1
                    error fail
Packit Service 4684c1
                   #endif
Packit Service 4684c1
                 ]])],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=powerpc64-elfv2],
Packit Service 4684c1
              [gl_cv_host_cpu_c_abi=powerpc64])
Packit Service 4684c1
           ],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=powerpc])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       rs6000 )
Packit Service 4684c1
         gl_cv_host_cpu_c_abi=powerpc
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       riscv32 | riscv64 )
Packit Service 4684c1
         # There are 2 architectures (with variants): rv32* and rv64*.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if __riscv_xlen == 64
Packit Service 4684c1
                  int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                  error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [cpu=riscv64],
Packit Service 4684c1
           [cpu=riscv32])
Packit Service 4684c1
         # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
Packit Service 4684c1
         # Size of 'long' and 'void *':
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined __LP64__
Packit Service 4684c1
                  int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                  error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [main_abi=lp64],
Packit Service 4684c1
           [main_abi=ilp32])
Packit Service 4684c1
         # Float ABIs:
Packit Service 4684c1
         # __riscv_float_abi_double:
Packit Service 4684c1
         #   'float' and 'double' are passed in floating-point registers.
Packit Service 4684c1
         # __riscv_float_abi_single:
Packit Service 4684c1
         #   'float' are passed in floating-point registers.
Packit Service 4684c1
         # __riscv_float_abi_soft:
Packit Service 4684c1
         #   No values are passed in floating-point registers.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined __riscv_float_abi_double
Packit Service 4684c1
                  int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                  error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [float_abi=d],
Packit Service 4684c1
           [AC_COMPILE_IFELSE(
Packit Service 4684c1
              [AC_LANG_SOURCE(
Packit Service 4684c1
                 [[#if defined __riscv_float_abi_single
Packit Service 4684c1
                     int ok;
Packit Service 4684c1
                   #else
Packit Service 4684c1
                     error fail
Packit Service 4684c1
                   #endif
Packit Service 4684c1
                 ]])],
Packit Service 4684c1
              [float_abi=f],
Packit Service 4684c1
              [float_abi=''])
Packit Service 4684c1
           ])
Packit Service 4684c1
         gl_cv_host_cpu_c_abi="${cpu}-${main_abi}${float_abi}"
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       s390* )
Packit Service 4684c1
         # On s390x, the C compiler may be generating 64-bit (= s390x) code
Packit Service 4684c1
         # or 31-bit (= s390) code.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined __LP64__ || defined __s390x__
Packit Service 4684c1
                  int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                  error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=s390x],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=s390])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       sparc | sparc64 )
Packit Service 4684c1
         # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
Packit Service 4684c1
         # C compiler still generates 32-bit code.
Packit Service 4684c1
         AC_COMPILE_IFELSE(
Packit Service 4684c1
           [AC_LANG_SOURCE(
Packit Service 4684c1
              [[#if defined __sparcv9 || defined __arch64__
Packit Service 4684c1
                 int ok;
Packit Service 4684c1
                #else
Packit Service 4684c1
                 error fail
Packit Service 4684c1
                #endif
Packit Service 4684c1
              ]])],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=sparc64],
Packit Service 4684c1
           [gl_cv_host_cpu_c_abi=sparc])
Packit Service 4684c1
         ;;
Packit Service 4684c1
Packit Service 4684c1
       *)
Packit Service 4684c1
         gl_cv_host_cpu_c_abi="$host_cpu"
Packit Service 4684c1
         ;;
Packit Service 4684c1
     esac
Packit Service 4684c1
    ])
Packit Service 4684c1
Packit Service 4684c1
  dnl In most cases, $HOST_CPU and $HOST_CPU_C_ABI are the same.
Packit Service 4684c1
  HOST_CPU=`echo "$gl_cv_host_cpu_c_abi" | sed -e 's/-.*//'`
Packit Service 4684c1
  HOST_CPU_C_ABI="$gl_cv_host_cpu_c_abi"
Packit Service 4684c1
  AC_SUBST([HOST_CPU])
Packit Service 4684c1
  AC_SUBST([HOST_CPU_C_ABI])
Packit Service 4684c1
Packit Service 4684c1
  # This was
Packit Service 4684c1
  #   AC_DEFINE_UNQUOTED([__${HOST_CPU}__])
Packit Service 4684c1
  #   AC_DEFINE_UNQUOTED([__${HOST_CPU_C_ABI}__])
Packit Service 4684c1
  # earlier, but KAI C++ 3.2d doesn't like this.
Packit Service 4684c1
  sed -e 's/-/_/g' >> confdefs.h <
Packit Service 4684c1
#ifndef __${HOST_CPU}__
Packit Service 4684c1
#define __${HOST_CPU}__ 1
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __${HOST_CPU_C_ABI}__
Packit Service 4684c1
#define __${HOST_CPU_C_ABI}__ 1
Packit Service 4684c1
#endif
Packit Service 4684c1
EOF
Packit Service 4684c1
  AH_TOP([/* CPU and C ABI indicator */
Packit Service 4684c1
#ifndef __i386__
Packit Service 4684c1
#undef __i386__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __x86_64_x32__
Packit Service 4684c1
#undef __x86_64_x32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __x86_64__
Packit Service 4684c1
#undef __x86_64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __alpha__
Packit Service 4684c1
#undef __alpha__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __arm__
Packit Service 4684c1
#undef __arm__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __armhf__
Packit Service 4684c1
#undef __armhf__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __arm64_ilp32__
Packit Service 4684c1
#undef __arm64_ilp32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __arm64__
Packit Service 4684c1
#undef __arm64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __hppa__
Packit Service 4684c1
#undef __hppa__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __hppa64__
Packit Service 4684c1
#undef __hppa64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __ia64_ilp32__
Packit Service 4684c1
#undef __ia64_ilp32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __ia64__
Packit Service 4684c1
#undef __ia64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __m68k__
Packit Service 4684c1
#undef __m68k__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __mips__
Packit Service 4684c1
#undef __mips__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __mipsn32__
Packit Service 4684c1
#undef __mipsn32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __mips64__
Packit Service 4684c1
#undef __mips64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __powerpc__
Packit Service 4684c1
#undef __powerpc__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __powerpc64__
Packit Service 4684c1
#undef __powerpc64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __powerpc64_elfv2__
Packit Service 4684c1
#undef __powerpc64_elfv2__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv32__
Packit Service 4684c1
#undef __riscv32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64__
Packit Service 4684c1
#undef __riscv64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv32_ilp32__
Packit Service 4684c1
#undef __riscv32_ilp32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv32_ilp32f__
Packit Service 4684c1
#undef __riscv32_ilp32f__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv32_ilp32d__
Packit Service 4684c1
#undef __riscv32_ilp32d__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_ilp32__
Packit Service 4684c1
#undef __riscv64_ilp32__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_ilp32f__
Packit Service 4684c1
#undef __riscv64_ilp32f__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_ilp32d__
Packit Service 4684c1
#undef __riscv64_ilp32d__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_lp64__
Packit Service 4684c1
#undef __riscv64_lp64__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_lp64f__
Packit Service 4684c1
#undef __riscv64_lp64f__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __riscv64_lp64d__
Packit Service 4684c1
#undef __riscv64_lp64d__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __s390__
Packit Service 4684c1
#undef __s390__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __s390x__
Packit Service 4684c1
#undef __s390x__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __sh__
Packit Service 4684c1
#undef __sh__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __sparc__
Packit Service 4684c1
#undef __sparc__
Packit Service 4684c1
#endif
Packit Service 4684c1
#ifndef __sparc64__
Packit Service 4684c1
#undef __sparc64__
Packit Service 4684c1
#endif
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
])
Packit Service 4684c1
Packit Service 4684c1
Packit Service 4684c1
dnl Sets the HOST_CPU_C_ABI_32BIT variable to 'yes' if the C language ABI
Packit Service 4684c1
dnl (application binary interface) is a 32-bit one, to 'no' if it is a 64-bit
Packit Service 4684c1
dnl one, or to 'unknown' if unknown.
Packit Service 4684c1
dnl This is a simplified variant of gl_HOST_CPU_C_ABI.
Packit Service 4684c1
AC_DEFUN([gl_HOST_CPU_C_ABI_32BIT],
Packit Service 4684c1
[
Packit Service 4684c1
  AC_REQUIRE([AC_CANONICAL_HOST])
Packit Service 4684c1
  AC_CACHE_CHECK([32-bit host C ABI], [gl_cv_host_cpu_c_abi_32bit],
Packit Service 4684c1
    [if test -n "$gl_cv_host_cpu_c_abi"; then
Packit Service 4684c1
       case "$gl_cv_host_cpu_c_abi" in
Packit Service 4684c1
         i386 | x86_64-x32 | arm | armhf | arm64-ilp32 | hppa | ia64-ilp32 | mips | mipsn32 | powerpc | riscv*-ilp32* | s390 | sparc)
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=yes ;;
Packit Service 4684c1
         x86_64 | alpha | arm64 | hppa64 | ia64 | mips64 | powerpc64 | powerpc64-elfv2 | riscv*-lp64* | s390x | sparc64 )
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=no ;;
Packit Service 4684c1
         *)
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=unknown ;;
Packit Service 4684c1
       esac
Packit Service 4684c1
     else
Packit Service 4684c1
       case "$host_cpu" in
Packit Service 4684c1
Packit Service 4684c1
         # CPUs that only support a 32-bit ABI.
Packit Service 4684c1
         arc \
Packit Service 4684c1
         | bfin \
Packit Service 4684c1
         | cris* \
Packit Service 4684c1
         | csky \
Packit Service 4684c1
         | epiphany \
Packit Service 4684c1
         | ft32 \
Packit Service 4684c1
         | h8300 \
Packit Service 4684c1
         | m68k \
Packit Service 4684c1
         | microblaze | microblazeel \
Packit Service 4684c1
         | nds32 | nds32le | nds32be \
Packit Service 4684c1
         | nios2 | nios2eb | nios2el \
Packit Service 4684c1
         | or1k* \
Packit Service 4684c1
         | or32 \
Packit Service 4684c1
         | sh | sh[1234] | sh[1234]e[lb] \
Packit Service 4684c1
         | tic6x \
Packit Service 4684c1
         | xtensa* )
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=yes
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         # CPUs that only support a 64-bit ABI.
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
         alpha | alphaev[4-8] | alphaev56 | alphapca5[67] | alphaev6[78] \
Packit Service 4684c1
         | mmix )
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=no
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
changequote(,)dnl
Packit Service 4684c1
         i[34567]86 )
Packit Service 4684c1
changequote([,])dnl
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=yes
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         x86_64 )
Packit Service 4684c1
           # On x86_64 systems, the C compiler may be generating code in one of
Packit Service 4684c1
           # these ABIs:
Packit Service 4684c1
           # - 64-bit instruction set, 64-bit pointers, 64-bit 'long': x86_64.
Packit Service 4684c1
           # - 64-bit instruction set, 64-bit pointers, 32-bit 'long': x86_64
Packit Service 4684c1
           #   with native Windows (mingw, MSVC).
Packit Service 4684c1
           # - 64-bit instruction set, 32-bit pointers, 32-bit 'long': x86_64-x32.
Packit Service 4684c1
           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': i386.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if (defined __x86_64__ || defined __amd64__ \
Packit Service 4684c1
                       || defined _M_X64 || defined _M_AMD64) \
Packit Service 4684c1
                      && !(defined __ILP32__ || defined _ILP32)
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         arm* | aarch64 )
Packit Service 4684c1
           # Assume arm with EABI.
Packit Service 4684c1
           # On arm64 systems, the C compiler may be generating code in one of
Packit Service 4684c1
           # these ABIs:
Packit Service 4684c1
           # - aarch64 instruction set, 64-bit pointers, 64-bit 'long': arm64.
Packit Service 4684c1
           # - aarch64 instruction set, 32-bit pointers, 32-bit 'long': arm64-ilp32.
Packit Service 4684c1
           # - 32-bit instruction set, 32-bit pointers, 32-bit 'long': arm or armhf.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __aarch64__ && !(defined __ILP32__ || defined _ILP32)
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         hppa1.0 | hppa1.1 | hppa2.0* | hppa64 )
Packit Service 4684c1
           # On hppa, the C compiler may be generating 32-bit code or 64-bit
Packit Service 4684c1
           # code. In the latter case, it defines _LP64 and __LP64__.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#ifdef __LP64__
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         ia64* )
Packit Service 4684c1
           # On ia64 on HP-UX, the C compiler may be generating 64-bit code or
Packit Service 4684c1
           # 32-bit code. In the latter case, it defines _ILP32.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#ifdef _ILP32
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         mips* )
Packit Service 4684c1
           # We should also check for (_MIPS_SZPTR == 64), but gcc keeps this
Packit Service 4684c1
           # at 32.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined _MIPS_SZLONG && (_MIPS_SZLONG == 64)
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         powerpc* )
Packit Service 4684c1
           # Different ABIs are in use on AIX vs. Mac OS X vs. Linux,*BSD.
Packit Service 4684c1
           # No need to distinguish them here; the caller may distinguish
Packit Service 4684c1
           # them based on the OS.
Packit Service 4684c1
           # On powerpc64 systems, the C compiler may still be generating
Packit Service 4684c1
           # 32-bit code. And on powerpc-ibm-aix systems, the C compiler may
Packit Service 4684c1
           # be generating 64-bit code.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __powerpc64__ || defined _ARCH_PPC64
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         rs6000 )
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=yes
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         riscv32 | riscv64 )
Packit Service 4684c1
           # There are 6 ABIs: ilp32, ilp32f, ilp32d, lp64, lp64f, lp64d.
Packit Service 4684c1
           # Size of 'long' and 'void *':
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __LP64__
Packit Service 4684c1
                    int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                    error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         s390* )
Packit Service 4684c1
           # On s390x, the C compiler may be generating 64-bit (= s390x) code
Packit Service 4684c1
           # or 31-bit (= s390) code.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __LP64__ || defined __s390x__
Packit Service 4684c1
                    int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                    error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         sparc | sparc64 )
Packit Service 4684c1
           # UltraSPARCs running Linux have `uname -m` = "sparc64", but the
Packit Service 4684c1
           # C compiler still generates 32-bit code.
Packit Service 4684c1
           AC_COMPILE_IFELSE(
Packit Service 4684c1
             [AC_LANG_SOURCE(
Packit Service 4684c1
                [[#if defined __sparcv9 || defined __arch64__
Packit Service 4684c1
                   int ok;
Packit Service 4684c1
                  #else
Packit Service 4684c1
                   error fail
Packit Service 4684c1
                  #endif
Packit Service 4684c1
                ]])],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=no],
Packit Service 4684c1
             [gl_cv_host_cpu_c_abi_32bit=yes])
Packit Service 4684c1
           ;;
Packit Service 4684c1
Packit Service 4684c1
         *)
Packit Service 4684c1
           gl_cv_host_cpu_c_abi_32bit=unknown
Packit Service 4684c1
           ;;
Packit Service 4684c1
       esac
Packit Service 4684c1
     fi
Packit Service 4684c1
    ])
Packit Service 4684c1
Packit Service 4684c1
  HOST_CPU_C_ABI_32BIT="$gl_cv_host_cpu_c_abi_32bit"
Packit Service 4684c1
])