# -*- shell-script -*-
#   Copyright (C) 2011-2021 Free Software Foundation, Inc.

# This program 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 2 of the License, or
# (at your option) any later version.
# 
# This program 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.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  

# This is the target specific configuration file.  This is invoked by the
# autoconf generated configure script.  Putting it in a separate shell file
# lets us skip running autoconf when modifying target specific information.

# This file switches on the shell variable ${target}, and sets the
# following shell variables:
#  config_path		An ordered list of directories to search for
#			sources and headers.  This is relative to the
#			config subdirectory of the source tree.
#  XCFLAGS		Add extra compile flags to use.
#  XLDFLAGS		Add extra link flags to use.

# Optimize TLS usage by avoiding the overhead of dynamic allocation.
if test "$gcc_cv_have_tls" = yes ; then
  case "${target}" in

    *-*-musl*)
	;;

    # For x86, we use slots in the TCB head for most of our TLS.
    # The setup of those slots in beginTransaction can afford to
    # use the global-dynamic model.
    i[456]86-*-linux* | x86_64-*-linux*)
	;;
    
    *-*-linux*)
	XCFLAGS="${XCFLAGS} -ftls-model=initial-exec"
	;;

  esac
fi

# Map the target cpu to an ARCH sub-directory.  At the same time,
# work out any special compilation flags as necessary.
case "${target_cpu}" in
  aarch64*)		ARCH=aarch64 ;;
  alpha*)		ARCH=alpha ;;
  rs6000 | powerpc*)
	XCFLAGS="${XCFLAGS} -mhtm"
	ARCH=powerpc
	;;

  arm*)		ARCH=arm ;;

  i[3456]86 | x86_64)
	cat > conftestx.c <<EOF
#ifndef __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
#error need -march=i486
#endif
EOF
	if ${CC} ${CFLAGS} -E conftestx.c > /dev/null 2>&1; then
	  :
	else
	  if test "${target_cpu}" = x86_64; then
	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
	  else
	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
	  fi
	  XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
	fi
	rm -f conftestx.c
	XCFLAGS="${XCFLAGS} -mrtm"
	ARCH=x86
	;;

  sh*)		ARCH=sh ;;

  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"
	    ;;
	  *" -m64 "*)
	    ;;
	  *)
	    if test "x$with_cpu" = xv8; then
	      XCFLAGS="${XCFLAGS} -mcpu=v9"
	    fi
	    ;;
	esac
	ARCH=sparc
	;;

  s390|s390x)
	XCFLAGS="${XCFLAGS} -mzarch -mhtm"
	ARCH=s390
	;;

  *)
	ARCH="${target_cpu}"
	;;
esac

# For the benefit of top-level configure, determine if the cpu is supported.
test -d ${srcdir}/config/$ARCH || UNSUPPORTED=1

# Since we require POSIX threads, assume a POSIX system by default.
config_path="$ARCH posix generic"

# Other system configury
case "${target}" in
  *-*-linux* | *-*-uclinux*)
	if test "$enable_linux_futex" = yes; then
	  config_path="linux/$ARCH linux $config_path"
	fi
	;;

  powerpc*-*-aix* | rs6000-*-aix*)
	# The system ought to be supported, but sjlj.S has not been ported.
	UNSUPPORTED=1
	;;

  *-*-gnu* | *-*-k*bsd*-gnu \
  | *-*-netbsd* | *-*-freebsd* | *-*-openbsd* \
  | *-*-solaris2* | *-*-sysv4* | *-*-hpux11* \
  | *-*-aix* | *-*-dragonfly*)
	# POSIX system.  The OS is supported.
	;;

  *-*-darwin*)
	# The OS is supported, but we need dynamic lookup to support undefined
	# weak symbols at link-time.
	XLDFLAGS="${XLDFLAGS} -Wl,-undefined,dynamic_lookup"
	;;

  *)	# Non-POSIX, or embedded system
	UNSUPPORTED=1
	;;
esac
