# Mappings from configuration triplets to gdbserver build options.
# This is invoked from the autoconf-generated configure script, to
# produce the appropriate Makefile substitutions.

# This file sets the following shell variables:
#   srv_regobj		The register protocol appropriate for this target.
#   srv_tgtobj		Any other target-specific modules appropriate
#			for this target.
#   srv_hostio_err	The object implementing the hostio_last_error
#			target method.
#   srv_xmltarget	The XML source file to use for target.xml, if any.
#   srv_xmlfiles	Any other XML files which should be available for
#			gdbserver in this configuration.
#
# In addition, on GNU/Linux the following shell variables will be set:
#   srv_linux_regsets	Set to "yes" if ptrace(PTRACE_GETREGS) and friends
#			may be available on this platform;  unset otherwise.
#			They will only be used if <sys/ptrace.h> defines
#			PTRACE_GETREGS.
#   srv_linux_usrregs	Set to "yes" if we can get at registers via
#			PTRACE_PEEKUSR / PTRACE_POKEUSR.

# Default hostio_last_error implementation
srv_hostio_err_objs="hostio-errno.o"

# Input is taken from the "${target}" variable.

case "${target}" in
  arc*-*-linux*)       srv_regobj=reg-arc.o
                       srv_tgtobj="linux-low.o linux-arc-low.o"
                       srv_linux_usrregs=yes
                       srv_linux_thread_db=yes
                       ;;
  arc*-*)              srv_regobj=reg-arc.o
                       srv_tgtobj="linux-low.o linux-arc-low.o"
                       srv_linux_usrregs=yes
                       srv_linux_thread_db=yes
                       ;;       
  arm*-*-linux*)	srv_tgtobj="linux-low.o linux-arm-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			if test $gdb_cv_arm_iwmmxt = yes; then
			  srv_regobj=arm-with-iwmmxt.o
			  srv_xmltarget=arm-with-iwmmxt.xml
			  srv_xmlfiles="arm-core.xml xscale-iwmmxt.xml"
			else
			  srv_regobj=reg-arm.o
			fi
			;;
  arm*-*-mingw32ce*)	srv_regobj=reg-arm.o
			srv_tgtobj="win32-low.o win32-arm-low.o"
			srv_tgtobj="${srv_tgtobj} wincecompat.o"
			# hostio_last_error implementation is in win32-low.c
			srv_hostio_err_objs=""
			srv_mingw=yes
			srv_mingwce=yes
			;;
  crisv32-*-linux*)	srv_regobj=reg-crisv32.o
			srv_tgtobj="linux-low.o linux-crisv32-low.o"
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  cris-*-linux*)	srv_regobj=reg-cris.o
			srv_tgtobj="linux-low.o linux-cris-low.o"
			srv_linux_usrregs=yes
			srv_linux_thread_db=yes
			;;
  i[34567]86-*-cygwin*)	srv_regobj=reg-i386.o
			srv_tgtobj="win32-low.o win32-i386-low.o"
			;;
  i[34567]86-*-linux*)	srv_regobj=reg-i386-linux.o
			srv_tgtobj="linux-low.o linux-i386-low.o i387-fp.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  i[34567]86-*-mingw*)	srv_regobj=reg-i386.o
			srv_tgtobj="win32-low.o win32-i386-low.o"
			srv_mingw=yes
			;;
  ia64-*-linux*)	srv_regobj=reg-ia64.o
			srv_tgtobj="linux-low.o linux-ia64-low.o"
			srv_linux_usrregs=yes
			;;
  m32r*-*-linux*)	srv_regobj=reg-m32r.o
			srv_tgtobj="linux-low.o linux-m32r-low.o"
			srv_linux_usrregs=yes
 			srv_linux_thread_db=yes
			;;
  m68*-*-linux*)	srv_regobj=reg-m68k.o
			srv_tgtobj="linux-low.o linux-m68k-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  m68*-*-uclinux*)	srv_regobj=reg-m68k.o
			srv_tgtobj="linux-low.o linux-m68k-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  mips*64*-*-linux*)	srv_regobj=mips64-linux.o
			srv_xmltarget=mips64-linux.xml
			srv_xmlfiles="mips64-cpu.xml mips64-cp0.xml mips64-fpu.xml"
			srv_tgtobj="linux-low.o linux-mips-low.o"
			srv_linux_regsets=yes
			srv_linux_usrregs=yes
			srv_linux_thread_db=yes
			;;
  mips*-*-linux*)	srv_regobj=mips-linux.o
			srv_xmltarget=mips-linux.xml
			srv_xmlfiles="mips-cpu.xml mips-cp0.xml mips-fpu.xml"
			srv_tgtobj="linux-low.o linux-mips-low.o"
			srv_linux_regsets=yes
			srv_linux_usrregs=yes
			srv_linux_thread_db=yes
			;;
  powerpc64-*-linux*)	srv_tgtobj="linux-low.o linux-ppc64-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			if test $gdb_cv_ppc_altivec = yes; then
			  srv_regobj=powerpc-64.o
			  srv_xmltarget=rs6000/powerpc-64.xml
			  srv_xmlfiles="rs6000/power-altivec.xml"
			  srv_xmlfiles="$srv_xmlfiles rs6000/power64-core.xml"
			  srv_xmlfiles="$srv_xmlfiles rs6000/power-fpu.xml"
			else
			  srv_regobj=reg-ppc64.o
			fi
			;;
  powerpc-*-linux*)	srv_tgtobj="linux-low.o linux-ppc-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			if test $gdb_cv_ppc_altivec = yes; then
			  srv_regobj=powerpc-32.o
			  srv_xmltarget=rs6000/powerpc-32.xml
			  srv_xmlfiles="rs6000/power-altivec.xml"
			  srv_xmlfiles="$srv_xmlfiles rs6000/power-core.xml"
			  srv_xmlfiles="$srv_xmlfiles rs6000/power-fpu.xml"
			elif test $gdb_cv_ppc_spe = yes; then
			  srv_regobj=powerpc-e500.o
			  srv_xmltarget=rs6000/powerpc-e500.xml
			  srv_xmlfiles="rs6000/power-spe.xml"
			  srv_xmlfiles="$srv_xmlfiles rs6000/power-core.xml"
			else
			  srv_regobj=reg-ppc.o
			fi
			;;
  s390-*-linux*)	srv_regobj=reg-s390.o
			srv_tgtobj="linux-low.o linux-s390-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  s390x-*-linux*)	srv_regobj=reg-s390x.o
			srv_tgtobj="linux-low.o linux-s390-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  sh*-*-linux*)		srv_regobj=reg-sh.o
			srv_tgtobj="linux-low.o linux-sh-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  spu*-*-*)		srv_regobj=reg-spu.o
			srv_tgtobj="spu-low.o"
			;;
  x86_64-*-linux*)	srv_regobj=reg-x86-64-linux.o
			srv_tgtobj="linux-low.o linux-x86-64-low.o i387-fp.o"
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  xscale*-*-linux*)	srv_regobj=reg-arm.o
			srv_tgtobj="linux-low.o linux-arm-low.o"
			srv_linux_usrregs=yes
			srv_linux_thread_db=yes
			;;
  xtensa*-*-linux*)	srv_regobj=reg-xtensa.o
			srv_tgtobj="linux-low.o linux-xtensa-low.o"
			srv_linux_regsets=yes
			;;
  *)			echo "Error: target not supported by gdbserver."
			exit 1
			;;
esac
