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