# configure.host

# This shell script handles all host based configuration for libgcj.
# It sets various shell variables based on the the host and the
# configuration options.  You can modify this shell script without
# needing to rerun autoconf.

# This shell script should be invoked as
#   . configure.host
# If it encounters an error, it will exit with a message.

# It uses the following shell variables:
#   host		The configuration host
#   host_cpu		The configuration host CPU
#   target_optspace	--enable-target-optspace ("yes", "no", "")

# It sets the following shell variables:
#   libgcj_cflags	Special CFLAGS to use when building
#   libgcj_cxxflags	Special CXXFLAGS to use when building
#   libgcj_javaflags	Special JAVAFLAGS to use when building
#   libgcj_interpreter  If the bytecode interpreter supports this platform.
#   enable_java_net_default  If java.net native code should be enabled by
#                            default.
#   enable_hash_synchronization_default  If hash synchronization should be
#                                        enabled by default.
#   sysdeps_dir		Directory containing system-dependent headers
#   slow_pthread_self   The synchronization code should try to avoid 
#			pthread_self calls by caching thread IDs in a hashtable
#   can_unwind_signal   Set to "yes" if the EH unwinder supports throwing
#			from a signal handler.
#   disable_dladdr      Set to "yes" if dladdr should not be used
#                       (i.e it is broken).

libgcj_flags=
libgcj_cflags=
libgcj_cxxflags=
libgcj_javaflags=
libgcj_interpreter=
enable_java_net_default=yes
enable_hash_synchronization_default=no
sysdeps_dir=generic
slow_pthread_self=
can_unwind_signal=no
disable_dladdr=

case "${target_optspace}:${host}" in
  yes:*)
    libgcj_flags="${libgcj_flags} -Os"
    ;;
  :m32r-* | :d10v-* | :d30v-*)
    libgcj_flags="${libgcj_flags} -Os"
    ;;
  no:* | :*)
    # Nothing.
    ;;
esac

AM_RUNTESTFLAGS= 

# Set any host dependent compiler flags.
# THIS TABLE IS SORTED.  KEEP IT THAT WAY.

echo "$target"

DIVIDESPEC=-fuse-divide-subroutine
EXCEPTIONSPEC=-fnon-call-exceptions
CHECKREFSPEC=

# This case statement supports per-CPU defaults.
case "${host}" in
  arm*-elf | strongarm*-elf | xscale*-elf)
	with_libffi_default=no
	PROCESS=Ecos
	FILE=Posix
	CHECKREFSPEC=-fcheck-references
	EXCEPTIONSPEC=
	enable_java_net_default=no
	enable_getenv_properties_default=no
	enable_main_args_default=no
	;;
  mips-tx39-*|mipstx39-unknown-*)
	libgcj_flags="${libgcj_flags} -G 0"
	LDFLAGS="$LDFLAGS -Tjmr3904dram.ld"
	AM_RUNTESTFLAGS="--target_board=jmr3904-sim"	
	# Use "Ecos" processes since they are a no-op.
	PROCESS=Ecos
	FILE=Posix
 	enable_java_net_default=no
 	enable_getenv_properties_default=no
	;;
  i686-*|i586-*|i486-*|i386-*)
	sysdeps_dir=i386
	libgcj_flags="${libgcj_flags} -ffloat-store -fno-omit-frame-pointer"
	libgcj_interpreter=yes
	libgcj_cxxflags=
	libgcj_cflags=
	DIVIDESPEC=-fno-use-divide-subroutine
	enable_hash_synchronization_default=yes
	slow_pthread_self=yes
	;;
  x86_64-*)
	sysdeps_dir=x86-64
	libgcj_flags="${libgcj_flags} -ffloat-store -fno-omit-frame-pointer"
	libgcj_cxxflags=
	libgcj_cflags=
	DIVIDESPEC=-f%{m32:no-}use-divide-subroutine
	enable_hash_synchronization_default=yes
	slow_pthread_self=yes
	libgcj_interpreter=yes
	;;
  alpha*-*)
	sysdeps_dir=alpha
	libgcj_flags="${libgcj_flags} -mieee"
	libgcj_interpreter=yes
	enable_hash_synchronization_default=yes
	IEEESPEC=-mieee
	;;
  hppa-*)
	sysdeps_dir=pa
	libgcj_interpreter=yes
	enable_hash_synchronization_default=yes
	;;
  powerpc64*-*)
	sysdeps_dir=powerpc
	libgcj_interpreter=yes
	if [ x`$CC -print-multi-os-directory` = x../lib64 ]; then
	    libgcj_flags="${libgcj_flags} -mminimal-toc"
	fi
	enable_hash_synchronization_default=yes
	slow_pthread_self=yes
	;;
  powerpc*-*)
	sysdeps_dir=powerpc
	libgcj_interpreter=yes
	enable_hash_synchronization_default=yes
	slow_pthread_self=yes
	;;
  s390*-*)
	sysdeps_dir=s390
	libgcj_interpreter=yes
	DIVIDESPEC=-fno-use-divide-subroutine
	enable_hash_synchronization_default=yes
	;;
  sparc*-*)
	libgcj_interpreter=yes
        ;;
  ia64-*)
	sysdeps_dir=ia64
        libgcj_flags="${libgcj_flags} -funwind-tables"
	libgcj_interpreter=yes
	enable_hash_synchronization_default=yes
	;;
  sh-* | sh[34]*-*)
	sysdeps_dir=sh
	libgcj_flags="${libgcj_flags} -mieee"
	libgcj_interpreter=yes
	enable_hash_synchronization_default=yes
	;;
esac

# This case statement supports generic port properties and may refine
# the above per-CPU defaults.  Note: If your OS implements
# MD_FALLBACK_FRAME_STATE_FOR, then you want to set can_unwind_signal
# here.
case "${host}" in
  i[34567]86*-linux* | \
  powerpc*-linux* | \
  alpha*-linux* | \
  s390*-linux* | \
  sparc*-linux* | \
  ia64-* | \
  x86_64*-linux* | \
  hppa*-linux* | \
  sh-linux* | sh[34]*-linux*)
  	can_unwind_signal=yes
	libgcj_ld_symbolic='-Wl,-Bsymbolic'
	if test x$slow_pthread_self = xyes \
	   && test x$cross_compiling != xyes; then
	  cat > conftest.c <<EOF
#define _GNU_SOURCE 1
#include <pthread.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <limits.h>

void *
tf (void *arg __attribute__ ((unused)))
{
  pthread_attr_t a;
  size_t s;

  if (pthread_getattr_np (pthread_self (), &a)
      || pthread_attr_getstacksize (&a, &s)
      || s > 2 * PTHREAD_STACK_MIN)
    exit (1);
  exit (0);
}

int
main (int argc, char **argv)
{
  pthread_t p;
  void *ret;
  struct rlimit r;

  if (argc == 2)
    {
      r.rlim_cur = 2 * PTHREAD_STACK_MIN;
      r.rlim_max = 2 * PTHREAD_STACK_MIN;
      if (setrlimit (RLIMIT_STACK, &r))
	exit (1);
      execl (argv[1], argv[0], NULL);
      exit (1);
    }

  if (pthread_create (&p, NULL, tf, NULL)
      || pthread_join (p, &ret))
    exit (1);
  exit (1);
}
EOF
	  $CC -o conftest conftest.c -lpthread > /dev/null 2>&1 && \
	  ./conftest ./conftest && slow_pthread_self=
	  rm -f conftest conftest.c
	fi
	;;
  i[34567]86-*-solaris2.1[0-9]* )
	sysdeps_dir=x86-64
	DIVIDESPEC=-f%{m32:no-}%{!m32:%{!m64:no-}}%{m64:}use-divide-subroutine
	;;
  mips*-*-linux* )
  	sysdeps_dir=mips
  	can_unwind_signal=yes
	DIVIDESPEC=-fno-use-divide-subroutine
	case "${host}" in
	    mipsel*-linux* | mipsisa32el*-linux*)
		enable_hash_synchronization_default=yes
		disable_dladdr=yes
	    ;;
	esac
	;;
  powerpc*-*-darwin*)
	enable_hash_synchronization_default=yes
	slow_pthread_self=
	can_unwind_signal=yes
	;;
  *-*-freebsd*)
	slow_pthread_self=
	;;
  *-mingw*)
  	# FIXME: win32_exception_handler( ) in win32.cc does not do the
	# right stuff yet w.r.t. SEH. Live with the following for now.
	can_unwind_signal=no
	CHECKREFSPEC=-fcheck-references
	DIVIDESPEC=-fuse-divide-subroutine
	;;
  *-cygwin*)
  	# The cygwin linker doesn't do 8-byte alignment by default, so
	# disable hash synchronization for now.
	enable_hash_synchronization_default=no
	slow_pthread_self=
	;;
esac

libgcj_cflags="${libgcj_cflags} ${libgcj_flags}"
libgcj_cxxflags="${libgcj_cxxflags} ${libgcj_flags}"
libgcj_javaflags="${libgcj_javaflags} ${libgcj_flags}"
