# -*- shell-script -*-
#   Copyright (C) 2012-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 see <http://www.gnu.org/licenses/>.

# 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.

# Filter out unsupported systems.
TSAN_TARGET_DEPENDENT_OBJECTS=
SANITIZER_COMMON_TARGET_DEPENDENT_OBJECTS=
case "${target}" in
  x86_64-*-freebsd* | i?86-*-freebsd*)
	;;
  x86_64-*-linux* | i?86-*-linux*)
	if test x$ac_cv_sizeof_void_p = x8; then
		TSAN_SUPPORTED=yes
		LSAN_SUPPORTED=yes
		TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_amd64.lo
	fi
	;;
  powerpc*-*-linux*)
	if test x$ac_cv_sizeof_void_p = x8; then
		TSAN_SUPPORTED=yes
		LSAN_SUPPORTED=yes
		TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_ppc64.lo
	fi
	;;
  sparc*-*-linux*)
	;;
  s390*-*-linux*)
	if test x$ac_cv_sizeof_void_p = x8; then
		TSAN_SUPPORTED=yes
		LSAN_SUPPORTED=yes
		TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_s390x.lo
	fi
	;;
  sparc*-*-solaris2.11*)
	;;
  arm*-*-*fdpiceabi)
	UNSUPPORTED=1
	;;
  arm*-*-linux*)
	;;
  mips*64*-*-linux*)
	# This clause is only here to not match the supported mips*-*-linux*.
	UNSUPPORTED=1
	;;
  mips*-*-linux*)
	;;
  aarch64*-*-linux*)
	if test x$ac_cv_sizeof_void_p = x8; then
		TSAN_SUPPORTED=yes
		LSAN_SUPPORTED=yes
		TSAN_TARGET_DEPENDENT_OBJECTS=tsan_rtl_aarch64.lo
		HWASAN_SUPPORTED=yes
	fi
	;;
  x86_64-*-darwin2* | x86_64-*-darwin1[2-9]* | i?86-*-darwin1[2-9]*)
	TSAN_SUPPORTED=no
	EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -Wl,-undefined,dynamic_lookup"
	;;
  x86_64-*-solaris2.11* | i?86-*-solaris2.11*)
	;;
  riscv64-*-linux*)
	;;
  *)
	UNSUPPORTED=1
	;;
esac
