From a267b06e1e2ef0cd7da0b8d418c348c51b4904e7 Mon Sep 17 00:00:00 2001 From: Maximilian Downey Twiss <creatorsmithmdt@gmail.com> Date: Fri, 25 Nov 2022 17:05:30 +1100 Subject: [PATCH 56/56] java, libjava: Upgrade from in-tree boehm-gc to external boehm-gc 8.3.0.
gcc/java/ChangeLog: * boehm.cc (get_boehm_type_descriptor): Remove check for flag_use_boehm_gc. (uses_jv_markobj_p): Remove flag_use_boehm_gc assert. * jvspec.cc: Remove fuse-boehm-gc. * lang.opt: Likewise. libjava/ChangeLog: * boehm.cc (GC_REDIRECT_TO_LOCAL): Include gc/gc.h instead of gc_local_alloc.h. (_Jv_SetGCFreeSpaceDivisor): Use GC_get_free_space_divisor to get old_div (before GC_set_free_space_divisor call). (_Jv_InitGC): Use GC_set variants of functions. (_Jv_GCInitializeFinalizers): Likewise. * configure.ac: Replace in-tree check with external checks from libobjc, check that found version is modern enough. * gnu/gcj/util/natGCInfo.cc (PACKAGE_NAME): Remove. (PACKAGE_STRING): Likewise. (PACKAGE_TARNAME): Likewise. (PACKAGE_VERSION): Likewise. (TRUE): Likewise. (FALSE): Likewise. (GC_print_debug_callback): Replace GC_n_set_marks with public functions. (struct print_hblkfl_s): Add. (UNIQUE_THRESHOLD): Remove. (HUGE_THRESHOLD): Likewise. (FL_COMPRESSION): Likewise. (N_HBLK_FLS): Likewise. (print_hblkfl_file_item): Add. (IS_MAPPED): Remove. (GC_print_hblkfreelist_file): Handle lack of HDR macro. (GC_print_debug_info_file): Use GC_word instead of word, handle lack of struct hblkhdr. (GC_enumerator::enumerate): Use GC_word instead of word. (GC_enumerator::enumerate_callback_adaptor): Use GC_word instead of word, handle lack of struct hblkhdr. (GC_enumerator::enumerate_callback): Handle lack of HDR macro. * include/boehm-gc.h: Include gc/gc.h instead of gc_ext_config.h, adjust comment accordingly. * libgcj.spec.in: Remove GCSPEC and JC1GCSPEC. * Makefile.in: Reconfigure. * configure: Likewise. * gcj/Makefile.in: Likewise. * include/Makefile.in: Likewise. * include/config.h.in: Likewise. * testsuite/Makefile.in: Likewise. Co-authored-by: Ivan Maidanski <ivmai@mail.ru> --- gcc/java/boehm.cc | 6 - gcc/java/jvspec.cc | 2 +- gcc/java/lang.opt | 4 - libjava/Makefile.in | 4 - libjava/boehm.cc | 24 +-- libjava/configure | 309 +++++++++++++++++++++++++----- libjava/configure.ac | 202 +++++++++++++++---- libjava/gcj/Makefile.in | 4 - libjava/gnu/gcj/util/natGCInfo.cc | 171 +++++------------ libjava/include/Makefile.in | 4 - libjava/include/boehm-gc.h | 5 +- libjava/include/config.h.in | 3 + libjava/libgcj.spec.in | 4 +- libjava/testsuite/Makefile.in | 4 - 14 files changed, 501 insertions(+), 245 deletions(-) diff --git a/gcc/java/boehm.cc b/gcc/java/boehm.cc index 38a2131e6f8..5859f038998 100644 --- a/gcc/java/boehm.cc +++ b/gcc/java/boehm.cc @@ -136,10 +136,6 @@ get_boehm_type_descriptor (tree type) int pointer_after_end = 0; tree field, value, value_type; - /* If the GC wasn't requested, just use a null pointer. */ - if (! flag_use_boehm_gc) - return null_pointer_node; - value_type = java_type_for_mode (ptr_mode, 1); wide_int mask = wi::zero (TYPE_PRECISION (value_type)); @@ -223,8 +219,6 @@ bool uses_jv_markobj_p (tree dtable) { tree v; - /* FIXME: what do we return if !flag_use_boehm_gc ? */ - gcc_assert (flag_use_boehm_gc); /* FIXME: this is wrong if TARGET_VTABLE_USES_DESCRIPTORS. However, this function is only used with flag_reduced_reflection. No point in asserting unless we hit the bad case. */ diff --git a/gcc/java/jvspec.cc b/gcc/java/jvspec.cc index 58142368621..3786926e8d9 100644 --- a/gcc/java/jvspec.cc +++ b/gcc/java/jvspec.cc @@ -66,7 +66,7 @@ static const char jvgenmain_spec[] = %<fassume-compiled* %<fno-assume-compiled*\ %<fcompile-resource* %<fassert %<fno-assert \ %<femit-class-file %<femit-class-files %<fencoding*\ - %<fuse-boehm-gc %<fhash-synchronization %<fjni\ + %<fhash-synchronization %<fjni\ %<findirect-dispatch\ %<fno-store-check %<foutput-class-dir\ %<fclasspath* %<fbootclasspath*\ diff --git a/gcc/java/lang.opt b/gcc/java/lang.opt index a6596d55a9c..594866da707 100644 --- a/gcc/java/lang.opt +++ b/gcc/java/lang.opt @@ -256,10 +256,6 @@ fstore-check Java Var(flag_store_check) Init(1) Enable assignability checks for stores into object arrays. -fuse-boehm-gc -Java Var(flag_use_boehm_gc) -Generate code for the Boehm GC. - fuse-divide-subroutine Java Var(flag_use_divide_subroutine) Init(1) Call a library routine to do integer divisions. diff --git a/libjava/Makefile.in b/libjava/Makefile.in index e1780d99c16..18ea3fd65da 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -679,7 +679,6 @@ EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCC_FOR_ECJX = @GCC_FOR_ECJX@ -GCDEPS = @GCDEPS@ GCINCS = @GCINCS@ GCJ = @GCJ@ GCJDEPMODE = @GCJDEPMODE@ @@ -689,8 +688,6 @@ GCJVERSION = @GCJVERSION@ GCJ_BIN_DIR = @GCJ_BIN_DIR@ GCJ_FOR_ECJX = @GCJ_FOR_ECJX@ GCLIBS = @GCLIBS@ -GCSPEC = @GCSPEC@ -GCTESTSPEC = @GCTESTSPEC@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ @@ -708,7 +705,6 @@ INTERPRETER = @INTERPRETER@ JAR = @JAR@ JAVA_HOME = @JAVA_HOME@ JAVA_VERSION = @JAVA_VERSION@ -JC1GCSPEC = @JC1GCSPEC@ JRE_BIN_DIR = @JRE_BIN_DIR@ JRE_DIR = @JRE_DIR@ JRE_LIB_DIR = @JRE_LIB_DIR@ diff --git a/libjava/boehm.cc b/libjava/boehm.cc index 043fd0030ca..da90f6db705 100644 --- a/libjava/boehm.cc +++ b/libjava/boehm.cc @@ -40,20 +40,18 @@ details. */ extern "C" { -#include <gc_config.h> - // Set GC_DEBUG before including gc.h! #ifdef LIBGCJ_GC_DEBUG # define GC_DEBUG #endif -#include <gc_mark.h> -#include <gc_gcj.h> -#include <javaxfc.h> // GC_finalize_all declaration. +#include <gc/gc_mark.h> +#include <gc/gc_gcj.h> +#include <gc/javaxfc.h> // GC_finalize_all declaration. #ifdef THREAD_LOCAL_ALLOC # define GC_REDIRECT_TO_LOCAL -# include <gc_local_alloc.h> +# include <gc/gc.h> #endif // From boehm's misc.c @@ -468,7 +466,9 @@ _Jv_GCSetMaximumHeapSize (size_t size) int _Jv_SetGCFreeSpaceDivisor (int div) { - return (int)GC_set_free_space_divisor ((GC_word)div); + int old_div = (int)GC_get_free_space_divisor (); + GC_set_free_space_divisor ((GC_word)div); + return old_div; } void @@ -523,7 +523,7 @@ _Jv_InitGC (void) gc_initialized = 1; // Ignore pointers that do not point to the start of an object. - GC_all_interior_pointers = 0; + GC_set_all_interior_pointers(0); #if defined (HAVE_DLFCN_H) && defined (HAVE_DLADDR) // Tell the collector to ask us before scanning DSOs. @@ -538,9 +538,9 @@ _Jv_InitGC (void) // Cause an out of memory error to be thrown from the allocators, // instead of returning 0. This is cheaper than checking on allocation. - GC_oom_fn = handle_out_of_memory; + GC_set_oom_fn(handle_out_of_memory); - GC_java_finalization = 1; + GC_set_java_finalization(1); // We use a different mark procedure for object arrays. This code // configures a different object `kind' for object array allocation and @@ -597,8 +597,8 @@ _Jv_AllocTraceTwo (jsize size /* includes vtable slot */) void _Jv_GCInitializeFinalizers (void (*notifier) (void)) { - GC_finalize_on_demand = 1; - GC_finalizer_notifier = notifier; + GC_set_finalize_on_demand(1); + GC_set_finalizer_notifier(notifier); } void diff --git a/libjava/configure b/libjava/configure index 30cffa633c3..966b5154f35 100755 --- a/libjava/configure +++ b/libjava/configure @@ -739,10 +739,6 @@ USING_NOGC_FALSE USING_NOGC_TRUE USING_BOEHMGC_FALSE USING_BOEHMGC_TRUE -GCTESTSPEC -JC1GCSPEC -GCSPEC -GCDEPS GCINCS GCLIBS LIBGCJTESTSPEC @@ -1023,6 +1019,9 @@ with_ecos with_system_zlib with_x enable_java_gc +with_target_bdw_gc +with_target_bdw_gc_include +with_target_bdw_gc_lib enable_rpath with_libiconv_prefix with_libiconv_type @@ -1719,7 +1718,8 @@ Optional Features: --enable-interpreter enable interpreter --disable-java-net disable java.net --disable-jvmpi disable JVMPI support - --enable-java-gc=TYPE choose garbage collector (default is boehm) + --enable-java-gc[=ARG] enable the use of the bdw-gc garbage collector with + libjava [ARG={default,yes,no}] --disable-rpath do not hardcode runtime library paths --enable-tls Use thread-local storage [default=yes] --disable-symvers disable symbol versioning for libjava @@ -1753,6 +1753,16 @@ Optional Packages: --with-ecos enable runtime eCos target support --with-system-zlib use installed libz --with-x use the X Window System + --with-target-bdw-gc=PATHLIST + specify prefix directory for installed bdw-gc + package. Equivalent to + --with-target-bdw-gc-include=PATH/include plus + --with-target-bdw-gc-lib=PATH/lib + --with-target-bdw-gc-include=PATHLIST + specify directories for installed bdw-gc include + files + --with-target-bdw-gc-lib=PATHLIST + specify directories for installed bdw-gc library --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir @@ -13128,7 +13138,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13131 "configure" +#line 13141 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13234,7 +13244,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13237 "configure" +#line 13247 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -21426,55 +21436,264 @@ fi -# Allow the GC to be disabled. Can be useful when debugging. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for garbage collector to use" >&5 -$as_echo_n "checking for garbage collector to use... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if garbage collector is enabled" >&5 +$as_echo_n "checking if garbage collector is enabled... " >&6; } # Check whether --enable-java-gc was given. if test "${enable_java_gc+set}" = set; then : - enableval=$enable_java_gc; GC=$enableval -else - GC=boehm -fi - -GCLIBS= -GCINCS= -GCDEPS= -GCSPEC= -JC1GCSPEC= -GCTESTSPEC= -case "$GC" in - boehm) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: boehm" >&5 -$as_echo "boehm" >&6; } - GCLIBS=../boehm-gc/libgcjgc_convenience.la - JC1GCSPEC='-fuse-boehm-gc' - GCTESTSPEC="-L`${PWDCMD-pwd}`/../boehm-gc/.libs -rpath `${PWDCMD-pwd}`/../boehm-gc/.libs" - GCINCS='-I$(top_srcdir)/../boehm-gc/include -I../boehm-gc/include' - GCOBJS=boehm.lo - GCHDR=boehm-gc.h - # The POSIX thread support needs to know this. + enableval=$enable_java_gc; USE_GC=$enableval +else + USE_GC=yes +fi -$as_echo "#define HAVE_BOEHM_GC 1" >>confdefs.h +# Check whether --with-target-bdw-gc was given. +if test "${with_target_bdw_gc+set}" = set; then : + withval=$with_target_bdw_gc; +fi + + +# Check whether --with-target-bdw-gc-include was given. +if test "${with_target_bdw_gc_include+set}" = set; then : + withval=$with_target_bdw_gc_include; +fi + + +# Check whether --with-target-bdw-gc-lib was given. +if test "${with_target_bdw_gc_lib+set}" = set; then : + withval=$with_target_bdw_gc_lib; +fi + + +case "${USE_GC}" in +no) + use_bdw_gc=no + ;; +yes|default) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bdw garbage collector" >&5 +$as_echo_n "checking for bdw garbage collector... " >&6; } + if test "x$with_target_bdw_gc$with_target_bdw_gc_include$with_target_bdw_gc_lib" = x; then + BDW_GC_CFLAGS= + GCLIBS="-lgc" + else + if test "x$with_target_bdw_gc_include" = x && test "x$with_target_bdw_gc_lib" != x; then + as_fn_error $? "found --with-target-bdw-gc-lib but --with-target-bdw-gc-include missing" "$LINENO" 5 + elif test "x$with_target_bdw_gc_include" != x && test "x$with_target_bdw_gc_lib" = x; then + as_fn_error $? "found --with-target-bdw-gc-include but --with-target-bdw-gc-lib missing" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: using paths configured with --with-target-bdw-gc options" >&5 +$as_echo "using paths configured with --with-target-bdw-gc options" >&6; } + fi + mldir=`${CC-gcc} --print-multi-directory 2>/dev/null` + bdw_val= + if test "x$with_target_bdw_gc" != x; then + for i in `echo $with_target_bdw_gc | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x; then + as_fn_error $? "no multilib path ($mldir) found in --with-target-bdw-gc" "$LINENO" 5 + fi + bdw_inc_dir="$bdw_val/include" + bdw_lib_dir="$bdw_val/lib" + fi + bdw_val= + if test "x$with_target_bdw_gc_include" != x; then + for i in `echo $with_target_bdw_gc_include | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i; fallback=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x && test "x$bdw_inc_dir" = x && test "x$fallback" != x; then + bdw_inc_dir="$fallback" + elif test "x$bdw_val" = x; then + as_fn_error $? "no multilib path ($mldir) found in --with-target-bdw-gc-include" "$LINENO" 5 + else + bdw_inc_dir="$bdw_val" + fi + fi + bdw_val= + if test "x$with_target_bdw_gc_lib" != x; then + for i in `echo $with_target_bdw_gc_lib | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x; then + as_fn_error $? "no multilib path ($mldir) found in --with-target-bdw-gc-lib" "$LINENO" 5 + fi + bdw_lib_dir="$bdw_val" + fi + if test "x$bdw_inc_dir" = x; then + as_fn_error $? "no multilib path ($mldir) found in --with-target-bdw-gc-include" "$LINENO" 5 + fi + if test "x$bdw_lib_dir" = x; then + as_fn_error $? "no multilib path ($mldir) found in --with-target-bdw-gc-lib" "$LINENO" 5 + fi + BDW_GC_CFLAGS="-I$bdw_inc_dir" + if test -f $bdw_lib_dir/libgc.la; then + GCLIBS="$bdw_lib_dir/libgc.la" + else + GCLIBS="-L$bdw_lib_dir -lgc" + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + fi + + case "$GCLIBS" in + *libgc.la) + use_bdw_gc=yes ;; - no) - { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 -$as_echo "none" >&6; } - GCHDR=no-gc.h - ;; - *) - as_fn_error $? "unrecognized collector \"$GC\"" "$LINENO" 5 - ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for system boehm-gc" >&5 +$as_echo_n "checking for system boehm-gc... " >&6; } + save_CFLAGS=$CFLAGS + save_LIBS=$LIBS + CFLAGS="$CFLAGS $BDW_GC_CFLAGS" + LIBS="$LIBS $GCLIBS" + if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <gc/gc.h> +int +main () +{ +GC_init() + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + if test "$cross_compiling" = yes; then : + system_bdw_gc_found=no + +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include <gc/gc.h> + int main() { + GC_init(); + return 0; + } + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + system_bdw_gc_found=yes +else + system_bdw_gc_found=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + +else + system_bdw_gc_found=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS=$save_CFLAGS + LIBS=$save_LIBS + if test x$enable_objc_gc = xauto && test x$system_bdw_gc_found = xno; then + as_fn_error $? "bdw-gc not found" "$LINENO" 5 + use_bdw_gc=no + elif test x$enable_objc_gc = xyes && test x$system_bdw_gc_found = xno; then + as_fn_error $? "bdw-gc not found" "$LINENO" 5 + else + use_bdw_gc=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 +$as_echo "found" >&6; } + fi + esac esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GC_iterate_free_hblks in -lgc" >&5 +$as_echo_n "checking for GC_iterate_free_hblks in -lgc... " >&6; } +if ${ac_cv_lib_gc_GC_iterate_free_hblks+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgc $LIBS" +if test x$gcc_no_link = xyes; then + as_fn_error $? "Link tests are not allowed after GCC_NO_EXECUTABLES." "$LINENO" 5 +fi +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char GC_iterate_free_hblks (); +int +main () +{ +return GC_iterate_free_hblks (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gc_GC_iterate_free_hblks=yes +else + ac_cv_lib_gc_GC_iterate_free_hblks=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gc_GC_iterate_free_hblks" >&5 +$as_echo "$ac_cv_lib_gc_GC_iterate_free_hblks" >&6; } +if test "x$ac_cv_lib_gc_GC_iterate_free_hblks" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGC 1 +_ACEOF + + LIBS="-lgc $LIBS" + +else + as_fn_error $? "installed boehm-gc is too old" "$LINENO" 5 +fi + + +if test "$use_bdw_gc" = no; then + as_fn_error $? "bdw-gc not found" "$LINENO" 5 + GCLIBS= + GCINCS= + GCHDR=no-gc.h +else + GCINCS=$BDW_GC_CFLAGS + GCLIBS=$GCLIBS + GCHDR=boehm-gc.h + # The POSIX thread support needs to know this. +$as_echo "#define HAVE_BOEHM_GC 1" >>confdefs.h + +fi ac_config_links="$ac_config_links include/java-gc.h:include/$GCHDR" - if test "$GC" = boehm; then + if test "$USE_GC" = yes; then USING_BOEHMGC_TRUE= USING_BOEHMGC_FALSE='#' else @@ -21482,7 +21701,7 @@ else USING_BOEHMGC_FALSE= fi - if test "$GC" = no; then + if test "$USE_GC" = no; then USING_NOGC_TRUE= USING_NOGC_FALSE='#' else @@ -21579,7 +21798,7 @@ $as_echo "#define HAVE_PTHREAD_MUTEXATTR_INIT 1" >>confdefs.h # If we're using the Boehm GC, then we happen to know that it # defines _REENTRANT, so we don't bother. Eww. - if test "$GC" != boehm; then + if test "$USE_GC" = no; then $as_echo "#define _REENTRANT 1" >>confdefs.h @@ -24148,7 +24367,7 @@ fi # On Solaris, and maybe other architectures, the Boehm collector # requires -ldl. - if test "$GC" = boehm; then + if test "$USE_GC" != no; then case "${host}" in *-*-darwin*) ;; diff --git a/libjava/configure.ac b/libjava/configure.ac index 4f654099fe3..03cae448e33 100644 --- a/libjava/configure.ac +++ b/libjava/configure.ac @@ -930,48 +930,174 @@ AC_SUBST(LIBMATHSPEC) AC_SUBST(LIBGCJTESTSPEC) -# Allow the GC to be disabled. Can be useful when debugging. -AC_MSG_CHECKING([for garbage collector to use]) +AC_MSG_CHECKING([if garbage collector is enabled]) AC_ARG_ENABLE(java-gc, - AS_HELP_STRING([--enable-java-gc=TYPE], - [choose garbage collector (default is boehm)]), - [GC=$enableval], - [GC=boehm]) -GCLIBS= -GCINCS= -GCDEPS= -GCSPEC= -JC1GCSPEC= -GCTESTSPEC= -case "$GC" in - boehm) - AC_MSG_RESULT(boehm) - GCLIBS=../boehm-gc/libgcjgc_convenience.la - JC1GCSPEC='-fuse-boehm-gc' - GCTESTSPEC="-L`${PWDCMD-pwd}`/../boehm-gc/.libs -rpath `${PWDCMD-pwd}`/../boehm-gc/.libs" - GCINCS='-I$(top_srcdir)/../boehm-gc/include -I../boehm-gc/include' - GCOBJS=boehm.lo - GCHDR=boehm-gc.h - # The POSIX thread support needs to know this. - AC_DEFINE(HAVE_BOEHM_GC, 1, [Define if Boehm GC in use.]) - ;; - no) - AC_MSG_RESULT(none) - GCHDR=no-gc.h - ;; - *) - AC_MSG_ERROR([unrecognized collector "$GC"]) +[AS_HELP_STRING([[--enable-java-gc[=ARG]]], + [enable the use of the bdw-gc garbage collector with libjava @<:@ARG={default,yes,no}@:>@])], +[USE_GC=$enableval], +[USE_GC=yes]) +AC_ARG_WITH([target-bdw-gc], +[AS_HELP_STRING([--with-target-bdw-gc=PATHLIST], + [specify prefix directory for installed bdw-gc package. + Equivalent to --with-target-bdw-gc-include=PATH/include + plus --with-target-bdw-gc-lib=PATH/lib])]) +AC_ARG_WITH([target-bdw-gc-include], +[AS_HELP_STRING([--with-target-bdw-gc-include=PATHLIST], + [specify directories for installed bdw-gc include files])]) +AC_ARG_WITH([target-bdw-gc-lib], +[AS_HELP_STRING([--with-target-bdw-gc-lib=PATHLIST], + [specify directories for installed bdw-gc library])]) + +case "${USE_GC}" in +no) + use_bdw_gc=no + ;; +yes|default) + AC_MSG_CHECKING([for bdw garbage collector]) + if test "x$with_target_bdw_gc$with_target_bdw_gc_include$with_target_bdw_gc_lib" = x; then + dnl no bdw-gw options, assuming bdw-gc in default locations + BDW_GC_CFLAGS= + GCLIBS="-lgc" + else + dnl bdw-gw options passed by configure flags + if test "x$with_target_bdw_gc_include" = x && test "x$with_target_bdw_gc_lib" != x; then + AC_MSG_ERROR([found --with-target-bdw-gc-lib but --with-target-bdw-gc-include missing]) + elif test "x$with_target_bdw_gc_include" != x && test "x$with_target_bdw_gc_lib" = x; then + AC_MSG_ERROR([found --with-target-bdw-gc-include but --with-target-bdw-gc-lib missing]) + else + AC_MSG_RESULT([using paths configured with --with-target-bdw-gc options]) + fi + mldir=`${CC-gcc} --print-multi-directory 2>/dev/null` + bdw_val= + if test "x$with_target_bdw_gc" != x; then + for i in `echo $with_target_bdw_gc | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x; then + AC_MSG_ERROR([no multilib path ($mldir) found in --with-target-bdw-gc]) + fi + bdw_inc_dir="$bdw_val/include" + bdw_lib_dir="$bdw_val/lib" + fi + bdw_val= + if test "x$with_target_bdw_gc_include" != x; then + for i in `echo $with_target_bdw_gc_include | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i; fallback=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x && test "x$bdw_inc_dir" = x && test "x$fallback" != x; then + bdw_inc_dir="$fallback" + elif test "x$bdw_val" = x; then + AC_MSG_ERROR([no multilib path ($mldir) found in --with-target-bdw-gc-include]) + else + bdw_inc_dir="$bdw_val" + fi + fi + bdw_val= + if test "x$with_target_bdw_gc_lib" != x; then + for i in `echo $with_target_bdw_gc_lib | tr ',' ' '`; do + case "$i" in + *=*) sd=${i%%=*}; d=${i#*=} ;; + *) sd=.; d=$i ;; + esac + if test "$mldir" = "$sd"; then + bdw_val=$d + fi + done + if test "x$bdw_val" = x; then + AC_MSG_ERROR([no multilib path ($mldir) found in --with-target-bdw-gc-lib]) + fi + bdw_lib_dir="$bdw_val" + fi + if test "x$bdw_inc_dir" = x; then + AC_MSG_ERROR([no multilib path ($mldir) found in --with-target-bdw-gc-include]) + fi + if test "x$bdw_lib_dir" = x; then + AC_MSG_ERROR([no multilib path ($mldir) found in --with-target-bdw-gc-lib]) + fi + BDW_GC_CFLAGS="-I$bdw_inc_dir" + if test -f $bdw_lib_dir/libgc.la; then + GCLIBS="$bdw_lib_dir/libgc.la" + else + GCLIBS="-L$bdw_lib_dir -lgc" + fi + AC_MSG_RESULT([found]) + fi + + case "$GCLIBS" in + *libgc.la) + use_bdw_gc=yes ;; + *) + AC_MSG_CHECKING([for system boehm-gc]) + save_CFLAGS=$CFLAGS + save_LIBS=$LIBS + CFLAGS="$CFLAGS $BDW_GC_CFLAGS" + LIBS="$LIBS $GCLIBS" + dnl the link test is not good enough for ARM32 multilib detection, + dnl first check to link, then to run + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include <gc/gc.h>],[GC_init()])], + [ + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include <gc/gc.h> + int main() { + GC_init(); + return 0; + } + ]])], + [system_bdw_gc_found=yes], + [system_bdw_gc_found=no], + dnl assume no system boehm-gc for cross builds ... + [system_bdw_gc_found=no] + ) + ], + [system_bdw_gc_found=no]) + CFLAGS=$save_CFLAGS + LIBS=$save_LIBS + if test x$enable_objc_gc = xauto && test x$system_bdw_gc_found = xno; then + AC_MSG_ERROR([bdw-gc not found]) + use_bdw_gc=no + elif test x$enable_objc_gc = xyes && test x$system_bdw_gc_found = xno; then + AC_MSG_ERROR([bdw-gc not found]) + else + use_bdw_gc=yes + AC_MSG_RESULT([found]) + fi + esac esac + +AC_CHECK_LIB([gc], [GC_iterate_free_hblks], [], [AC_MSG_ERROR([installed boehm-gc is too old])]) + +if test "$use_bdw_gc" = no; then + AC_MSG_ERROR([bdw-gc not found]) + GCLIBS= + GCINCS= + GCHDR=no-gc.h +else + GCINCS=$BDW_GC_CFLAGS + GCLIBS=$GCLIBS + GCHDR=boehm-gc.h + # The POSIX thread support needs to know this. + AC_DEFINE(HAVE_BOEHM_GC, 1, [Define if Boehm GC in use.]) +fi + AC_SUBST(GCLIBS) AC_SUBST(GCINCS) -AC_SUBST(GCDEPS) -AC_SUBST(GCSPEC) -AC_SUBST(JC1GCSPEC) -AC_SUBST(GCTESTSPEC) AC_CONFIG_LINKS(include/java-gc.h:include/$GCHDR) -AM_CONDITIONAL(USING_BOEHMGC, test "$GC" = boehm) -AM_CONDITIONAL(USING_NOGC, test "$GC" = no) +AM_CONDITIONAL(USING_BOEHMGC, test "$USE_GC" = yes) +AM_CONDITIONAL(USING_NOGC, test "$USE_GC" = no) AC_MSG_CHECKING([for thread model used by GCC]) @@ -1055,7 +1181,7 @@ case "$THREADS" in # If we're using the Boehm GC, then we happen to know that it # defines _REENTRANT, so we don't bother. Eww. - if test "$GC" != boehm; then + if test "$USE_GC" = no; then AC_DEFINE(_REENTRANT, 1, [Required define if using POSIX threads]) fi AC_DEFINE(_POSIX_PTHREAD_SEMANTICS, 1, [Required define if using POSIX threads]) @@ -1412,7 +1538,7 @@ else # On Solaris, and maybe other architectures, the Boehm collector # requires -ldl. - if test "$GC" = boehm; then + if test "$USE_GC" != no; then case "${host}" in *-*-darwin*) ;; diff --git a/libjava/gcj/Makefile.in b/libjava/gcj/Makefile.in index e517a43dd1a..83b57288302 100644 --- a/libjava/gcj/Makefile.in +++ b/libjava/gcj/Makefile.in @@ -229,7 +229,6 @@ EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCC_FOR_ECJX = @GCC_FOR_ECJX@ -GCDEPS = @GCDEPS@ GCINCS = @GCINCS@ GCJ = @GCJ@ GCJDEPMODE = @GCJDEPMODE@ @@ -239,8 +238,6 @@ GCJVERSION = @GCJVERSION@ GCJ_BIN_DIR = @GCJ_BIN_DIR@ GCJ_FOR_ECJX = @GCJ_FOR_ECJX@ GCLIBS = @GCLIBS@ -GCSPEC = @GCSPEC@ -GCTESTSPEC = @GCTESTSPEC@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ @@ -258,7 +255,6 @@ INTERPRETER = @INTERPRETER@ JAR = @JAR@ JAVA_HOME = @JAVA_HOME@ JAVA_VERSION = @JAVA_VERSION@ -JC1GCSPEC = @JC1GCSPEC@ JRE_BIN_DIR = @JRE_BIN_DIR@ JRE_DIR = @JRE_DIR@ JRE_LIB_DIR = @JRE_LIB_DIR@ diff --git a/libjava/gnu/gcj/util/natGCInfo.cc b/libjava/gnu/gcj/util/natGCInfo.cc index a5936174da7..144337259ce 100644 --- a/libjava/gnu/gcj/util/natGCInfo.cc +++ b/libjava/gnu/gcj/util/natGCInfo.cc @@ -25,44 +25,9 @@ #include <string.h> #include <errno.h> -// -// Boehm GC includes. -// -#ifdef PACKAGE_NAME -#undef PACKAGE_NAME -#endif - -#ifdef PACKAGE_STRING -#undef PACKAGE_STRING -#endif - -#ifdef PACKAGE_TARNAME -#undef PACKAGE_TARNAME -#endif - -#ifdef PACKAGE_VERSION -#undef PACKAGE_VERSION -#endif - -#ifdef TRUE -#undef TRUE -#endif - -#ifdef FALSE -#undef FALSE -#endif - -extern "C" { -#include "private/dbg_mlc.h" - int GC_n_set_marks(hdr* hhdr); - ptr_t GC_clear_stack(ptr_t p); - extern int GC_gcj_kind; - extern int GC_gcj_debug_kind; -} - -#endif - -#ifdef HAVE_PROC_SELF_MAPS +#include "gc/gc.h" +#include "gc/gc_gcj.h" +#include "gc/gc_mark.h" static int gc_ok = 1; @@ -76,88 +41,59 @@ struct gc_debug_info }; static void -GC_print_debug_callback(hblk *h, word user_data) +GC_print_debug_callback(GC_hblk_s *h, GC_word user_data) { - hdr *hhdr = HDR(h); - size_t bytes = WORDS_TO_BYTES(hhdr -> hb_sz); + size_t bytes; gc_debug_info *pinfo = (gc_debug_info *)user_data; fprintf(pinfo->fp, "ptr = %#lx, kind = %d, size = %zd, marks = %d\n", - (unsigned long)h, hhdr->hb_obj_kind, bytes, GC_n_set_marks(hhdr)); + (unsigned long)h, GC_get_kind_and_size(h, &bytes), bytes, GC_count_set_marks_in_hblk(h)); } -/* - this next section of definitions shouldn't really be here. - copied from boehmgc/allchblk.c -*/ +struct print_hblkfl_s { + FILE *fp; + GC_word total_free; + int prev_index; +}; -# define UNIQUE_THRESHOLD 32 -# define HUGE_THRESHOLD 256 -# define FL_COMPRESSION 8 -# define N_HBLK_FLS (HUGE_THRESHOLD - UNIQUE_THRESHOLD)/FL_COMPRESSION \ - + UNIQUE_THRESHOLD -#ifndef USE_MUNMAP -extern "C" { - extern word GC_free_bytes[N_HBLK_FLS+1]; +static void GC_CALLBACK print_hblkfl_file_item(struct GC_hblk_s *h, int i, + GC_word client_data) +{ + GC_word sz; + print_hblkfl_s *pdata = (print_hblkfl_s *)client_data; + + if (pdata->prev_index != i) { + fprintf(pdata->fp, "Free list %d:\n", i); + pdata->prev_index = i; + } + + sz = GC_size(h); + fprintf(pdata->fp, "\t0x%lx size %lu ", (unsigned long)h, + (unsigned long)sz); + pdata->total_free += sz; + + if (GC_is_black_listed(h, GC_get_hblk_size()) != 0) + fprintf(pdata->fp, "start black listed\n"); + else if (GC_is_black_listed(h, sz) != 0) + fprintf(pdata->fp, "partially black listed\n"); + else + fprintf(pdata->fp, "not black listed\n"); } -#endif - -# ifdef USE_MUNMAP -# define IS_MAPPED(hhdr) (((hhdr) -> hb_flags & WAS_UNMAPPED) == 0) -# else /* !USE_MMAP */ -# define IS_MAPPED(hhdr) 1 -# endif /* USE_MUNMAP */ static void GC_print_hblkfreelist_file(FILE *fp) { - struct hblk * h; - word total_free = 0; - hdr * hhdr; - word sz; - int i; + print_hblkfl_s data; + data.fp = fp; + data.total_free = 0; + data.prev_index = -1; fprintf(fp, "---------- Begin free map ----------\n"); - for (i = 0; i <= N_HBLK_FLS; ++i) - { - h = GC_hblkfreelist[i]; -#ifdef USE_MUNMAP - if (0 != h) - fprintf (fp, "Free list %ld:\n", (unsigned long)i); -#else - if (0 != h) - fprintf (fp, "Free list %ld (Total size %ld):\n", - (unsigned long)i, - (unsigned long)GC_free_bytes[i]); -#endif - while (h != 0) - { - hhdr = HDR(h); - sz = hhdr -> hb_sz; - fprintf (fp, "\t0x%lx size %lu ", (unsigned long)h, - (unsigned long)sz); - total_free += sz; - - if (GC_is_black_listed (h, HBLKSIZE) != 0) - fprintf (fp, "start black listed\n"); - else if (GC_is_black_listed(h, hhdr -> hb_sz) != 0) - fprintf (fp, "partially black listed\n"); - else - fprintf (fp, "not black listed\n"); - - h = hhdr -> hb_next; - } - } -#ifndef USE_MUNMAP - if (total_free != GC_large_free_bytes) - { - fprintf (fp, "GC_large_free_bytes = %lu (INCONSISTENT!!)\n", - (unsigned long) GC_large_free_bytes); - } -#endif - fprintf (fp, "Total of %lu bytes on free list\n", (unsigned long)total_free); - fprintf (fp, "---------- End free map ----------\n"); + GC_iterate_free_hblks(print_hblkfl_file_item, (GC_word)&data); + fprintf(fp, "Total of %lu bytes on free list\n", + (unsigned long)data.total_free); + fprintf(fp, "---------- End free map ----------\n"); } static int GC_dump_count = 1; @@ -173,7 +109,7 @@ GC_print_debug_info_file(FILE* fp) if (gc_ok) GC_gcollect(); fprintf(info.fp, "---------- Begin block map ----------\n"); - GC_apply_to_all_blocks(GC_print_debug_callback, (word)(void*)(&info)); + GC_apply_to_all_blocks(GC_print_debug_callback, (GC_word)(void*)(&info)); //fprintf(fp, "#Total used %d free %d wasted %d\n", info.used, info.free, info.wasted); //fprintf(fp, "#Total blocks %d; %dK bytes\n", info.blocks, info.blocks*4); fprintf(info.fp, "---------- End block map ----------\n"); @@ -194,8 +130,8 @@ namespace int bytes_fd; void print_address_map(); - void enumerate_callback(struct hblk *h); - static void enumerate_callback_adaptor(struct hblk *h, word dummy); + void enumerate_callback(GC_hblk_s *h); + static void enumerate_callback_adaptor(GC_hblk_s *h, GC_word dummy); }; } @@ -300,7 +236,7 @@ GC_enumerator::enumerate() if (gc_ok) GC_gcollect(); GC_apply_to_all_blocks(enumerate_callback_adaptor, - (word)(void*)(this)); + (GC_word)(void*)(this)); fprintf(fp, "---------- End object map ----------\n"); fflush(fp); @@ -316,25 +252,24 @@ GC_enumerator::enumerate() } void -GC_enumerator::enumerate_callback_adaptor(struct hblk *h, - word dummy) +GC_enumerator::enumerate_callback_adaptor(GC_hblk_s *h, + GC_word dummy) { GC_enumerator* pinfo = (GC_enumerator*)dummy; pinfo->enumerate_callback(h); } void -GC_enumerator::enumerate_callback(struct hblk *h) +GC_enumerator::enumerate_callback(GC_hblk_s *h) { - hdr * hhdr = HDR(h); - size_t bytes = WORDS_TO_BYTES(hhdr->hb_sz); + size_t bytes; int i; - for (i = 0; i == 0 || (i + bytes <= HBLKSIZE); i += bytes) + for (i = 0; i == 0 || (i + bytes <= GC_get_hblk_size()); i += bytes) { - int inUse = mark_bit_from_hdr(hhdr,BYTES_TO_WORDS(i)); // in use + int inUse = GC_is_marked((char*)h+i); // in use char *ptr = (char*)h+i; // address - int kind = hhdr->hb_obj_kind; // kind + int kind = GC_get_kind_and_size(h, &bytes); // kind void *klass = 0; void *data = 0; if (kind == GC_gcj_kind @@ -431,7 +366,7 @@ void J2A(name, n); oomDumpName = n; - GC_oom_fn = nomem_handler; + GC_set_oom_fn(nomem_handler); } #else // HAVE_PROC_SELF_MAPS diff --git a/libjava/include/Makefile.in b/libjava/include/Makefile.in index d60f77153f7..57add8dc800 100644 --- a/libjava/include/Makefile.in +++ b/libjava/include/Makefile.in @@ -230,7 +230,6 @@ EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCC_FOR_ECJX = @GCC_FOR_ECJX@ -GCDEPS = @GCDEPS@ GCINCS = @GCINCS@ GCJ = @GCJ@ GCJDEPMODE = @GCJDEPMODE@ @@ -240,8 +239,6 @@ GCJVERSION = @GCJVERSION@ GCJ_BIN_DIR = @GCJ_BIN_DIR@ GCJ_FOR_ECJX = @GCJ_FOR_ECJX@ GCLIBS = @GCLIBS@ -GCSPEC = @GCSPEC@ -GCTESTSPEC = @GCTESTSPEC@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ @@ -259,7 +256,6 @@ INTERPRETER = @INTERPRETER@ JAR = @JAR@ JAVA_HOME = @JAVA_HOME@ JAVA_VERSION = @JAVA_VERSION@ -JC1GCSPEC = @JC1GCSPEC@ JRE_BIN_DIR = @JRE_BIN_DIR@ JRE_DIR = @JRE_DIR@ JRE_LIB_DIR = @JRE_LIB_DIR@ diff --git a/libjava/include/boehm-gc.h b/libjava/include/boehm-gc.h index ed8ac6aa2e3..96f45469203 100644 --- a/libjava/include/boehm-gc.h +++ b/libjava/include/boehm-gc.h @@ -27,7 +27,7 @@ extern "C" #include <java/lang/Class.h> #include <string.h> -#include <gc_ext_config.h> // for THREAD_LOCAL_ALLOC +#include <gc/gc.h> // for THREAD_LOCAL_ALLOC extern "C" void * GC_gcj_malloc(size_t, void *); extern "C" void * GC_malloc_atomic(size_t); @@ -41,8 +41,7 @@ extern "C" void * GC_local_malloc_atomic(size_t); inline void * _Jv_AllocObj (jsize size, jclass klass) { - // This should call GC_GCJ_MALLOC, but that would involve - // including gc.h. + // FIXME: This should call GC_GCJ_MALLOC #ifdef THREAD_LOCAL_ALLOC return GC_local_gcj_malloc (size, klass->vtable); #else diff --git a/libjava/include/config.h.in b/libjava/include/config.h.in index 52fef3c056b..ec444d6c107 100644 --- a/libjava/include/config.h.in +++ b/libjava/include/config.h.in @@ -207,6 +207,9 @@ /* Define if libdlloader will be built on this platform */ #undef HAVE_LIBDLLOADER +/* Define to 1 if you have the `gc' library (-lgc). */ +#undef HAVE_LIBGC + /* Define to 1 if you have the `ltdl' library (-lltdl). */ #undef HAVE_LIBLTDL diff --git a/libjava/libgcj.spec.in b/libjava/libgcj.spec.in index 22eec3dbc79..bfeed858d44 100644 --- a/libjava/libgcj.spec.in +++ b/libjava/libgcj.spec.in @@ -7,6 +7,6 @@ *startfile: @THREADSTARTFILESPEC@ %(startfileorig) %rename lib liborig -*lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ @LIBMATHSPEC@ @LDLIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) @LIBSTDCXXSPEC@ %(liborig) +*lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ @LIBMATHSPEC@ @LDLIBICONV@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) @LIBSTDCXXSPEC@ %(liborig) -*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ @ATOMICSPEC@ @LIBGCJ_BC_SPEC@ -fkeep-inline-functions +*jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ @ATOMICSPEC@ @LIBGCJ_BC_SPEC@ -fkeep-inline-functions diff --git a/libjava/testsuite/Makefile.in b/libjava/testsuite/Makefile.in index 841d517444f..d5e6755400b 100644 --- a/libjava/testsuite/Makefile.in +++ b/libjava/testsuite/Makefile.in @@ -183,7 +183,6 @@ EXCEPTIONSPEC = @EXCEPTIONSPEC@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCC_FOR_ECJX = @GCC_FOR_ECJX@ -GCDEPS = @GCDEPS@ GCINCS = @GCINCS@ GCJ = @GCJ@ GCJDEPMODE = @GCJDEPMODE@ @@ -193,8 +192,6 @@ GCJVERSION = @GCJVERSION@ GCJ_BIN_DIR = @GCJ_BIN_DIR@ GCJ_FOR_ECJX = @GCJ_FOR_ECJX@ GCLIBS = @GCLIBS@ -GCSPEC = @GCSPEC@ -GCTESTSPEC = @GCTESTSPEC@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_LIBS = @GLIB_LIBS@ GREP = @GREP@ @@ -212,7 +209,6 @@ INTERPRETER = @INTERPRETER@ JAR = @JAR@ JAVA_HOME = @JAVA_HOME@ JAVA_VERSION = @JAVA_VERSION@ -JC1GCSPEC = @JC1GCSPEC@ JRE_BIN_DIR = @JRE_BIN_DIR@ JRE_DIR = @JRE_DIR@ JRE_LIB_DIR = @JRE_LIB_DIR@ -- 2.38.1