# -*- shell-script -*- # Copyright (C) 2012-2019 Free Software Foundation, Inc. # Contributed by Richard Henderson . # # This file is part of the GNU Atomic Library (libatomic). # # Libatomic is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU General Public License for # more details. # # Under Section 7 of GPL version 3, you are granted additional # permissions described in the GCC Runtime Library Exception, version # 3.1, as published by the Free Software Foundation. # # You should have received a copy of the GNU General Public License and # a copy of the GCC Runtime Library Exception along with this program; # see the files COPYING3 and COPYING.RUNTIME respectively. If not, see # . # Map the target cpu to an ARCH sub-directory. At the same time, # work out any special compilation flags as necessary. # Give operating systems the opportunity to discard XCFLAGS modifications based # on ${target_cpu}. For example to allow proper use of multilibs. configure_tgt_pre_target_cpu_XCFLAGS="${XCFLAGS}" case "${target_cpu}" in alpha*) # fenv.c needs this option to generate inexact exceptions. XCFLAGS="${XCFLAGS} -mfp-trap-mode=sui" ARCH=alpha ;; rs6000 | powerpc*) ARCH=powerpc ;; riscv*) ARCH=riscv ;; sh*) ARCH=sh ;; aarch64*) ARCH=aarch64 case "${target}" in aarch64*-*-linux*) if test -n "$enable_aarch64_lse"; then try_ifunc=yes fi ;; esac ;; arm*) ARCH=arm case "${target}" in arm*-*-freebsd* | arm*-*-netbsd*) ;; *) # ??? Detect when -march=armv7 is already enabled. try_ifunc=yes ;; esac ;; sparc) case " ${CC} ${CFLAGS} " in *" -m64 "*) ;; *) if test -z "$with_cpu"; then XCFLAGS="${XCFLAGS} -mcpu=v9" fi esac ARCH=sparc ;; sparc64|sparcv9) case " ${CC} ${CFLAGS} " in *" -m32 "*) XCFLAGS="${XCFLAGS} -mcpu=v9" ;; esac ARCH=sparc ;; i[3456]86) case " ${CC} ${CFLAGS} " in *" -m64 "*|*" -mx32 "*) ;; *) if test -z "$with_arch"; then XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}" XCFLAGS="${XCFLAGS} -fomit-frame-pointer" fi esac ARCH=x86 # ??? Detect when -march=i686 is already enabled. try_ifunc=yes ;; x86_64) case " ${CC} ${CFLAGS} " in *" -m32 "*) XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic" XCFLAGS="${XCFLAGS} -fomit-frame-pointer" ;; *) ;; esac ARCH=x86 # ??? Detect when -mcx16 is already enabled. try_ifunc=yes ;; *) ARCH="${target_cpu}" ;; esac # The cpu configury is always most relevant. if test -d ${srcdir}/config/$ARCH ; then config_path="$ARCH" fi # Other system configury case "${target}" in aarch64*-*-linux*) # OS support for atomic primitives. config_path="${config_path} linux/aarch64 posix" ;; arm*-*-linux*) # OS support for atomic primitives. config_path="${config_path} linux/arm posix" ;; s390*-*-linux*) # OS support for atomic primitives. config_path="${config_path} s390 posix" ;; *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu \ | *-*-netbsd* | *-*-freebsd* | *-*-openbsd* | *-*-dragonfly* \ | *-*-solaris2* | *-*-sysv4* | *-*-irix6* | *-*-osf* | *-*-hpux11* \ | *-*-darwin* | *-*-aix* | *-*-cygwin*) # POSIX system. The OS is supported. config_path="${config_path} posix" ;; *-*-mingw*) # OS support for atomic primitives. case ${target_thread_file} in win32) config_path="${config_path} mingw" ;; posix) config_path="${config_path} posix" ;; esac ;; *-*-rtems*) XCFLAGS="${configure_tgt_pre_target_cpu_XCFLAGS}" config_path="rtems" ;; *-*-elf*) # ??? No target OS. We could be targeting bare-metal kernel-mode, # or user-mode for some custom OS. If the target supports TAS, # we can build our own spinlocks, given there are no signals. # If the target supports disabling interrupts, we can work in # kernel-mode, given the system is not multi-processor. UNSUPPORTED=1 ;; *) # Who are you? UNSUPPORTED=1 ;; esac # glibc will pass hwcap to ifunc resolver functions as an argument. # The type may be different on different architectures. case "${target}" in aarch64*-*-*) IFUNC_RESOLVER_ARGS="uint64_t hwcap" ;; *) IFUNC_RESOLVER_ARGS="void" ;; esac