program CMakeFortranCompilerABI

implicit none

integer :: i(1) = 0
where (i==0) i=1
if (any(i/=1)) stop 1
! showing Fortran 90 syntax is OK

#if 0
! Address Size
#endif
#if defined(_LP64)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(_M_IA64)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(_M_X64)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(_M_AMD64)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) ||         \
  defined(__amd64__)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__)
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
PRINT *, 'INFO:sizeof_dptr[8]'

#elif defined(_ILP32)
PRINT *, 'INFO:sizeof_dptr[4]'
#elif defined(_M_IX86)
PRINT *, 'INFO:sizeof_dptr[4]'
#elif defined(__i386) || defined(__i386__)
PRINT *, 'INFO:sizeof_dptr[4]'
#elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__)
PRINT *, 'INFO:sizeof_dptr[4]'
#elif defined(__sparc) || defined(__sparc__)
PRINT *, 'INFO:sizeof_dptr[4]'

#elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 8
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ == 4
PRINT *, 'INFO:sizeof_dptr[4]'
#elif defined(__SIZEOF_SIZE_T__) && __SIZEOF_SIZE_T__ == 8
PRINT *, 'INFO:sizeof_dptr[8]'
#elif defined(__SIZEOF_SIZE_T__) && __SIZEOF_SIZE_T__ == 4
PRINT *, 'INFO:sizeof_dptr[4]'
#endif

#if 0
! Application Binary Interface
#endif
#if defined(__ELF__)
PRINT *, 'INFO:abi[ELF]'
#endif

#if 0
! Sync with
!   Help/variable/CMAKE_LANG_COMPILER_ARCHITECTURE_ID.rst
!   Modules/CMakeCompilerABI.h
!   Modules/CMakeFortranCompilerABI.F
!   Modules/Internal/CMakeParseCompilerArchitectureId.cmake
#endif
#if defined(__APPLE__) && defined(__arm64__)
#  if defined(__ARM64_ARCH_8_32__)
PRINT *, 'INFO:arch[arm64_32]'
#  elif defined(__arm64e__)
PRINT *, 'INFO:arch[arm64e]'
#  else
PRINT *, 'INFO:arch[arm64]'
#  endif
#elif defined(_MSC_VER) && defined(_M_ARM64EC)
PRINT *, 'INFO:arch[arm64ec]'
#elif defined(_MSC_VER) && defined(_M_ARM64)
PRINT *, 'INFO:arch[arm64]'
#elif defined(__arm64ec__)
PRINT *, 'INFO:arch[arm64ec]'
#elif defined(__aarch64__)
PRINT *, 'INFO:arch[aarch64]'
#elif __ARM_ARCH == 7 || _M_ARM == 7 || defined(__ARM_ARCH_7__)
#  if defined(__APPLE__) && defined(__ARM_ARCH_7K__)
PRINT *, 'INFO:arch[armv7k]'
#  elif defined(__APPLE__) && defined(__ARM_ARCH_7S__)
PRINT *, 'INFO:arch[armv7s]'
#  else
PRINT *, 'INFO:arch[armv7]'
#  endif
#elif __ARM_ARCH == 6 || _M_ARM == 6 || defined(__ARM_ARCH_6__)
PRINT *, 'INFO:arch[armv6]'
#elif __ARM_ARCH == 5 || _M_ARM == 5 || defined(__ARM_ARCH_5__)
PRINT *, 'INFO:arch[armv5]'
#elif defined(__alpha) || defined(__alpha) || defined(_M_ALPHA)
PRINT *, 'INFO:arch[alpha]'
#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) ||         \
  defined(__amd64__) || defined(_M_X64) || defined(_M_AMD64)
PRINT *, 'INFO:arch[x86_64]'
#elif defined(__i686) || defined(__i686__) || _M_IX86 == 600
PRINT *, 'INFO:arch[i686]'
#elif defined(__i586) || defined(__i586__) || _M_IX86 == 500
PRINT *, 'INFO:arch[i586]'
#elif defined(__i486) || defined(__i486__) || _M_IX86 == 400
PRINT *, 'INFO:arch[i486]'
#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
PRINT *, 'INFO:arch[i386]'
#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
PRINT *, 'INFO:arch[ia64]'
#elif defined(__loongarch64)
PRINT *, 'INFO:arch[loongarch64]'
#elif defined(__loongarch__)
PRINT *, 'INFO:arch[loongarch32]'
#elif defined(__m68k__)
PRINT *, 'INFO:arch[m68k]'
#elif defined(__mips64) || defined(__mips64__)
#  if defined(_MIPSEL)
PRINT *, 'INFO:arch[mips64el]'
#  else
PRINT *, 'INFO:arch[mips64]'
#  endif
#elif defined(__mips) || defined(__mips__)
#  if defined(_MIPSEL)
PRINT *, 'INFO:arch[mipsel]'
#  else
PRINT *, 'INFO:arch[mips]'
#  endif
#elif defined(__riscv) && __riscv_xlen == 64
PRINT *, 'INFO:arch[riscv64]'
#elif defined(__riscv) && __riscv_xlen == 32
PRINT *, 'INFO:arch[riscv32]'
#elif defined(__s390x__)
PRINT *, 'INFO:arch[s390x]'
#elif defined(__s390__)
PRINT *, 'INFO:arch[s390]'
#elif defined(__sparcv9) || defined(__sparcv9__) || defined(__sparc64__)
PRINT *, 'INFO:arch[sparcv9]'
#elif defined(__sparc) || defined(__sparc__)
PRINT *, 'INFO:arch[sparc]'
#elif defined(__sw_64) || defined(__sw_64__)
PRINT *, 'INFO:arch[sw_64]'
#elif defined(__hppa) || defined(__hppa__)
#  if defined(__LP64__)
PRINT *, 'INFO:arch[parisc64]'
#  else
PRINT *, 'INFO:arch[parisc]'
#  endif
#elif defined(__ppc64__) || defined(__powerpc64__) || defined(__PPC64__) ||   \
  defined(_ARCH_PPC64)
#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
PRINT *, 'INFO:arch[ppc64le]'
#  else
PRINT *, 'INFO:arch[ppc64]'
#  endif
#elif defined(__ppc__) || defined(__powerpc__) || defined(__PPC__) ||         \
  defined(_ARCH_PPC)
#  if defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__)
PRINT *, 'INFO:arch[ppcle]'
#  else
PRINT *, 'INFO:arch[ppc]'
#  endif
#elif defined(__wasm64) || defined(__wasm64__)
PRINT *, 'INFO:arch[wasm64]'
#elif defined(__wasm32) || defined(__wasm32__)
PRINT *, 'INFO:arch[wasm32]'
#endif

PRINT *, 'ABI Detection'
end program
