# -*- shell-script -*-
#   Copyright (C) 2011-2018 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

    # 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)
	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
	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
	;;

  x86_64)
	case " ${CC} ${CFLAGS} " in
	  *" -m32 "*)
	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
	    XCFLAGS="${XCFLAGS} -fomit-frame-pointer"
	    ;;
	esac
	XCFLAGS="${XCFLAGS} -mrtm"
	ARCH=x86
	;;
  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*)
	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* \
  | *-*-darwin* | *-*-aix* | *-*-dragonfly*)
	# POSIX system.  The OS is supported.
	;;

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