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