# -*- 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
		HWASAN_SUPPORTED=yes
	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*-*-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[01]* | x86_64-*-darwin1[6-9]* | i?86-*-darwin1[6-8]*)
	TSAN_SUPPORTED=no
	EXTRA_CXXFLAGS="${EXTRA_CXXFLAGS} -Wl,-undefined,dynamic_lookup"
	;;
  x86_64-*-solaris2.11* | i?86-*-solaris2.11*)
	;;
  riscv64-*-linux*)
	;;
  loongarch64-*-linux*)
	;;
  *)
	UNSUPPORTED=1
	;;
esac
