# Mapping of configurations into GDB host definitions.  This is
# invoked from the autoconf generated configure script.

# This file sets the following shell variables:
#  gdb_host_cpu			generic name of host's CPU
#  gdb_host			name of GDB host definition to use
#  gdb_host_float_format	host's float floatformat, or 0
#  gdb_host_double_format	host's double floatformat, or 0
#  gdb_host_long_double_format	host's long double floatformat, or 0
#  gdb_host_obs			host-specific .o files to include

# Map host cpu into the config cpu subdirectory name.
# The default is $host_cpu.

case $host in
 alpha*-*-osf1* | \
 alpha*-*-osf2* | \
 hppa*-*-hiux* | \
 i[34567]86-ncr-* | \
 i[34567]86-*-dgux* | \
 i[34567]86-*-lynxos* | \
 i[34567]86-*-sco3.2v5* | \
 i[34567]86-*-sco3.2v4* | \
 i[34567]86-*-sco* | \
 i[34567]86-*-sysv4.2* | \
 i[34567]86-*-sysv4* | \
 i[34567]86-*-sysv5* | \
 i[34567]86-*-unixware2* | \
 i[34567]86-*-unixware* | \
 i[34567]86-*-sysv* | \
 i[34567]86-*-isc* | \
 rs6000-*-lynxos* | \
 null)
    echo "*** Configuration $host is obsolete." >&2
    echo "*** Support has been REMOVED." >&2
    exit 1
    ;;
esac

case "${host_cpu}" in

alpha*)			gdb_host_cpu=alpha ;;
arm*)			gdb_host_cpu=arm ;;
hppa*)			gdb_host_cpu=pa ;;
i[34567]86*)		gdb_host_cpu=i386 ;;
m68*)			gdb_host_cpu=m68k ;;
m88*)			gdb_host_cpu=m88k ;;
mips*)			gdb_host_cpu=mips ;;
powerpc* | rs6000)	gdb_host_cpu=powerpc ;;
sparcv9 | sparc64)	gdb_host_cpu=sparc ;;
s390*)			gdb_host_cpu=s390 ;;
sh*)			gdb_host_cpu=sh ;;
tilegx*)		gdb_host_cpu=tilegx ;;
x86_64*)		gdb_host_cpu=i386 ;;
m32r*)			gdb_host_cpu=m32r ;;
xtensa*)		gdb_host_cpu=xtensa ;;
*)			gdb_host_cpu=$host_cpu ;;

esac

# map host info into gdb names.

case "${host}" in

*-*-darwin*)		gdb_host=darwin ;;

alpha*-*-osf[3456789]*)	gdb_host=alpha-osf3 ;;
alpha*-*-linux*)	gdb_host=alpha-linux ;;
alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu)
			gdb_host=fbsd ;;
alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu)
			gdb_host=nbsd ;;
alpha*-*-openbsd*)	gdb_host=nbsd ;;

arm*-*-linux*)		gdb_host=linux ;;
arm*-*-netbsdelf* | arm*-*-knetbsd*-gnu)
			gdb_host=nbsdelf ;;
arm*-*-netbsd*)		gdb_host=nbsdaout ;;
arm*-*-openbsd*)	gdb_host=nbsdelf ;;

hppa*-*-hpux*)
			gdb_host=hpux ;;
hppa*-*-linux*)		gdb_host=linux ;;
hppa*-*-netbsd*)	gdb_host=nbsd ;;
hppa*-*-openbsd*)	gdb_host=obsd ;;

i[34567]86-*-freebsd* | i[34567]86-*-kfreebsd*-gnu)
			gdb_host=fbsd ;;
i[34567]86-*-netbsdelf* | i[34567]86-*-knetbsd*-gnu)
			gdb_host=nbsdelf ;;
i[34567]86-*-netbsd*)	gdb_host=nbsdaout ;;
i[34567]86-*-go32*)	gdb_host=go32 ;;
i[34567]86-*-mingw32*)	gdb_host=mingw
			gdb_host_obs=mingw-hdep.o
			;;
i[34567]86-*-msdosdjgpp*) gdb_host=go32 ;;
i[34567]86-*-linux*)	gdb_host=linux ;;
i[34567]86-*-gnu*)	gdb_host=i386gnu ;;
i[3456]86-*-nto*) 	gdb_host=nto ;;
i[34567]86-*-openbsd[0-2].* | i[34567]86-*-openbsd3.[0-3])
			gdb_host=obsdaout ;;
i[34567]86-*-openbsd*)	gdb_host=obsd ;;
i[34567]86-*-solaris2.1[0-9]* | x86_64-*-solaris2.1[0-9]*)
			gdb_host=sol2-64 ;;
i[34567]86-*-solaris*)	gdb_host=i386sol2 ;;
i[34567]86-*-cygwin*)	gdb_host=cygwin ;;

ia64-*-hpux*)		gdb_host=hpux ;;
ia64-*-linux*)		gdb_host=linux ;;

m68*-*-linux*)		gdb_host=linux ;;
m68*-*-netbsdelf* | m68*-*-knetbsd*-gnu)
			gdb_host=nbsdelf ;;
m68*-*-netbsd*)		gdb_host=nbsdaout ;;
m68*-*-openbsd*)	gdb_host=obsd ;;

m88*-*-openbsd*)	gdb_host=obsd ;;

mips-sgi-irix5*)	gdb_host=irix5 ;;
mips-sgi-irix6*)	gdb_host=irix6 ;;
mips*-*-linux*)		gdb_host=linux ;;
mips*-*-netbsd* | mips*-*-knetbsd*-gnu)
			gdb_host=nbsd ;;
mips64*-*-openbsd*)	gdb_host=obsd64 ;;

powerpc-*-aix* | rs6000-*-*)
			gdb_host=aix ;;
powerpc-*-linux*)	gdb_host=linux ;;
powerpc-*-netbsd* | powerpc-*-knetbsd*-gnu)
			gdb_host=nbsd ;;
powerpc-*-openbsd*)	gdb_host=obsd ;;

powerpc64-*-linux*)     gdb_host=ppc64-linux
                        # Support 'pseudo-native' debugging on the Cell BE
                        if test "${target_cpu}" = "spu"; then
				gdb_host=spu-linux
				gdb_native=yes
                        fi
			;;

s390*-*-*)		gdb_host=s390 ;;

sh*-*-netbsdelf* | sh*-*-knetbsd*-gnu)
			gdb_host=nbsd ;;
sh*-*-openbsd*)		gdb_host=nbsd ;;

sparc64-*-freebsd* | sparc64-*-kfreebsd*-gnu)
			gdb_host=fbsd ;;
sparc-*-linux*)		gdb_host=linux ;;
sparc64-*-linux*)	gdb_host=linux64 ;;
sparc-*-netbsdelf* | sparc-*-knetbsd*-gnu)
			gdb_host=nbsdelf ;;
sparc-*-netbsdaout*)	gdb_host=nbsdaout ;;
sparc-*-netbsd*)	gdb_host=nbsdaout ;;
sparc64-*-netbsd* | sparc64-*-knetbsd*-gnu)
			gdb_host=nbsd64 ;;
sparc-*-openbsd*)	gdb_host=nbsdelf ;;
sparc64-*-openbsd*)	gdb_host=nbsd64 ;;
sparc-*-solaris2* | sparcv9-*-solaris2* | sparc64-*-solaris2*)
			gdb_host=sol2
			;;

tilegx-*-linux*)	gdb_host=linux ;;

vax-*-bsd*)		gdb_host=vax ;;
vax-*-netbsdelf* | vax-*-knetbsd*-gnu)
			gdb_host=nbsdelf ;;
vax-*-netbsd*)		gdb_host=nbsdaout ;;
vax-*-openbsd*)		gdb_host=obsd ;;
vax-*-ultrix*)		gdb_host=vax ;;

x86_64-*-linux*)	gdb_host=linux64 ;;
x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu)
			gdb_host=fbsd64 ;;
x86_64-*-netbsd* | x86_64-*-knetbsd*-gnu)
			gdb_host=nbsd64 ;;
x86_64-*-openbsd*)	gdb_host=obsd64 ;;
x86_64-*-mingw*)        gdb_host=mingw64
			gdb_host_obs=mingw-hdep.o
			;;
m32r*-*-linux*)          gdb_host=linux ;;

xtensa*-*-linux*)	gdb_host=linux ;;

esac



# Map the host/cpu onto the floatformat correspondong to C's "float",
# "double" and "long double" types.

case "${host}" in
i[34567]86-*-*)
	gdb_host_float_format="&floatformat_ieee_single_little"
	gdb_host_double_format="&floatformat_ieee_double_little"
	gdb_host_long_double_format="&floatformat_i387_ext"
	;;
hppa*-*-linux*)
	gdb_host_float_format="&floatformat_ieee_single_big"
	gdb_host_double_format="&floatformat_ieee_double_big"
	gdb_host_long_double_format="&floatformat_ieee_double_big"
	;;
m68*-*-*)
	gdb_host_float_format="&floatformat_ieee_single_big"
	gdb_host_double_format="&floatformat_ieee_double_big"
	gdb_host_long_double_format="&floatformat_m68881_ext"
	;;
ia64-*-hpux*)
	gdb_host_float_format="&floatformat_ieee_single_big"
	gdb_host_double_format="&floatformat_ieee_double_big"
	gdb_host_long_double_format="&floatformat_ia64_quad_big"
	;;
*)
	gdb_host_float_format=0
	gdb_host_double_format=0
	gdb_host_long_double_format=0
	;;
esac
