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

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

case "${target}" in
  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"
			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_regobj=reg-ppc64.o
			srv_tgtobj="linux-low.o linux-ppc64-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  powerpc-*-linux*)	srv_regobj=reg-ppc.o
			srv_tgtobj="linux-low.o linux-ppc-low.o"
			srv_linux_usrregs=yes
			srv_linux_regsets=yes
			srv_linux_thread_db=yes
			;;
  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
			;;
  *)			echo "Error: target not supported by gdbserver."
			exit 1
			;;
esac
