# 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

    *-*-k*bsd*-gnu*)
	;;

    *-*-linux* | *-*-gnu*)
	XCFLAGS="${XCFLAGS} -ftls-model=initial-exec -DUSING_INITIAL_EXEC_TLS"
	;;

    *-*-rtems*)
	XCFLAGS="${XCFLAGS} -ftls-model=local-exec"
	;;
  esac
fi

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

# Check for futex enabled all at once.
if test x$enable_linux_futex = xyes; then
  case "${target}" in

    aarch64*-*-linux*)
	config_path="linux posix"
	;;

    alpha*-*-linux*)
	config_path="linux/alpha linux posix"
	;;

    arm*-*-linux*)
	config_path="linux posix"
	;;

    ia64*-*-linux*)
	config_path="linux/ia64 linux posix"
	;;

    mips*-*-linux*)
	config_path="linux/mips linux posix"
	;;

    powerpc*-*-linux*)
	config_path="linux/powerpc linux posix"
	;;

    s390*-*-linux*)
	config_path="linux/s390 linux posix"
	;;

    tile*-*-linux*)
	config_path="linux/tile linux posix"
	;;

    # Note that bare i386 is not included here.  We need cmpxchg.
    i[456]86-*-linux*)
	config_path="linux/x86 linux posix"
	case " ${CC} ${CFLAGS} " in
	  *" -m64 "*|*" -mx32 "*)
	    ;;
	  *)
	    if test -z "$with_arch"; then
	      XCFLAGS="${XCFLAGS} -march=i486 -mtune=${target_cpu}"
	    fi
	esac
	;;

    # Similar jiggery-pokery for x86_64 multilibs, except here we
    # can't rely on the --with-arch configure option, since that
    # applies to the 64-bit side.
    x86_64-*-linux*)
	config_path="linux/x86 linux posix"
	case " ${CC} ${CFLAGS} " in
	  *" -m32 "*)
	    XCFLAGS="${XCFLAGS} -march=i486 -mtune=generic"
	    ;;
	esac
	;;

    # Note that sparcv7 and sparcv8 is not included here.  We need cas.
    sparcv9-*-linux* | sparc64-*-linux*)
	echo "int i;" > conftestx.c
	if ${CC} ${CFLAGS} -c -o conftestx.o conftestx.c > /dev/null 2>&1; then
	  config_path="linux/sparc linux posix"
	  case "`/usr/bin/file conftestx.o`" in
	    *32-bit*)
	      case " ${CC} ${CFLAGS}" in
		*" -mcpu=ultrasparc"*)
		  ;;
		*)
		  XCFLAGS="${XCFLAGS} -mcpu=v9"
		  ;;
	      esac
	      ;;
	  esac
	fi
	rm -f conftestx.c conftestx.o
	;;
  esac
fi

# Other system configury
case "${target}" in

  *-*-hpux*)
	config_path="hpux posix"
	case "${target}" in
	  *-*-hpux11*)
	     # HPUX v11.x requires -lrt to resolve sem_init in libgomp.la
	     XLDFLAGS="${XLDFLAGS} -lrt"
	     ;;
	esac
	case "${target}" in
	  hppa[12]*-*-hpux*)
	    # PA 32 HP-UX needs -frandom-seed for bootstrap compare.
	    XCFLAGS="${XCFLAGS} -frandom-seed=fixed-seed"
	    ;;
	esac
	;;

  *-*-mingw32*)
	config_path="mingw32 posix"
	;;

  *-*-darwin*)
	config_path="bsd darwin posix"
	;;

  *-*-freebsd*)
	# Need to link with -lpthread so libgomp.so is self-contained.
	XLDFLAGS="${XLDFLAGS} -lpthread"
	;;

  *-*-aix*)
	config_path="posix"
	# Need to link with -lpthread so libgomp.so is self-contained.
	XLDFLAGS="${XLDFLAGS} -lpthread"
	# AIX needs -frandom-seed for bootstrap compare.
	XCFLAGS="${XCFLAGS} -frandom-seed=\$@"
	;;

  nvptx*-*-*)
	config_path="nvptx"
	;;

  *-*-rtems*)
	# Use self-contained synchronization objects if provided by Newlib
	if test "x$ac_cv_type_struct__Mutex_Control" = xyes ; then
	    config_path="rtems posix"
	fi
	;;

  *)
	;;

esac
