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