# 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

aarch64*)		gdb_host_cpu=aarch64 ;;
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 ;;

aarch64*-*-linux*)	gdb_host=linux ;;

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*-*-freebsd*)	gdb_host=fbsd ;;
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
			;;
x86_64-*-cygwin*)	gdb_host=cygwin64 ;;
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
