--- a/.hgtags-top-repo Tue Feb 19 17:32:10 2013 -0500
+++ b/.hgtags-top-repo Wed Jul 05 18:41:05 2017 +0200
@@ -198,3 +198,4 @@
b43aa5bd8ca5c8121336495382d35ecfa7a71536 jdk8-b74
2a713921952cbd77a1e699626976cb6cdfe3e57e jdk8-b75
278af9fc67e7eba2884936b49ec07345f423aabb jdk8-b76
+3933eebc659d58c597aa8cb4b3e58f2250ce3e1a jdk8-b77
--- a/NewMakefile.gmk Tue Feb 19 17:32:10 2013 -0500
+++ b/NewMakefile.gmk Wed Jul 05 18:41:05 2017 +0200
@@ -96,6 +96,7 @@
$(info . make all # Compile everything, all repos and images)
$(info . make images # Create complete j2sdk and j2re images)
$(info . make overlay-images # Create limited images for sparc 64 bit platforms)
+ $(info . make profiles # Create complete j2re compact profile images)
$(info . make bootcycle-images # Build images twice, second time with newly build JDK)
$(info . make install # Install the generated images locally)
$(info . make clean # Remove all files generated by make, but not those)
--- a/common/autoconf/generated-configure.sh Tue Feb 19 17:32:10 2013 -0500
+++ b/common/autoconf/generated-configure.sh Wed Jul 05 18:41:05 2017 +0200
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.67 for OpenJDK jdk8.
+# Generated by GNU Autoconf 2.68 for OpenJDK jdk8.
#
# Report bugs to <build-dev@openjdk.java.net>.
#
@@ -91,6 +91,7 @@
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -216,11 +217,18 @@
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
+ # Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+ case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+ esac
+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
fi
if test x$as_have_required = xno; then :
@@ -641,6 +649,7 @@
CXXFLAGS_JDKLIB
CFLAGS_JDKEXE
CFLAGS_JDKLIB
+MACOSX_REQUIRED_VERSION
PACKAGE_PATH
LEGACY_EXTRA_LDFLAGS
LEGACY_EXTRA_CXXFLAGS
@@ -1433,7 +1442,7 @@
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
esac
@@ -1858,7 +1867,7 @@
if $ac_init_version; then
cat <<\_ACEOF
OpenJDK configure jdk8
-generated by GNU Autoconf 2.67
+generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
@@ -1904,7 +1913,7 @@
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_compile
@@ -1942,7 +1951,7 @@
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_compile
@@ -1980,7 +1989,7 @@
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_objc_try_compile
@@ -2017,7 +2026,7 @@
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_c_try_cpp
@@ -2054,7 +2063,7 @@
ac_retval=1
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_cpp
@@ -2067,10 +2076,10 @@
ac_fn_cxx_check_header_mongrel ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval "test \"\${$3+set}\"" = set; then :
+ if eval \${$3+:} false; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
@@ -2137,7 +2146,7 @@
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
eval "$3=\$ac_header_compiler"
@@ -2146,7 +2155,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_cxx_check_header_mongrel
@@ -2187,7 +2196,7 @@
ac_retval=$ac_status
fi
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_run
@@ -2201,7 +2210,7 @@
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2219,7 +2228,7 @@
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_cxx_check_header_compile
@@ -2396,7 +2405,7 @@
rm -f conftest.val
fi
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_compute_int
@@ -2442,7 +2451,7 @@
# interfere with the next link command; also delete a directory that is
# left behind by Apple's compiler. We do this before executing the actions.
rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
as_fn_set_status $ac_retval
} # ac_fn_cxx_try_link
@@ -2455,7 +2464,7 @@
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2510,7 +2519,7 @@
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_cxx_check_func
@@ -2523,7 +2532,7 @@
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
-if eval "test \"\${$3+set}\"" = set; then :
+if eval \${$3+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -2541,7 +2550,7 @@
eval ac_res=\$$3
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;}
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
cat >config.log <<_ACEOF
@@ -2549,7 +2558,7 @@
running configure, to aid debugging if configure makes a mistake.
It was created by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.67. Invocation command line was
+generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -2807,7 +2816,7 @@
|| { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
done
@@ -3723,7 +3732,7 @@
#CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks:
-DATE_WHEN_GENERATED=1359971740
+DATE_WHEN_GENERATED=1361218904
###############################################################################
#
@@ -3761,7 +3770,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BASENAME+set}" = set; then :
+if ${ac_cv_path_BASENAME+:} false; then :
$as_echo_n "(cached) " >&6
else
case $BASENAME in
@@ -3820,7 +3829,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BASH+set}" = set; then :
+if ${ac_cv_path_BASH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $BASH in
@@ -3879,7 +3888,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CAT+set}" = set; then :
+if ${ac_cv_path_CAT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CAT in
@@ -3938,7 +3947,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CHMOD+set}" = set; then :
+if ${ac_cv_path_CHMOD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CHMOD in
@@ -3997,7 +4006,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CMP+set}" = set; then :
+if ${ac_cv_path_CMP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CMP in
@@ -4056,7 +4065,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_COMM+set}" = set; then :
+if ${ac_cv_path_COMM+:} false; then :
$as_echo_n "(cached) " >&6
else
case $COMM in
@@ -4115,7 +4124,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CP+set}" = set; then :
+if ${ac_cv_path_CP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CP in
@@ -4174,7 +4183,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CPIO+set}" = set; then :
+if ${ac_cv_path_CPIO+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CPIO in
@@ -4233,7 +4242,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CUT+set}" = set; then :
+if ${ac_cv_path_CUT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CUT in
@@ -4292,7 +4301,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_DATE+set}" = set; then :
+if ${ac_cv_path_DATE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DATE in
@@ -4351,7 +4360,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_DIFF+set}" = set; then :
+if ${ac_cv_path_DIFF+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DIFF in
@@ -4410,7 +4419,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_DIRNAME+set}" = set; then :
+if ${ac_cv_path_DIRNAME+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DIRNAME in
@@ -4469,7 +4478,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_ECHO+set}" = set; then :
+if ${ac_cv_path_ECHO+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ECHO in
@@ -4528,7 +4537,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_EXPR+set}" = set; then :
+if ${ac_cv_path_EXPR+:} false; then :
$as_echo_n "(cached) " >&6
else
case $EXPR in
@@ -4587,7 +4596,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_FILE+set}" = set; then :
+if ${ac_cv_path_FILE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $FILE in
@@ -4646,7 +4655,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_FIND+set}" = set; then :
+if ${ac_cv_path_FIND+:} false; then :
$as_echo_n "(cached) " >&6
else
case $FIND in
@@ -4705,7 +4714,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_HEAD+set}" = set; then :
+if ${ac_cv_path_HEAD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $HEAD in
@@ -4764,7 +4773,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_LN+set}" = set; then :
+if ${ac_cv_path_LN+:} false; then :
$as_echo_n "(cached) " >&6
else
case $LN in
@@ -4823,7 +4832,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_LS+set}" = set; then :
+if ${ac_cv_path_LS+:} false; then :
$as_echo_n "(cached) " >&6
else
case $LS in
@@ -4882,7 +4891,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_MKDIR+set}" = set; then :
+if ${ac_cv_path_MKDIR+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MKDIR in
@@ -4941,7 +4950,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_MKTEMP+set}" = set; then :
+if ${ac_cv_path_MKTEMP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MKTEMP in
@@ -5000,7 +5009,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_MV+set}" = set; then :
+if ${ac_cv_path_MV+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MV in
@@ -5059,7 +5068,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PRINTF+set}" = set; then :
+if ${ac_cv_path_PRINTF+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PRINTF in
@@ -5118,7 +5127,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_THEPWDCMD+set}" = set; then :
+if ${ac_cv_path_THEPWDCMD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $THEPWDCMD in
@@ -5177,7 +5186,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_RM+set}" = set; then :
+if ${ac_cv_path_RM+:} false; then :
$as_echo_n "(cached) " >&6
else
case $RM in
@@ -5236,7 +5245,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_SH+set}" = set; then :
+if ${ac_cv_path_SH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SH in
@@ -5295,7 +5304,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_SORT+set}" = set; then :
+if ${ac_cv_path_SORT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SORT in
@@ -5354,7 +5363,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TAIL+set}" = set; then :
+if ${ac_cv_path_TAIL+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TAIL in
@@ -5413,7 +5422,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TAR+set}" = set; then :
+if ${ac_cv_path_TAR+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TAR in
@@ -5472,7 +5481,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TEE+set}" = set; then :
+if ${ac_cv_path_TEE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TEE in
@@ -5531,7 +5540,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TOUCH+set}" = set; then :
+if ${ac_cv_path_TOUCH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TOUCH in
@@ -5590,7 +5599,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TR+set}" = set; then :
+if ${ac_cv_path_TR+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TR in
@@ -5649,7 +5658,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_UNAME+set}" = set; then :
+if ${ac_cv_path_UNAME+:} false; then :
$as_echo_n "(cached) " >&6
else
case $UNAME in
@@ -5708,7 +5717,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_UNIQ+set}" = set; then :
+if ${ac_cv_path_UNIQ+:} false; then :
$as_echo_n "(cached) " >&6
else
case $UNIQ in
@@ -5767,7 +5776,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_WC+set}" = set; then :
+if ${ac_cv_path_WC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $WC in
@@ -5826,7 +5835,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_WHICH+set}" = set; then :
+if ${ac_cv_path_WHICH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $WHICH in
@@ -5885,7 +5894,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_XARGS+set}" = set; then :
+if ${ac_cv_path_XARGS+:} false; then :
$as_echo_n "(cached) " >&6
else
case $XARGS in
@@ -5945,7 +5954,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then :
+if ${ac_cv_prog_AWK+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AWK"; then
@@ -5995,7 +6004,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then :
+if ${ac_cv_path_GREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -z "$GREP"; then
@@ -6070,7 +6079,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then :
+if ${ac_cv_path_EGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
@@ -6149,7 +6158,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
-if test "${ac_cv_path_FGREP+set}" = set; then :
+if ${ac_cv_path_FGREP+:} false; then :
$as_echo_n "(cached) " >&6
else
if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
@@ -6228,7 +6237,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
-if test "${ac_cv_path_SED+set}" = set; then :
+if ${ac_cv_path_SED+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
@@ -6314,7 +6323,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_NAWK+set}" = set; then :
+if ${ac_cv_path_NAWK+:} false; then :
$as_echo_n "(cached) " >&6
else
case $NAWK in
@@ -6374,7 +6383,7 @@
set dummy cygpath; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CYGPATH+set}" = set; then :
+if ${ac_cv_path_CYGPATH+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CYGPATH in
@@ -6414,7 +6423,7 @@
set dummy readlink; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_READLINK+set}" = set; then :
+if ${ac_cv_path_READLINK+:} false; then :
$as_echo_n "(cached) " >&6
else
case $READLINK in
@@ -6454,7 +6463,7 @@
set dummy df; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_DF+set}" = set; then :
+if ${ac_cv_path_DF+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DF in
@@ -6494,7 +6503,7 @@
set dummy SetFile; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_SETFILE+set}" = set; then :
+if ${ac_cv_path_SETFILE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $SETFILE in
@@ -6540,7 +6549,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
-if test "${ac_cv_build+set}" = set; then :
+if ${ac_cv_build+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_build_alias=$build_alias
@@ -6556,7 +6565,7 @@
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
@@ -6574,7 +6583,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
-if test "${ac_cv_host+set}" = set; then :
+if ${ac_cv_host+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$host_alias" = x; then
@@ -6589,7 +6598,7 @@
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
@@ -6607,7 +6616,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
-if test "${ac_cv_target+set}" = set; then :
+if ${ac_cv_target+:} false; then :
$as_echo_n "(cached) " >&6
else
if test "x$target_alias" = x; then
@@ -6622,7 +6631,7 @@
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
-*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
@@ -8088,7 +8097,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PKGHANDLER+set}" = set; then :
+if ${ac_cv_prog_PKGHANDLER+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PKGHANDLER"; then
@@ -8453,7 +8462,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then :
+if ${ac_cv_path_CHECK_GMAKE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_GMAKE in
@@ -8807,7 +8816,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CHECK_MAKE+set}" = set; then :
+if ${ac_cv_path_CHECK_MAKE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_MAKE in
@@ -9166,7 +9175,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then :
+if ${ac_cv_path_CHECK_TOOLSDIR_GMAKE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_TOOLSDIR_GMAKE in
@@ -9519,7 +9528,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then :
+if ${ac_cv_path_CHECK_TOOLSDIR_MAKE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CHECK_TOOLSDIR_MAKE in
@@ -9915,7 +9924,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_UNZIP+set}" = set; then :
+if ${ac_cv_path_UNZIP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $UNZIP in
@@ -9974,7 +9983,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_ZIP+set}" = set; then :
+if ${ac_cv_path_ZIP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ZIP in
@@ -10033,7 +10042,7 @@
set dummy ldd; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_LDD+set}" = set; then :
+if ${ac_cv_path_LDD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $LDD in
@@ -10079,7 +10088,7 @@
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_OTOOL+set}" = set; then :
+if ${ac_cv_path_OTOOL+:} false; then :
$as_echo_n "(cached) " >&6
else
case $OTOOL in
@@ -10124,7 +10133,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_READELF+set}" = set; then :
+if ${ac_cv_path_READELF+:} false; then :
$as_echo_n "(cached) " >&6
else
case $READELF in
@@ -10167,7 +10176,7 @@
set dummy hg; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_HG+set}" = set; then :
+if ${ac_cv_path_HG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $HG in
@@ -10207,7 +10216,7 @@
set dummy stat; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_STAT+set}" = set; then :
+if ${ac_cv_path_STAT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $STAT in
@@ -10247,7 +10256,7 @@
set dummy time; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TIME+set}" = set; then :
+if ${ac_cv_path_TIME+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TIME in
@@ -10292,7 +10301,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_COMM+set}" = set; then :
+if ${ac_cv_path_COMM+:} false; then :
$as_echo_n "(cached) " >&6
else
case $COMM in
@@ -10356,7 +10365,7 @@
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_PKG_CONFIG+set}" = set; then :
+if ${ac_cv_path_PKG_CONFIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $PKG_CONFIG in
@@ -10399,7 +10408,7 @@
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then :
+if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
$as_echo_n "(cached) " >&6
else
case $ac_pt_PKG_CONFIG in
@@ -10572,7 +10581,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then :
+if ${ac_cv_prog_BDEPS_UNZIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$BDEPS_UNZIP"; then
@@ -10618,7 +10627,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then :
+if ${ac_cv_prog_BDEPS_FTP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$BDEPS_FTP"; then
@@ -11885,7 +11894,7 @@
set dummy javac; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_JAVAC_CHECK+set}" = set; then :
+if ${ac_cv_path_JAVAC_CHECK+:} false; then :
$as_echo_n "(cached) " >&6
else
case $JAVAC_CHECK in
@@ -11925,7 +11934,7 @@
set dummy java; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_JAVA_CHECK+set}" = set; then :
+if ${ac_cv_path_JAVA_CHECK+:} false; then :
$as_echo_n "(cached) " >&6
else
case $JAVA_CHECK in
@@ -15984,7 +15993,7 @@
set dummy link; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CYGWIN_LINK+set}" = set; then :
+if ${ac_cv_path_CYGWIN_LINK+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CYGWIN_LINK in
@@ -16973,7 +16982,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BUILD_CC+set}" = set; then :
+if ${ac_cv_path_BUILD_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_CC in
@@ -17284,7 +17293,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BUILD_CXX+set}" = set; then :
+if ${ac_cv_path_BUILD_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_CXX in
@@ -17593,7 +17602,7 @@
set dummy ld; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_BUILD_LD+set}" = set; then :
+if ${ac_cv_path_BUILD_LD+:} false; then :
$as_echo_n "(cached) " >&6
else
case $BUILD_LD in
@@ -18105,7 +18114,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TOOLS_DIR_CC+set}" = set; then :
+if ${ac_cv_path_TOOLS_DIR_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TOOLS_DIR_CC in
@@ -18157,7 +18166,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then :
+if ${ac_cv_path_POTENTIAL_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
case $POTENTIAL_CC in
@@ -18570,7 +18579,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then :
+if ${ac_cv_prog_PROPER_COMPILER_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PROPER_COMPILER_CC"; then
@@ -18614,7 +18623,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_PROPER_COMPILER_CC"; then
@@ -19064,7 +19073,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then :
+if ${ac_cv_prog_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CC"; then
@@ -19108,7 +19117,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CC"; then
@@ -19161,7 +19170,7 @@
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
@@ -19276,7 +19285,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
@@ -19319,7 +19328,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
@@ -19378,7 +19387,7 @@
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
@@ -19389,7 +19398,7 @@
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
-if test "${ac_cv_objext+set}" = set; then :
+if ${ac_cv_objext+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -19430,7 +19439,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
@@ -19440,7 +19449,7 @@
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then :
+if ${ac_cv_c_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -19477,7 +19486,7 @@
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then :
+if ${ac_cv_prog_cc_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_c_werror_flag=$ac_c_werror_flag
@@ -19555,7 +19564,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then :
+if ${ac_cv_prog_cc_c89+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_prog_cc_c89=no
@@ -19674,7 +19683,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_TOOLS_DIR_CXX+set}" = set; then :
+if ${ac_cv_path_TOOLS_DIR_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
case $TOOLS_DIR_CXX in
@@ -19726,7 +19735,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then :
+if ${ac_cv_path_POTENTIAL_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
case $POTENTIAL_CXX in
@@ -20139,7 +20148,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then :
+if ${ac_cv_prog_PROPER_COMPILER_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$PROPER_COMPILER_CXX"; then
@@ -20183,7 +20192,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then :
+if ${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_PROPER_COMPILER_CXX"; then
@@ -20637,7 +20646,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_CXX+set}" = set; then :
+if ${ac_cv_prog_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$CXX"; then
@@ -20681,7 +20690,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then :
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_CXX"; then
@@ -20759,7 +20768,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then :
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -20796,7 +20805,7 @@
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if test "${ac_cv_prog_cxx_g+set}" = set; then :
+if ${ac_cv_prog_cxx_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
@@ -20894,7 +20903,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJC+set}" = set; then :
+if ${ac_cv_prog_OBJC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJC"; then
@@ -20938,7 +20947,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJC+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OBJC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJC"; then
@@ -21014,7 +21023,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5
$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; }
-if test "${ac_cv_objc_compiler_gnu+set}" = set; then :
+if ${ac_cv_objc_compiler_gnu+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -21051,7 +21060,7 @@
ac_save_OBJCFLAGS=$OBJCFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5
$as_echo_n "checking whether $OBJC accepts -g... " >&6; }
-if test "${ac_cv_prog_objc_g+set}" = set; then :
+if ${ac_cv_prog_objc_g+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_save_objc_werror_flag=$ac_objc_werror_flag
@@ -21427,7 +21436,7 @@
set dummy ${ac_tool_prefix}ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_AR+set}" = set; then :
+if ${ac_cv_prog_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$AR"; then
@@ -21467,7 +21476,7 @@
set dummy ar; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then :
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_AR"; then
@@ -21809,7 +21818,7 @@
set dummy link; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_WINLD+set}" = set; then :
+if ${ac_cv_prog_WINLD+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$WINLD"; then
@@ -22148,7 +22157,7 @@
set dummy mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_MT+set}" = set; then :
+if ${ac_cv_prog_MT+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$MT"; then
@@ -22469,7 +22478,7 @@
set dummy rc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_RC+set}" = set; then :
+if ${ac_cv_prog_RC+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$RC"; then
@@ -22860,7 +22869,7 @@
set dummy lib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_WINAR+set}" = set; then :
+if ${ac_cv_prog_WINAR+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$WINAR"; then
@@ -23166,7 +23175,7 @@
set dummy dumpbin; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_DUMPBIN+set}" = set; then :
+if ${ac_cv_prog_DUMPBIN+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$DUMPBIN"; then
@@ -23485,7 +23494,7 @@
CPP=
fi
if test -z "$CPP"; then
- if test "${ac_cv_prog_CPP+set}" = set; then :
+ if ${ac_cv_prog_CPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CPP needs to be expanded
@@ -23601,7 +23610,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=cpp
@@ -23885,7 +23894,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
- if test "${ac_cv_prog_CXXCPP+set}" = set; then :
+ if ${ac_cv_prog_CXXCPP+:} false; then :
$as_echo_n "(cached) " >&6
else
# Double quotes because CXXCPP needs to be expanded
@@ -24001,7 +24010,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
fi
ac_ext=cpp
@@ -24303,7 +24312,7 @@
set dummy as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_AS+set}" = set; then :
+if ${ac_cv_path_AS+:} false; then :
$as_echo_n "(cached) " >&6
else
case $AS in
@@ -24617,7 +24626,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_NM+set}" = set; then :
+if ${ac_cv_path_NM+:} false; then :
$as_echo_n "(cached) " >&6
else
case $NM in
@@ -24926,7 +24935,7 @@
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_STRIP+set}" = set; then :
+if ${ac_cv_path_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
case $STRIP in
@@ -25232,7 +25241,7 @@
set dummy mcs; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_MCS+set}" = set; then :
+if ${ac_cv_path_MCS+:} false; then :
$as_echo_n "(cached) " >&6
else
case $MCS in
@@ -25540,7 +25549,7 @@
set dummy ${ac_tool_prefix}nm; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_NM+set}" = set; then :
+if ${ac_cv_prog_NM+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$NM"; then
@@ -25580,7 +25589,7 @@
set dummy nm; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_NM+set}" = set; then :
+if ${ac_cv_prog_ac_ct_NM+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_NM"; then
@@ -25898,7 +25907,7 @@
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then :
+if ${ac_cv_prog_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$STRIP"; then
@@ -25938,7 +25947,7 @@
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_STRIP"; then
@@ -26263,7 +26272,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJCOPY+set}" = set; then :
+if ${ac_cv_prog_OBJCOPY+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJCOPY"; then
@@ -26307,7 +26316,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OBJCOPY+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJCOPY"; then
@@ -26634,7 +26643,7 @@
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_OBJDUMP+set}" = set; then :
+if ${ac_cv_prog_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$OBJDUMP"; then
@@ -26678,7 +26687,7 @@
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then :
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
$as_echo_n "(cached) " >&6
else
if test -n "$ac_ct_OBJDUMP"; then
@@ -27002,7 +27011,7 @@
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_LIPO+set}" = set; then :
+if ${ac_cv_path_LIPO+:} false; then :
$as_echo_n "(cached) " >&6
else
case $LIPO in
@@ -27317,7 +27326,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then :
+if ${ac_cv_header_stdc+:} false; then :
$as_echo_n "(cached) " >&6
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -27493,7 +27502,7 @@
for ac_header in stdio.h
do :
ac_fn_cxx_check_header_mongrel "$LINENO" "stdio.h" "ac_cv_header_stdio_h" "$ac_includes_default"
-if test "x$ac_cv_header_stdio_h" = x""yes; then :
+if test "x$ac_cv_header_stdio_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_STDIO_H 1
_ACEOF
@@ -27522,7 +27531,7 @@
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int *" >&5
$as_echo_n "checking size of int *... " >&6; }
-if test "${ac_cv_sizeof_int_p+set}" = set; then :
+if ${ac_cv_sizeof_int_p+:} false; then :
$as_echo_n "(cached) " >&6
else
if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int *))" "ac_cv_sizeof_int_p" "$ac_includes_default"; then :
@@ -27532,7 +27541,7 @@
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int *)
-See \`config.log' for more details" "$LINENO" 5 ; }
+See \`config.log' for more details" "$LINENO" 5; }
else
ac_cv_sizeof_int_p=0
fi
@@ -27579,7 +27588,7 @@
#
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
-if test "${ac_cv_c_bigendian+set}" = set; then :
+if ${ac_cv_c_bigendian+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_cv_c_bigendian=unknown
@@ -28233,6 +28242,10 @@
fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
+ # Adding these macros will make it an error to link to mac APIs newer than OS version 10.7
+ MACOSX_REQUIRED_VERSION=1070
+
+ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(MACOSX_REQUIRED_VERSION) -DMAC_OS_X_VERSION_MIN_REQUIRED=\$(MACOSX_REQUIRED_VERSION)"
fi
if test "x$OPENJDK_TARGET_OS" = xbsd; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DBSD -D_ALLBSD_SOURCE"
@@ -28579,8 +28592,8 @@
have_x=disabled
else
case $x_includes,$x_libraries in #(
- *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5 ;; #(
- *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then :
+ *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
+ *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
$as_echo_n "(cached) " >&6
else
# One or both of the vars are not set, and there is no cached value.
@@ -28857,7 +28870,7 @@
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
-if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then :
+if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -28891,14 +28904,14 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then :
+if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
-if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then :
+if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -28932,7 +28945,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
-if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then :
+if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
fi
@@ -28951,14 +28964,14 @@
# The functions gethostbyname, getservbyname, and inet_addr are
# in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
ac_fn_cxx_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = x""yes; then :
+if test "x$ac_cv_func_gethostbyname" = xyes; then :
fi
if test $ac_cv_func_gethostbyname = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then :
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -28992,14 +29005,14 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then :
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
fi
if test $ac_cv_lib_nsl_gethostbyname = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
-if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then :
+if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29033,7 +29046,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5
$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
-if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then :
+if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
fi
@@ -29048,14 +29061,14 @@
# must be given before -lnsl if both are needed. We assume that
# if connect needs -lnsl, so does gethostbyname.
ac_fn_cxx_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = x""yes; then :
+if test "x$ac_cv_func_connect" = xyes; then :
fi
if test $ac_cv_func_connect = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
$as_echo_n "checking for connect in -lsocket... " >&6; }
-if test "${ac_cv_lib_socket_connect+set}" = set; then :
+if ${ac_cv_lib_socket_connect+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29089,7 +29102,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5
$as_echo "$ac_cv_lib_socket_connect" >&6; }
-if test "x$ac_cv_lib_socket_connect" = x""yes; then :
+if test "x$ac_cv_lib_socket_connect" = xyes; then :
X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
fi
@@ -29097,14 +29110,14 @@
# Guillermo Gomez says -lposix is necessary on A/UX.
ac_fn_cxx_check_func "$LINENO" "remove" "ac_cv_func_remove"
-if test "x$ac_cv_func_remove" = x""yes; then :
+if test "x$ac_cv_func_remove" = xyes; then :
fi
if test $ac_cv_func_remove = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
$as_echo_n "checking for remove in -lposix... " >&6; }
-if test "${ac_cv_lib_posix_remove+set}" = set; then :
+if ${ac_cv_lib_posix_remove+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29138,7 +29151,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5
$as_echo "$ac_cv_lib_posix_remove" >&6; }
-if test "x$ac_cv_lib_posix_remove" = x""yes; then :
+if test "x$ac_cv_lib_posix_remove" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
fi
@@ -29146,14 +29159,14 @@
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
ac_fn_cxx_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
-if test "x$ac_cv_func_shmat" = x""yes; then :
+if test "x$ac_cv_func_shmat" = xyes; then :
fi
if test $ac_cv_func_shmat = no; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
$as_echo_n "checking for shmat in -lipc... " >&6; }
-if test "${ac_cv_lib_ipc_shmat+set}" = set; then :
+if ${ac_cv_lib_ipc_shmat+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29187,7 +29200,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5
$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
-if test "x$ac_cv_lib_ipc_shmat" = x""yes; then :
+if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
fi
@@ -29205,7 +29218,7 @@
# John Interrante, Karl Berry
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
-if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then :
+if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -29239,7 +29252,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
-if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then :
+if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
fi
@@ -30252,7 +30265,7 @@
LDFLAGS="$FREETYPE2_LIBS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5
$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; }
-if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then :
+if ${ac_cv_lib_freetype_FT_Init_FreeType+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30286,7 +30299,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5
$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; }
-if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then :
+if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = xyes; then :
FREETYPE2_FOUND=true
else
as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5
@@ -30574,7 +30587,7 @@
for ac_header in alsa/asoundlib.h
do :
ac_fn_cxx_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default"
-if test "x$ac_cv_header_alsa_asoundlib_h" = x""yes; then :
+if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_ALSA_ASOUNDLIB_H 1
_ACEOF
@@ -30633,7 +30646,7 @@
USE_EXTERNAL_LIBJPEG=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ljpeg" >&5
$as_echo_n "checking for main in -ljpeg... " >&6; }
-if test "${ac_cv_lib_jpeg_main+set}" = set; then :
+if ${ac_cv_lib_jpeg_main+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30661,7 +30674,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_main" >&5
$as_echo "$ac_cv_lib_jpeg_main" >&6; }
-if test "x$ac_cv_lib_jpeg_main" = x""yes; then :
+if test "x$ac_cv_lib_jpeg_main" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBJPEG 1
_ACEOF
@@ -30685,7 +30698,7 @@
USE_EXTERNAL_LIBJPEG=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgif" >&5
$as_echo_n "checking for main in -lgif... " >&6; }
-if test "${ac_cv_lib_gif_main+set}" = set; then :
+if ${ac_cv_lib_gif_main+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30713,7 +30726,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_main" >&5
$as_echo "$ac_cv_lib_gif_main" >&6; }
-if test "x$ac_cv_lib_gif_main" = x""yes; then :
+if test "x$ac_cv_lib_gif_main" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBGIF 1
_ACEOF
@@ -30743,7 +30756,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5
$as_echo_n "checking for compress in -lz... " >&6; }
-if test "${ac_cv_lib_z_compress+set}" = set; then :
+if ${ac_cv_lib_z_compress+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30777,7 +30790,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5
$as_echo "$ac_cv_lib_z_compress" >&6; }
-if test "x$ac_cv_lib_z_compress" = x""yes; then :
+if test "x$ac_cv_lib_z_compress" = xyes; then :
ZLIB_FOUND=yes
else
ZLIB_FOUND=no
@@ -30870,7 +30883,7 @@
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
$as_echo_n "checking for cos in -lm... " >&6; }
-if test "${ac_cv_lib_m_cos+set}" = set; then :
+if ${ac_cv_lib_m_cos+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30904,7 +30917,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
$as_echo "$ac_cv_lib_m_cos" >&6; }
-if test "x$ac_cv_lib_m_cos" = x""yes; then :
+if test "x$ac_cv_lib_m_cos" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBM 1
_ACEOF
@@ -30928,7 +30941,7 @@
LIBS=""
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then :
+if ${ac_cv_lib_dl_dlopen+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
@@ -30962,7 +30975,7 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then :
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
cat >>confdefs.h <<_ACEOF
#define HAVE_LIBDL 1
_ACEOF
@@ -31606,7 +31619,7 @@
set dummy ccache; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
-if test "${ac_cv_path_CCACHE+set}" = set; then :
+if ${ac_cv_path_CCACHE+:} false; then :
$as_echo_n "(cached) " >&6
else
case $CCACHE in
@@ -31867,10 +31880,21 @@
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
- test "x$cache_file" != "x/dev/null" &&
+ if test "x$cache_file" != "x/dev/null"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
- cat confcache >$cache_file
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
@@ -31902,7 +31926,7 @@
-: ${CONFIG_STATUS=./config.status}
+: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
@@ -32003,6 +32027,7 @@
IFS=" "" $as_nl"
# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
case $0 in #((
*[\\/]* ) as_myself=$0 ;;
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
@@ -32310,7 +32335,7 @@
# values after options handling.
ac_log="
This file was extended by OpenJDK $as_me jdk8, which was
-generated by GNU Autoconf 2.67. Invocation command line was
+generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -32373,7 +32398,7 @@
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
OpenJDK config.status jdk8
-configured by $0, generated by GNU Autoconf 2.67,
+configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -32502,7 +32527,7 @@
"$OUTPUT_ROOT/spec.sh") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" ;;
"$OUTPUT_ROOT/Makefile") CONFIG_FILES="$CONFIG_FILES $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" ;;
- *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac
done
@@ -32524,9 +32549,10 @@
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
- tmp=
+ tmp= ac_tmp=
trap 'exit_status=$?
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
trap 'as_fn_exit 1' 1 2 13 15
}
@@ -32534,12 +32560,13 @@
{
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
+ test -d "$tmp"
} ||
{
tmp=./conf$$-$RANDOM
(umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
@@ -32561,7 +32588,7 @@
ac_cs_awk_cr=$ac_cr
fi
-echo 'BEGIN {' >"$tmp/subs1.awk" &&
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF
@@ -32589,7 +32616,7 @@
rm -f conf$$subs.sh
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
@@ -32637,7 +32664,7 @@
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
-cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
for (key in S) S_is_set[key] = 1
FS = ""
@@ -32669,7 +32696,7 @@
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
cat
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF
@@ -32703,7 +32730,7 @@
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
-cat >"$tmp/defines.awk" <<\_ACAWK ||
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF
@@ -32715,8 +32742,8 @@
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
- ac_t=`sed -n "/$ac_delim/p" confdefs.h`
- if test -z "$ac_t"; then
+ ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+ if test -z "$ac_tt"; then
break
elif $ac_last_try; then
as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
@@ -32817,7 +32844,7 @@
esac
case $ac_mode$ac_tag in
:[FHL]*:*);;
- :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
:[FH]-) ac_tag=-:-;;
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
esac
@@ -32836,7 +32863,7 @@
for ac_f
do
case $ac_f in
- -) ac_f="$tmp/stdin";;
+ -) ac_f="$ac_tmp/stdin";;
*) # Look for the file first in the build tree, then in the source tree
# (if the path is not absolute). The absolute path cannot be DOS-style,
# because $ac_f cannot contain `:'.
@@ -32845,7 +32872,7 @@
[\\/$]*) false;;
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
esac ||
- as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
@@ -32871,8 +32898,8 @@
esac
case $ac_tag in
- *:-:* | *:-) cat >"$tmp/stdin" \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
esac
;;
esac
@@ -32997,21 +33024,22 @@
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
$ac_datarootdir_hack
"
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
- || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
- rm -f "$tmp/stdin"
+ rm -f "$ac_tmp/stdin"
case $ac_file in
- -) cat "$tmp/out" && rm -f "$tmp/out";;
- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
esac \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
;;
@@ -33022,20 +33050,20 @@
if test x"$ac_file" != x-; then
{
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
- } >"$tmp/config.h" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+ } >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
- if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+ if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
- mv "$tmp/config.h" "$ac_file" \
+ mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
$as_echo "/* $configure_input */" \
- && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
;;
--- a/common/autoconf/spec.gmk.in Tue Feb 19 17:32:10 2013 -0500
+++ b/common/autoconf/spec.gmk.in Wed Jul 05 18:41:05 2017 +0200
@@ -282,6 +282,9 @@
X_LIBS:=@X_LIBS@
OPENWIN_HOME:=@OPENWIN_HOME@
+# The lowest required version of macosx to enforce compatiblity for
+MACOSX_REQUIRED_VERSION=@MACOSX_REQUIRED_VERSION@
+
# There are two types: CC or CL
# CC is gcc and others behaving reasonably similar.
# CL is cl.exe only.
--- a/common/autoconf/toolchain.m4 Tue Feb 19 17:32:10 2013 -0500
+++ b/common/autoconf/toolchain.m4 Wed Jul 05 18:41:05 2017 +0200
@@ -876,6 +876,10 @@
fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
+ # Adding these macros will make it an error to link to mac APIs newer than OS version 10.7
+ MACOSX_REQUIRED_VERSION=1070
+ AC_SUBST(MACOSX_REQUIRED_VERSION)
+ CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMAC_OS_X_VERSION_MAX_ALLOWED=\$(MACOSX_REQUIRED_VERSION) -DMAC_OS_X_VERSION_MIN_REQUIRED=\$(MACOSX_REQUIRED_VERSION)"
fi
if test "x$OPENJDK_TARGET_OS" = xbsd; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DBSD -D_ALLBSD_SOURCE"
--- a/common/bin/hgforest.sh Tue Feb 19 17:32:10 2013 -0500
+++ b/common/bin/hgforest.sh Wed Jul 05 18:41:05 2017 +0200
@@ -64,33 +64,33 @@
mkdir -p ${tmp}
safe_interrupt () {
- if [ -d ${tmp} ]; then
- if [ "`ls ${tmp}`" != "" ]; then
- echo "Waiting for processes ( `cat ${tmp}/* | tr '\n' ' '`) to terminate nicely!"
+ if [ -d ${tmp} ]; then
+ if [ "`ls ${tmp}/*.pid`" != "" ]; then
+ echo "Waiting for processes ( `cat ${tmp}/*.pid | tr '\n' ' '`) to terminate nicely!"
sleep 1
# Pipe stderr to dev/null to silence kill, that complains when trying to kill
# a subprocess that has already exited.
- kill -TERM `cat ${tmp}/* | tr '\n' ' '` 2> /dev/null
- wait
- echo Interrupt complete!
- fi
+ kill -TERM `cat ${tmp}/*.pid | tr '\n' ' '` 2> /dev/null
+ wait
+ echo Interrupt complete!
+ fi
fi
rm -f -r ${tmp}
exit 1
}
nice_exit () {
- if [ -d ${tmp} ]; then
- if [ "`ls ${tmp}`" != "" ]; then
- wait
- fi
+ if [ -d ${tmp} ]; then
+ if [ "`ls ${tmp}`" != "" ]; then
+ wait
+ fi
fi
rm -f -r ${tmp}
}
trap 'safe_interrupt' INT QUIT
trap 'nice_exit' EXIT
-
+
# Only look in specific locations for possible forests (avoids long searches)
pull_default=""
repos=""
@@ -172,14 +172,26 @@
if [ "${command}" = "clone" -o "${command}" = "fclone" ] ; then
pull_newrepo="`echo ${pull_base}/${i} | sed -e 's@\([^:]/\)//*@\1@g'`"
echo ${hg} clone ${pull_newrepo} ${i}
- ${hg} clone ${pull_newrepo} ${i} &
+ path="`dirname ${i}`"
+ if [ "${path}" != "." ] ; then
+ times=0
+ while [ ! -d "${path}" ] ## nested repo, ensure containing dir exists
+ do
+ times=`expr ${times} '+' 1`
+ if [ `expr ${times} '%' 10` -eq 0 ] ; then
+ echo ${path} still not created, waiting...
+ fi
+ sleep 5
+ done
+ fi
+ (${hg} clone ${pull_newrepo} ${i}; echo "$?" > ${tmp}/${repopidfile}.pid.rc )&
else
echo "cd ${i} && ${hg} $*"
- cd ${i} && ${hg} "$@" &
- fi
+ cd ${i} && (${hg} "$@"; echo "$?" > ${tmp}/${repopidfile}.pid.rc )&
+ fi
echo $! > ${tmp}/${repopidfile}.pid
) 2>&1 | sed -e "s@^@${reponame}: @") &
-
+
if [ `expr ${n} '%' ${at_a_time}` -eq 0 ] ; then
sleep 2
echo Waiting 5 secs before spawning next background command.
@@ -189,6 +201,15 @@
# Wait for all hg commands to complete
wait
-# Terminate with exit 0 all the time (hard to know when to say "failed")
-exit 0
-
+# Terminate with exit 0 only if all subprocesses were successful
+ec=0
+if [ -d ${tmp} ]; then
+ for rc in ${tmp}/*.pid.rc ; do
+ exit_code=`cat ${rc} | tr -d ' \n\r'`
+ if [ "${exit_code}" != "0" ] ; then
+ echo "WARNING: ${rc} exited abnormally."
+ ec=1
+ fi
+ done
+fi
+exit ${ec}
--- a/common/makefiles/Main.gmk Tue Feb 19 17:32:10 2013 -0500
+++ b/common/makefiles/Main.gmk Wed Jul 05 18:41:05 2017 +0200
@@ -129,7 +129,9 @@
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk demos)
@$(call TargetExit)
-images: source-tips demos images-only
+# Note: This double-colon rule is intentional, to support
+# custom make file integration.
+images:: source-tips demos images-only
images-only: start-make
@$(call TargetEnter)
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk images)
@@ -141,6 +143,17 @@
@($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk overlay-images)
@$(call TargetExit)
+profiles: profiles-oscheck source-tips jdk hotspot profiles-only
+profiles-only: start-make
+ @$(call TargetEnter)
+ @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk profiles)
+ @$(call TargetExit)
+
+profiles-oscheck:
+ifneq ($(OPENJDK_TARGET_OS), linux)
+ @echo "Error: The Java SE 8 Compact Profiles are only implemented for Linux at this time" && exit 1
+endif
+
install: images install-only
install-only: start-make
@$(call TargetEnter)
@@ -167,7 +180,7 @@
test: start-make
@$(call TargetEnter)
- @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
+ @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 -k MAKEFLAGS= PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
@$(call TargetExit)
# Stores the tips for each repository. This file is be used when constructing the jdk image and can be
@@ -224,5 +237,6 @@
.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only
.PHONY: all test clean dist-clean bootcycle-images start-make
.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-overlay-images clean-bootcycle-build
+.PHONY: profiles profiles-only profiles-oscheck
FRC: # Force target
--- a/common/makefiles/javadoc/CORE_PKGS.gmk Tue Feb 19 17:32:10 2013 -0500
+++ b/common/makefiles/javadoc/CORE_PKGS.gmk Wed Jul 05 18:41:05 2017 +0200
@@ -128,9 +128,9 @@
java.text \
java.text.spi \
java.time \
+ java.time.chrono \
+ java.time.format \
java.time.temporal \
- java.time.calendar \
- java.time.format \
java.time.zone \
java.util \
java.util.concurrent \
--- a/common/makefiles/javadoc/Javadoc.gmk Tue Feb 19 17:32:10 2013 -0500
+++ b/common/makefiles/javadoc/Javadoc.gmk Wed Jul 05 18:41:05 2017 +0200
@@ -267,6 +267,7 @@
-use \
-keywords \
-Xdoclint:none \
+ -Xprofilespath $(JDK_TOPDIR)/makefiles/profile-rtjar-includes.txt \
$(ADDITIONAL_JAVADOCFLAGS)
ifdef OPENJDK
--- a/get_source.sh Tue Feb 19 17:32:10 2013 -0500
+++ b/get_source.sh Wed Jul 05 18:41:05 2017 +0200
@@ -26,7 +26,7 @@
#
# Get clones of all nested repositories
-sh ./common/bin/hgforest.sh clone "$@"
+sh ./common/bin/hgforest.sh clone "$@" || exit 1
# Update all existing repositories to the latest sources
sh ./common/bin/hgforest.sh pull -u
--- a/hotspot/.hgtags Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/.hgtags Wed Jul 05 18:41:05 2017 +0200
@@ -314,3 +314,5 @@
6778d0b1659323a506ca47600ca29a9d9f8b383d jdk8-b75
20b605466ccb1b3725eb25314d9e8782199630c5 jdk8-b76
412d722168bc23f8e6d98995202728678561417f hs25-b18
+cdb46031e7184d37301288f5719121a63c7054b5 jdk8-b77
+9f19f4a7d48a4ebe7f616b6068971ea5f8b075fa hs25-b19
--- a/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m Wed Jul 05 18:41:05 2017 +0200
@@ -97,7 +97,8 @@
* Method: init0
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) {
+JNIEXPORT void JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) {
symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J");
taskID = (*env)->GetFieldID(env, cls, "task", "J");
CHECK_EXCEPTION;
@@ -108,7 +109,11 @@
* Method: lookupByName0
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
*/
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0(JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) {
+JNIEXPORT jlong JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0(
+ JNIEnv *env, jobject this_obj,
+ jstring objectName, jstring symbolName)
+{
jlong address = 0;
JNF_COCOA_ENTER(env);
@@ -137,7 +142,11 @@
* Method: readBytesFromProcess0
* Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult;
*/
-JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0(JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) {
+JNIEXPORT jbyteArray JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0(
+ JNIEnv *env, jobject this_obj,
+ jlong addr, jlong numBytes)
+{
if (debug) printf("readBytesFromProcess called. addr = %llx numBytes = %lld\n", addr, numBytes);
// must allocate storage instead of using former parameter buf
@@ -209,12 +218,74 @@
return array;
}
+
/*
- * Class: sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal
+ * Lookup the thread_t that corresponds to the given thread_id.
+ * The thread_id should be the result from calling thread_info() with THREAD_IDENTIFIER_INFO
+ * and reading the m_ident_info.thread_id returned.
+ * The returned thread_t is the mach send right to the kernel port for the corresponding thread.
+ *
+ * We cannot simply use the OSThread._thread_id field in the JVM. This is set to ::mach_thread_self()
+ * in the VM, but that thread port is not valid for a remote debugger to access the thread.
+ */
+thread_t
+lookupThreadFromThreadId(task_t task, jlong thread_id) {
+ if (debug) {
+ printf("lookupThreadFromThreadId thread_id=0x%llx\n", thread_id);
+ }
+
+ thread_array_t thread_list = NULL;
+ mach_msg_type_number_t thread_list_count = 0;
+ thread_t result_thread = 0;
+ int i;
+
+ // get the list of all the send rights
+ kern_return_t result = task_threads(task, &thread_list, &thread_list_count);
+ if (result != KERN_SUCCESS) {
+ if (debug) {
+ printf("task_threads returned 0x%x\n", result);
+ }
+ return 0;
+ }
+
+ for(i = 0 ; i < thread_list_count; i++) {
+ thread_identifier_info_data_t m_ident_info;
+ mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
+
+ // get the THREAD_IDENTIFIER_INFO for the send right
+ result = thread_info(thread_list[i], THREAD_IDENTIFIER_INFO, (thread_info_t) &m_ident_info, &count);
+ if (result != KERN_SUCCESS) {
+ if (debug) {
+ printf("thread_info returned 0x%x\n", result);
+ }
+ break;
+ }
+
+ // if this is the one we're looking for, return the send right
+ if (thread_id == m_ident_info.thread_id)
+ {
+ result_thread = thread_list[i];
+ break;
+ }
+ }
+
+ vm_size_t thread_list_size = (vm_size_t) (thread_list_count * sizeof (thread_t));
+ vm_deallocate(mach_task_self(), (vm_address_t) thread_list, thread_list_count);
+
+ return result_thread;
+}
+
+
+/*
+ * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
* Method: getThreadIntegerRegisterSet0
- * Signature: (I)[J
+ * Signature: (J)[J
*/
-JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0(JNIEnv *env, jobject this_obj, jint lwp_id) {
+JNIEXPORT jlongArray JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0(
+ JNIEnv *env, jobject this_obj,
+ jlong thread_id)
+{
if (debug)
printf("getThreadRegisterSet0 called\n");
@@ -226,8 +297,9 @@
int i;
jlongArray registerArray;
jlong *primitiveArray;
+ task_t gTask = getTask(env, this_obj);
- tid = lwp_id;
+ tid = lookupThreadFromThreadId(gTask, thread_id);
result = thread_get_state(tid, HSDB_THREAD_STATE, (thread_state_t)&state, &count);
@@ -328,19 +400,21 @@
}
/*
- * Class: sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal
+ * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
* Method: translateTID0
* Signature: (I)I
*/
JNIEXPORT jint JNICALL
-Java_sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal_translateTID0(JNIEnv *env, jobject this_obj, jint tid) {
+Java_sun_jvm_hotspot_debugger_macosx_MacOSXDebuggerLocal_translateTID0(
+ JNIEnv *env, jobject this_obj, jint tid)
+{
if (debug)
printf("translateTID0 called on tid = 0x%x\n", (int)tid);
kern_return_t result;
thread_t foreign_tid, usable_tid;
mach_msg_type_name_t type;
-
+
foreign_tid = tid;
task_t gTask = getTask(env, this_obj);
@@ -361,7 +435,10 @@
* Method: attach0
* Signature: (I)V
*/
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I(JNIEnv *env, jobject this_obj, jint jpid) {
+JNIEXPORT void JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I(
+ JNIEnv *env, jobject this_obj, jint jpid)
+{
JNF_COCOA_ENTER(env);
if (getenv("JAVA_SAPROC_DEBUG") != NULL)
debug = JNI_TRUE;
@@ -401,7 +478,10 @@
* Method: detach0
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0(JNIEnv *env, jobject this_obj) {
+JNIEXPORT void JNICALL
+Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0(
+ JNIEnv *env, jobject this_obj)
+{
JNF_COCOA_ENTER(env);
if (debug) printf("detach0 called\n");
@@ -419,10 +499,13 @@
* Method: load_library
* Signature: (Ljava/lang/String;)L
*/
-JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_asm_Disassembler_load_1library(JNIEnv * env,
- jclass disclass,
- jstring jrepath_s,
- jstring libname_s) {
+JNIEXPORT jlong JNICALL
+Java_sun_jvm_hotspot_asm_Disassembler_load_1library(
+ JNIEnv * env,
+ jclass disclass,
+ jstring jrepath_s,
+ jstring libname_s)
+{
uintptr_t func = 0;
const char* error_message = NULL;
const char* java_home;
@@ -533,13 +616,16 @@
* Method: decode
* Signature: (Lsun/jvm/hotspot/asm/InstructionVisitor;J[BLjava/lang/String;J)V
*/
-JNIEXPORT void JNICALL Java_sun_jvm_hotspot_asm_Disassembler_decode(JNIEnv * env,
- jobject dis,
- jobject visitor,
- jlong startPc,
- jbyteArray code,
- jstring options_s,
- jlong decode_instructions_virtual) {
+JNIEXPORT void JNICALL
+Java_sun_jvm_hotspot_asm_Disassembler_decode(
+ JNIEnv * env,
+ jobject dis,
+ jobject visitor,
+ jlong startPc,
+ jbyteArray code,
+ jstring options_s,
+ jlong decode_instructions_virtual)
+{
jboolean isCopy;
jbyte* start = (*env)->GetByteArrayElements(env, code, &isCopy);
jbyte* end = start + (*env)->GetArrayLength(env, code);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebugger.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebugger.java Wed Jul 05 18:41:05 2017 +0200
@@ -49,7 +49,7 @@
public BsdAddress readCompKlassAddress(long address) throws DebuggerException;
public BsdOopHandle readOopHandle(long address) throws DebuggerException;
public BsdOopHandle readCompOopHandle(long address) throws DebuggerException;
- public long[] getThreadIntegerRegisterSet(int lwp_id) throws DebuggerException;
+ public long[] getThreadIntegerRegisterSet(long unique_thread_id) throws DebuggerException;
public long getAddressValue(Address addr) throws DebuggerException;
public Address newAddress(long value) throws DebuggerException;
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebuggerLocal.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdDebuggerLocal.java Wed Jul 05 18:41:05 2017 +0200
@@ -90,7 +90,7 @@
throws DebuggerException;
private native ClosestSymbol lookupByAddress0(long address)
throws DebuggerException;
- private native long[] getThreadIntegerRegisterSet0(int lwp_id)
+ private native long[] getThreadIntegerRegisterSet0(long unique_thread_id)
throws DebuggerException;
private native byte[] readBytesFromProcess0(long address, long numBytes)
throws DebuggerException;
@@ -400,10 +400,15 @@
//
/** From the ThreadAccess interface via Debugger and JVMDebugger */
+ public ThreadProxy getThreadForIdentifierAddress(Address threadIdAddr, Address uniqueThreadIdAddr) {
+ return new BsdThread(this, threadIdAddr, uniqueThreadIdAddr);
+ }
+ @Override
public ThreadProxy getThreadForIdentifierAddress(Address addr) {
- return new BsdThread(this, addr);
+ throw new RuntimeException("unimplemented");
}
+
/** From the ThreadAccess interface via Debugger and JVMDebugger */
public ThreadProxy getThreadForThreadId(long id) {
return new BsdThread(this, id);
@@ -455,22 +460,22 @@
// Thread context access
//
- public synchronized long[] getThreadIntegerRegisterSet(int lwp_id)
+ public synchronized long[] getThreadIntegerRegisterSet(long unique_thread_id)
throws DebuggerException {
requireAttach();
if (isCore) {
- return getThreadIntegerRegisterSet0(lwp_id);
+ return getThreadIntegerRegisterSet0(unique_thread_id);
} else {
class GetThreadIntegerRegisterSetTask implements WorkerThreadTask {
- int lwp_id;
+ long unique_thread_id;
long[] result;
public void doit(BsdDebuggerLocal debugger) {
- result = debugger.getThreadIntegerRegisterSet0(lwp_id);
+ result = debugger.getThreadIntegerRegisterSet0(unique_thread_id);
}
}
GetThreadIntegerRegisterSetTask task = new GetThreadIntegerRegisterSetTask();
- task.lwp_id = lwp_id;
+ task.unique_thread_id = unique_thread_id;
workerThread.execute(task);
return task.result;
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThread.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/debugger/bsd/BsdThread.java Wed Jul 05 18:41:05 2017 +0200
@@ -28,21 +28,23 @@
class BsdThread implements ThreadProxy {
private BsdDebugger debugger;
- private int lwp_id;
+ private int thread_id;
+ private long unique_thread_id;
/** The address argument must be the address of the _thread_id in the
OSThread. It's value is result ::gettid() call. */
- BsdThread(BsdDebugger debugger, Address addr) {
+ BsdThread(BsdDebugger debugger, Address threadIdAddr, Address uniqueThreadIdAddr) {
this.debugger = debugger;
// FIXME: size of data fetched here should be configurable.
// However, making it so would produce a dependency on the "types"
// package from the debugger package, which is not desired.
- this.lwp_id = (int) addr.getCIntegerAt(0, 4, true);
+ this.thread_id = (int) threadIdAddr.getCIntegerAt(0, 4, true);
+ this.unique_thread_id = uniqueThreadIdAddr.getCIntegerAt(0, 8, true);
}
BsdThread(BsdDebugger debugger, long id) {
this.debugger = debugger;
- this.lwp_id = (int) id;
+ this.thread_id = (int) id;
}
public boolean equals(Object obj) {
@@ -50,19 +52,19 @@
return false;
}
- return (((BsdThread) obj).lwp_id == lwp_id);
+ return (((BsdThread) obj).thread_id == thread_id);
}
public int hashCode() {
- return lwp_id;
+ return thread_id;
}
public String toString() {
- return Integer.toString(lwp_id);
+ return Integer.toString(thread_id);
}
public ThreadContext getContext() throws IllegalThreadStateException {
- long[] data = debugger.getThreadIntegerRegisterSet(lwp_id);
+ long[] data = debugger.getThreadIntegerRegisterSet(unique_thread_id);
ThreadContext context = BsdThreadContextFactory.createThreadContext(debugger);
for (int i = 0; i < data.length; i++) {
context.setRegister(i, data[i]);
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -49,12 +49,18 @@
private static int HAS_LOCALVARIABLE_TABLE;
private static int HAS_EXCEPTION_TABLE;
private static int HAS_GENERIC_SIGNATURE;
+ private static int HAS_METHOD_ANNOTATIONS;
+ private static int HAS_PARAMETER_ANNOTATIONS;
+ private static int HAS_DEFAULT_ANNOTATIONS;
+ private static int HAS_TYPE_ANNOTATIONS;
+
+ private static final int sizeofShort = 2;
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
Type type = db.lookupType("ConstMethod");
constants = new MetadataField(type.getAddressField("_constants"), 0);
constMethodSize = new CIntField(type.getCIntegerField("_constMethod_size"), 0);
- flags = new ByteField(type.getJByteField("_flags"), 0);
+ flags = new CIntField(type.getCIntegerField("_flags"), 0);
// enum constants for flags
HAS_LINENUMBER_TABLE = db.lookupIntConstant("ConstMethod::_has_linenumber_table").intValue();
@@ -62,6 +68,10 @@
HAS_LOCALVARIABLE_TABLE = db.lookupIntConstant("ConstMethod::_has_localvariable_table").intValue();
HAS_EXCEPTION_TABLE = db.lookupIntConstant("ConstMethod::_has_exception_table").intValue();
HAS_GENERIC_SIGNATURE = db.lookupIntConstant("ConstMethod::_has_generic_signature").intValue();
+ HAS_METHOD_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_method_annotations").intValue();
+ HAS_PARAMETER_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_parameter_annotations").intValue();
+ HAS_DEFAULT_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_default_annotations").intValue();
+ HAS_TYPE_ANNOTATIONS = db.lookupIntConstant("ConstMethod::_has_type_annotations").intValue();
// Size of Java bytecodes allocated immediately after ConstMethod*.
codeSize = new CIntField(type.getCIntegerField("_code_size"), 0);
@@ -92,7 +102,7 @@
// Fields
private static MetadataField constants;
private static CIntField constMethodSize;
- private static ByteField flags;
+ private static CIntField flags;
private static CIntField codeSize;
private static CIntField nameIndex;
private static CIntField signatureIndex;
@@ -123,7 +133,7 @@
return constMethodSize.getValue(this);
}
- public byte getFlags() {
+ public long getFlags() {
return flags.getValue(this);
}
@@ -253,7 +263,7 @@
public void iterateFields(MetadataVisitor visitor) {
visitor.doMetadata(constants, true);
visitor.doCInt(constMethodSize, true);
- visitor.doByte(flags, true);
+ visitor.doCInt(flags, true);
visitor.doCInt(codeSize, true);
visitor.doCInt(nameIndex, true);
visitor.doCInt(signatureIndex, true);
@@ -381,6 +391,22 @@
return (getFlags() & HAS_GENERIC_SIGNATURE) != 0;
}
+ private boolean hasMethodAnnotations() {
+ return (getFlags() & HAS_METHOD_ANNOTATIONS) != 0;
+ }
+
+ private boolean hasParameterAnnotations() {
+ return (getFlags() & HAS_PARAMETER_ANNOTATIONS) != 0;
+ }
+
+ private boolean hasDefaultAnnotations() {
+ return (getFlags() & HAS_DEFAULT_ANNOTATIONS) != 0;
+ }
+
+ private boolean hasTypeAnnotations() {
+ return (getFlags() & HAS_TYPE_ANNOTATIONS) != 0;
+ }
+
//---------------------------------------------------------------------------
// Internals only below this point
@@ -400,9 +426,15 @@
return offsetOfCodeEnd() + (isNative() ? 2 * VM.getVM().getAddressSize() : 0);
}
- // Offset of last short in Method*
+ // Offset of last short in Method* before annotations, if present
private long offsetOfLastU2Element() {
- return getSize() * VM.getVM().getObjectHeap().getOopSize() - 2;
+ int offset = 0;
+ if (hasMethodAnnotations()) offset++;
+ if (hasParameterAnnotations()) offset++;
+ if (hasTypeAnnotations()) offset++;
+ if (hasDefaultAnnotations()) offset++;
+ long wordSize = VM.getVM().getObjectHeap().getOopSize();
+ return (getSize() * wordSize) - (offset * wordSize) - sizeofShort;
}
// Offset of the generic signature index
@@ -411,7 +443,7 @@
}
private long offsetOfCheckedExceptionsLength() {
- return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
+ return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
}
@@ -461,11 +493,11 @@
}
if (hasExceptionTable()) {
- return offsetOfExceptionTable() - 2;
+ return offsetOfExceptionTable() - sizeofShort;
} else if (hasCheckedExceptions()) {
- return offsetOfCheckedExceptions() - 2;
+ return offsetOfCheckedExceptions() - sizeofShort;
} else {
- return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
+ return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
}
}
@@ -493,9 +525,9 @@
Assert.that(hasExceptionTable(), "should only be called if table is present");
}
if (hasCheckedExceptions()) {
- return offsetOfCheckedExceptions() - 2;
+ return offsetOfCheckedExceptions() - sizeofShort;
} else {
- return hasGenericSignature() ? offsetOfLastU2Element() - 2 :
+ return hasGenericSignature() ? offsetOfLastU2Element() - sizeofShort :
offsetOfLastU2Element();
}
}
--- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/runtime/bsd_amd64/BsdAMD64JavaThreadPDAccess.java Wed Jul 05 18:41:05 2017 +0200
@@ -28,6 +28,8 @@
import java.util.*;
import sun.jvm.hotspot.debugger.*;
import sun.jvm.hotspot.debugger.amd64.*;
+import sun.jvm.hotspot.debugger.bsd.BsdDebugger;
+import sun.jvm.hotspot.debugger.bsd.BsdDebuggerLocal;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.runtime.amd64.*;
import sun.jvm.hotspot.runtime.x86.*;
@@ -38,8 +40,9 @@
private static AddressField lastJavaFPField;
private static AddressField osThreadField;
- // Field from OSThread
+ // Fields from OSThread
private static CIntegerField osThreadThreadIDField;
+ private static CIntegerField osThreadUniqueThreadIDField;
// This is currently unneeded but is being kept in case we change
// the currentFrameGuess algorithm
@@ -61,7 +64,8 @@
lastJavaFPField = anchorType.getAddressField("_last_Java_fp");
Type osThreadType = db.lookupType("OSThread");
- osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
+ osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
+ osThreadUniqueThreadIDField = osThreadType.getCIntegerField("_unique_thread_id");
}
public Address getLastJavaFP(Address addr) {
@@ -125,8 +129,9 @@
Address osThreadAddr = osThreadField.getValue(addr);
// Get the address of the _thread_id from the OSThread
Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset());
+ Address uniqueThreadIdAddr = osThreadAddr.addOffsetTo(osThreadUniqueThreadIDField.getOffset());
- JVMDebugger debugger = VM.getVM().getDebugger();
- return debugger.getThreadForIdentifierAddress(threadIdAddr);
+ BsdDebuggerLocal debugger = (BsdDebuggerLocal) VM.getVM().getDebugger();
+ return debugger.getThreadForIdentifierAddress(threadIdAddr, uniqueThreadIdAddr);
}
}
--- a/hotspot/make/hotspot_version Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/make/hotspot_version Wed Jul 05 18:41:05 2017 +0200
@@ -35,7 +35,7 @@
HS_MAJOR_VER=25
HS_MINOR_VER=0
-HS_BUILD_NUMBER=18
+HS_BUILD_NUMBER=19
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
--- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -2270,10 +2270,11 @@
}
void Assembler::vpermq(XMMRegister dst, XMMRegister src, int imm8, bool vector256) {
- int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, true, vector256);
- emit_int8(0x00);
- emit_int8(0xC0 | encode);
- emit_int8(imm8);
+ assert(VM_Version::supports_avx2(), "");
+ int encode = simd_prefix_and_encode(dst, xnoreg, src, VEX_SIMD_66, VEX_OPCODE_0F_3A, true, vector256);
+ emit_int8(0x00);
+ emit_int8(0xC0 | encode);
+ emit_int8(imm8);
}
void Assembler::pcmpestri(XMMRegister dst, Address src, int imm8) {
--- a/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/cpu/x86/vm/macroAssembler_x86.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -5691,7 +5691,7 @@
Address::ScaleFactor scale = Address::times_2;
int stride = 8;
- if (UseAVX >= 2) {
+ if (UseAVX >= 2 && UseSSE42Intrinsics) {
Label COMPARE_WIDE_VECTORS, VECTOR_NOT_EQUAL, COMPARE_WIDE_TAIL, COMPARE_SMALL_STR;
Label COMPARE_WIDE_VECTORS_LOOP, COMPARE_16_CHARS, COMPARE_INDEX_CHAR;
Label COMPARE_TAIL_LONG;
--- a/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/cpu/zero/vm/shark_globals_zero.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright 2008, 2009, 2010 Red Hat, Inc.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@@ -51,7 +51,7 @@
define_pd_global(intx, OnStackReplacePercentage, 933 );
define_pd_global(intx, FreqInlineSize, 325 );
define_pd_global(intx, InlineSmallCode, 1000 );
-define_pd_global(intx, NewRatio, 12 );
+define_pd_global(uintx, NewRatio, 12 );
define_pd_global(intx, NewSizeThreadIncrease, 4*K );
define_pd_global(intx, InitialCodeCacheSize, 160*K);
define_pd_global(intx, ReservedCodeCacheSize, 32*M );
--- a/hotspot/src/os/bsd/vm/osThread_bsd.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/os/bsd/vm/osThread_bsd.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -49,6 +49,11 @@
// (e.g. pthread_kill).
pthread_t _pthread_id;
+ // This is the "thread_id" from struct thread_identifier_info. According to a
+ // comment in thread_info.h, this is a "system-wide unique 64-bit thread id".
+ // The value is used by SA to correlate threads.
+ uint64_t _unique_thread_id;
+
sigset_t _caller_sigmask; // Caller's signal mask
public:
@@ -77,6 +82,10 @@
_pthread_id = tid;
}
+ void set_unique_thread_id(uint64_t id) {
+ _unique_thread_id = id;
+ }
+
// ***************************************************************
// suspension support.
// ***************************************************************
--- a/hotspot/src/os/bsd/vm/os_bsd.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/os/bsd/vm/os_bsd.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -657,6 +657,18 @@
objc_registerThreadWithCollector_t objc_registerThreadWithCollectorFunction = NULL;
#endif
+#ifdef __APPLE__
+static uint64_t locate_unique_thread_id() {
+ // Additional thread_id used to correlate threads in SA
+ thread_identifier_info_data_t m_ident_info;
+ mach_msg_type_number_t count = THREAD_IDENTIFIER_INFO_COUNT;
+
+ thread_info(::mach_thread_self(), THREAD_IDENTIFIER_INFO,
+ (thread_info_t) &m_ident_info, &count);
+ return m_ident_info.thread_id;
+}
+#endif
+
// Thread start routine for all newly created threads
static void *java_start(Thread *thread) {
// Try to randomize the cache line index of hot stack frames.
@@ -685,6 +697,7 @@
#ifdef __APPLE__
// thread_id is mach thread on macos
osthread->set_thread_id(::mach_thread_self());
+ osthread->set_unique_thread_id(locate_unique_thread_id());
#else
// thread_id is pthread_id on BSD
osthread->set_thread_id(::pthread_self());
@@ -847,6 +860,7 @@
// Store pthread info into the OSThread
#ifdef __APPLE__
osthread->set_thread_id(::mach_thread_self());
+ osthread->set_unique_thread_id(locate_unique_thread_id());
#else
osthread->set_thread_id(::pthread_self());
#endif
--- a/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/os_cpu/bsd_x86/vm/globals_bsd_x86.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -42,7 +42,7 @@
#endif // AMD64
define_pd_global(intx, CompilerThreadStackSize, 0);
-define_pd_global(intx, SurvivorRatio, 8);
+define_pd_global(uintx, SurvivorRatio, 8);
define_pd_global(uintx, JVMInvokeMethodSlack, 8192);
--- a/hotspot/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/os_cpu/bsd_x86/vm/vmStructs_bsd_x86.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -35,17 +35,16 @@
/* Threads (NOTE: incomplete) */ \
/******************************/ \
nonstatic_field(OSThread, _thread_id, OSThread::thread_id_t) \
- nonstatic_field(OSThread, _pthread_id, pthread_t)
+ nonstatic_field(OSThread, _unique_thread_id, uint64_t)
#define VM_TYPES_OS_CPU(declare_type, declare_toplevel_type, declare_oop_type, declare_integer_type, declare_unsigned_integer_type, declare_c1_toplevel_type, declare_c2_type, declare_c2_toplevel_type) \
\
/**********************/ \
- /* Posix Thread IDs */ \
+ /* Thread IDs */ \
/**********************/ \
\
- declare_unsigned_integer_type(OSThread::thread_id_t) \
- declare_unsigned_integer_type(pthread_t)
+ declare_unsigned_integer_type(OSThread::thread_id_t)
#define VM_INT_CONSTANTS_OS_CPU(declare_constant, declare_preprocessor_constant, declare_c1_constant, declare_c2_constant, declare_c2_preprocessor_constant)
--- a/hotspot/src/share/tools/whitebox/sun/hotspot/WhiteBox.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/tools/whitebox/sun/hotspot/WhiteBox.java Wed Jul 05 18:41:05 2017 +0200
@@ -23,6 +23,8 @@
*/
package sun.hotspot;
+
+import java.lang.reflect.Method;
import java.security.BasicPermission;
import sun.hotspot.parser.DiagnosticCommand;
@@ -81,4 +83,15 @@
public native boolean NMTAllocTest();
public native boolean NMTFreeTestMemory();
public native boolean NMTWaitForDataMerge();
+
+ // Compiler
+ public native void deoptimizeAll();
+ public native boolean isMethodCompiled(Method method);
+ public native boolean isMethodCompilable(Method method);
+ public native boolean isMethodQueuedForCompilation(Method method);
+ public native int deoptimizeMethod(Method method);
+ public native void makeMethodNotCompilable(Method method);
+ public native int getMethodCompilationLevel(Method method);
+ public native boolean setDontInlineMethod(Method method, boolean value);
+ public native int getCompileQueuesSize();
}
--- a/hotspot/src/share/vm/asm/macroAssembler.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/asm/macroAssembler.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -37,10 +37,10 @@
# include "assembler_zero.hpp"
#endif
#ifdef TARGET_ARCH_arm
-# include "assembler_arm.hpp"
+# include "macroAssembler_arm.hpp"
#endif
#ifdef TARGET_ARCH_ppc
-# include "assembler_ppc.hpp"
+# include "macroAssembler_ppc.hpp"
#endif
#endif // SHARE_VM_ASM_MACROASSEMBLER_HPP
--- a/hotspot/src/share/vm/asm/macroAssembler.inline.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/asm/macroAssembler.inline.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -37,10 +37,10 @@
# include "assembler_zero.inline.hpp"
#endif
#ifdef TARGET_ARCH_arm
-# include "assembler_arm.inline.hpp"
+# include "macroAssembler_arm.inline.hpp"
#endif
#ifdef TARGET_ARCH_ppc
-# include "assembler_ppc.inline.hpp"
+# include "macroAssembler_ppc.inline.hpp"
#endif
#endif // SHARE_VM_ASM_MACROASSEMBLER_INLINE_HPP
--- a/hotspot/src/share/vm/classfile/classFileParser.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/classfile/classFileParser.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1856,6 +1856,154 @@
#define MAX_CODE_SIZE 65535
#define INITIAL_MAX_LVT_NUMBER 256
+/* Copy class file LVT's/LVTT's into the HotSpot internal LVT.
+ *
+ * Rules for LVT's and LVTT's are:
+ * - There can be any number of LVT's and LVTT's.
+ * - If there are n LVT's, it is the same as if there was just
+ * one LVT containing all the entries from the n LVT's.
+ * - There may be no more than one LVT entry per local variable.
+ * Two LVT entries are 'equal' if these fields are the same:
+ * start_pc, length, name, slot
+ * - There may be no more than one LVTT entry per each LVT entry.
+ * Each LVTT entry has to match some LVT entry.
+ * - HotSpot internal LVT keeps natural ordering of class file LVT entries.
+ */
+void ClassFileParser::copy_localvariable_table(ConstMethod* cm,
+ int lvt_cnt,
+ u2* localvariable_table_length,
+ u2** localvariable_table_start,
+ int lvtt_cnt,
+ u2* localvariable_type_table_length,
+ u2** localvariable_type_table_start,
+ TRAPS) {
+
+ LVT_Hash** lvt_Hash = NEW_RESOURCE_ARRAY(LVT_Hash*, HASH_ROW_SIZE);
+ initialize_hashtable(lvt_Hash);
+
+ // To fill LocalVariableTable in
+ Classfile_LVT_Element* cf_lvt;
+ LocalVariableTableElement* lvt = cm->localvariable_table_start();
+
+ for (int tbl_no = 0; tbl_no < lvt_cnt; tbl_no++) {
+ cf_lvt = (Classfile_LVT_Element *) localvariable_table_start[tbl_no];
+ for (int idx = 0; idx < localvariable_table_length[tbl_no]; idx++, lvt++) {
+ copy_lvt_element(&cf_lvt[idx], lvt);
+ // If no duplicates, add LVT elem in hashtable lvt_Hash.
+ if (LVT_put_after_lookup(lvt, lvt_Hash) == false
+ && _need_verify
+ && _major_version >= JAVA_1_5_VERSION) {
+ clear_hashtable(lvt_Hash);
+ ConstantPool* cp = cm->constants();
+ classfile_parse_error("Duplicated LocalVariableTable attribute "
+ "entry for '%s' in class file %s",
+ cp->symbol_at(lvt->name_cp_index)->as_utf8(),
+ CHECK);
+ }
+ }
+ }
+
+ // To merge LocalVariableTable and LocalVariableTypeTable
+ Classfile_LVT_Element* cf_lvtt;
+ LocalVariableTableElement lvtt_elem;
+
+ for (int tbl_no = 0; tbl_no < lvtt_cnt; tbl_no++) {
+ cf_lvtt = (Classfile_LVT_Element *) localvariable_type_table_start[tbl_no];
+ for (int idx = 0; idx < localvariable_type_table_length[tbl_no]; idx++) {
+ copy_lvt_element(&cf_lvtt[idx], &lvtt_elem);
+ int index = hash(&lvtt_elem);
+ LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash);
+ if (entry == NULL) {
+ if (_need_verify) {
+ clear_hashtable(lvt_Hash);
+ ConstantPool* cp = cm->constants();
+ classfile_parse_error("LVTT entry for '%s' in class file %s "
+ "does not match any LVT entry",
+ cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
+ CHECK);
+ }
+ } else if (entry->_elem->signature_cp_index != 0 && _need_verify) {
+ clear_hashtable(lvt_Hash);
+ ConstantPool* cp = cm->constants();
+ classfile_parse_error("Duplicated LocalVariableTypeTable attribute "
+ "entry for '%s' in class file %s",
+ cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
+ CHECK);
+ } else {
+ // to add generic signatures into LocalVariableTable
+ entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index;
+ }
+ }
+ }
+ clear_hashtable(lvt_Hash);
+}
+
+
+void ClassFileParser::copy_method_annotations(ClassLoaderData* loader_data,
+ ConstMethod* cm,
+ u1* runtime_visible_annotations,
+ int runtime_visible_annotations_length,
+ u1* runtime_invisible_annotations,
+ int runtime_invisible_annotations_length,
+ u1* runtime_visible_parameter_annotations,
+ int runtime_visible_parameter_annotations_length,
+ u1* runtime_invisible_parameter_annotations,
+ int runtime_invisible_parameter_annotations_length,
+ u1* runtime_visible_type_annotations,
+ int runtime_visible_type_annotations_length,
+ u1* runtime_invisible_type_annotations,
+ int runtime_invisible_type_annotations_length,
+ u1* annotation_default,
+ int annotation_default_length,
+ TRAPS) {
+
+ AnnotationArray* a;
+
+ if (runtime_visible_annotations_length +
+ runtime_invisible_annotations_length > 0) {
+ a = assemble_annotations(loader_data,
+ runtime_visible_annotations,
+ runtime_visible_annotations_length,
+ runtime_invisible_annotations,
+ runtime_invisible_annotations_length,
+ CHECK);
+ cm->set_method_annotations(a);
+ }
+
+ if (runtime_visible_parameter_annotations_length +
+ runtime_invisible_parameter_annotations_length > 0) {
+ a = assemble_annotations(loader_data,
+ runtime_visible_parameter_annotations,
+ runtime_visible_parameter_annotations_length,
+ runtime_invisible_parameter_annotations,
+ runtime_invisible_parameter_annotations_length,
+ CHECK);
+ cm->set_parameter_annotations(a);
+ }
+
+ if (annotation_default_length > 0) {
+ a = assemble_annotations(loader_data,
+ annotation_default,
+ annotation_default_length,
+ NULL,
+ 0,
+ CHECK);
+ cm->set_default_annotations(a);
+ }
+
+ if (runtime_visible_type_annotations_length +
+ runtime_invisible_type_annotations_length > 0) {
+ a = assemble_annotations(loader_data,
+ runtime_visible_type_annotations,
+ runtime_visible_type_annotations_length,
+ runtime_invisible_type_annotations,
+ runtime_invisible_type_annotations_length,
+ CHECK);
+ cm->set_type_annotations(a);
+ }
+}
+
+
// Note: the parse_method below is big and clunky because all parsing of the code and exceptions
// attribute is inlined. This is cumbersome to avoid since we inline most of the parts in the
// Method* to save footprint, so we only know the size of the resulting Method* when the
@@ -1869,10 +2017,6 @@
constantPoolHandle cp,
bool is_interface,
AccessFlags *promoted_flags,
- AnnotationArray** method_annotations,
- AnnotationArray** method_parameter_annotations,
- AnnotationArray** method_default_annotations,
- AnnotationArray** method_type_annotations,
TRAPS) {
ClassFileStream* cfs = stream();
methodHandle nullHandle;
@@ -2273,10 +2417,24 @@
}
// All sizing information for a Method* is finally available, now create it
+ InlineTableSizes sizes(
+ total_lvt_length,
+ linenumber_table_length,
+ exception_table_length,
+ checked_exceptions_length,
+ method_parameters_length,
+ generic_signature_index,
+ runtime_visible_annotations_length +
+ runtime_invisible_annotations_length,
+ runtime_visible_parameter_annotations_length +
+ runtime_invisible_parameter_annotations_length,
+ runtime_visible_type_annotations_length +
+ runtime_invisible_type_annotations_length,
+ annotation_default_length,
+ 0);
+
Method* m = Method::allocate(
- loader_data, code_length, access_flags, linenumber_table_length,
- total_lvt_length, exception_table_length, checked_exceptions_length,
- method_parameters_length, generic_signature_index,
+ loader_data, code_length, access_flags, &sizes,
ConstMethod::NORMAL, CHECK_(nullHandle));
ClassLoadingService::add_class_method_size(m->size()*HeapWordSize);
@@ -2347,107 +2505,37 @@
copy_u2_with_conversion((u2*) m->checked_exceptions_start(), checked_exceptions_start, size);
}
- /* Copy class file LVT's/LVTT's into the HotSpot internal LVT.
- *
- * Rules for LVT's and LVTT's are:
- * - There can be any number of LVT's and LVTT's.
- * - If there are n LVT's, it is the same as if there was just
- * one LVT containing all the entries from the n LVT's.
- * - There may be no more than one LVT entry per local variable.
- * Two LVT entries are 'equal' if these fields are the same:
- * start_pc, length, name, slot
- * - There may be no more than one LVTT entry per each LVT entry.
- * Each LVTT entry has to match some LVT entry.
- * - HotSpot internal LVT keeps natural ordering of class file LVT entries.
- */
+ // Copy class file LVT's/LVTT's into the HotSpot internal LVT.
if (total_lvt_length > 0) {
- int tbl_no, idx;
-
promoted_flags->set_has_localvariable_table();
-
- LVT_Hash** lvt_Hash = NEW_RESOURCE_ARRAY(LVT_Hash*, HASH_ROW_SIZE);
- initialize_hashtable(lvt_Hash);
-
- // To fill LocalVariableTable in
- Classfile_LVT_Element* cf_lvt;
- LocalVariableTableElement* lvt = m->localvariable_table_start();
-
- for (tbl_no = 0; tbl_no < lvt_cnt; tbl_no++) {
- cf_lvt = (Classfile_LVT_Element *) localvariable_table_start[tbl_no];
- for (idx = 0; idx < localvariable_table_length[tbl_no]; idx++, lvt++) {
- copy_lvt_element(&cf_lvt[idx], lvt);
- // If no duplicates, add LVT elem in hashtable lvt_Hash.
- if (LVT_put_after_lookup(lvt, lvt_Hash) == false
- && _need_verify
- && _major_version >= JAVA_1_5_VERSION ) {
- clear_hashtable(lvt_Hash);
- classfile_parse_error("Duplicated LocalVariableTable attribute "
- "entry for '%s' in class file %s",
- cp->symbol_at(lvt->name_cp_index)->as_utf8(),
- CHECK_(nullHandle));
- }
- }
- }
-
- // To merge LocalVariableTable and LocalVariableTypeTable
- Classfile_LVT_Element* cf_lvtt;
- LocalVariableTableElement lvtt_elem;
-
- for (tbl_no = 0; tbl_no < lvtt_cnt; tbl_no++) {
- cf_lvtt = (Classfile_LVT_Element *) localvariable_type_table_start[tbl_no];
- for (idx = 0; idx < localvariable_type_table_length[tbl_no]; idx++) {
- copy_lvt_element(&cf_lvtt[idx], &lvtt_elem);
- int index = hash(&lvtt_elem);
- LVT_Hash* entry = LVT_lookup(&lvtt_elem, index, lvt_Hash);
- if (entry == NULL) {
- if (_need_verify) {
- clear_hashtable(lvt_Hash);
- classfile_parse_error("LVTT entry for '%s' in class file %s "
- "does not match any LVT entry",
- cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
- CHECK_(nullHandle));
- }
- } else if (entry->_elem->signature_cp_index != 0 && _need_verify) {
- clear_hashtable(lvt_Hash);
- classfile_parse_error("Duplicated LocalVariableTypeTable attribute "
- "entry for '%s' in class file %s",
- cp->symbol_at(lvtt_elem.name_cp_index)->as_utf8(),
- CHECK_(nullHandle));
- } else {
- // to add generic signatures into LocalVariableTable
- entry->_elem->signature_cp_index = lvtt_elem.descriptor_cp_index;
- }
- }
- }
- clear_hashtable(lvt_Hash);
+ copy_localvariable_table(m->constMethod(), lvt_cnt,
+ localvariable_table_length,
+ localvariable_table_start,
+ lvtt_cnt,
+ localvariable_type_table_length,
+ localvariable_type_table_start, CHECK_NULL);
}
if (parsed_annotations.has_any_annotations())
parsed_annotations.apply_to(m);
- *method_annotations = assemble_annotations(loader_data,
- runtime_visible_annotations,
- runtime_visible_annotations_length,
- runtime_invisible_annotations,
- runtime_invisible_annotations_length,
- CHECK_(nullHandle));
- *method_parameter_annotations = assemble_annotations(loader_data,
- runtime_visible_parameter_annotations,
- runtime_visible_parameter_annotations_length,
- runtime_invisible_parameter_annotations,
- runtime_invisible_parameter_annotations_length,
- CHECK_(nullHandle));
- *method_default_annotations = assemble_annotations(loader_data,
- annotation_default,
- annotation_default_length,
- NULL,
- 0,
- CHECK_(nullHandle));
- *method_type_annotations = assemble_annotations(loader_data,
- runtime_visible_type_annotations,
- runtime_visible_type_annotations_length,
- runtime_invisible_type_annotations,
- runtime_invisible_type_annotations_length,
- CHECK_(nullHandle));
+
+ // Copy annotations
+ copy_method_annotations(loader_data, m->constMethod(),
+ runtime_visible_annotations,
+ runtime_visible_annotations_length,
+ runtime_invisible_annotations,
+ runtime_invisible_annotations_length,
+ runtime_visible_parameter_annotations,
+ runtime_visible_parameter_annotations_length,
+ runtime_invisible_parameter_annotations,
+ runtime_invisible_parameter_annotations_length,
+ runtime_visible_type_annotations,
+ runtime_visible_type_annotations_length,
+ runtime_invisible_type_annotations,
+ runtime_invisible_type_annotations_length,
+ annotation_default,
+ annotation_default_length,
+ CHECK_NULL);
if (name == vmSymbols::finalize_method_name() &&
signature == vmSymbols::void_method_signature()) {
@@ -2463,6 +2551,7 @@
_has_vanilla_constructor = true;
}
+ NOT_PRODUCT(m->verify());
return m;
}
@@ -2476,17 +2565,9 @@
bool is_interface,
AccessFlags* promoted_flags,
bool* has_final_method,
- Array<AnnotationArray*>** methods_annotations,
- Array<AnnotationArray*>** methods_parameter_annotations,
- Array<AnnotationArray*>** methods_default_annotations,
- Array<AnnotationArray*>** methods_type_annotations,
bool* has_default_methods,
TRAPS) {
ClassFileStream* cfs = stream();
- AnnotationArray* method_annotations = NULL;
- AnnotationArray* method_parameter_annotations = NULL;
- AnnotationArray* method_default_annotations = NULL;
- AnnotationArray* method_type_annotations = NULL;
cfs->guarantee_more(2, CHECK_NULL); // length
u2 length = cfs->get_u2_fast();
if (length == 0) {
@@ -2500,10 +2581,6 @@
methodHandle method = parse_method(loader_data,
cp, is_interface,
promoted_flags,
- &method_annotations,
- &method_parameter_annotations,
- &method_default_annotations,
- &method_type_annotations,
CHECK_NULL);
if (method->is_final()) {
@@ -2514,38 +2591,6 @@
*has_default_methods = true;
}
methods->at_put(index, method());
-
- if (method_annotations != NULL) {
- if (*methods_annotations == NULL) {
- *methods_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
- }
- (*methods_annotations)->at_put(index, method_annotations);
- }
-
- if (method_parameter_annotations != NULL) {
- if (*methods_parameter_annotations == NULL) {
- *methods_parameter_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
- }
- (*methods_parameter_annotations)->at_put(index, method_parameter_annotations);
- }
-
- if (method_default_annotations != NULL) {
- if (*methods_default_annotations == NULL) {
- *methods_default_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
- }
- (*methods_default_annotations)->at_put(index, method_default_annotations);
- }
-
- if (method_type_annotations != NULL) {
- if (*methods_type_annotations == NULL) {
- *methods_type_annotations =
- MetadataFactory::new_array<AnnotationArray*>(loader_data, length, NULL, CHECK_NULL);
- }
- (*methods_type_annotations)->at_put(index, method_type_annotations);
- }
}
if (_need_verify && length > 1) {
@@ -2578,11 +2623,7 @@
Array<int>* ClassFileParser::sort_methods(ClassLoaderData* loader_data,
Array<Method*>* methods,
- Array<AnnotationArray*>* methods_annotations,
- Array<AnnotationArray*>* methods_parameter_annotations,
- Array<AnnotationArray*>* methods_default_annotations,
- Array<AnnotationArray*>* methods_type_annotations,
- TRAPS) {
+ TRAPS) {
int length = methods->length();
// If JVMTI original method ordering or sharing is enabled we have to
// remember the original class file ordering.
@@ -2598,10 +2639,7 @@
}
// Sort method array by ascending method name (for faster lookups & vtable construction)
// Note that the ordering is not alphabetical, see Symbol::fast_compare
- Method::sort_methods(methods, methods_annotations,
- methods_parameter_annotations,
- methods_default_annotations,
- methods_type_annotations);
+ Method::sort_methods(methods);
// If JVMTI original method ordering or sharing is enabled construct int
// array remembering the original ordering
@@ -3048,9 +3086,6 @@
k->set_source_debug_extension(_sde_buffer, _sde_length);
}
k->set_inner_classes(_inner_classes);
- if (_annotations != NULL) {
- k->annotations()->set_class_annotations(_annotations);
- }
}
AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_data,
@@ -3361,19 +3396,10 @@
bool has_final_method = false;
AccessFlags promoted_flags;
promoted_flags.set_flags(0);
-
- Array<AnnotationArray*>* methods_annotations = NULL;
- Array<AnnotationArray*>* methods_parameter_annotations = NULL;
- Array<AnnotationArray*>* methods_default_annotations = NULL;
- Array<AnnotationArray*>* methods_type_annotations = NULL;
Array<Method*>* methods = parse_methods(loader_data,
cp, access_flags.is_interface(),
&promoted_flags,
&has_final_method,
- &methods_annotations,
- &methods_parameter_annotations,
- &methods_default_annotations,
- &methods_type_annotations,
&has_default_methods,
CHECK_(nullHandle));
@@ -3432,10 +3458,6 @@
// sort methods
Array<int>* method_ordering = sort_methods(loader_data,
methods,
- methods_annotations,
- methods_parameter_annotations,
- methods_default_annotations,
- methods_type_annotations,
CHECK_(nullHandle));
// promote flags from parse_methods() to the klass' flags
@@ -4035,7 +4057,6 @@
const unsigned int total_oop_map_count =
compute_oop_map_count(super_klass, nonstatic_oop_map_count,
first_nonstatic_oop_offset);
-
// Compute reference type
ReferenceType rt;
if (super_klass() == NULL) {
@@ -4057,7 +4078,7 @@
access_flags,
name,
super_klass(),
- host_klass,
+ !host_klass.is_null(),
CHECK_(nullHandle));
// Add all classes to our internal class loader list here,
@@ -4103,31 +4124,15 @@
if (is_anonymous()) // I am well known to myself
cp->klass_at_put(this_class_index, this_klass()); // eagerly resolve
- // Allocate an annotation type if needed.
- if (fields_annotations != NULL ||
- methods_annotations != NULL ||
- methods_parameter_annotations != NULL ||
- methods_default_annotations != NULL ||
- fields_type_annotations != NULL ||
- methods_type_annotations != NULL) {
- Annotations* anno = Annotations::allocate(loader_data,
- fields_annotations, methods_annotations,
- methods_parameter_annotations,
- methods_default_annotations, CHECK_(nullHandle));
- this_klass->set_annotations(anno);
- } else {
- this_klass->set_annotations(NULL);
- }
-
- if (fields_type_annotations != NULL ||
- methods_type_annotations != NULL) {
- assert(this_klass->annotations() != NULL, "annotations should have been allocated");
- Annotations* anno = Annotations::allocate(loader_data,
- fields_type_annotations,
- methods_type_annotations,
- NULL,
- NULL, CHECK_(nullHandle));
- this_klass->annotations()->set_type_annotations(anno);
+ // Assign allocations if needed
+ if (_annotations != NULL || _type_annotations != NULL ||
+ fields_annotations != NULL || fields_type_annotations != NULL) {
+ Annotations* annotations = Annotations::allocate(loader_data, CHECK_NULL);
+ annotations->set_class_annotations(_annotations);
+ annotations->set_class_type_annotations(_type_annotations);
+ annotations->set_fields_annotations(fields_annotations);
+ annotations->set_fields_type_annotations(fields_type_annotations);
+ this_klass->set_annotations(annotations);
}
this_klass->set_minor_version(minor_version);
@@ -4153,27 +4158,8 @@
// Fill in field values obtained by parse_classfile_attributes
if (parsed_annotations.has_any_annotations())
parsed_annotations.apply_to(this_klass);
-
- // Create annotations
- if (_annotations != NULL && this_klass->annotations() == NULL) {
- Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
- this_klass->set_annotations(anno);
- }
apply_parsed_class_attributes(this_klass);
- // Create type annotations
- if (_type_annotations != NULL) {
- if (this_klass->annotations() == NULL) {
- Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
- this_klass->set_annotations(anno);
- }
- if (this_klass->annotations()->type_annotations() == NULL) {
- Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL);
- this_klass->annotations()->set_type_annotations(anno);
- }
- this_klass->annotations()->type_annotations()->set_class_annotations(_type_annotations);
- }
-
// Miranda methods
if ((num_miranda_methods > 0) ||
// if this class introduced new miranda methods or
--- a/hotspot/src/share/vm/classfile/classFileParser.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/classfile/classFileParser.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -199,29 +199,17 @@
constantPoolHandle cp,
bool is_interface,
AccessFlags* promoted_flags,
- AnnotationArray** method_annotations,
- AnnotationArray** method_parameter_annotations,
- AnnotationArray** method_default_annotations,
- AnnotationArray** method_type_annotations,
TRAPS);
Array<Method*>* parse_methods(ClassLoaderData* loader_data,
constantPoolHandle cp,
bool is_interface,
AccessFlags* promoted_flags,
bool* has_final_method,
- Array<AnnotationArray*>** methods_annotations,
- Array<AnnotationArray*>** methods_parameter_annotations,
- Array<AnnotationArray*>** methods_default_annotations,
- Array<AnnotationArray*>** methods_type_annotations,
bool* has_default_method,
TRAPS);
Array<int>* sort_methods(ClassLoaderData* loader_data,
Array<Method*>* methods,
- Array<AnnotationArray*>* methods_annotations,
- Array<AnnotationArray*>* methods_parameter_annotations,
- Array<AnnotationArray*>* methods_default_annotations,
- Array<AnnotationArray*>* methods_type_annotations,
- TRAPS);
+ TRAPS);
u2* parse_exception_table(ClassLoaderData* loader_data,
u4 code_length, u4 exception_table_length,
constantPoolHandle cp, TRAPS);
@@ -377,6 +365,32 @@
: cp->tag_at(index).is_klass_reference());
}
+ void copy_localvariable_table(ConstMethod* cm, int lvt_cnt,
+ u2* localvariable_table_length,
+ u2** localvariable_table_start,
+ int lvtt_cnt,
+ u2* localvariable_type_table_length,
+ u2** localvariable_type_table_start,
+ TRAPS);
+
+ void copy_method_annotations(ClassLoaderData* loader_data,
+ ConstMethod* cm,
+ u1* runtime_visible_annotations,
+ int runtime_visible_annotations_length,
+ u1* runtime_invisible_annotations,
+ int runtime_invisible_annotations_length,
+ u1* runtime_visible_parameter_annotations,
+ int runtime_visible_parameter_annotations_length,
+ u1* runtime_invisible_parameter_annotations,
+ int runtime_invisible_parameter_annotations_length,
+ u1* runtime_visible_type_annotations,
+ int runtime_visible_type_annotations_length,
+ u1* runtime_invisible_type_annotations,
+ int runtime_invisible_type_annotations_length,
+ u1* annotation_default,
+ int annotation_default_length,
+ TRAPS);
+
public:
// Constructor
ClassFileParser(ClassFileStream* st) { set_stream(st); }
--- a/hotspot/src/share/vm/classfile/defaultMethods.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/classfile/defaultMethods.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1146,9 +1146,10 @@
address code_start = static_cast<address>(bytecodes->adr_at(0));
int code_length = bytecodes->length();
+ InlineTableSizes sizes;
Method* m = Method::allocate(cp->pool_holder()->class_loader_data(),
- code_length, flags, 0, 0, 0, 0, 0, 0,
+ code_length, flags, &sizes,
mt, CHECK_NULL);
m->set_constants(NULL); // This will get filled in later
@@ -1285,33 +1286,15 @@
enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS };
- Array<AnnotationArray*>* original_annots[NUM_ARRAYS] = { NULL };
-
Array<Method*>* original_methods = klass->methods();
- Annotations* annots = klass->annotations();
- if (annots != NULL) {
- original_annots[ANNOTATIONS] = annots->methods_annotations();
- original_annots[PARAMETERS] = annots->methods_parameter_annotations();
- original_annots[DEFAULTS] = annots->methods_default_annotations();
- }
-
Array<int>* original_ordering = klass->method_ordering();
Array<int>* merged_ordering = Universe::the_empty_int_array();
int new_size = klass->methods()->length() + new_methods->length();
- Array<AnnotationArray*>* merged_annots[NUM_ARRAYS];
-
Array<Method*>* merged_methods = MetadataFactory::new_array<Method*>(
klass->class_loader_data(), new_size, NULL, CHECK);
- for (int i = 0; i < NUM_ARRAYS; ++i) {
- if (original_annots[i] != NULL) {
- merged_annots[i] = MetadataFactory::new_array<AnnotationArray*>(
- klass->class_loader_data(), new_size, CHECK);
- } else {
- merged_annots[i] = NULL;
- }
- }
+
if (original_ordering != NULL && original_ordering->length() > 0) {
merged_ordering = MetadataFactory::new_array<int>(
klass->class_loader_data(), new_size, CHECK);
@@ -1338,12 +1321,6 @@
(new_method == NULL || orig_method->name() < new_method->name())) {
merged_methods->at_put(i, orig_method);
original_methods->at_put(orig_idx, NULL);
- for (int j = 0; j < NUM_ARRAYS; ++j) {
- if (merged_annots[j] != NULL) {
- merged_annots[j]->at_put(i, original_annots[j]->at(orig_idx));
- original_annots[j]->at_put(orig_idx, NULL);
- }
- }
if (merged_ordering->length() > 0) {
merged_ordering->at_put(i, original_ordering->at(orig_idx));
}
@@ -1372,21 +1349,9 @@
// Replace klass methods with new merged lists
klass->set_methods(merged_methods);
- if (annots != NULL) {
- annots->set_methods_annotations(merged_annots[ANNOTATIONS]);
- annots->set_methods_parameter_annotations(merged_annots[PARAMETERS]);
- annots->set_methods_default_annotations(merged_annots[DEFAULTS]);
- } else {
- assert(merged_annots[ANNOTATIONS] == NULL, "Must be");
- assert(merged_annots[PARAMETERS] == NULL, "Must be");
- assert(merged_annots[DEFAULTS] == NULL, "Must be");
- }
ClassLoaderData* cld = klass->class_loader_data();
MetadataFactory::free_array(cld, original_methods);
- for (int i = 0; i < NUM_ARRAYS; ++i) {
- MetadataFactory::free_array(cld, original_annots[i]);
- }
if (original_ordering->length() > 0) {
klass->set_method_ordering(merged_ordering);
MetadataFactory::free_array(cld, original_ordering);
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -274,8 +274,8 @@
// end of a collection, we let CMSTriggerRatio of the (purported) free
// space be allocated before initiating a new collection cycle.
//
-void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, intx tr) {
- assert(io <= 100 && tr >= 0 && tr <= 100, "Check the arguments");
+void ConcurrentMarkSweepGeneration::init_initiating_occupancy(intx io, uintx tr) {
+ assert(io <= 100 && tr <= 100, "Check the arguments");
if (io >= 0) {
_initiating_occupancy = (double)io / 100.0;
} else {
--- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1093,7 +1093,7 @@
// getter and initializer for _initiating_occupancy field.
double initiating_occupancy() const { return _initiating_occupancy; }
- void init_initiating_occupancy(intx io, intx tr);
+ void init_initiating_occupancy(intx io, uintx tr);
public:
ConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size,
--- a/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/g1/concurrentMark.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -4062,15 +4062,36 @@
if (_cm->verbose_low()) {
gclog_or_tty->print_cr("[%u] we're scanning part "
"["PTR_FORMAT", "PTR_FORMAT") "
- "of region "PTR_FORMAT,
- _worker_id, _finger, _region_limit, _curr_region);
+ "of region "HR_FORMAT,
+ _worker_id, _finger, _region_limit,
+ HR_FORMAT_PARAMS(_curr_region));
}
- // Let's iterate over the bitmap of the part of the
- // region that is left.
- if (mr.is_empty() || _nextMarkBitMap->iterate(&bitmap_closure, mr)) {
- // We successfully completed iterating over the region. Now,
- // let's give up the region.
+ assert(!_curr_region->isHumongous() || mr.start() == _curr_region->bottom(),
+ "humongous regions should go around loop once only");
+
+ // Some special cases:
+ // If the memory region is empty, we can just give up the region.
+ // If the current region is humongous then we only need to check
+ // the bitmap for the bit associated with the start of the object,
+ // scan the object if it's live, and give up the region.
+ // Otherwise, let's iterate over the bitmap of the part of the region
+ // that is left.
+ // If the iteration is successful, give up the region.
+ if (mr.is_empty()) {
+ giveup_current_region();
+ regular_clock_call();
+ } else if (_curr_region->isHumongous() && mr.start() == _curr_region->bottom()) {
+ if (_nextMarkBitMap->isMarked(mr.start())) {
+ // The object is marked - apply the closure
+ BitMap::idx_t offset = _nextMarkBitMap->heapWordToOffset(mr.start());
+ bitmap_closure.do_bit(offset);
+ }
+ // Even if this task aborted while scanning the humongous object
+ // we can (and should) give up the current region.
+ giveup_current_region();
+ regular_clock_call();
+ } else if (_nextMarkBitMap->iterate(&bitmap_closure, mr)) {
giveup_current_region();
regular_clock_call();
} else {
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1893,7 +1893,6 @@
_ref_processor_stw(NULL),
_process_strong_tasks(new SubTasksDone(G1H_PS_NumElements)),
_bot_shared(NULL),
- _objs_with_preserved_marks(NULL), _preserved_marks_of_objs(NULL),
_evac_failure_scan_stack(NULL) ,
_mark_in_progress(false),
_cg1r(NULL), _summary_bytes_used(0),
@@ -4215,22 +4214,15 @@
assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
// Now restore saved marks, if any.
- if (_objs_with_preserved_marks != NULL) {
- assert(_preserved_marks_of_objs != NULL, "Both or none.");
- guarantee(_objs_with_preserved_marks->length() ==
- _preserved_marks_of_objs->length(), "Both or none.");
- for (int i = 0; i < _objs_with_preserved_marks->length(); i++) {
- oop obj = _objs_with_preserved_marks->at(i);
- markOop m = _preserved_marks_of_objs->at(i);
- obj->set_mark(m);
- }
-
- // Delete the preserved marks growable arrays (allocated on the C heap).
- delete _objs_with_preserved_marks;
- delete _preserved_marks_of_objs;
- _objs_with_preserved_marks = NULL;
- _preserved_marks_of_objs = NULL;
- }
+ assert(_objs_with_preserved_marks.size() ==
+ _preserved_marks_of_objs.size(), "Both or none.");
+ while (!_objs_with_preserved_marks.is_empty()) {
+ oop obj = _objs_with_preserved_marks.pop();
+ markOop m = _preserved_marks_of_objs.pop();
+ obj->set_mark(m);
+ }
+ _objs_with_preserved_marks.clear(true);
+ _preserved_marks_of_objs.clear(true);
}
void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
@@ -4313,15 +4305,8 @@
// We want to call the "for_promotion_failure" version only in the
// case of a promotion failure.
if (m->must_be_preserved_for_promotion_failure(obj)) {
- if (_objs_with_preserved_marks == NULL) {
- assert(_preserved_marks_of_objs == NULL, "Both or none.");
- _objs_with_preserved_marks =
- new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
- _preserved_marks_of_objs =
- new (ResourceObj::C_HEAP, mtGC) GrowableArray<markOop>(40, true);
- }
- _objs_with_preserved_marks->push(obj);
- _preserved_marks_of_objs->push(m);
+ _objs_with_preserved_marks.push(obj);
+ _preserved_marks_of_objs.push(m);
}
}
--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -37,6 +37,7 @@
#include "memory/barrierSet.hpp"
#include "memory/memRegion.hpp"
#include "memory/sharedHeap.hpp"
+#include "utilities/stack.hpp"
// A "G1CollectedHeap" is an implementation of a java heap for HotSpot.
// It uses the "Garbage First" heap organization and algorithm, which
@@ -877,10 +878,9 @@
// forwarding pointers to themselves. Reset them.
void remove_self_forwarding_pointers();
- // When one is non-null, so is the other. Together, they each pair is
- // an object with a preserved mark, and its mark value.
- GrowableArray<oop>* _objs_with_preserved_marks;
- GrowableArray<markOop>* _preserved_marks_of_objs;
+ // Together, these store an object with a preserved mark, and its mark value.
+ Stack<oop, mtGC> _objs_with_preserved_marks;
+ Stack<markOop, mtGC> _preserved_marks_of_objs;
// Preserve the mark of "obj", if necessary, in preparation for its mark
// word being overwritten with a self-forwarding-pointer.
--- a/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1_globals.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -101,9 +101,6 @@
"to-space, we will allow regions whose survival rate is up to " \
"S + (1 - S)*X, where X is this parameter (as a fraction.)") \
\
- develop(intx, G1InitYoungSurvRatio, 50, \
- "Expected Survival Rate for newly allocated bytes") \
- \
develop(bool, G1SATBPrintStubs, false, \
"If true, print generated stubs for the SATB barrier") \
\
--- a/hotspot/src/share/vm/memory/heapInspection.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -85,16 +85,20 @@
"Number of bytes used by the InstanceKlass::singers() array") \
f(class_annotations_bytes, class_annotations, \
"Size of class annotations") \
+ f(class_type_annotations_bytes, class_type_annotations, \
+ "Size of class type annotations") \
f(fields_annotations_bytes, fields_annotations, \
"Size of field annotations") \
+ f(fields_type_annotations_bytes, fields_type_annotations, \
+ "Size of field type annotations") \
f(methods_annotations_bytes, methods_annotations, \
"Size of method annotations") \
f(methods_parameter_annotations_bytes, methods_parameter_annotations, \
"Size of method parameter annotations") \
+ f(methods_type_annotations_bytes, methods_type_annotations, \
+ "Size of methods type annotations") \
f(methods_default_annotations_bytes, methods_default_annotations, \
"Size of methods default annotations") \
- f(type_annotations_bytes, type_annotations, \
- "Size of type annotations") \
f(annotations_bytes, annotations, \
"Size of all annotations") \
f(cp_bytes, Cp, \
--- a/hotspot/src/share/vm/memory/metaspace.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/memory/metaspace.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1064,11 +1064,11 @@
//
// After the GC the compute_new_size() for MetaspaceGC is called to
// resize the capacity of the metaspaces. The current implementation
-// is based on the flags MinHeapFreeRatio and MaxHeapFreeRatio used
+// is based on the flags MinMetaspaceFreeRatio and MaxHeapFreeRatio used
// to resize the Java heap by some GC's. New flags can be implemented
// if really needed. MinHeapFreeRatio is used to calculate how much
// free space is desirable in the metaspace capacity to decide how much
-// to increase the HWM. MaxHeapFreeRatio is used to decide how much
+// to increase the HWM. MaxMetaspaceFreeRatio is used to decide how much
// free space is desirable in the metaspace capacity before decreasing
// the HWM.
@@ -1166,7 +1166,7 @@
size_t capacity_until_GC = vsl->capacity_bytes_sum();
size_t free_after_gc = capacity_until_GC - used_after_gc;
- const double minimum_free_percentage = MinHeapFreeRatio / 100.0;
+ const double minimum_free_percentage = MinMetaspaceFreeRatio / 100.0;
const double maximum_used_percentage = 1.0 - minimum_free_percentage;
const double min_tmp = used_after_gc / maximum_used_percentage;
@@ -1232,8 +1232,8 @@
max_shrink_words));
// Should shrinking be considered?
- if (MaxHeapFreeRatio < 100) {
- const double maximum_free_percentage = MaxHeapFreeRatio / 100.0;
+ if (MaxMetaspaceFreeRatio < 100) {
+ const double maximum_free_percentage = MaxMetaspaceFreeRatio / 100.0;
const double minimum_used_percentage = 1.0 - maximum_free_percentage;
const double max_tmp = used_after_gc / minimum_used_percentage;
size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx));
--- a/hotspot/src/share/vm/oops/annotations.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/annotations.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -36,16 +36,8 @@
return new (loader_data, size(), true, THREAD) Annotations();
}
-Annotations* Annotations::allocate(ClassLoaderData* loader_data,
- Array<AnnotationArray*>* fa,
- Array<AnnotationArray*>* ma,
- Array<AnnotationArray*>* mpa,
- Array<AnnotationArray*>* mda, TRAPS) {
- return new (loader_data, size(), true, THREAD) Annotations(fa, ma, mpa, mda);
-}
-
// helper
-static void free_contents(ClassLoaderData* loader_data, Array<AnnotationArray*>* p) {
+void Annotations::free_contents(ClassLoaderData* loader_data, Array<AnnotationArray*>* p) {
if (p != NULL) {
for (int i = 0; i < p->length(); i++) {
MetadataFactory::free_array<u1>(loader_data, p->at(i));
@@ -59,44 +51,16 @@
MetadataFactory::free_array<u1>(loader_data, class_annotations());
}
free_contents(loader_data, fields_annotations());
- free_contents(loader_data, methods_annotations());
- free_contents(loader_data, methods_parameter_annotations());
- free_contents(loader_data, methods_default_annotations());
- // Recursively deallocate optional Annotations linked through this one
- MetadataFactory::free_metadata(loader_data, type_annotations());
+ if (class_type_annotations() != NULL) {
+ MetadataFactory::free_array<u1>(loader_data, class_type_annotations());
+ }
+ free_contents(loader_data, fields_type_annotations());
}
-// Set the annotation at 'idnum' to 'anno'.
-// We don't want to create or extend the array if 'anno' is NULL, since that is the
-// default value. However, if the array exists and is long enough, we must set NULL values.
-void Annotations::set_methods_annotations_of(instanceKlassHandle ik,
- int idnum, AnnotationArray* anno,
- Array<AnnotationArray*>** md_p,
- TRAPS) {
- Array<AnnotationArray*>* md = *md_p;
- if (md != NULL && md->length() > idnum) {
- md->at_put(idnum, anno);
- } else if (anno != NULL) {
- // create the array
- int length = MAX2(idnum+1, (int)ik->idnum_allocated_count());
- md = MetadataFactory::new_array<AnnotationArray*>(ik->class_loader_data(), length, CHECK);
- if (*md_p != NULL) {
- // copy the existing entries
- for (int index = 0; index < (*md_p)->length(); index++) {
- md->at_put(index, (*md_p)->at(index));
- }
- }
- set_annotations(md, md_p);
- md->at_put(idnum, anno);
- } // if no array and idnum isn't included there is nothing to do
-}
-
-// Keep created annotations in a global growable array (should be hashtable)
-// need to add, search, delete when class is unloaded.
-// Does it need a lock? yes. This sucks.
-
// Copy annotations to JVM call or reflection to the java heap.
+// The alternative to creating this array and adding to Java heap pressure
+// is to have a hashtable of the already created typeArrayOops
typeArrayOop Annotations::make_java_array(AnnotationArray* annotations, TRAPS) {
if (annotations != NULL) {
int length = annotations->length();
@@ -132,28 +96,15 @@
void Annotations::collect_statistics(KlassSizeStats *sz) const {
sz->_annotations_bytes = sz->count(this);
sz->_class_annotations_bytes = sz->count(class_annotations());
+ sz->_class_type_annotations_bytes = sz->count(class_type_annotations());
sz->_fields_annotations_bytes = count_bytes(fields_annotations());
- sz->_methods_annotations_bytes = count_bytes(methods_annotations());
- sz->_methods_parameter_annotations_bytes =
- count_bytes(methods_parameter_annotations());
- sz->_methods_default_annotations_bytes =
- count_bytes(methods_default_annotations());
-
- const Annotations* type_anno = type_annotations();
- if (type_anno != NULL) {
- sz->_type_annotations_bytes = sz->count(type_anno);
- sz->_type_annotations_bytes += sz->count(type_anno->class_annotations());
- sz->_type_annotations_bytes += count_bytes(type_anno->fields_annotations());
- sz->_type_annotations_bytes += count_bytes(type_anno->methods_annotations());
- }
+ sz->_fields_type_annotations_bytes = count_bytes(fields_type_annotations());
sz->_annotations_bytes +=
sz->_class_annotations_bytes +
+ sz->_class_type_annotations_bytes +
sz->_fields_annotations_bytes +
- sz->_methods_annotations_bytes +
- sz->_methods_parameter_annotations_bytes +
- sz->_methods_default_annotations_bytes +
- sz->_type_annotations_bytes;
+ sz->_fields_type_annotations_bytes;
sz->_ro_bytes += sz->_annotations_bytes;
}
@@ -165,8 +116,7 @@
void Annotations::print_on(outputStream* st) const {
st->print(BULLET"class_annotations "); class_annotations()->print_value_on(st);
st->print(BULLET"fields_annotations "); fields_annotations()->print_value_on(st);
- st->print(BULLET"methods_annotations "); methods_annotations()->print_value_on(st);
- st->print(BULLET"methods_parameter_annotations"); methods_parameter_annotations()->print_value_on(st);
- st->print(BULLET"methods_default_annotations "); methods_default_annotations()->print_value_on(st);
+ st->print(BULLET"class_type_annotations "); class_type_annotations()->print_value_on(st);
+ st->print(BULLET"fields_type_annotations "); fields_type_annotations()->print_value_on(st);
}
#endif // PRODUCT
--- a/hotspot/src/share/vm/oops/annotations.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/annotations.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -49,38 +49,15 @@
// Annotation objects (byte arrays) for fields, or null if no annotations.
// Indices correspond to entries (not indices) in fields array.
Array<AnnotationArray*>* _fields_annotations;
- // Annotation objects (byte arrays) for methods, or null if no annotations.
- // Index is the idnum, which is initially the same as the methods array index.
- Array<AnnotationArray*>* _methods_annotations;
- // Annotation objects (byte arrays) for methods' parameters, or null if no
- // such annotations.
- // Index is the idnum, which is initially the same as the methods array index.
- Array<AnnotationArray*>* _methods_parameter_annotations;
- // Annotation objects (byte arrays) for methods' default values, or null if no
- // such annotations.
- // Index is the idnum, which is initially the same as the methods array index.
- Array<AnnotationArray*>* _methods_default_annotations;
// Type annotations for this class, or null if none.
- Annotations* _type_annotations;
-
- // Constructor where some some values are known to not be null
- Annotations(Array<AnnotationArray*>* fa, Array<AnnotationArray*>* ma,
- Array<AnnotationArray*>* mpa, Array<AnnotationArray*>* mda) :
- _class_annotations(NULL),
- _fields_annotations(fa),
- _methods_annotations(ma),
- _methods_parameter_annotations(mpa),
- _methods_default_annotations(mda),
- _type_annotations(NULL) {}
+ AnnotationArray* _class_type_annotations;
+ Array<AnnotationArray*>* _fields_type_annotations;
public:
// Allocate instance of this class
static Annotations* allocate(ClassLoaderData* loader_data, TRAPS);
- static Annotations* allocate(ClassLoaderData* loader_data,
- Array<AnnotationArray*>* fa,
- Array<AnnotationArray*>* ma,
- Array<AnnotationArray*>* mpa,
- Array<AnnotationArray*>* mda, TRAPS);
+
+ static void free_contents(ClassLoaderData* loader_data, Array<AnnotationArray*>* p);
void deallocate_contents(ClassLoaderData* loader_data);
DEBUG_ONLY(bool on_stack() { return false; }) // for template
@@ -93,61 +70,24 @@
// Constructor to initialize to null
Annotations() : _class_annotations(NULL),
_fields_annotations(NULL),
- _methods_annotations(NULL),
- _methods_parameter_annotations(NULL),
- _methods_default_annotations(NULL),
- _type_annotations(NULL) {}
+ _class_type_annotations(NULL),
+ _fields_type_annotations(NULL) {}
AnnotationArray* class_annotations() const { return _class_annotations; }
Array<AnnotationArray*>* fields_annotations() const { return _fields_annotations; }
- Array<AnnotationArray*>* methods_annotations() const { return _methods_annotations; }
- Array<AnnotationArray*>* methods_parameter_annotations() const { return _methods_parameter_annotations; }
- Array<AnnotationArray*>* methods_default_annotations() const { return _methods_default_annotations; }
- Annotations* type_annotations() const { return _type_annotations; }
+ AnnotationArray* class_type_annotations() const { return _class_type_annotations; }
+ Array<AnnotationArray*>* fields_type_annotations() const { return _fields_type_annotations; }
void set_class_annotations(AnnotationArray* md) { _class_annotations = md; }
void set_fields_annotations(Array<AnnotationArray*>* md) { _fields_annotations = md; }
- void set_methods_annotations(Array<AnnotationArray*>* md) { _methods_annotations = md; }
- void set_methods_parameter_annotations(Array<AnnotationArray*>* md) { _methods_parameter_annotations = md; }
- void set_methods_default_annotations(Array<AnnotationArray*>* md) { _methods_default_annotations = md; }
- void set_type_annotations(Annotations* annos) { _type_annotations = annos; }
-
- // Redefine classes support
- AnnotationArray* get_method_annotations_of(int idnum)
- { return get_method_annotations_from(idnum, _methods_annotations); }
-
- AnnotationArray* get_method_parameter_annotations_of(int idnum)
- { return get_method_annotations_from(idnum, _methods_parameter_annotations); }
- AnnotationArray* get_method_default_annotations_of(int idnum)
- { return get_method_annotations_from(idnum, _methods_default_annotations); }
-
-
- void set_method_annotations_of(instanceKlassHandle ik,
- int idnum, AnnotationArray* anno, TRAPS) {
- set_methods_annotations_of(ik, idnum, anno, &_methods_annotations, THREAD);
- }
-
- void set_method_parameter_annotations_of(instanceKlassHandle ik,
- int idnum, AnnotationArray* anno, TRAPS) {
- set_methods_annotations_of(ik, idnum, anno, &_methods_parameter_annotations, THREAD);
- }
-
- void set_method_default_annotations_of(instanceKlassHandle ik,
- int idnum, AnnotationArray* anno, TRAPS) {
- set_methods_annotations_of(ik, idnum, anno, &_methods_default_annotations, THREAD);
- }
+ void set_class_type_annotations(AnnotationArray* cta) { _class_type_annotations = cta; }
+ void set_fields_type_annotations(Array<AnnotationArray*>* fta) { _fields_type_annotations = fta; }
// Turn metadata annotations into a Java heap object (oop)
static typeArrayOop make_java_array(AnnotationArray* annotations, TRAPS);
- inline AnnotationArray* get_method_annotations_from(int idnum, Array<AnnotationArray*>* annos);
- void set_annotations(Array<AnnotationArray*>* md, Array<AnnotationArray*>** md_p) { *md_p = md; }
-
bool is_klass() const { return false; }
private:
- void set_methods_annotations_of(instanceKlassHandle ik,
- int idnum, AnnotationArray* anno,
- Array<AnnotationArray*>** md_p, TRAPS);
static julong count_bytes(Array<AnnotationArray*>* p);
public:
const char* internal_name() const { return "{constant pool}"; }
@@ -156,13 +96,4 @@
#endif
void print_value_on(outputStream* st) const;
};
-
-
-// For method with idnum get the method's Annotations
-inline AnnotationArray* Annotations::get_method_annotations_from(int idnum, Array<AnnotationArray*>* annos) {
- if (annos == NULL || annos->length() <= idnum) {
- return NULL;
- }
- return annos->at(idnum);
-}
#endif // SHARE_VM_OOPS_ANNOTATIONS_HPP
--- a/hotspot/src/share/vm/oops/constMethod.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/constMethod.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -36,51 +36,26 @@
ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data,
int byte_code_size,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
MethodType method_type,
TRAPS) {
- int size = ConstMethod::size(byte_code_size,
- compressed_line_number_size,
- localvariable_table_length,
- exception_table_length,
- checked_exceptions_length,
- method_parameters_length,
- generic_signature_index);
+ int size = ConstMethod::size(byte_code_size, sizes);
return new (loader_data, size, true, THREAD) ConstMethod(
- byte_code_size, compressed_line_number_size, localvariable_table_length,
- exception_table_length, checked_exceptions_length,
- method_parameters_length, generic_signature_index,
- method_type, size);
+ byte_code_size, sizes, method_type, size);
}
ConstMethod::ConstMethod(int byte_code_size,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
MethodType method_type,
int size) {
No_Safepoint_Verifier no_safepoint;
- set_interpreter_kind(Interpreter::invalid);
init_fingerprint();
set_constants(NULL);
set_stackmap_data(NULL);
set_code_size(byte_code_size);
set_constMethod_size(size);
- set_inlined_tables_length(generic_signature_index,
- checked_exceptions_length,
- compressed_line_number_size,
- localvariable_table_length,
- exception_table_length,
- method_parameters_length);
+ set_inlined_tables_length(sizes);
set_method_type(method_type);
assert(this->size() == size, "wrong size for object");
}
@@ -88,47 +63,70 @@
// Deallocate metadata fields associated with ConstMethod*
void ConstMethod::deallocate_contents(ClassLoaderData* loader_data) {
- set_interpreter_kind(Interpreter::invalid);
if (stackmap_data() != NULL) {
MetadataFactory::free_array<u1>(loader_data, stackmap_data());
}
set_stackmap_data(NULL);
+
+ // deallocate annotation arrays
+ if (has_method_annotations())
+ MetadataFactory::free_array<u1>(loader_data, method_annotations());
+ if (has_parameter_annotations())
+ MetadataFactory::free_array<u1>(loader_data, parameter_annotations());
+ if (has_type_annotations())
+ MetadataFactory::free_array<u1>(loader_data, type_annotations());
+ if (has_default_annotations())
+ MetadataFactory::free_array<u1>(loader_data, default_annotations());
}
// How big must this constMethodObject be?
int ConstMethod::size(int code_size,
- int compressed_line_number_size,
- int local_variable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index) {
+ InlineTableSizes* sizes) {
int extra_bytes = code_size;
- if (compressed_line_number_size > 0) {
- extra_bytes += compressed_line_number_size;
+ if (sizes->compressed_linenumber_size() > 0) {
+ extra_bytes += sizes->compressed_linenumber_size();
}
- if (checked_exceptions_length > 0) {
+ if (sizes->checked_exceptions_length() > 0) {
extra_bytes += sizeof(u2);
- extra_bytes += checked_exceptions_length * sizeof(CheckedExceptionElement);
+ extra_bytes += sizes->checked_exceptions_length() * sizeof(CheckedExceptionElement);
}
- if (local_variable_table_length > 0) {
+ if (sizes->localvariable_table_length() > 0) {
extra_bytes += sizeof(u2);
extra_bytes +=
- local_variable_table_length * sizeof(LocalVariableTableElement);
+ sizes->localvariable_table_length() * sizeof(LocalVariableTableElement);
}
- if (exception_table_length > 0) {
+ if (sizes->exception_table_length() > 0) {
extra_bytes += sizeof(u2);
- extra_bytes += exception_table_length * sizeof(ExceptionTableElement);
+ extra_bytes += sizes->exception_table_length() * sizeof(ExceptionTableElement);
}
- if (generic_signature_index != 0) {
+ if (sizes->generic_signature_index() != 0) {
extra_bytes += sizeof(u2);
}
- if (method_parameters_length > 0) {
+ if (sizes->method_parameters_length() > 0) {
extra_bytes += sizeof(u2);
- extra_bytes += method_parameters_length * sizeof(MethodParametersElement);
+ extra_bytes += sizes->method_parameters_length() * sizeof(MethodParametersElement);
+ }
+
+ // Align sizes up to a word.
+ extra_bytes = align_size_up(extra_bytes, BytesPerWord);
+
+ // One pointer per annotation array
+ if (sizes->method_annotations_length() > 0) {
+ extra_bytes += sizeof(AnnotationArray*);
}
+ if (sizes->parameter_annotations_length() > 0) {
+ extra_bytes += sizeof(AnnotationArray*);
+ }
+ if (sizes->type_annotations_length() > 0) {
+ extra_bytes += sizeof(AnnotationArray*);
+ }
+ if (sizes->default_annotations_length() > 0) {
+ extra_bytes += sizeof(AnnotationArray*);
+ }
+
int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
+ assert(extra_words == extra_bytes/BytesPerWord, "should already be aligned");
return align_object_size(header_size() + extra_words);
}
@@ -145,12 +143,28 @@
return code_end();
}
+// Last short in ConstMethod* before annotations
+u2* ConstMethod::last_u2_element() const {
+ int offset = 0;
+ if (has_method_annotations()) offset++;
+ if (has_parameter_annotations()) offset++;
+ if (has_type_annotations()) offset++;
+ if (has_default_annotations()) offset++;
+ return (u2*)((AnnotationArray**)constMethod_end() - offset) - 1;
+}
+
u2* ConstMethod::generic_signature_index_addr() const {
// Located at the end of the constMethod.
assert(has_generic_signature(), "called only if generic signature exists");
return last_u2_element();
}
+u2* ConstMethod::method_parameters_length_addr() const {
+ assert(has_method_parameters(), "called only if table is present");
+ return has_generic_signature() ? (last_u2_element() - 1) :
+ last_u2_element();
+}
+
u2* ConstMethod::checked_exceptions_length_addr() const {
// Located immediately before the generic signature index.
assert(has_checked_exceptions(), "called only if table is present");
@@ -164,12 +178,6 @@
}
}
-u2* ConstMethod::method_parameters_length_addr() const {
- assert(has_method_parameters(), "called only if table is present");
- return has_generic_signature() ? (last_u2_element() - 1) :
- last_u2_element();
-}
-
u2* ConstMethod::exception_table_length_addr() const {
assert(has_exception_handler(), "called only if table is present");
if (has_checked_exceptions()) {
@@ -181,9 +189,9 @@
return (u2*)method_parameters_start() - 1;
} else {
// Else, the exception table is at the end of the constMethod.
- return has_generic_signature() ? (last_u2_element() - 1) :
- last_u2_element();
- }
+ return has_generic_signature() ? (last_u2_element() - 1) :
+ last_u2_element();
+ }
}
}
@@ -204,32 +212,38 @@
// Else, the exception table is at the end of the constMethod.
return has_generic_signature() ? (last_u2_element() - 1) :
last_u2_element();
+ }
}
}
- }
}
// Update the flags to indicate the presence of these optional fields.
-void ConstMethod::set_inlined_tables_length(u2 generic_signature_index,
- int checked_exceptions_len,
- int compressed_line_number_size,
- int localvariable_table_len,
- int exception_table_len,
- int method_parameters_len) {
- assert(_flags == 0, "Error");
- if (compressed_line_number_size > 0)
+void ConstMethod::set_inlined_tables_length(InlineTableSizes* sizes) {
+ _flags = 0;
+ if (sizes->compressed_linenumber_size() > 0)
_flags |= _has_linenumber_table;
- if (generic_signature_index != 0)
+ if (sizes->generic_signature_index() != 0)
_flags |= _has_generic_signature;
- if (method_parameters_len > 0)
+ if (sizes->method_parameters_length() > 0)
_flags |= _has_method_parameters;
- if (checked_exceptions_len > 0)
+ if (sizes->checked_exceptions_length() > 0)
_flags |= _has_checked_exceptions;
- if (exception_table_len > 0)
+ if (sizes->exception_table_length() > 0)
_flags |= _has_exception_table;
- if (localvariable_table_len > 0)
+ if (sizes->localvariable_table_length() > 0)
_flags |= _has_localvariable_table;
+ // annotations, they are all pointer sized embedded objects so don't have
+ // a length embedded also.
+ if (sizes->method_annotations_length() > 0)
+ _flags |= _has_method_annotations;
+ if (sizes->parameter_annotations_length() > 0)
+ _flags |= _has_parameter_annotations;
+ if (sizes->type_annotations_length() > 0)
+ _flags |= _has_type_annotations;
+ if (sizes->default_annotations_length() > 0)
+ _flags |= _has_default_annotations;
+
// This code is extremely brittle and should possibly be revised.
// The *_length_addr functions walk backwards through the
// constMethod data, using each of the length indexes ahead of them,
@@ -242,17 +256,17 @@
// Also, the servicability agent needs to be informed anytime
// anything is added here. It might be advisable to have some sort
// of indication of this inline.
- if (generic_signature_index != 0)
- *(generic_signature_index_addr()) = generic_signature_index;
+ if (sizes->generic_signature_index() != 0)
+ *(generic_signature_index_addr()) = sizes->generic_signature_index();
// New data should probably go here.
- if (method_parameters_len > 0)
- *(method_parameters_length_addr()) = method_parameters_len;
- if (checked_exceptions_len > 0)
- *(checked_exceptions_length_addr()) = checked_exceptions_len;
- if (exception_table_len > 0)
- *(exception_table_length_addr()) = exception_table_len;
- if (localvariable_table_len > 0)
- *(localvariable_table_length_addr()) = localvariable_table_len;
+ if (sizes->method_parameters_length() > 0)
+ *(method_parameters_length_addr()) = sizes->method_parameters_length();
+ if (sizes->checked_exceptions_length() > 0)
+ *(checked_exceptions_length_addr()) = sizes->checked_exceptions_length();
+ if (sizes->exception_table_length() > 0)
+ *(exception_table_length_addr()) = sizes->exception_table_length();
+ if (sizes->localvariable_table_length() > 0)
+ *(localvariable_table_length_addr()) = sizes->localvariable_table_length();
}
int ConstMethod::method_parameters_length() const {
@@ -307,6 +321,34 @@
return (ExceptionTableElement*)addr;
}
+AnnotationArray** ConstMethod::method_annotations_addr() const {
+ assert(has_method_annotations(), "should only be called if method annotations are present");
+ return (AnnotationArray**)constMethod_end() - 1;
+}
+
+AnnotationArray** ConstMethod::parameter_annotations_addr() const {
+ assert(has_parameter_annotations(), "should only be called if method parameter annotations are present");
+ int offset = 1;
+ if (has_method_annotations()) offset++;
+ return (AnnotationArray**)constMethod_end() - offset;
+}
+
+AnnotationArray** ConstMethod::type_annotations_addr() const {
+ assert(has_type_annotations(), "should only be called if method type annotations are present");
+ int offset = 1;
+ if (has_method_annotations()) offset++;
+ if (has_parameter_annotations()) offset++;
+ return (AnnotationArray**)constMethod_end() - offset;
+}
+
+AnnotationArray** ConstMethod::default_annotations_addr() const {
+ assert(has_default_annotations(), "should only be called if method default annotations are present");
+ int offset = 1;
+ if (has_method_annotations()) offset++;
+ if (has_parameter_annotations()) offset++;
+ if (has_type_annotations()) offset++;
+ return (AnnotationArray**)constMethod_end() - offset;
+}
// Printing
@@ -339,8 +381,25 @@
sz->_bytecode_bytes += (n2 = code_size());
sz->_stackmap_bytes += (n3 = sz->count_array(stackmap_data()));
- sz->_method_all_bytes += n1 + n3; // note: n2 is part of n3
- sz->_ro_bytes += n1 + n3;
+ // Count method annotations
+ int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
+ if (has_method_annotations()) {
+ sz->_methods_annotations_bytes += (a1 = sz->count_array(method_annotations()));
+ }
+ if (has_parameter_annotations()) {
+ sz->_methods_parameter_annotations_bytes += (a2 = sz->count_array(parameter_annotations()));
+ }
+ if (has_type_annotations()) {
+ sz->_methods_type_annotations_bytes += (a3 = sz->count_array(type_annotations()));
+ }
+ if (has_default_annotations()) {
+ sz->_methods_default_annotations_bytes += (a4 = sz->count_array(default_annotations()));
+ }
+
+ int size_annotations = a1 + a2 + a3 + a4;
+
+ sz->_method_all_bytes += n1 + n3 + size_annotations; // note: n2 is part of n3
+ sz->_ro_bytes += n1 + n3 + size_annotations;
}
#endif // INCLUDE_SERVICES
@@ -352,10 +411,9 @@
// Verification can occur during oop construction before the method or
// other fields have been initialized.
- guarantee(is_metadata(), err_msg("Should be metadata " PTR_FORMAT, this));
guarantee(method()->is_method(), "should be method");
- address m_end = (address)((oop*) this + size());
+ address m_end = (address)((intptr_t) this + size());
address compressed_table_start = code_end();
guarantee(compressed_table_start <= m_end, "invalid method layout");
address compressed_table_end = compressed_table_start;
--- a/hotspot/src/share/vm/oops/constMethod.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/constMethod.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -86,19 +86,22 @@
// | generic signature index (u2) |
// | (indexed from start of constMethodOop) |
// |------------------------------------------------------|
+// | annotations arrays - method, parameter, type, default|
+// | pointer to Array<u1> if annotation is present |
+// |------------------------------------------------------|
//
// IMPORTANT: If anything gets added here, there need to be changes to
// ensure that ServicabilityAgent doesn't get broken as a result!
-// Utitily class decribing elements in checked exceptions table inlined in Method*.
+// Utility class describing elements in checked exceptions table inlined in Method*.
class CheckedExceptionElement VALUE_OBJ_CLASS_SPEC {
public:
u2 class_cp_index;
};
-// Utitily class decribing elements in local variable table inlined in Method*.
+// Utility class describing elements in local variable table inlined in Method*.
class LocalVariableTableElement VALUE_OBJ_CLASS_SPEC {
public:
u2 start_bci;
@@ -109,7 +112,7 @@
u2 slot;
};
-// Utitily class describing elements in exception table
+// Utility class describing elements in exception table
class ExceptionTableElement VALUE_OBJ_CLASS_SPEC {
public:
u2 start_pc;
@@ -127,6 +130,51 @@
class KlassSizeStats;
+// Class to collect the sizes of ConstMethod inline tables
+#define INLINE_TABLES_DO(do_element) \
+ do_element(localvariable_table_length) \
+ do_element(compressed_linenumber_size) \
+ do_element(exception_table_length) \
+ do_element(checked_exceptions_length) \
+ do_element(method_parameters_length) \
+ do_element(generic_signature_index) \
+ do_element(method_annotations_length) \
+ do_element(parameter_annotations_length) \
+ do_element(type_annotations_length) \
+ do_element(default_annotations_length)
+
+#define INLINE_TABLE_DECLARE(sym) int _##sym;
+#define INLINE_TABLE_PARAM(sym) int sym,
+#define INLINE_TABLE_INIT(sym) _##sym(sym),
+#define INLINE_TABLE_NULL(sym) _##sym(0),
+#define INLINE_TABLE_ACCESSOR(sym) int sym() const { return _##sym; }
+
+class InlineTableSizes : StackObj {
+ // declarations
+ INLINE_TABLES_DO(INLINE_TABLE_DECLARE)
+ int _end;
+ public:
+ InlineTableSizes(
+ INLINE_TABLES_DO(INLINE_TABLE_PARAM)
+ int end) :
+ INLINE_TABLES_DO(INLINE_TABLE_INIT)
+ _end(end) {}
+
+ // Default constructor for no inlined tables
+ InlineTableSizes() :
+ INLINE_TABLES_DO(INLINE_TABLE_NULL)
+ _end(0) {}
+
+ // Accessors
+ INLINE_TABLES_DO(INLINE_TABLE_ACCESSOR)
+};
+#undef INLINE_TABLE_ACCESSOR
+#undef INLINE_TABLE_NULL
+#undef INLINE_TABLE_INIT
+#undef INLINE_TABLE_PARAM
+#undef INLINE_TABLE_DECLARE
+
+
class ConstMethod : public MetaspaceObj {
friend class VMStructs;
@@ -135,13 +183,17 @@
private:
enum {
- _has_linenumber_table = 1,
- _has_checked_exceptions = 2,
- _has_localvariable_table = 4,
- _has_exception_table = 8,
- _has_generic_signature = 16,
- _has_method_parameters = 32,
- _is_overpass = 64
+ _has_linenumber_table = 0x0001,
+ _has_checked_exceptions = 0x0002,
+ _has_localvariable_table = 0x0004,
+ _has_exception_table = 0x0008,
+ _has_generic_signature = 0x0010,
+ _has_method_parameters = 0x0020,
+ _is_overpass = 0x0040,
+ _has_method_annotations = 0x0080,
+ _has_parameter_annotations = 0x0100,
+ _has_type_annotations = 0x0200,
+ _has_default_annotations = 0x0400
};
// Bit vector of signature
@@ -158,8 +210,7 @@
Array<u1>* _stackmap_data;
int _constMethod_size;
- jbyte _interpreter_kind;
- jbyte _flags;
+ u2 _flags;
// Size of Java bytecodes allocated immediately after Method*.
u2 _code_size;
@@ -174,36 +225,21 @@
// Constructor
ConstMethod(int byte_code_size,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
MethodType is_overpass,
int size);
public:
static ConstMethod* allocate(ClassLoaderData* loader_data,
int byte_code_size,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
MethodType mt,
TRAPS);
bool is_constMethod() const { return true; }
// Inlined tables
- void set_inlined_tables_length(u2 generic_signature_index,
- int checked_exceptions_len,
- int compressed_line_number_size,
- int localvariable_table_len,
- int exception_table_len,
- int method_parameters_length);
+ void set_inlined_tables_length(InlineTableSizes* sizes);
bool has_generic_signature() const
{ return (_flags & _has_generic_signature) != 0; }
@@ -235,10 +271,6 @@
}
}
-
- void set_interpreter_kind(int kind) { _interpreter_kind = kind; }
- int interpreter_kind(void) const { return _interpreter_kind; }
-
// constant pool
ConstantPool* constants() const { return _constants; }
void set_constants(ConstantPool* c) { _constants = c; }
@@ -307,12 +339,7 @@
}
// Size needed
- static int size(int code_size, int compressed_line_number_size,
- int local_variable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index);
+ static int size(int code_size, InlineTableSizes* sizes);
int size() const { return _constMethod_size;}
void set_constMethod_size(int size) { _constMethod_size = size; }
@@ -354,6 +381,65 @@
int method_parameters_length() const;
MethodParametersElement* method_parameters_start() const;
+ // method annotations
+ bool has_method_annotations() const
+ { return (_flags & _has_method_annotations) != 0; }
+
+ bool has_parameter_annotations() const
+ { return (_flags & _has_parameter_annotations) != 0; }
+
+ bool has_type_annotations() const
+ { return (_flags & _has_type_annotations) != 0; }
+
+ bool has_default_annotations() const
+ { return (_flags & _has_default_annotations) != 0; }
+
+
+ AnnotationArray** method_annotations_addr() const;
+ AnnotationArray* method_annotations() const {
+ return has_method_annotations() ? *(method_annotations_addr()) : NULL;
+ }
+ void set_method_annotations(AnnotationArray* anno) {
+ *(method_annotations_addr()) = anno;
+ }
+
+ AnnotationArray** parameter_annotations_addr() const;
+ AnnotationArray* parameter_annotations() const {
+ return has_parameter_annotations() ? *(parameter_annotations_addr()) : NULL;
+ }
+ void set_parameter_annotations(AnnotationArray* anno) {
+ *(parameter_annotations_addr()) = anno;
+ }
+
+ AnnotationArray** type_annotations_addr() const;
+ AnnotationArray* type_annotations() const {
+ return has_type_annotations() ? *(type_annotations_addr()) : NULL;
+ }
+ void set_type_annotations(AnnotationArray* anno) {
+ *(type_annotations_addr()) = anno;
+ }
+
+ AnnotationArray** default_annotations_addr() const;
+ AnnotationArray* default_annotations() const {
+ return has_default_annotations() ? *(default_annotations_addr()) : NULL;
+ }
+ void set_default_annotations(AnnotationArray* anno) {
+ *(default_annotations_addr()) = anno;
+ }
+
+ int method_annotations_length() const {
+ return has_method_annotations() ? method_annotations()->length() : 0;
+ }
+ int parameter_annotations_length() const {
+ return has_parameter_annotations() ? parameter_annotations()->length() : 0;
+ }
+ int type_annotations_length() const {
+ return has_type_annotations() ? type_annotations()->length() : 0;
+ }
+ int default_annotations_length() const {
+ return has_default_annotations() ? default_annotations()->length() : 0;
+ }
+
// byte codes
void set_code(address code) {
if (code_size() > 0) {
@@ -409,11 +495,10 @@
// First byte after ConstMethod*
address constMethod_end() const
- { return (address)((oop*)this + _constMethod_size); }
+ { return (address)((intptr_t*)this + _constMethod_size); }
// Last short in ConstMethod*
- u2* last_u2_element() const
- { return (u2*)constMethod_end() - 1; }
+ u2* last_u2_element() const;
public:
// Printing
--- a/hotspot/src/share/vm/oops/cpCache.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/cpCache.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -402,8 +402,9 @@
}
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
-// If this constantPoolCacheEntry refers to old_method then update it
+// If this ConstantPoolCacheEntry refers to old_method then update it
// to refer to new_method.
bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method,
Method* new_method, bool * trace_name_printed) {
@@ -461,16 +462,24 @@
return false;
}
-#ifndef PRODUCT
-bool ConstantPoolCacheEntry::check_no_old_entries() {
+// a constant pool cache entry should never contain old or obsolete methods
+bool ConstantPoolCacheEntry::check_no_old_or_obsolete_entries() {
if (is_vfinal()) {
+ // virtual and final so _f2 contains method ptr instead of vtable index
Metadata* f2 = (Metadata*)_f2;
- return (f2->is_valid() && f2->is_method() && !((Method*)f2)->is_old());
- } else {
- return (_f1 == NULL || (_f1->is_valid() && _f1->is_method() && !((Method*)_f1)->is_old()));
+ // Return false if _f2 refers to an old or an obsolete method.
+ // _f2 == NULL || !_f2->is_method() are just as unexpected here.
+ return (f2 != NULL NOT_PRODUCT(&& f2->is_valid()) && f2->is_method() &&
+ !((Method*)f2)->is_old() && !((Method*)f2)->is_obsolete());
+ } else if (_f1 == NULL ||
+ (NOT_PRODUCT(_f1->is_valid() &&) !_f1->is_method())) {
+ // _f1 == NULL || !_f1->is_method() are OK here
+ return true;
}
+ // return false if _f1 refers to an old or an obsolete method
+ return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() &&
+ !((Method*)_f1)->is_old() && !((Method*)_f1)->is_obsolete());
}
-#endif
bool ConstantPoolCacheEntry::is_interesting_method_entry(Klass* k) {
if (!is_method_entry()) {
@@ -503,13 +512,15 @@
// the method is in the interesting class so the entry is interesting
return true;
}
+#endif // INCLUDE_JVMTI
void ConstantPoolCacheEntry::print(outputStream* st, int index) const {
// print separator
if (index == 0) st->print_cr(" -------------");
// print entry
st->print("%3d ("PTR_FORMAT") ", index, (intptr_t)this);
- st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(), constant_pool_index());
+ st->print_cr("[%02x|%02x|%5d]", bytecode_2(), bytecode_1(),
+ constant_pool_index());
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f1);
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_f2);
st->print_cr(" [ "PTR_FORMAT"]", (intptr_t)_flags);
@@ -553,8 +564,9 @@
}
}
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
-// If any entry of this constantPoolCache points to any of
+// If any entry of this ConstantPoolCache points to any of
// old_methods, replace it with the corresponding new_method.
void ConstantPoolCache::adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed) {
@@ -573,7 +585,7 @@
continue;
}
- // The constantPoolCache contains entries for several different
+ // The ConstantPoolCache contains entries for several different
// things, but we only care about methods. In fact, we only care
// about methods in the same class as the one that contains the
// old_methods. At this point, we have an interesting entry.
@@ -592,17 +604,25 @@
}
}
-#ifndef PRODUCT
-bool ConstantPoolCache::check_no_old_entries() {
+// the constant pool cache should never contain old or obsolete methods
+bool ConstantPoolCache::check_no_old_or_obsolete_entries() {
for (int i = 1; i < length(); i++) {
if (entry_at(i)->is_interesting_method_entry(NULL) &&
- !entry_at(i)->check_no_old_entries()) {
+ !entry_at(i)->check_no_old_or_obsolete_entries()) {
return false;
}
}
return true;
}
-#endif // PRODUCT
+
+void ConstantPoolCache::dump_cache() {
+ for (int i = 1; i < length(); i++) {
+ if (entry_at(i)->is_interesting_method_entry(NULL)) {
+ entry_at(i)->print(tty, i);
+ }
+ }
+}
+#endif // INCLUDE_JVMTI
// Printing
--- a/hotspot/src/share/vm/oops/cpCache.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/cpCache.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -337,16 +337,18 @@
static ByteSize f2_offset() { return byte_offset_of(ConstantPoolCacheEntry, _f2); }
static ByteSize flags_offset() { return byte_offset_of(ConstantPoolCacheEntry, _flags); }
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
- // If this constantPoolCacheEntry refers to old_method then update it
+ // If this ConstantPoolCacheEntry refers to old_method then update it
// to refer to new_method.
// trace_name_printed is set to true if the current call has
// printed the klass name so that other routines in the adjust_*
// group don't print the klass name.
bool adjust_method_entry(Method* old_method, Method* new_method,
bool * trace_name_printed);
- NOT_PRODUCT(bool check_no_old_entries();)
+ bool check_no_old_or_obsolete_entries();
bool is_interesting_method_entry(Klass* k);
+#endif // INCLUDE_JVMTI
// Debugging & Printing
void print (outputStream* st, int index) const;
@@ -423,15 +425,18 @@
return (base_offset() + ConstantPoolCacheEntry::size_in_bytes() * index);
}
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
- // If any entry of this constantPoolCache points to any of
+ // If any entry of this ConstantPoolCache points to any of
// old_methods, replace it with the corresponding new_method.
// trace_name_printed is set to true if the current call has
// printed the klass name so that other routines in the adjust_*
// group don't print the klass name.
void adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed);
- NOT_PRODUCT(bool check_no_old_entries();)
+ bool check_no_old_or_obsolete_entries();
+ void dump_cache();
+#endif // INCLUDE_JVMTI
// Deallocate - no fields to deallocate
DEBUG_ONLY(bool on_stack() { return false; })
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -166,20 +166,19 @@
volatile int InstanceKlass::_total_instanceKlass_count = 0;
Klass* InstanceKlass::allocate_instance_klass(ClassLoaderData* loader_data,
- int vtable_len,
- int itable_len,
- int static_field_size,
- int nonstatic_oop_map_size,
- ReferenceType rt,
- AccessFlags access_flags,
- Symbol* name,
+ int vtable_len,
+ int itable_len,
+ int static_field_size,
+ int nonstatic_oop_map_size,
+ ReferenceType rt,
+ AccessFlags access_flags,
+ Symbol* name,
Klass* super_klass,
- KlassHandle host_klass,
- TRAPS) {
+ bool is_anonymous,
+ TRAPS) {
int size = InstanceKlass::size(vtable_len, itable_len, nonstatic_oop_map_size,
- access_flags.is_interface(),
- !host_klass.is_null());
+ access_flags.is_interface(), is_anonymous);
// Allocation
InstanceKlass* ik;
@@ -187,25 +186,25 @@
if (name == vmSymbols::java_lang_Class()) {
ik = new (loader_data, size, THREAD) InstanceMirrorKlass(
vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
- access_flags, !host_klass.is_null());
+ access_flags, is_anonymous);
} else if (name == vmSymbols::java_lang_ClassLoader() ||
(SystemDictionary::ClassLoader_klass_loaded() &&
super_klass != NULL &&
super_klass->is_subtype_of(SystemDictionary::ClassLoader_klass()))) {
ik = new (loader_data, size, THREAD) InstanceClassLoaderKlass(
vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
- access_flags, !host_klass.is_null());
+ access_flags, is_anonymous);
} else {
// normal class
ik = new (loader_data, size, THREAD) InstanceKlass(
vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
- access_flags, !host_klass.is_null());
+ access_flags, is_anonymous);
}
} else {
// reference klass
ik = new (loader_data, size, THREAD) InstanceRefKlass(
vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt,
- access_flags, !host_klass.is_null());
+ access_flags, is_anonymous);
}
Atomic::inc(&_total_instanceKlass_count);
@@ -2793,7 +2792,10 @@
st->print("%s", source_debug_extension());
st->cr();
}
- st->print(BULLET"annotations: "); annotations()->print_value_on(st); st->cr();
+ st->print(BULLET"class annotations: "); class_annotations()->print_value_on(st); st->cr();
+ st->print(BULLET"class type annotations: "); class_type_annotations()->print_value_on(st); st->cr();
+ st->print(BULLET"field annotations: "); fields_annotations()->print_value_on(st); st->cr();
+ st->print(BULLET"field type annotations: "); fields_type_annotations()->print_value_on(st); st->cr();
{
ResourceMark rm;
// PreviousVersionInfo objects returned via PreviousVersionWalker
--- a/hotspot/src/share/vm/oops/instanceKlass.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/instanceKlass.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -155,8 +155,8 @@
ReferenceType rt,
AccessFlags access_flags,
Symbol* name,
- Klass* super_klass,
- KlassHandle host_klass,
+ Klass* super_klass,
+ bool is_anonymous,
TRAPS);
InstanceKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
@@ -679,19 +679,19 @@
// annotations support
Annotations* annotations() const { return _annotations; }
void set_annotations(Annotations* anno) { _annotations = anno; }
+
AnnotationArray* class_annotations() const {
- if (annotations() == NULL) return NULL;
- return annotations()->class_annotations();
+ return (_annotations != NULL) ? _annotations->class_annotations() : NULL;
}
Array<AnnotationArray*>* fields_annotations() const {
- if (annotations() == NULL) return NULL;
- return annotations()->fields_annotations();
+ return (_annotations != NULL) ? _annotations->fields_annotations() : NULL;
}
- Annotations* type_annotations() const {
- if (annotations() == NULL) return NULL;
- return annotations()->type_annotations();
+ AnnotationArray* class_type_annotations() const {
+ return (_annotations != NULL) ? _annotations->class_type_annotations() : NULL;
}
-
+ Array<AnnotationArray*>* fields_type_annotations() const {
+ return (_annotations != NULL) ? _annotations->fields_type_annotations() : NULL;
+ }
// allocation
instanceOop allocate_instance(TRAPS);
@@ -810,6 +810,7 @@
// Sizing (in words)
static int header_size() { return align_object_offset(sizeof(InstanceKlass)/HeapWordSize); }
+
static int size(int vtable_length, int itable_length,
int nonstatic_oop_map_size,
bool is_interface, bool is_anonymous) {
@@ -847,10 +848,14 @@
return (OopMapBlock*)(start_of_itable() + align_object_offset(itable_length()));
}
+ Klass** end_of_nonstatic_oop_maps() const {
+ return (Klass**)(start_of_nonstatic_oop_maps() +
+ nonstatic_oop_map_count());
+ }
+
Klass** adr_implementor() const {
if (is_interface()) {
- return (Klass**)(start_of_nonstatic_oop_maps() +
- nonstatic_oop_map_count());
+ return (Klass**)end_of_nonstatic_oop_maps();
} else {
return NULL;
}
@@ -862,8 +867,7 @@
if (adr_impl != NULL) {
return adr_impl + 1;
} else {
- return (Klass**)(start_of_nonstatic_oop_maps() +
- nonstatic_oop_map_count());
+ return end_of_nonstatic_oop_maps();
}
} else {
return NULL;
--- a/hotspot/src/share/vm/oops/klassVtable.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/klassVtable.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -610,6 +610,7 @@
Copy::disjoint_words((HeapWord*)table(), (HeapWord*)start, _length * vtableEntry::size());
}
+#if INCLUDE_JVMTI
void klassVtable::adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed) {
// search the vtable for uses of either obsolete or EMCP methods
@@ -638,11 +639,39 @@
new_method->name()->as_C_string(),
new_method->signature()->as_C_string()));
}
+ // cannot 'break' here; see for-loop comment above.
}
}
}
}
+// a vtable should never contain old or obsolete methods
+bool klassVtable::check_no_old_or_obsolete_entries() {
+ for (int i = 0; i < length(); i++) {
+ Method* m = unchecked_method_at(i);
+ if (m != NULL &&
+ (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void klassVtable::dump_vtable() {
+ tty->print_cr("vtable dump --");
+ for (int i = 0; i < length(); i++) {
+ Method* m = unchecked_method_at(i);
+ if (m != NULL) {
+ tty->print(" (%5d) ", i);
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
+ }
+}
+#endif // INCLUDE_JVMTI
+
// CDS/RedefineClasses support - clear vtables so they can be reinitialized
void klassVtable::clear_vtable() {
for (int i = 0; i < _length; i++) table()[i].clear();
@@ -805,6 +834,7 @@
}
}
+#if INCLUDE_JVMTI
void klassItable::adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed) {
// search the itable for uses of either obsolete or EMCP methods
@@ -833,13 +863,44 @@
new_method->name()->as_C_string(),
new_method->signature()->as_C_string()));
}
- // Cannot break because there might be another entry for this method
+ // cannot 'break' here; see for-loop comment above.
}
ime++;
}
}
}
+// an itable should never contain old or obsolete methods
+bool klassItable::check_no_old_or_obsolete_entries() {
+ itableMethodEntry* ime = method_entry(0);
+ for (int i = 0; i < _size_method_table; i++) {
+ Method* m = ime->method();
+ if (m != NULL &&
+ (NOT_PRODUCT(!m->is_valid() ||) m->is_old() || m->is_obsolete())) {
+ return false;
+ }
+ ime++;
+ }
+ return true;
+}
+
+void klassItable::dump_itable() {
+ itableMethodEntry* ime = method_entry(0);
+ tty->print_cr("itable dump --");
+ for (int i = 0; i < _size_method_table; i++) {
+ Method* m = ime->method();
+ if (m != NULL) {
+ tty->print(" (%5d) ", i);
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
+ ime++;
+ }
+}
+#endif // INCLUDE_JVMTI
+
// Setup
class InterfaceVisiterClosure : public StackObj {
@@ -1126,43 +1187,6 @@
tty->print_cr("%6d bytes total", total);
}
-bool klassVtable::check_no_old_entries() {
- // Check that there really is no entry
- for (int i = 0; i < length(); i++) {
- Method* m = unchecked_method_at(i);
- if (m != NULL) {
- if (!m->is_valid() || m->is_old()) {
- return false;
- }
- }
- }
- return true;
-}
-
-void klassVtable::dump_vtable() {
- tty->print_cr("vtable dump --");
- for (int i = 0; i < length(); i++) {
- Method* m = unchecked_method_at(i);
- if (m != NULL) {
- tty->print(" (%5d) ", i);
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- }
- }
-}
-
-bool klassItable::check_no_old_entries() {
- itableMethodEntry* ime = method_entry(0);
- for(int i = 0; i < _size_method_table; i++) {
- Method* m = ime->method();
- if (m != NULL && (!m->is_valid() || m->is_old())) return false;
- ime++;
- }
- return true;
-}
-
int klassItable::_total_classes; // Total no. of classes with itables
long klassItable::_total_size; // Total no. of bytes used for itables
--- a/hotspot/src/share/vm/oops/klassVtable.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/klassVtable.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -90,6 +90,7 @@
Array<Method*>* methods, AccessFlags class_flags, Handle classloader,
Symbol* classname, Array<Klass*>* local_interfaces, TRAPS);
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
// If any entry of this vtable points to any of old_methods,
// replace it with the corresponding new_method.
@@ -98,17 +99,15 @@
// group don't print the klass name.
void adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed);
+ bool check_no_old_or_obsolete_entries();
+ void dump_vtable();
+#endif // INCLUDE_JVMTI
// Debugging code
void print() PRODUCT_RETURN;
void verify(outputStream* st, bool force = false);
static void print_statistics() PRODUCT_RETURN;
-#ifndef PRODUCT
- bool check_no_old_entries();
- void dump_vtable();
-#endif
-
protected:
friend class vtableEntry;
private:
@@ -275,6 +274,7 @@
// Updates
void initialize_with_method(Method* m);
+#if INCLUDE_JVMTI
// RedefineClasses() API support:
// if any entry of this itable points to any of old_methods,
// replace it with the corresponding new_method.
@@ -283,6 +283,9 @@
// group don't print the klass name.
void adjust_method_entries(Method** old_methods, Method** new_methods,
int methods_length, bool * trace_name_printed);
+ bool check_no_old_or_obsolete_entries();
+ void dump_itable();
+#endif // INCLUDE_JVMTI
// Setup of itable
static int compute_itable_size(Array<Klass*>* transitive_interfaces);
@@ -307,11 +310,6 @@
NOT_PRODUCT(static long _total_size;) // Total no. of bytes used for itables
static void update_stats(int size) PRODUCT_RETURN NOT_PRODUCT({ _total_classes++; _total_size += size; })
-
- public:
-#ifndef PRODUCT
- bool check_no_old_entries();
-#endif
};
#endif // SHARE_VM_OOPS_KLASSVTABLE_HPP
--- a/hotspot/src/share/vm/oops/method.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/method.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -61,24 +61,14 @@
Method* Method::allocate(ClassLoaderData* loader_data,
int byte_code_size,
AccessFlags access_flags,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
ConstMethod::MethodType method_type,
TRAPS) {
assert(!access_flags.is_native() || byte_code_size == 0,
"native methods should not contain byte codes");
ConstMethod* cm = ConstMethod::allocate(loader_data,
byte_code_size,
- compressed_line_number_size,
- localvariable_table_length,
- exception_table_length,
- checked_exceptions_length,
- method_parameters_length,
- generic_signature_index,
+ sizes,
method_type,
CHECK_NULL);
@@ -317,14 +307,6 @@
}
-void Method::set_interpreter_kind() {
- int kind = Interpreter::method_kind(this);
- assert(kind != Interpreter::invalid,
- "interpreter entry must be valid");
- set_interpreter_kind(kind);
-}
-
-
// Attempt to return method oop to original state. Clear any pointers
// (to objects outside the shared spaces). We won't be able to predict
// where they should point in a new JVM. Further initialize some
@@ -332,7 +314,6 @@
void Method::remove_unshareable_info() {
unlink_method();
- set_interpreter_kind();
}
@@ -1045,9 +1026,9 @@
methodHandle m;
{
+ InlineTableSizes sizes;
Method* m_oop = Method::allocate(loader_data, 0,
- accessFlags_from(flags_bits),
- 0, 0, 0, 0, 0, 0,
+ accessFlags_from(flags_bits), &sizes,
ConstMethod::NORMAL, CHECK_(empty));
m = methodHandle(THREAD, m_oop);
}
@@ -1096,22 +1077,35 @@
assert(!m->is_native(), "cannot rewrite native methods");
// Allocate new Method*
AccessFlags flags = m->access_flags();
- u2 generic_signature_index = m->generic_signature_index();
- int checked_exceptions_len = m->checked_exceptions_length();
- int localvariable_len = m->localvariable_table_length();
- int exception_table_len = m->exception_table_length();
- int method_parameters_len = m->method_parameters_length();
+
+ ConstMethod* cm = m->constMethod();
+ int checked_exceptions_len = cm->checked_exceptions_length();
+ int localvariable_len = cm->localvariable_table_length();
+ int exception_table_len = cm->exception_table_length();
+ int method_parameters_len = cm->method_parameters_length();
+ int method_annotations_len = cm->method_annotations_length();
+ int parameter_annotations_len = cm->parameter_annotations_length();
+ int type_annotations_len = cm->type_annotations_length();
+ int default_annotations_len = cm->default_annotations_length();
+
+ InlineTableSizes sizes(
+ localvariable_len,
+ new_compressed_linenumber_size,
+ exception_table_len,
+ checked_exceptions_len,
+ method_parameters_len,
+ cm->generic_signature_index(),
+ method_annotations_len,
+ parameter_annotations_len,
+ type_annotations_len,
+ default_annotations_len,
+ 0);
ClassLoaderData* loader_data = m->method_holder()->class_loader_data();
Method* newm_oop = Method::allocate(loader_data,
new_code_length,
flags,
- new_compressed_linenumber_size,
- localvariable_len,
- exception_table_len,
- checked_exceptions_len,
- method_parameters_len,
- generic_signature_index,
+ &sizes,
m->method_type(),
CHECK_(methodHandle()));
methodHandle newm (THREAD, newm_oop);
@@ -1311,29 +1305,6 @@
MethodHandles::print_as_basic_type_signature_on(st, signature(), true);
}
-// This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
-static void reorder_based_on_method_index(Array<Method*>* methods,
- Array<AnnotationArray*>* annotations,
- GrowableArray<AnnotationArray*>* temp_array) {
- if (annotations == NULL) {
- return;
- }
-
- int length = methods->length();
- int i;
- // Copy to temp array
- temp_array->clear();
- for (i = 0; i < length; i++) {
- temp_array->append(annotations->at(i));
- }
-
- // Copy back using old method indices
- for (i = 0; i < length; i++) {
- Method* m = methods->at(i);
- annotations->at_put(i, temp_array->at(m->method_idnum()));
- }
-}
-
// Comparer for sorting an object array containing
// Method*s.
static int method_comparator(Method* a, Method* b) {
@@ -1341,48 +1312,13 @@
}
// This is only done during class loading, so it is OK to assume method_idnum matches the methods() array
-void Method::sort_methods(Array<Method*>* methods,
- Array<AnnotationArray*>* methods_annotations,
- Array<AnnotationArray*>* methods_parameter_annotations,
- Array<AnnotationArray*>* methods_default_annotations,
- Array<AnnotationArray*>* methods_type_annotations,
- bool idempotent) {
+void Method::sort_methods(Array<Method*>* methods, bool idempotent) {
int length = methods->length();
if (length > 1) {
- bool do_annotations = false;
- if (methods_annotations != NULL ||
- methods_parameter_annotations != NULL ||
- methods_default_annotations != NULL ||
- methods_type_annotations != NULL) {
- do_annotations = true;
- }
- if (do_annotations) {
- // Remember current method ordering so we can reorder annotations
- for (int i = 0; i < length; i++) {
- Method* m = methods->at(i);
- m->set_method_idnum(i);
- }
- }
{
No_Safepoint_Verifier nsv;
QuickSort::sort<Method*>(methods->data(), length, method_comparator, idempotent);
}
-
- // Sort annotations if necessary
- assert(methods_annotations == NULL || methods_annotations->length() == methods->length(), "");
- assert(methods_parameter_annotations == NULL || methods_parameter_annotations->length() == methods->length(), "");
- assert(methods_default_annotations == NULL || methods_default_annotations->length() == methods->length(), "");
- assert(methods_type_annotations == NULL || methods_type_annotations->length() == methods->length(), "");
- if (do_annotations) {
- ResourceMark rm;
- // Allocate temporary storage
- GrowableArray<AnnotationArray*>* temp_array = new GrowableArray<AnnotationArray*>(length);
- reorder_based_on_method_index(methods, methods_annotations, temp_array);
- reorder_based_on_method_index(methods, methods_parameter_annotations, temp_array);
- reorder_based_on_method_index(methods, methods_default_annotations, temp_array);
- reorder_based_on_method_index(methods, methods_type_annotations, temp_array);
- }
-
// Reset method ordering
for (int i = 0; i < length; i++) {
Method* m = methods->at(i);
@@ -1393,9 +1329,9 @@
//-----------------------------------------------------------------------------------
-// Non-product code
+// Non-product code unless JVM/TI needs it
-#ifndef PRODUCT
+#if !defined(PRODUCT) || INCLUDE_JVMTI
class SignatureTypePrinter : public SignatureTypeNames {
private:
outputStream* _st;
@@ -1430,8 +1366,13 @@
sig.print_parameters();
st->print(")");
}
+#endif // !PRODUCT || INCLUDE_JVMTI
+//-----------------------------------------------------------------------------------
+// Non-product code
+
+#ifndef PRODUCT
void Method::print_codes_on(outputStream* st) const {
print_codes_on(0, code_size(), st);
}
--- a/hotspot/src/share/vm/oops/method.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/oops/method.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -101,6 +101,7 @@
class AdapterHandlerEntry;
class MethodData;
class ConstMethod;
+class InlineTableSizes;
class KlassSizeStats;
class Method : public Metadata {
@@ -157,12 +158,7 @@
static Method* allocate(ClassLoaderData* loader_data,
int byte_code_size,
AccessFlags access_flags,
- int compressed_line_number_size,
- int localvariable_table_length,
- int exception_table_length,
- int checked_exceptions_length,
- int method_parameters_length,
- u2 generic_signature_index,
+ InlineTableSizes* sizes,
ConstMethod::MethodType method_type,
TRAPS);
@@ -207,33 +203,17 @@
// annotations support
AnnotationArray* annotations() const {
- InstanceKlass* ik = method_holder();
- if (ik->annotations() == NULL) {
- return NULL;
- }
- return ik->annotations()->get_method_annotations_of(method_idnum());
+ return constMethod()->method_annotations();
}
AnnotationArray* parameter_annotations() const {
- InstanceKlass* ik = method_holder();
- if (ik->annotations() == NULL) {
- return NULL;
- }
- return ik->annotations()->get_method_parameter_annotations_of(method_idnum());
+ return constMethod()->parameter_annotations();
}
AnnotationArray* annotation_default() const {
- InstanceKlass* ik = method_holder();
- if (ik->annotations() == NULL) {
- return NULL;
- }
- return ik->annotations()->get_method_default_annotations_of(method_idnum());
+ return constMethod()->default_annotations();
}
- AnnotationArray* type_annotations() const {
- InstanceKlass* ik = method_holder();
- Annotations* type_annos = ik->type_annotations();
- if (type_annos == NULL)
- return NULL;
- return type_annos->get_method_annotations_of(method_idnum());
-}
+ AnnotationArray* type_annotations() const {
+ return constMethod()->type_annotations();
+ }
#ifdef CC_INTERP
void set_result_index(BasicType type);
@@ -439,13 +419,6 @@
address interpreter_entry() const { return _i2i_entry; }
// Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry
void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; }
- int interpreter_kind(void) {
- return constMethod()->interpreter_kind();
- }
- void set_interpreter_kind();
- void set_interpreter_kind(int kind) {
- constMethod()->set_interpreter_kind(kind);
- }
// native function (used for native methods only)
enum {
@@ -800,16 +773,15 @@
static bool has_unloaded_classes_in_signature(methodHandle m, TRAPS);
// Printing
- void print_short_name(outputStream* st = tty) /*PRODUCT_RETURN*/; // prints as klassname::methodname; Exposed so field engineers can debug VM
+ void print_short_name(outputStream* st = tty); // prints as klassname::methodname; Exposed so field engineers can debug VM
+#if INCLUDE_JVMTI
+ void print_name(outputStream* st = tty); // prints as "virtual void foo(int)"; exposed for TraceRedefineClasses
+#else
void print_name(outputStream* st = tty) PRODUCT_RETURN; // prints as "virtual void foo(int)"
+#endif
// Helper routine used for method sorting
- static void sort_methods(Array<Method*>* methods,
- Array<AnnotationArray*>* methods_annotations,
- Array<AnnotationArray*>* methods_parameter_annotations,
- Array<AnnotationArray*>* methods_default_annotations,
- Array<AnnotationArray*>* methods_type_annotations,
- bool idempotent = false);
+ static void sort_methods(Array<Method*>* methods, bool idempotent = false);
// Deallocation function for redefine classes or if an error occurs
void deallocate_contents(ClassLoaderData* loader_data);
--- a/hotspot/src/share/vm/opto/c2_globals.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/c2_globals.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -618,6 +618,9 @@
\
product(intx, LiveNodeCountInliningCutoff, 20000, \
"max number of live nodes in a method") \
+ \
+ diagnostic(bool, OptimizeExpensiveOps, true, \
+ "Find best control for expensive operations") \
C2_FLAGS(DECLARE_DEVELOPER_FLAG, DECLARE_PD_DEVELOPER_FLAG, DECLARE_PRODUCT_FLAG, DECLARE_PD_PRODUCT_FLAG, DECLARE_DIAGNOSTIC_FLAG, DECLARE_EXPERIMENTAL_FLAG, DECLARE_NOTPRODUCT_FLAG)
--- a/hotspot/src/share/vm/opto/compile.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/compile.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -409,6 +409,13 @@
remove_macro_node(n);
}
}
+ // Remove useless expensive node
+ for (int i = C->expensive_count()-1; i >= 0; i--) {
+ Node* n = C->expensive_node(i);
+ if (!useful.member(n)) {
+ remove_expensive_node(n);
+ }
+ }
// clean up the late inline lists
remove_useless_late_inlines(&_string_late_inlines, useful);
remove_useless_late_inlines(&_late_inlines, useful);
@@ -1061,6 +1068,7 @@
_intrinsics = NULL;
_macro_nodes = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8, 0, NULL);
_predicate_opaqs = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8, 0, NULL);
+ _expensive_nodes = new(comp_arena()) GrowableArray<Node*>(comp_arena(), 8, 0, NULL);
register_library_intrinsics();
}
@@ -1927,6 +1935,10 @@
if (failing()) return;
+ // No more new expensive nodes will be added to the list from here
+ // so keep only the actual candidates for optimizations.
+ cleanup_expensive_nodes(igvn);
+
// Perform escape analysis
if (_do_escape_analysis && ConnectionGraph::has_candidates(this)) {
if (has_loops()) {
@@ -3010,6 +3022,15 @@
return true;
}
+ // Expensive nodes have their control input set to prevent the GVN
+ // from freely commoning them. There's no GVN beyond this point so
+ // no need to keep the control input. We want the expensive nodes to
+ // be freely moved to the least frequent code path by gcm.
+ assert(OptimizeExpensiveOps || expensive_count() == 0, "optimization off but list non empty?");
+ for (int i = 0; i < expensive_count(); i++) {
+ _expensive_nodes->at(i)->set_req(0, NULL);
+ }
+
Final_Reshape_Counts frc;
// Visit everybody reachable!
@@ -3525,3 +3546,126 @@
}
}
}
+
+int Compile::cmp_expensive_nodes(Node* n1, Node* n2) {
+ if (n1->Opcode() < n2->Opcode()) return -1;
+ else if (n1->Opcode() > n2->Opcode()) return 1;
+
+ assert(n1->req() == n2->req(), err_msg_res("can't compare %s nodes: n1->req() = %d, n2->req() = %d", NodeClassNames[n1->Opcode()], n1->req(), n2->req()));
+ for (uint i = 1; i < n1->req(); i++) {
+ if (n1->in(i) < n2->in(i)) return -1;
+ else if (n1->in(i) > n2->in(i)) return 1;
+ }
+
+ return 0;
+}
+
+int Compile::cmp_expensive_nodes(Node** n1p, Node** n2p) {
+ Node* n1 = *n1p;
+ Node* n2 = *n2p;
+
+ return cmp_expensive_nodes(n1, n2);
+}
+
+void Compile::sort_expensive_nodes() {
+ if (!expensive_nodes_sorted()) {
+ _expensive_nodes->sort(cmp_expensive_nodes);
+ }
+}
+
+bool Compile::expensive_nodes_sorted() const {
+ for (int i = 1; i < _expensive_nodes->length(); i++) {
+ if (cmp_expensive_nodes(_expensive_nodes->adr_at(i), _expensive_nodes->adr_at(i-1)) < 0) {
+ return false;
+ }
+ }
+ return true;
+}
+
+bool Compile::should_optimize_expensive_nodes(PhaseIterGVN &igvn) {
+ if (_expensive_nodes->length() == 0) {
+ return false;
+ }
+
+ assert(OptimizeExpensiveOps, "optimization off?");
+
+ // Take this opportunity to remove dead nodes from the list
+ int j = 0;
+ for (int i = 0; i < _expensive_nodes->length(); i++) {
+ Node* n = _expensive_nodes->at(i);
+ if (!n->is_unreachable(igvn)) {
+ assert(n->is_expensive(), "should be expensive");
+ _expensive_nodes->at_put(j, n);
+ j++;
+ }
+ }
+ _expensive_nodes->trunc_to(j);
+
+ // Then sort the list so that similar nodes are next to each other
+ // and check for at least two nodes of identical kind with same data
+ // inputs.
+ sort_expensive_nodes();
+
+ for (int i = 0; i < _expensive_nodes->length()-1; i++) {
+ if (cmp_expensive_nodes(_expensive_nodes->adr_at(i), _expensive_nodes->adr_at(i+1)) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void Compile::cleanup_expensive_nodes(PhaseIterGVN &igvn) {
+ if (_expensive_nodes->length() == 0) {
+ return;
+ }
+
+ assert(OptimizeExpensiveOps, "optimization off?");
+
+ // Sort to bring similar nodes next to each other and clear the
+ // control input of nodes for which there's only a single copy.
+ sort_expensive_nodes();
+
+ int j = 0;
+ int identical = 0;
+ int i = 0;
+ for (; i < _expensive_nodes->length()-1; i++) {
+ assert(j <= i, "can't write beyond current index");
+ if (_expensive_nodes->at(i)->Opcode() == _expensive_nodes->at(i+1)->Opcode()) {
+ identical++;
+ _expensive_nodes->at_put(j++, _expensive_nodes->at(i));
+ continue;
+ }
+ if (identical > 0) {
+ _expensive_nodes->at_put(j++, _expensive_nodes->at(i));
+ identical = 0;
+ } else {
+ Node* n = _expensive_nodes->at(i);
+ igvn.hash_delete(n);
+ n->set_req(0, NULL);
+ igvn.hash_insert(n);
+ }
+ }
+ if (identical > 0) {
+ _expensive_nodes->at_put(j++, _expensive_nodes->at(i));
+ } else if (_expensive_nodes->length() >= 1) {
+ Node* n = _expensive_nodes->at(i);
+ igvn.hash_delete(n);
+ n->set_req(0, NULL);
+ igvn.hash_insert(n);
+ }
+ _expensive_nodes->trunc_to(j);
+}
+
+void Compile::add_expensive_node(Node * n) {
+ assert(!_expensive_nodes->contains(n), "duplicate entry in expensive list");
+ assert(n->is_expensive(), "expensive nodes with non-null control here only");
+ assert(!n->is_CFG() && !n->is_Mem(), "no cfg or memory nodes here");
+ if (OptimizeExpensiveOps) {
+ _expensive_nodes->append(n);
+ } else {
+ // Clear control input and let IGVN optimize expensive nodes if
+ // OptimizeExpensiveOps is off.
+ n->set_req(0, NULL);
+ }
+}
--- a/hotspot/src/share/vm/opto/compile.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/compile.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -314,6 +314,7 @@
GrowableArray<CallGenerator*>* _intrinsics; // List of intrinsics.
GrowableArray<Node*>* _macro_nodes; // List of nodes which need to be expanded before matching.
GrowableArray<Node*>* _predicate_opaqs; // List of Opaque1 nodes for the loop predicates.
+ GrowableArray<Node*>* _expensive_nodes; // List of nodes that are expensive to compute and that we'd better not let the GVN freely common
ConnectionGraph* _congraph;
#ifndef PRODUCT
IdealGraphPrinter* _printer;
@@ -398,6 +399,13 @@
GrowableArray<PrintInliningBuffer>* _print_inlining_list;
int _print_inlining;
+ // Only keep nodes in the expensive node list that need to be optimized
+ void cleanup_expensive_nodes(PhaseIterGVN &igvn);
+ // Use for sorting expensive nodes to bring similar nodes together
+ static int cmp_expensive_nodes(Node** n1, Node** n2);
+ // Expensive nodes list already sorted?
+ bool expensive_nodes_sorted() const;
+
public:
outputStream* print_inlining_stream() const {
@@ -573,8 +581,10 @@
int macro_count() { return _macro_nodes->length(); }
int predicate_count() { return _predicate_opaqs->length();}
+ int expensive_count() { return _expensive_nodes->length(); }
Node* macro_node(int idx) { return _macro_nodes->at(idx); }
Node* predicate_opaque1_node(int idx) { return _predicate_opaqs->at(idx);}
+ Node* expensive_node(int idx) { return _expensive_nodes->at(idx); }
ConnectionGraph* congraph() { return _congraph;}
void set_congraph(ConnectionGraph* congraph) { _congraph = congraph;}
void add_macro_node(Node * n) {
@@ -592,6 +602,12 @@
_predicate_opaqs->remove(n);
}
}
+ void add_expensive_node(Node * n);
+ void remove_expensive_node(Node * n) {
+ if (_expensive_nodes->contains(n)) {
+ _expensive_nodes->remove(n);
+ }
+ }
void add_predicate_opaq(Node * n) {
assert(!_predicate_opaqs->contains(n), " duplicate entry in predicate opaque1");
assert(_macro_nodes->contains(n), "should have already been in macro list");
@@ -604,6 +620,13 @@
return _predicate_opaqs->contains(n);
}
+ // Are there candidate expensive nodes for optimization?
+ bool should_optimize_expensive_nodes(PhaseIterGVN &igvn);
+ // Check whether n1 and n2 are similar
+ static int cmp_expensive_nodes(Node* n1, Node* n2);
+ // Sort expensive nodes to locate similar expensive nodes
+ void sort_expensive_nodes();
+
// Compilation environment.
Arena* comp_arena() { return &_comp_arena; }
ciEnv* env() const { return _env; }
--- a/hotspot/src/share/vm/opto/library_call.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1653,7 +1653,7 @@
// really odd corner cases (+/- Infinity). Just uncommon-trap them.
bool LibraryCallKit::inline_exp() {
Node* arg = round_double_node(argument(0));
- Node* n = _gvn.transform(new (C) ExpDNode(0, arg));
+ Node* n = _gvn.transform(new (C) ExpDNode(C, control(), arg));
finish_pow_exp(n, arg, NULL, OptoRuntime::Math_D_D_Type(), CAST_FROM_FN_PTR(address, SharedRuntime::dexp), "EXP");
@@ -1688,7 +1688,7 @@
if (!too_many_traps(Deoptimization::Reason_intrinsic)) {
// Short form: skip the fancy tests and just check for NaN result.
- result = _gvn.transform(new (C) PowDNode(0, x, y));
+ result = _gvn.transform(new (C) PowDNode(C, control(), x, y));
} else {
// If this inlining ever returned NaN in the past, include all
// checks + call to the runtime.
@@ -1715,7 +1715,7 @@
Node *complex_path = _gvn.transform( new (C) IfTrueNode(if1) );
// Set fast path result
- Node *fast_result = _gvn.transform( new (C) PowDNode(0, x, y) );
+ Node *fast_result = _gvn.transform( new (C) PowDNode(C, control(), x, y) );
phi->init_req(3, fast_result);
// Complex path
@@ -1775,7 +1775,7 @@
// abs(x)
Node *absx=_gvn.transform( new (C) AbsDNode(x));
// abs(x)^y
- Node *absxpowy = _gvn.transform( new (C) PowDNode(0, absx, y) );
+ Node *absxpowy = _gvn.transform( new (C) PowDNode(C, control(), absx, y) );
// -abs(x)^y
Node *negabsxpowy = _gvn.transform(new (C) NegDNode (absxpowy));
// (1&(long)y)==1?-DPow(abs(x), y):DPow(abs(x), y)
--- a/hotspot/src/share/vm/opto/loopnode.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -88,9 +88,9 @@
assert( !n->is_Phi() && !n->is_CFG(), "this code only handles data nodes" );
uint i;
Node *early;
- if( n->in(0) ) {
+ if (n->in(0) && !n->is_expensive()) {
early = n->in(0);
- if( !early->is_CFG() ) // Might be a non-CFG multi-def
+ if (!early->is_CFG()) // Might be a non-CFG multi-def
early = get_ctrl(early); // So treat input as a straight data input
i = 1;
} else {
@@ -99,28 +99,28 @@
}
uint e_d = dom_depth(early);
assert( early, "" );
- for( ; i < n->req(); i++ ) {
+ for (; i < n->req(); i++) {
Node *cin = get_ctrl(n->in(i));
assert( cin, "" );
// Keep deepest dominator depth
uint c_d = dom_depth(cin);
- if( c_d > e_d ) { // Deeper guy?
+ if (c_d > e_d) { // Deeper guy?
early = cin; // Keep deepest found so far
e_d = c_d;
- } else if( c_d == e_d && // Same depth?
- early != cin ) { // If not equal, must use slower algorithm
+ } else if (c_d == e_d && // Same depth?
+ early != cin) { // If not equal, must use slower algorithm
// If same depth but not equal, one _must_ dominate the other
// and we want the deeper (i.e., dominated) guy.
Node *n1 = early;
Node *n2 = cin;
- while( 1 ) {
+ while (1) {
n1 = idom(n1); // Walk up until break cycle
n2 = idom(n2);
- if( n1 == cin || // Walked early up to cin
- dom_depth(n2) < c_d )
+ if (n1 == cin || // Walked early up to cin
+ dom_depth(n2) < c_d)
break; // early is deeper; keep him
- if( n2 == early || // Walked cin up to early
- dom_depth(n1) < c_d ) {
+ if (n2 == early || // Walked cin up to early
+ dom_depth(n1) < c_d) {
early = cin; // cin is deeper; keep him
break;
}
@@ -132,9 +132,108 @@
// Return earliest legal location
assert(early == find_non_split_ctrl(early), "unexpected early control");
+ if (n->is_expensive()) {
+ assert(n->in(0), "should have control input");
+ early = get_early_ctrl_for_expensive(n, early);
+ }
+
return early;
}
+//------------------------------get_early_ctrl_for_expensive---------------------------------
+// Move node up the dominator tree as high as legal while still beneficial
+Node *PhaseIdealLoop::get_early_ctrl_for_expensive(Node *n, Node* earliest) {
+ assert(n->in(0) && n->is_expensive(), "expensive node with control input here");
+ assert(OptimizeExpensiveOps, "optimization off?");
+
+ Node* ctl = n->in(0);
+ assert(ctl->is_CFG(), "expensive input 0 must be cfg");
+ uint min_dom_depth = dom_depth(earliest);
+#ifdef ASSERT
+ if (!is_dominator(ctl, earliest) && !is_dominator(earliest, ctl)) {
+ dump_bad_graph("Bad graph detected in get_early_ctrl_for_expensive", n, earliest, ctl);
+ assert(false, "Bad graph detected in get_early_ctrl_for_expensive");
+ }
+#endif
+ if (dom_depth(ctl) < min_dom_depth) {
+ return earliest;
+ }
+
+ while (1) {
+ Node *next = ctl;
+ // Moving the node out of a loop on the projection of a If
+ // confuses loop predication. So once we hit a Loop in a If branch
+ // that doesn't branch to an UNC, we stop. The code that process
+ // expensive nodes will notice the loop and skip over it to try to
+ // move the node further up.
+ if (ctl->is_CountedLoop() && ctl->in(1) != NULL && ctl->in(1)->in(0) != NULL && ctl->in(1)->in(0)->is_If()) {
+ if (!is_uncommon_trap_if_pattern(ctl->in(1)->as_Proj(), Deoptimization::Reason_none)) {
+ break;
+ }
+ next = idom(ctl->in(1)->in(0));
+ } else if (ctl->is_Proj()) {
+ // We only move it up along a projection if the projection is
+ // the single control projection for its parent: same code path,
+ // if it's a If with UNC or fallthrough of a call.
+ Node* parent_ctl = ctl->in(0);
+ if (parent_ctl == NULL) {
+ break;
+ } else if (parent_ctl->is_CountedLoopEnd() && parent_ctl->as_CountedLoopEnd()->loopnode() != NULL) {
+ next = parent_ctl->as_CountedLoopEnd()->loopnode()->init_control();
+ } else if (parent_ctl->is_If()) {
+ if (!is_uncommon_trap_if_pattern(ctl->as_Proj(), Deoptimization::Reason_none)) {
+ break;
+ }
+ assert(idom(ctl) == parent_ctl, "strange");
+ next = idom(parent_ctl);
+ } else if (ctl->is_CatchProj()) {
+ if (ctl->as_Proj()->_con != CatchProjNode::fall_through_index) {
+ break;
+ }
+ assert(parent_ctl->in(0)->in(0)->is_Call(), "strange graph");
+ next = parent_ctl->in(0)->in(0)->in(0);
+ } else {
+ // Check if parent control has a single projection (this
+ // control is the only possible successor of the parent
+ // control). If so, we can try to move the node above the
+ // parent control.
+ int nb_ctl_proj = 0;
+ for (DUIterator_Fast imax, i = parent_ctl->fast_outs(imax); i < imax; i++) {
+ Node *p = parent_ctl->fast_out(i);
+ if (p->is_Proj() && p->is_CFG()) {
+ nb_ctl_proj++;
+ if (nb_ctl_proj > 1) {
+ break;
+ }
+ }
+ }
+
+ if (nb_ctl_proj > 1) {
+ break;
+ }
+ assert(parent_ctl->is_Start() || parent_ctl->is_MemBar() || parent_ctl->is_Call(), "unexpected node");
+ assert(idom(ctl) == parent_ctl, "strange");
+ next = idom(parent_ctl);
+ }
+ } else {
+ next = idom(ctl);
+ }
+ if (next->is_Root() || next->is_Start() || dom_depth(next) < min_dom_depth) {
+ break;
+ }
+ ctl = next;
+ }
+
+ if (ctl != n->in(0)) {
+ _igvn.hash_delete(n);
+ n->set_req(0, ctl);
+ _igvn.hash_insert(n);
+ }
+
+ return ctl;
+}
+
+
//------------------------------set_early_ctrl---------------------------------
// Set earliest legal control
void PhaseIdealLoop::set_early_ctrl( Node *n ) {
@@ -1892,6 +1991,98 @@
}
}
+//------------------------process_expensive_nodes-----------------------------
+// Expensive nodes have their control input set to prevent the GVN
+// from commoning them and as a result forcing the resulting node to
+// be in a more frequent path. Use CFG information here, to change the
+// control inputs so that some expensive nodes can be commoned while
+// not executed more frequently.
+bool PhaseIdealLoop::process_expensive_nodes() {
+ assert(OptimizeExpensiveOps, "optimization off?");
+
+ // Sort nodes to bring similar nodes together
+ C->sort_expensive_nodes();
+
+ bool progress = false;
+
+ for (int i = 0; i < C->expensive_count(); ) {
+ Node* n = C->expensive_node(i);
+ int start = i;
+ // Find nodes similar to n
+ i++;
+ for (; i < C->expensive_count() && Compile::cmp_expensive_nodes(n, C->expensive_node(i)) == 0; i++);
+ int end = i;
+ // And compare them two by two
+ for (int j = start; j < end; j++) {
+ Node* n1 = C->expensive_node(j);
+ if (is_node_unreachable(n1)) {
+ continue;
+ }
+ for (int k = j+1; k < end; k++) {
+ Node* n2 = C->expensive_node(k);
+ if (is_node_unreachable(n2)) {
+ continue;
+ }
+
+ assert(n1 != n2, "should be pair of nodes");
+
+ Node* c1 = n1->in(0);
+ Node* c2 = n2->in(0);
+
+ Node* parent_c1 = c1;
+ Node* parent_c2 = c2;
+
+ // The call to get_early_ctrl_for_expensive() moves the
+ // expensive nodes up but stops at loops that are in a if
+ // branch. See whether we can exit the loop and move above the
+ // If.
+ if (c1->is_Loop()) {
+ parent_c1 = c1->in(1);
+ }
+ if (c2->is_Loop()) {
+ parent_c2 = c2->in(1);
+ }
+
+ if (parent_c1 == parent_c2) {
+ _igvn._worklist.push(n1);
+ _igvn._worklist.push(n2);
+ continue;
+ }
+
+ // Look for identical expensive node up the dominator chain.
+ if (is_dominator(c1, c2)) {
+ c2 = c1;
+ } else if (is_dominator(c2, c1)) {
+ c1 = c2;
+ } else if (parent_c1->is_Proj() && parent_c1->in(0)->is_If() &&
+ parent_c2->is_Proj() && parent_c1->in(0) == parent_c2->in(0)) {
+ // Both branches have the same expensive node so move it up
+ // before the if.
+ c1 = c2 = idom(parent_c1->in(0));
+ }
+ // Do the actual moves
+ if (n1->in(0) != c1) {
+ _igvn.hash_delete(n1);
+ n1->set_req(0, c1);
+ _igvn.hash_insert(n1);
+ _igvn._worklist.push(n1);
+ progress = true;
+ }
+ if (n2->in(0) != c2) {
+ _igvn.hash_delete(n2);
+ n2->set_req(0, c2);
+ _igvn.hash_insert(n2);
+ _igvn._worklist.push(n2);
+ progress = true;
+ }
+ }
+ }
+ }
+
+ return progress;
+}
+
+
//=============================================================================
//----------------------------build_and_optimize-------------------------------
// Create a PhaseLoop. Build the ideal Loop tree. Map each Ideal Node to
@@ -1960,7 +2151,9 @@
}
// Nothing to do, so get out
- if( !C->has_loops() && !skip_loop_opts && !do_split_ifs && !_verify_me && !_verify_only ) {
+ bool stop_early = !C->has_loops() && !skip_loop_opts && !do_split_ifs && !_verify_me && !_verify_only;
+ bool do_expensive_nodes = C->should_optimize_expensive_nodes(_igvn);
+ if (stop_early && !do_expensive_nodes) {
_igvn.optimize(); // Cleanup NeverBranches
return;
}
@@ -2058,6 +2251,21 @@
return;
}
+ if (stop_early) {
+ assert(do_expensive_nodes, "why are we here?");
+ if (process_expensive_nodes()) {
+ // If we made some progress when processing expensive nodes then
+ // the IGVN may modify the graph in a way that will allow us to
+ // make some more progress: we need to try processing expensive
+ // nodes again.
+ C->set_major_progress();
+ }
+
+ _igvn.optimize();
+
+ return;
+ }
+
// Some parser-inserted loop predicates could never be used by loop
// predication or they were moved away from loop during some optimizations.
// For example, peeling. Eliminate them before next loop optimizations.
@@ -2120,6 +2328,10 @@
NOT_PRODUCT( if( VerifyLoopOptimizations ) verify(); );
}
+ if (!C->major_progress() && do_expensive_nodes && process_expensive_nodes()) {
+ C->set_major_progress();
+ }
+
// Perform loop predication before iteration splitting
if (C->has_loops() && !C->major_progress() && (C->predicate_count() > 0)) {
_ltree_root->_child->loop_predication(this);
@@ -3299,7 +3511,7 @@
#ifdef ASSERT
if (legal->is_Start() && !early->is_Root()) {
// Bad graph. Print idom path and fail.
- dump_bad_graph(n, early, LCA);
+ dump_bad_graph("Bad graph detected in build_loop_late", n, early, LCA);
assert(false, "Bad graph detected in build_loop_late");
}
#endif
@@ -3350,8 +3562,8 @@
}
#ifdef ASSERT
-void PhaseIdealLoop::dump_bad_graph(Node* n, Node* early, Node* LCA) {
- tty->print_cr( "Bad graph detected in build_loop_late");
+void PhaseIdealLoop::dump_bad_graph(const char* msg, Node* n, Node* early, Node* LCA) {
+ tty->print_cr(msg);
tty->print("n: "); n->dump();
tty->print("early(n): "); early->dump();
if (n->in(0) != NULL && !n->in(0)->is_top() &&
--- a/hotspot/src/share/vm/opto/loopnode.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/loopnode.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -263,9 +263,18 @@
bool stride_is_con() const { Node *tmp = stride (); return (tmp != NULL && tmp->is_Con()); }
BoolTest::mask test_trip() const { return in(TestValue)->as_Bool()->_test._test; }
CountedLoopNode *loopnode() const {
+ // The CountedLoopNode that goes with this CountedLoopEndNode may
+ // have been optimized out by the IGVN so be cautious with the
+ // pattern matching on the graph
+ if (phi() == NULL) {
+ return NULL;
+ }
Node *ln = phi()->in(0);
- assert( ln->Opcode() == Op_CountedLoop, "malformed loop" );
- return (CountedLoopNode*)ln; }
+ if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit() == this) {
+ return (CountedLoopNode*)ln;
+ }
+ return NULL;
+ }
#ifndef PRODUCT
virtual void dump_spec(outputStream *st) const;
@@ -598,6 +607,7 @@
// check if transform created new nodes that need _ctrl recorded
Node *get_late_ctrl( Node *n, Node *early );
Node *get_early_ctrl( Node *n );
+ Node *get_early_ctrl_for_expensive(Node *n, Node* earliest);
void set_early_ctrl( Node *n );
void set_subtree_ctrl( Node *root );
void set_ctrl( Node *n, Node *ctrl ) {
@@ -905,6 +915,16 @@
void collect_potentially_useful_predicates(IdealLoopTree *loop, Unique_Node_List &predicate_opaque1);
void eliminate_useless_predicates();
+ // Change the control input of expensive nodes to allow commoning by
+ // IGVN when it is guaranteed to not result in a more frequent
+ // execution of the expensive node. Return true if progress.
+ bool process_expensive_nodes();
+
+ // Check whether node has become unreachable
+ bool is_node_unreachable(Node *n) const {
+ return !has_node(n) || n->is_unreachable(_igvn);
+ }
+
// Eliminate range-checks and other trip-counter vs loop-invariant tests.
void do_range_check( IdealLoopTree *loop, Node_List &old_new );
@@ -1043,7 +1063,7 @@
void register_new_node( Node *n, Node *blk );
#ifdef ASSERT
-void dump_bad_graph(Node* n, Node* early, Node* LCA);
+ void dump_bad_graph(const char* msg, Node* n, Node* early, Node* LCA);
#endif
#ifndef PRODUCT
--- a/hotspot/src/share/vm/opto/node.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/node.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -493,6 +493,8 @@
}
if (is_macro())
compile->add_macro_node(n);
+ if (is_expensive())
+ compile->add_expensive_node(n);
n->set_idx(compile->next_unique()); // Get new unique index as well
debug_only( n->verify_construction() );
@@ -616,6 +618,9 @@
if (is_macro()) {
compile->remove_macro_node(this);
}
+ if (is_expensive()) {
+ compile->remove_expensive_node(this);
+ }
#ifdef ASSERT
// We will not actually delete the storage, but we'll make the node unusable.
*(address*)this = badAddress; // smash the C++ vtbl, probably
@@ -689,6 +694,13 @@
}
#endif
+
+//------------------------------is_unreachable---------------------------------
+bool Node::is_unreachable(PhaseIterGVN &igvn) const {
+ assert(!is_Mach(), "doesn't work with MachNodes");
+ return outcnt() == 0 || igvn.type(this) == Type::TOP || in(0)->is_top();
+}
+
//------------------------------add_req----------------------------------------
// Add a new required input at the end
void Node::add_req( Node *n ) {
@@ -1246,6 +1258,9 @@
if (dead->is_macro()) {
igvn->C->remove_macro_node(dead);
}
+ if (dead->is_expensive()) {
+ igvn->C->remove_expensive_node(dead);
+ }
// Kill all inputs to the dead guy
for (uint i=0; i < dead->req(); i++) {
Node *n = dead->in(i); // Get input to dead guy
--- a/hotspot/src/share/vm/opto/node.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/node.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -378,6 +378,8 @@
bool is_dead() const;
#define is_not_dead(n) ((n) == NULL || !VerifyIterativeGVN || !((n)->is_dead()))
#endif
+ // Check whether node has become unreachable
+ bool is_unreachable(PhaseIterGVN &igvn) const;
// Set a required input edge, also updates corresponding output edge
void add_req( Node *n ); // Append a NEW required input
@@ -646,7 +648,8 @@
Flag_may_be_short_branch = Flag_is_dead_loop_safe << 1,
Flag_avoid_back_to_back = Flag_may_be_short_branch << 1,
Flag_has_call = Flag_avoid_back_to_back << 1,
- _max_flags = (Flag_has_call << 1) - 1 // allow flags combination
+ Flag_is_expensive = Flag_has_call << 1,
+ _max_flags = (Flag_is_expensive << 1) - 1 // allow flags combination
};
private:
@@ -819,6 +822,8 @@
// The node is a "macro" node which needs to be expanded before matching
bool is_macro() const { return (_flags & Flag_is_macro) != 0; }
+ // The node is expensive: the best control is set during loop opts
+ bool is_expensive() const { return (_flags & Flag_is_expensive) != 0 && in(0) != NULL; }
//----------------- Optimization
--- a/hotspot/src/share/vm/opto/phaseX.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/phaseX.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1203,6 +1203,9 @@
if (dead->is_macro()) {
C->remove_macro_node(dead);
}
+ if (dead->is_expensive()) {
+ C->remove_expensive_node(dead);
+ }
if (recurse) {
continue;
--- a/hotspot/src/share/vm/opto/regmask.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/regmask.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -241,7 +241,8 @@
} else { // Else its a split-pair case
if( bit != _A[i] ) return false; // Found many bits, so fail
i++; // Skip iteration forward
- if( _A[i] != 1 ) return false; // Require 1 lo bit in next word
+ if( i >= RM_SIZE || _A[i] != 1 )
+ return false; // Require 1 lo bit in next word
}
}
}
@@ -254,7 +255,7 @@
// Find the lowest-numbered register set in the mask. Return the
// HIGHEST register number in the set, or BAD if no sets.
// Works also for size 1.
-OptoReg::Name RegMask::find_first_set(int size) const {
+OptoReg::Name RegMask::find_first_set(const int size) const {
verify_sets(size);
for (int i = 0; i < RM_SIZE; i++) {
if (_A[i]) { // Found some bits
@@ -268,7 +269,7 @@
//------------------------------clear_to_sets----------------------------------
// Clear out partial bits; leave only aligned adjacent bit pairs
-void RegMask::clear_to_sets(int size) {
+void RegMask::clear_to_sets(const int size) {
if (size == 1) return;
assert(2 <= size && size <= 8, "update low bits table");
assert(is_power_of_2(size), "sanity");
@@ -293,7 +294,7 @@
//------------------------------smear_to_sets----------------------------------
// Smear out partial bits to aligned adjacent bit sets
-void RegMask::smear_to_sets(int size) {
+void RegMask::smear_to_sets(const int size) {
if (size == 1) return;
assert(2 <= size && size <= 8, "update low bits table");
assert(is_power_of_2(size), "sanity");
@@ -318,7 +319,7 @@
}
//------------------------------is_aligned_set--------------------------------
-bool RegMask::is_aligned_sets(int size) const {
+bool RegMask::is_aligned_sets(const int size) const {
if (size == 1) return true;
assert(2 <= size && size <= 8, "update low bits table");
assert(is_power_of_2(size), "sanity");
@@ -344,7 +345,7 @@
//------------------------------is_bound_set-----------------------------------
// Return TRUE if the mask contains one adjacent set of bits and no other bits.
// Works also for size 1.
-int RegMask::is_bound_set(int size) const {
+int RegMask::is_bound_set(const int size) const {
if( is_AllStack() ) return false;
assert(1 <= size && size <= 8, "update low bits table");
int bit = -1; // Set to hold the one bit allowed
@@ -352,7 +353,7 @@
if (_A[i] ) { // Found some bits
if (bit != -1)
return false; // Already had bits, so fail
- bit = _A[i] & -_A[i]; // Extract 1 bit from mask
+ bit = _A[i] & -_A[i]; // Extract low bit from mask
int hi_bit = bit << (size-1); // high bit
if (hi_bit != 0) { // Bit set stays in same word?
int set = hi_bit + ((hi_bit-1) & ~(bit-1));
@@ -362,12 +363,12 @@
if (((-1) & ~(bit-1)) != _A[i])
return false; // Found many bits, so fail
i++; // Skip iteration forward and check high part
- assert(size <= 8, "update next code");
// The lower 24 bits should be 0 since it is split case and size <= 8.
int set = bit>>24;
set = set & -set; // Remove sign extension.
set = (((set << size) - 1) >> 8);
- if (_A[i] != set) return false; // Require 1 lo bit in next word
+ if (i >= RM_SIZE || _A[i] != set)
+ return false; // Require expected low bits in next word
}
}
}
--- a/hotspot/src/share/vm/opto/regmask.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/regmask.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -225,22 +225,22 @@
// Find the lowest-numbered register set in the mask. Return the
// HIGHEST register number in the set, or BAD if no sets.
// Assert that the mask contains only bit sets.
- OptoReg::Name find_first_set(int size) const;
+ OptoReg::Name find_first_set(const int size) const;
// Clear out partial bits; leave only aligned adjacent bit sets of size.
- void clear_to_sets(int size);
+ void clear_to_sets(const int size);
// Smear out partial bits to aligned adjacent bit sets.
- void smear_to_sets(int size);
+ void smear_to_sets(const int size);
// Verify that the mask contains only aligned adjacent bit sets
void verify_sets(int size) const { assert(is_aligned_sets(size), "mask is not aligned, adjacent sets"); }
// Test that the mask contains only aligned adjacent bit sets
- bool is_aligned_sets(int size) const;
+ bool is_aligned_sets(const int size) const;
// mask is a set of misaligned registers
bool is_misaligned_set(int size) const { return (int)Size()==size && !is_aligned_sets(size);}
// Test for a single adjacent set
- int is_bound_set(int size) const;
+ int is_bound_set(const int size) const;
static bool is_vector(uint ireg);
static int num_registers(uint ireg);
--- a/hotspot/src/share/vm/opto/subnode.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/opto/subnode.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -456,7 +456,10 @@
// Exponentiate a double
class ExpDNode : public Node {
public:
- ExpDNode( Node *c, Node *in1 ) : Node(c, in1) {}
+ ExpDNode(Compile* C, Node *c, Node *in1) : Node(c, in1) {
+ init_flags(Flag_is_expensive);
+ C->add_expensive_node(this);
+ }
virtual int Opcode() const;
const Type *bottom_type() const { return Type::DOUBLE; }
virtual uint ideal_reg() const { return Op_RegD; }
@@ -489,7 +492,10 @@
// Raise a double to a double power
class PowDNode : public Node {
public:
- PowDNode(Node *c, Node *in1, Node *in2 ) : Node(c, in1, in2) {}
+ PowDNode(Compile* C, Node *c, Node *in1, Node *in2 ) : Node(c, in1, in2) {
+ init_flags(Flag_is_expensive);
+ C->add_expensive_node(this);
+ }
virtual int Opcode() const;
const Type *bottom_type() const { return Type::DOUBLE; }
virtual uint ideal_reg() const { return Op_RegD; }
--- a/hotspot/src/share/vm/prims/jvm.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1573,9 +1573,9 @@
if (!java_lang_Class::is_primitive(JNIHandles::resolve(cls))) {
Klass* k = java_lang_Class::as_Klass(JNIHandles::resolve(cls));
if (k->oop_is_instance()) {
- Annotations* type_annotations = InstanceKlass::cast(k)->type_annotations();
+ AnnotationArray* type_annotations = InstanceKlass::cast(k)->class_type_annotations();
if (type_annotations != NULL) {
- typeArrayOop a = Annotations::make_java_array(type_annotations->class_annotations(), CHECK_NULL);
+ typeArrayOop a = Annotations::make_java_array(type_annotations, CHECK_NULL);
return (jbyteArray) JNIHandles::make_local(env, a);
}
}
@@ -4528,6 +4528,5 @@
// consider to expose this new capability in the sun.rt.jvmCapabilities jvmstat
// counter defined in runtimeService.cpp.
info->is_attachable = AttachListener::is_attach_supported();
- info->is_kernel_jvm = 0; // false;
}
JVM_END
--- a/hotspot/src/share/vm/prims/jvm.h Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 18:41:05 2017 +0200
@@ -1559,8 +1559,7 @@
* the new bit is also added in the main/baseline.
*/
unsigned int is_attachable : 1;
- unsigned int is_kernel_jvm : 1;
- unsigned int : 30;
+ unsigned int : 31;
unsigned int : 32;
unsigned int : 32;
} jvm_version_info;
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -154,8 +154,15 @@
// See jvmtiExport.hpp for detailed explanation.
JvmtiExport::set_has_redefined_a_class();
-#ifdef ASSERT
- SystemDictionary::classes_do(check_class, thread);
+// check_class() is optionally called for product bits, but is
+// always called for non-product bits.
+#ifdef PRODUCT
+ if (RC_TRACE_ENABLED(0x00004000)) {
+#endif
+ RC_TRACE_WITH_THREAD(0x00004000, thread, ("calling check_class"));
+ SystemDictionary::classes_do(check_class, thread);
+#ifdef PRODUCT
+ }
#endif
}
@@ -485,26 +492,6 @@
} // end find_or_append_indirect_entry()
-void VM_RedefineClasses::swap_all_method_annotations(int i, int j, instanceKlassHandle scratch_class, TRAPS) {
- AnnotationArray* save;
-
- Annotations* sca = scratch_class->annotations();
- if (sca == NULL) return;
-
- save = sca->get_method_annotations_of(i);
- sca->set_method_annotations_of(scratch_class, i, sca->get_method_annotations_of(j), CHECK);
- sca->set_method_annotations_of(scratch_class, j, save, CHECK);
-
- save = sca->get_method_parameter_annotations_of(i);
- sca->set_method_parameter_annotations_of(scratch_class, i, sca->get_method_parameter_annotations_of(j), CHECK);
- sca->set_method_parameter_annotations_of(scratch_class, j, save, CHECK);
-
- save = sca->get_method_default_annotations_of(i);
- sca->set_method_default_annotations_of(scratch_class, i, sca->get_method_default_annotations_of(j), CHECK);
- sca->set_method_default_annotations_of(scratch_class, j, save, CHECK);
-}
-
-
jvmtiError VM_RedefineClasses::compare_and_normalize_class_versions(
instanceKlassHandle the_class,
instanceKlassHandle scratch_class) {
@@ -686,10 +673,9 @@
idnum_owner->set_method_idnum(new_num);
}
k_new_method->set_method_idnum(old_num);
- swap_all_method_annotations(old_num, new_num, scratch_class, thread);
- if (thread->has_pending_exception()) {
- return JVMTI_ERROR_OUT_OF_MEMORY;
- }
+ if (thread->has_pending_exception()) {
+ return JVMTI_ERROR_OUT_OF_MEMORY;
+ }
}
}
RC_TRACE(0x00008000, ("Method matched: new: %s [%d] == old: %s [%d]",
@@ -722,7 +708,6 @@
idnum_owner->set_method_idnum(new_num);
}
k_new_method->set_method_idnum(num);
- swap_all_method_annotations(new_num, num, scratch_class, thread);
if (thread->has_pending_exception()) {
return JVMTI_ERROR_OUT_OF_MEMORY;
}
@@ -1564,9 +1549,9 @@
bcp, cp_index, new_index));
// Rewriter::rewrite_method() uses put_native_u2() in this
// situation because it is reusing the constant pool index
- // location for a native index into the constantPoolCache.
+ // location for a native index into the ConstantPoolCache.
// Since we are updating the constant pool index prior to
- // verification and constantPoolCache initialization, we
+ // verification and ConstantPoolCache initialization, we
// need to keep the new index in Java byte order.
Bytes::put_Java_u2(p, new_index);
}
@@ -1888,10 +1873,7 @@
bool VM_RedefineClasses::rewrite_cp_refs_in_fields_annotations(
instanceKlassHandle scratch_class, TRAPS) {
- Annotations* sca = scratch_class->annotations();
- if (sca == NULL) return true;
-
- Array<AnnotationArray*>* fields_annotations = sca->fields_annotations();
+ Array<AnnotationArray*>* fields_annotations = scratch_class->fields_annotations();
if (fields_annotations == NULL || fields_annotations->length() == 0) {
// no fields_annotations so nothing to do
@@ -1926,21 +1908,10 @@
bool VM_RedefineClasses::rewrite_cp_refs_in_methods_annotations(
instanceKlassHandle scratch_class, TRAPS) {
- Annotations* sca = scratch_class->annotations();
- if (sca == NULL) return true;
-
- Array<AnnotationArray*>* methods_annotations = sca->methods_annotations();
-
- if (methods_annotations == NULL || methods_annotations->length() == 0) {
- // no methods_annotations so nothing to do
- return true;
- }
-
- RC_TRACE_WITH_THREAD(0x02000000, THREAD,
- ("methods_annotations length=%d", methods_annotations->length()));
-
- for (int i = 0; i < methods_annotations->length(); i++) {
- AnnotationArray* method_annotations = methods_annotations->at(i);
+ for (int i = 0; i < scratch_class->methods()->length(); i++) {
+ Method* m = scratch_class->methods()->at(i);
+ AnnotationArray* method_annotations = m->constMethod()->method_annotations();
+
if (method_annotations == NULL || method_annotations->length() == 0) {
// this method does not have any annotations so skip it
continue;
@@ -1976,24 +1947,9 @@
bool VM_RedefineClasses::rewrite_cp_refs_in_methods_parameter_annotations(
instanceKlassHandle scratch_class, TRAPS) {
- Annotations* sca = scratch_class->annotations();
- if (sca == NULL) return true;
-
- Array<AnnotationArray*>* methods_parameter_annotations =
- sca->methods_parameter_annotations();
-
- if (methods_parameter_annotations == NULL
- || methods_parameter_annotations->length() == 0) {
- // no methods_parameter_annotations so nothing to do
- return true;
- }
-
- RC_TRACE_WITH_THREAD(0x02000000, THREAD,
- ("methods_parameter_annotations length=%d",
- methods_parameter_annotations->length()));
-
- for (int i = 0; i < methods_parameter_annotations->length(); i++) {
- AnnotationArray* method_parameter_annotations = methods_parameter_annotations->at(i);
+ for (int i = 0; i < scratch_class->methods()->length(); i++) {
+ Method* m = scratch_class->methods()->at(i);
+ AnnotationArray* method_parameter_annotations = m->constMethod()->parameter_annotations();
if (method_parameter_annotations == NULL
|| method_parameter_annotations->length() == 0) {
// this method does not have any parameter annotations so skip it
@@ -2043,24 +1999,9 @@
bool VM_RedefineClasses::rewrite_cp_refs_in_methods_default_annotations(
instanceKlassHandle scratch_class, TRAPS) {
- Annotations* sca = scratch_class->annotations();
- if (sca == NULL) return true;
-
- Array<AnnotationArray*>* methods_default_annotations =
- sca->methods_default_annotations();
-
- if (methods_default_annotations == NULL
- || methods_default_annotations->length() == 0) {
- // no methods_default_annotations so nothing to do
- return true;
- }
-
- RC_TRACE_WITH_THREAD(0x02000000, THREAD,
- ("methods_default_annotations length=%d",
- methods_default_annotations->length()));
-
- for (int i = 0; i < methods_default_annotations->length(); i++) {
- AnnotationArray* method_default_annotations = methods_default_annotations->at(i);
+ for (int i = 0; i < scratch_class->methods()->length(); i++) {
+ Method* m = scratch_class->methods()->at(i);
+ AnnotationArray* method_default_annotations = m->constMethod()->default_annotations();
if (method_default_annotations == NULL
|| method_default_annotations->length() == 0) {
// this method does not have any default annotations so skip it
@@ -3065,6 +3006,31 @@
}
+void VM_RedefineClasses::swap_annotations(instanceKlassHandle the_class,
+ instanceKlassHandle scratch_class) {
+ // Since there is currently no rewriting of type annotations indexes
+ // into the CP, we null out type annotations on scratch_class before
+ // we swap annotations with the_class rather than facing the
+ // possibility of shipping annotations with broken indexes to
+ // Java-land.
+ ClassLoaderData* loader_data = scratch_class->class_loader_data();
+ AnnotationArray* new_class_type_annotations = scratch_class->class_type_annotations();
+ if (new_class_type_annotations != NULL) {
+ MetadataFactory::free_array<u1>(loader_data, new_class_type_annotations);
+ scratch_class->annotations()->set_class_type_annotations(NULL);
+ }
+ Array<AnnotationArray*>* new_field_type_annotations = scratch_class->fields_type_annotations();
+ if (new_field_type_annotations != NULL) {
+ Annotations::free_contents(loader_data, new_field_type_annotations);
+ scratch_class->annotations()->set_fields_type_annotations(NULL);
+ }
+
+ // Swap annotation fields values
+ Annotations* old_annotations = the_class->annotations();
+ the_class->set_annotations(scratch_class->annotations());
+ scratch_class->set_annotations(old_annotations);
+}
+
// Install the redefinition of a class:
// - house keeping (flushing breakpoints and caches, deoptimizing
@@ -3275,23 +3241,7 @@
the_class->set_access_flags(flags);
}
- // Since there is currently no rewriting of type annotations indexes
- // into the CP, we null out type annotations on scratch_class before
- // we swap annotations with the_class rather than facing the
- // possibility of shipping annotations with broken indexes to
- // Java-land.
- Annotations* new_annotations = scratch_class->annotations();
- if (new_annotations != NULL) {
- Annotations* new_type_annotations = new_annotations->type_annotations();
- if (new_type_annotations != NULL) {
- MetadataFactory::free_metadata(scratch_class->class_loader_data(), new_type_annotations);
- new_annotations->set_type_annotations(NULL);
- }
- }
- // Swap annotation fields values
- Annotations* old_annotations = the_class->annotations();
- the_class->set_annotations(scratch_class->annotations());
- scratch_class->set_annotations(old_annotations);
+ swap_annotations(the_class, scratch_class);
// Replace minor version number of class file
u2 old_minor_version = the_class->minor_version();
@@ -3371,7 +3321,6 @@
}
}
-#ifndef PRODUCT
void VM_RedefineClasses::check_class(Klass* k_oop,
ClassLoaderData* initiating_loader,
TRAPS) {
@@ -3379,82 +3328,110 @@
if (k->oop_is_instance()) {
HandleMark hm(THREAD);
InstanceKlass *ik = (InstanceKlass *) k;
-
- if (ik->vtable_length() > 0) {
- ResourceMark rm(THREAD);
- if (!ik->vtable()->check_no_old_entries()) {
- tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name());
+ bool no_old_methods = true; // be optimistic
+ ResourceMark rm(THREAD);
+
+ // a vtable should never contain old or obsolete methods
+ if (ik->vtable_length() > 0 &&
+ !ik->vtable()->check_no_old_or_obsolete_entries()) {
+ if (RC_TRACE_ENABLED(0x00004000)) {
+ RC_TRACE_WITH_THREAD(0x00004000, THREAD,
+ ("klassVtable::check_no_old_or_obsolete_entries failure"
+ " -- OLD or OBSOLETE method found -- class: %s",
+ ik->signature_name()));
ik->vtable()->dump_vtable();
- assert(false, "OLD method found");
}
+ no_old_methods = false;
}
- if (ik->itable_length() > 0) {
- ResourceMark rm(THREAD);
- if (!ik->itable()->check_no_old_entries()) {
- tty->print_cr("klassItable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name());
- assert(false, "OLD method found");
+
+ // an itable should never contain old or obsolete methods
+ if (ik->itable_length() > 0 &&
+ !ik->itable()->check_no_old_or_obsolete_entries()) {
+ if (RC_TRACE_ENABLED(0x00004000)) {
+ RC_TRACE_WITH_THREAD(0x00004000, THREAD,
+ ("klassItable::check_no_old_or_obsolete_entries failure"
+ " -- OLD or OBSOLETE method found -- class: %s",
+ ik->signature_name()));
+ ik->itable()->dump_itable();
}
+ no_old_methods = false;
}
- // Check that the constant pool cache has no deleted entries.
+
+ // the constant pool cache should never contain old or obsolete methods
if (ik->constants() != NULL &&
ik->constants()->cache() != NULL &&
- !ik->constants()->cache()->check_no_old_entries()) {
- tty->print_cr("klassVtable::check_no_old_entries failure -- OLD method found -- class: %s", ik->signature_name());
- assert(false, "OLD method found");
+ !ik->constants()->cache()->check_no_old_or_obsolete_entries()) {
+ if (RC_TRACE_ENABLED(0x00004000)) {
+ RC_TRACE_WITH_THREAD(0x00004000, THREAD,
+ ("cp-cache::check_no_old_or_obsolete_entries failure"
+ " -- OLD or OBSOLETE method found -- class: %s",
+ ik->signature_name()));
+ ik->constants()->cache()->dump_cache();
+ }
+ no_old_methods = false;
+ }
+
+ if (!no_old_methods) {
+ if (RC_TRACE_ENABLED(0x00004000)) {
+ dump_methods();
+ } else {
+ tty->print_cr("INFO: use the '-XX:TraceRedefineClasses=16384' option "
+ "to see more info about the following guarantee() failure.");
+ }
+ guarantee(false, "OLD and/or OBSOLETE method(s) found");
}
}
}
void VM_RedefineClasses::dump_methods() {
- int j;
- tty->print_cr("_old_methods --");
- for (j = 0; j < _old_methods->length(); ++j) {
- Method* m = _old_methods->at(j);
- tty->print("%4d (%5d) ", j, m->vtable_index());
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- }
- tty->print_cr("_new_methods --");
- for (j = 0; j < _new_methods->length(); ++j) {
- Method* m = _new_methods->at(j);
- tty->print("%4d (%5d) ", j, m->vtable_index());
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- }
- tty->print_cr("_matching_(old/new)_methods --");
- for (j = 0; j < _matching_methods_length; ++j) {
- Method* m = _matching_old_methods[j];
- tty->print("%4d (%5d) ", j, m->vtable_index());
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- m = _matching_new_methods[j];
- tty->print(" (%5d) ", m->vtable_index());
- m->access_flags().print_on(tty);
- tty->cr();
- }
- tty->print_cr("_deleted_methods --");
- for (j = 0; j < _deleted_methods_length; ++j) {
- Method* m = _deleted_methods[j];
- tty->print("%4d (%5d) ", j, m->vtable_index());
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- }
- tty->print_cr("_added_methods --");
- for (j = 0; j < _added_methods_length; ++j) {
- Method* m = _added_methods[j];
- tty->print("%4d (%5d) ", j, m->vtable_index());
- m->access_flags().print_on(tty);
- tty->print(" -- ");
- m->print_name(tty);
- tty->cr();
- }
+ int j;
+ RC_TRACE(0x00004000, ("_old_methods --"));
+ for (j = 0; j < _old_methods->length(); ++j) {
+ Method* m = _old_methods->at(j);
+ RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
+ RC_TRACE(0x00004000, ("_new_methods --"));
+ for (j = 0; j < _new_methods->length(); ++j) {
+ Method* m = _new_methods->at(j);
+ RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
+ RC_TRACE(0x00004000, ("_matching_(old/new)_methods --"));
+ for (j = 0; j < _matching_methods_length; ++j) {
+ Method* m = _matching_old_methods[j];
+ RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ m = _matching_new_methods[j];
+ RC_TRACE_NO_CR(0x00004000, (" (%5d) ", m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->cr();
+ }
+ RC_TRACE(0x00004000, ("_deleted_methods --"));
+ for (j = 0; j < _deleted_methods_length; ++j) {
+ Method* m = _deleted_methods[j];
+ RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
+ RC_TRACE(0x00004000, ("_added_methods --"));
+ for (j = 0; j < _added_methods_length; ++j) {
+ Method* m = _added_methods[j];
+ RC_TRACE_NO_CR(0x00004000, ("%4d (%5d) ", j, m->vtable_index()));
+ m->access_flags().print_on(tty);
+ tty->print(" -- ");
+ m->print_name(tty);
+ tty->cr();
+ }
}
-#endif
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClasses.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -384,11 +384,6 @@
jvmtiError compare_and_normalize_class_versions(
instanceKlassHandle the_class, instanceKlassHandle scratch_class);
- // Swap annotations[i] with annotations[j]
- // Used by compare_and_normalize_class_versions() when normalizing
- // overloaded methods or changing idnum as when adding or deleting methods.
- void swap_all_method_annotations(int i, int j, instanceKlassHandle scratch_class, TRAPS);
-
// Figure out which new methods match old methods in name and signature,
// which methods have been added, and which are no longer present
void compute_added_deleted_matching_methods();
@@ -417,6 +412,9 @@
void redefine_single_class(jclass the_jclass,
Klass* scratch_class_oop, TRAPS);
+ void swap_annotations(instanceKlassHandle new_class,
+ instanceKlassHandle scratch_class);
+
// Increment the classRedefinedCount field in the specific InstanceKlass
// and in all direct and indirect subclasses.
void increment_class_counter(InstanceKlass *ik, TRAPS);
@@ -468,9 +466,9 @@
void flush_dependent_code(instanceKlassHandle k_h, TRAPS);
- static void check_class(Klass* k_oop, ClassLoaderData* initiating_loader, TRAPS) PRODUCT_RETURN;
-
- static void dump_methods() PRODUCT_RETURN;
+ static void check_class(Klass* k_oop, ClassLoaderData* initiating_loader,
+ TRAPS);
+ static void dump_methods();
public:
VM_RedefineClasses(jint class_count,
--- a/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/jvmtiRedefineClassesTrace.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -54,7 +54,7 @@
// 0x00000800 | 2048 - previous class breakpoint mgmt
// 0x00001000 | 4096 - detect calls to obsolete methods
// 0x00002000 | 8192 - fail a guarantee() in addition to detection
-// 0x00004000 | 16384 - unused
+// 0x00004000 | 16384 - detect old/obsolete methods in metadata
// 0x00008000 | 32768 - old/new method matching/add/delete
// 0x00010000 | 65536 - impl details: CP size info
// 0x00020000 | 131072 - impl details: CP merge pass info
@@ -82,6 +82,13 @@
tty->print_cr args; \
} while (0)
+#define RC_TRACE_NO_CR(level, args) \
+ if ((TraceRedefineClasses & level) != 0) { \
+ ResourceMark rm; \
+ tty->print("RedefineClasses-0x%x: ", level); \
+ tty->print args; \
+ } while (0)
+
#define RC_TRACE_WITH_THREAD(level, thread, args) \
if ((TraceRedefineClasses & level) != 0) { \
ResourceMark rm(thread); \
--- a/hotspot/src/share/vm/prims/wbtestmethods/parserTests.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/wbtestmethods/parserTests.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -27,6 +27,6 @@
#include "prims/jni.h"
#include "prims/whitebox.hpp"
-WB_METHOD_DECLARE WB_ParseCommandLine(JNIEnv* env, jobject o, jstring args, jobjectArray arguments);
+WB_METHOD_DECLARE(jobjectArray) WB_ParseCommandLine(JNIEnv* env, jobject o, jstring args, jobjectArray arguments);
#endif //SHARE_VM_PRIMS_WBTESTMETHODS_PARSERTESTS_H
--- a/hotspot/src/share/vm/prims/whitebox.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -48,6 +48,8 @@
#include "services/memTracker.hpp"
#endif // INCLUDE_NMT
+#include "compiler/compileBroker.hpp"
+
bool WhiteBox::_used = false;
WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj))
@@ -169,6 +171,89 @@
#endif // INCLUDE_NMT
+static jmethodID reflected_method_to_jmid(JavaThread* thread, JNIEnv* env, jobject method) {
+ assert(method != NULL, "method should not be null");
+ ThreadToNativeFromVM ttn(thread);
+ return env->FromReflectedMethod(method);
+}
+
+WB_ENTRY(void, WB_DeoptimizeAll(JNIEnv* env, jobject o))
+ MutexLockerEx mu(Compile_lock);
+ CodeCache::mark_all_nmethods_for_deoptimization();
+ VM_Deoptimize op;
+ VMThread::execute(&op);
+WB_END
+
+WB_ENTRY(jint, WB_DeoptimizeMethod(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ MutexLockerEx mu(Compile_lock);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ int result = 0;
+ nmethod* code = mh->code();
+ if (code != NULL) {
+ code->mark_for_deoptimization();
+ ++result;
+ }
+ result += CodeCache::mark_for_deoptimization(mh());
+ if (result > 0) {
+ VM_Deoptimize op;
+ VMThread::execute(&op);
+ }
+ return result;
+WB_END
+
+WB_ENTRY(jboolean, WB_IsMethodCompiled(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ MutexLockerEx mu(Compile_lock);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ nmethod* code = mh->code();
+ if (code == NULL) {
+ return JNI_FALSE;
+ }
+ return (code->is_alive() && !code->is_marked_for_deoptimization());
+WB_END
+
+WB_ENTRY(jboolean, WB_IsMethodCompilable(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ MutexLockerEx mu(Compile_lock);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ return !mh->is_not_compilable();
+WB_END
+
+WB_ENTRY(jboolean, WB_IsMethodQueuedForCompilation(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ MutexLockerEx mu(Compile_lock);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ return mh->queued_for_compilation();
+WB_END
+
+WB_ENTRY(jint, WB_GetMethodCompilationLevel(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ nmethod* code = mh->code();
+ return (code != NULL ? code->comp_level() : CompLevel_none);
+WB_END
+
+
+WB_ENTRY(void, WB_MakeMethodNotCompilable(JNIEnv* env, jobject o, jobject method))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ mh->set_not_compilable();
+WB_END
+
+WB_ENTRY(jboolean, WB_SetDontInlineMethod(JNIEnv* env, jobject o, jobject method, jboolean value))
+ jmethodID jmid = reflected_method_to_jmid(thread, env, method);
+ methodHandle mh(THREAD, Method::checked_resolve_jmethod_id(jmid));
+ bool result = mh->dont_inline();
+ mh->set_dont_inline(value == JNI_TRUE);
+ return result;
+WB_END
+
+WB_ENTRY(jint, WB_GetCompileQueuesSize(JNIEnv* env, jobject o))
+ return CompileBroker::queue_size(CompLevel_full_optimization) /* C2 */ +
+ CompileBroker::queue_size(CompLevel_full_profile) /* C1 */;
+WB_END
+
//Some convenience methods to deal with objects from java
int WhiteBox::offset_for_field(const char* field_name, oop object,
Symbol* signature_symbol) {
@@ -225,9 +310,9 @@
static JNINativeMethod methods[] = {
{CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress },
{CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize },
- {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive },
- {CC "parseCommandLine",
- CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
+ {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive },
+ {CC"parseCommandLine",
+ CC"(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;",
(void*) &WB_ParseCommandLine
},
#if INCLUDE_ALL_GCS
@@ -241,6 +326,23 @@
{CC"NMTFreeTestMemory", CC"()Z", (void*)&WB_NMTFreeTestMemory },
{CC"NMTWaitForDataMerge",CC"()Z", (void*)&WB_NMTWaitForDataMerge},
#endif // INCLUDE_NMT
+ {CC"deoptimizeAll", CC"()V", (void*)&WB_DeoptimizeAll },
+ {CC"deoptimizeMethod", CC"(Ljava/lang/reflect/Method;)I",
+ (void*)&WB_DeoptimizeMethod },
+ {CC"isMethodCompiled", CC"(Ljava/lang/reflect/Method;)Z",
+ (void*)&WB_IsMethodCompiled },
+ {CC"isMethodCompilable", CC"(Ljava/lang/reflect/Method;)Z",
+ (void*)&WB_IsMethodCompilable},
+ {CC"isMethodQueuedForCompilation",
+ CC"(Ljava/lang/reflect/Method;)Z", (void*)&WB_IsMethodQueuedForCompilation},
+ {CC"makeMethodNotCompilable",
+ CC"(Ljava/lang/reflect/Method;)V", (void*)&WB_MakeMethodNotCompilable},
+ {CC"setDontInlineMethod",
+ CC"(Ljava/lang/reflect/Method;Z)Z", (void*)&WB_SetDontInlineMethod},
+ {CC"getMethodCompilationLevel",
+ CC"(Ljava/lang/reflect/Method;)I", (void*)&WB_GetMethodCompilationLevel},
+ {CC"getCompileQueuesSize",
+ CC"()I", (void*)&WB_GetCompileQueuesSize},
};
#undef CC
--- a/hotspot/src/share/vm/prims/whitebox.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/prims/whitebox.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -34,7 +34,7 @@
#define WB_ENTRY(result_type, header) JNI_ENTRY(result_type, header)
#define WB_END JNI_END
-#define WB_METHOD_DECLARE extern "C" jobjectArray JNICALL
+#define WB_METHOD_DECLARE(result_type) extern "C" result_type JNICALL
class WhiteBox : public AllStatic {
private:
--- a/hotspot/src/share/vm/runtime/arguments.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1086,7 +1086,7 @@
}
// Increase the code cache size - tiered compiles a lot more.
if (FLAG_IS_DEFAULT(ReservedCodeCacheSize)) {
- FLAG_SET_DEFAULT(ReservedCodeCacheSize, ReservedCodeCacheSize * 2);
+ FLAG_SET_DEFAULT(ReservedCodeCacheSize, ReservedCodeCacheSize * 5);
}
}
@@ -1257,7 +1257,7 @@
// prefer minuscule survivor spaces so as not to waste
// space for (non-existent) survivors
if (FLAG_IS_DEFAULT(SurvivorRatio) && MaxTenuringThreshold == 0) {
- FLAG_SET_ERGO(intx, SurvivorRatio, MAX2((intx)1024, SurvivorRatio));
+ FLAG_SET_ERGO(uintx, SurvivorRatio, MAX2((uintx)1024, SurvivorRatio));
}
// If OldPLABSize is set and CMSParPromoteBlocksToClaim is not,
// set CMSParPromoteBlocksToClaim equal to OldPLABSize.
@@ -1897,6 +1897,24 @@
// Keeping the heap 100% free is hard ;-) so limit it to 99%.
MinHeapFreeRatio = MIN2(MinHeapFreeRatio, (uintx) 99);
+ // Min/MaxMetaspaceFreeRatio
+ status = status && verify_percentage(MinMetaspaceFreeRatio, "MinMetaspaceFreeRatio");
+ status = status && verify_percentage(MaxMetaspaceFreeRatio, "MaxMetaspaceFreeRatio");
+
+ if (MinMetaspaceFreeRatio > MaxMetaspaceFreeRatio) {
+ jio_fprintf(defaultStream::error_stream(),
+ "MinMetaspaceFreeRatio (%s" UINTX_FORMAT ") must be less than or "
+ "equal to MaxMetaspaceFreeRatio (%s" UINTX_FORMAT ")\n",
+ FLAG_IS_DEFAULT(MinMetaspaceFreeRatio) ? "Default: " : "",
+ MinMetaspaceFreeRatio,
+ FLAG_IS_DEFAULT(MaxMetaspaceFreeRatio) ? "Default: " : "",
+ MaxMetaspaceFreeRatio);
+ status = false;
+ }
+
+ // Trying to keep 100% free is not practical
+ MinMetaspaceFreeRatio = MIN2(MinMetaspaceFreeRatio, (uintx) 99);
+
if (FullGCALot && FLAG_IS_DEFAULT(MarkSweepAlwaysCompactCount)) {
MarkSweepAlwaysCompactCount = 1; // Move objects every gc.
}
@@ -1904,7 +1922,7 @@
if (UseParallelOldGC && ParallelOldGCSplitALot) {
// Settings to encourage splitting.
if (!FLAG_IS_CMDLINE(NewRatio)) {
- FLAG_SET_CMDLINE(intx, NewRatio, 2);
+ FLAG_SET_CMDLINE(uintx, NewRatio, 2);
}
if (!FLAG_IS_CMDLINE(ScavengeBeforeFullGC)) {
FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false);
--- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -67,13 +67,10 @@
AnnotationArray* fieldDescriptor::type_annotations() const {
InstanceKlass* ik = field_holder();
- Annotations* type_annos = ik->type_annotations();
+ Array<AnnotationArray*>* type_annos = ik->fields_type_annotations();
if (type_annos == NULL)
return NULL;
- Array<AnnotationArray*>* md = type_annos->fields_annotations();
- if (md == NULL)
- return NULL;
- return md->at(index());
+ return type_annos->at(index());
}
constantTag fieldDescriptor::initial_value_tag() const {
--- a/hotspot/src/share/vm/runtime/globals.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/runtime/globals.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -69,7 +69,10 @@
}
bool Flag::is_unlocked() const {
- if (strcmp(kind, "{diagnostic}") == 0) {
+ if (strcmp(kind, "{diagnostic}") == 0 ||
+ strcmp(kind, "{C2 diagnostic}") == 0 ||
+ strcmp(kind, "{ARCH diagnostic}") == 0 ||
+ strcmp(kind, "{Shark diagnostic}") == 0) {
if (strcmp(name, "EnableInvokeDynamic") == 0 && UnlockExperimentalVMOptions && !UnlockDiagnosticVMOptions) {
// transitional logic to allow tests to run until they are changed
static int warned;
@@ -78,7 +81,9 @@
}
return UnlockDiagnosticVMOptions;
} else if (strcmp(kind, "{experimental}") == 0 ||
- strcmp(kind, "{C2 experimental}") == 0) {
+ strcmp(kind, "{C2 experimental}") == 0 ||
+ strcmp(kind, "{ARCH experimental}") == 0 ||
+ strcmp(kind, "{Shark experimental}") == 0) {
return UnlockExperimentalVMOptions;
} else {
return is_unlocked_ext();
--- a/hotspot/src/share/vm/runtime/globals.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/runtime/globals.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -1802,7 +1802,7 @@
product(bool, ParallelRefProcBalancingEnabled, true, \
"Enable balancing of reference processing queues") \
\
- product(intx, CMSTriggerRatio, 80, \
+ product(uintx, CMSTriggerRatio, 80, \
"Percentage of MinHeapFreeRatio in CMS generation that is " \
"allocated before a CMS collection cycle commences") \
\
@@ -1816,7 +1816,7 @@
\
product(uintx, InitiatingHeapOccupancyPercent, 45, \
"Percentage of the (entire) heap occupancy to start a " \
- "concurrent GC cycle. It us used by GCs that trigger a " \
+ "concurrent GC cycle. It is used by GCs that trigger a " \
"concurrent GC cycle based on the occupancy of the entire heap, " \
"not just one of the generations (e.g., G1). A value of 0 " \
"denotes 'do constant GC cycles'.") \
@@ -2977,10 +2977,10 @@
product(uintx, TLABWasteIncrement, 4, \
"Increment allowed waste at slow allocation") \
\
- product(intx, SurvivorRatio, 8, \
+ product(uintx, SurvivorRatio, 8, \
"Ratio of eden/survivor space size") \
\
- product(intx, NewRatio, 2, \
+ product(uintx, NewRatio, 2, \
"Ratio of new/old generation sizes") \
\
product_pd(uintx, NewSizeThreadIncrease, \
@@ -3010,10 +3010,16 @@
"Min change in heap space due to GC (in bytes)") \
\
product(uintx, MinMetaspaceExpansion, ScaleForWordSize(256*K), \
- "Min expansion of permanent heap (in bytes)") \
+ "Min expansion of Metaspace (in bytes)") \
+ \
+ product(uintx, MinMetaspaceFreeRatio, 40, \
+ "Min percentage of Metaspace free after GC to avoid expansion") \
+ \
+ product(uintx, MaxMetaspaceFreeRatio, 70, \
+ "Max percentage of Metaspace free after GC to avoid shrinking") \
\
product(uintx, MaxMetaspaceExpansion, ScaleForWordSize(4*M), \
- "Max expansion of permanent heap without full GC (in bytes)") \
+ "Max expansion of Metaspace without full GC (in bytes)") \
\
product(intx, QueuedAllocationWarningCount, 0, \
"Number of times an allocation that queues behind a GC " \
@@ -3031,7 +3037,7 @@
product(uintx, InitialTenuringThreshold, 7, \
"Initial value for tenuring threshold") \
\
- product(intx, TargetSurvivorRatio, 50, \
+ product(uintx, TargetSurvivorRatio, 50, \
"Desired percentage of survivor space used after scavenge") \
\
product(uintx, MarkSweepDeadRatio, 5, \
--- a/hotspot/src/share/vm/runtime/vmStructs.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/runtime/vmStructs.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -366,11 +366,10 @@
volatile_nonstatic_field(Method, _from_compiled_entry, address) \
volatile_nonstatic_field(Method, _from_interpreted_entry, address) \
volatile_nonstatic_field(ConstMethod, _fingerprint, uint64_t) \
- nonstatic_field(ConstMethod, _constants, ConstantPool*) \
+ nonstatic_field(ConstMethod, _constants, ConstantPool*) \
nonstatic_field(ConstMethod, _stackmap_data, Array<u1>*) \
nonstatic_field(ConstMethod, _constMethod_size, int) \
- nonstatic_field(ConstMethod, _interpreter_kind, jbyte) \
- nonstatic_field(ConstMethod, _flags, jbyte) \
+ nonstatic_field(ConstMethod, _flags, u2) \
nonstatic_field(ConstMethod, _code_size, u2) \
nonstatic_field(ConstMethod, _name_index, u2) \
nonstatic_field(ConstMethod, _signature_index, u2) \
@@ -2261,14 +2260,18 @@
declare_constant(Klass::_lh_array_tag_obj_value) \
\
/********************************/ \
- /* ConstMethod anon-enum */ \
+ /* ConstMethod anon-enum */ \
/********************************/ \
\
- declare_constant(ConstMethod::_has_linenumber_table) \
- declare_constant(ConstMethod::_has_checked_exceptions) \
- declare_constant(ConstMethod::_has_localvariable_table) \
- declare_constant(ConstMethod::_has_exception_table) \
- declare_constant(ConstMethod::_has_generic_signature) \
+ declare_constant(ConstMethod::_has_linenumber_table) \
+ declare_constant(ConstMethod::_has_checked_exceptions) \
+ declare_constant(ConstMethod::_has_localvariable_table) \
+ declare_constant(ConstMethod::_has_exception_table) \
+ declare_constant(ConstMethod::_has_generic_signature) \
+ declare_constant(ConstMethod::_has_method_annotations) \
+ declare_constant(ConstMethod::_has_parameter_annotations) \
+ declare_constant(ConstMethod::_has_default_annotations) \
+ declare_constant(ConstMethod::_has_type_annotations) \
\
/*************************************/ \
/* InstanceKlass enum */ \
--- a/hotspot/src/share/vm/utilities/accessFlags.cpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/utilities/accessFlags.cpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,7 @@
} while(f != old_flags);
}
-#ifndef PRODUCT
+#if !defined(PRODUCT) || INCLUDE_JVMTI
void AccessFlags::print_on(outputStream* st) const {
if (is_public ()) st->print("public " );
@@ -80,7 +80,7 @@
if (on_stack ()) st->print("{on_stack} " );
}
-#endif
+#endif // !PRODUCT || INCLUDE_JVMTI
void accessFlags_init() {
assert(sizeof(AccessFlags) == sizeof(jint), "just checking size of flags");
--- a/hotspot/src/share/vm/utilities/accessFlags.hpp Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/src/share/vm/utilities/accessFlags.hpp Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -239,7 +239,11 @@
inline friend AccessFlags accessFlags_from(jint flags);
// Printing/debugging
+#if INCLUDE_JVMTI
+ void print_on(outputStream* st) const;
+#else
void print_on(outputStream* st) const PRODUCT_RETURN;
+#endif
};
inline AccessFlags accessFlags_from(jint flags) {
--- a/hotspot/test/compiler/7009359/Test7009359.java Tue Feb 19 17:32:10 2013 -0500
+++ b/hotspot/test/compiler/7009359/Test7009359.java Wed Jul 05 18:41:05 2017 +0200
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -27,13 +27,13 @@
* @bug 7009359
* @summary HS with -XX:+AggressiveOpts optimize new StringBuffer(null) so it does not throw NPE as expected
*
- * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+OptimizeStringConcat -XX:CompileCommand=exclude,Test7009359,main Test7009359
+ * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:+OptimizeStringConcat -XX:CompileCommand=dontinline,Test7009359,stringmakerBUG Test7009359
*
*/
public class Test7009359 {
public static void main (String[] args) {
- for(int i = 0; i < 1000000; i++) {
+ for(int i = 0; i < 100000; i++) {
if(!stringmakerBUG(null).equals("NPE")) {
System.out.println("StringBuffer(null) does not throw NPE");
System.exit(97);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import sun.hotspot.WhiteBox;
+import sun.management.ManagementFactoryHelper;
+import com.sun.management.HotSpotDiagnosticMXBean;
+
+import java.lang.reflect.Method;
+
+/*
+ * @author igor.ignatyev@oracle.com
+ */
+public abstract class CompilerWhiteBoxTest {
+ protected static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
+ protected static final Method METHOD = getMethod("method");
+ protected static final int COMPILE_THRESHOLD
+ = Integer.parseInt(getVMOption("CompileThreshold", "10000"));
+
+ protected static Method getMethod(String name) {
+ try {
+ return CompilerWhiteBoxTest.class.getDeclaredMethod(name);
+ } catch (NoSuchMethodException | SecurityException e) {
+ throw new RuntimeException(
+ "exception on getting method " + name, e);
+ }
+ }
+
+ protected static String getVMOption(String name, String defaultValue) {
+ String result;
+ HotSpotDiagnosticMXBean diagnostic
+ = ManagementFactoryHelper.getDiagnosticMXBean();
+ result = diagnostic.getVMOption(name).getValue();
+ return result == null ? defaultValue : result;
+ }
+
+ protected final void runTest() throws RuntimeException {
+ if (ManagementFactoryHelper.getCompilationMXBean() == null) {
+ System.err.println(
+ "Warning: test is not applicable in interpreted mode");
+ return;
+ }
+ System.out.println("at test's start:");
+ printInfo(METHOD);
+ try {
+ test();
+ } catch (Exception e) {
+ System.out.printf("on exception '%s':", e.getMessage());
+ printInfo(METHOD);
+ throw new RuntimeException(e);
+ }
+ System.out.println("at test's end:");
+ printInfo(METHOD);
+ }
+
+ protected static void checkNotCompiled(Method method) {
+ if (WHITE_BOX.isMethodCompiled(method)) {
+ throw new RuntimeException(method + " must be not compiled");
+ }
+ if (WHITE_BOX.getMethodCompilationLevel(method) != 0) {
+ throw new RuntimeException(method + " comp_level must be == 0");
+ }
+ }
+
+ protected static void checkCompiled(Method method)
+ throws InterruptedException {
+ final long start = System.currentTimeMillis();
+ waitBackgroundCompilation(method);
+ if (WHITE_BOX.isMethodQueuedForCompilation(method)) {
+ System.err.printf("Warning: %s is still in queue after %dms%n",
+ method, System.currentTimeMillis() - start);
+ return;
+ }
+ if (!WHITE_BOX.isMethodCompiled(method)) {
+ throw new RuntimeException(method + " must be compiled");
+ }
+ if (WHITE_BOX.getMethodCompilationLevel(method) == 0) {
+ throw new RuntimeException(method + " comp_level must be != 0");
+ }
+ }
+
+ protected static void waitBackgroundCompilation(Method method)
+ throws InterruptedException {
+ final Object obj = new Object();
+ synchronized (obj) {
+ for (int i = 0; i < 10; ++i) {
+ if (!WHITE_BOX.isMethodQueuedForCompilation(method)) {
+ break;
+ }
+ obj.wait(1000);
+ }
+ }
+ }
+
+ protected static void printInfo(Method method) {
+ System.out.printf("%n%s:%n", method);
+ System.out.printf("\tcompilable:\t%b%n",
+ WHITE_BOX.isMethodCompilable(method));
+ System.out.printf("\tcompiled:\t%b%n",
+ WHITE_BOX.isMethodCompiled(method));
+ System.out.printf("\tcomp_level:\t%d%n",
+ WHITE_BOX.getMethodCompilationLevel(method));
+ System.out.printf("\tin_queue:\t%b%n",
+ WHITE_BOX.isMethodQueuedForCompilation(method));
+ System.out.printf("compile_queues_size:\t%d%n%n",
+ WHITE_BOX.getCompileQueuesSize());
+ }
+
+ protected abstract void test() throws Exception;
+
+ protected final int compile() {
+ int result = 0;
+ for (int i = 0; i < COMPILE_THRESHOLD; ++i) {
+ result += method();
+ }
+ return result;
+ }
+
+
+ protected int method() {
+ return 42;
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test DeoptimizeAllTest
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI DeoptimizeAllTest.java
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI DeoptimizeAllTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class DeoptimizeAllTest extends CompilerWhiteBoxTest {
+
+ public static void main(String[] args) throws Exception {
+ new DeoptimizeAllTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ // to prevent inlining #method into #compile()
+ WHITE_BOX.setDontInlineMethod(METHOD, true);
+ compile();
+ checkCompiled(METHOD);
+ WHITE_BOX.deoptimizeAll();
+ checkNotCompiled(METHOD);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test DeoptimizeMethodTest
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI DeoptimizeMethodTest.java
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI DeoptimizeMethodTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class DeoptimizeMethodTest extends CompilerWhiteBoxTest {
+
+ public static void main(String[] args) throws Exception {
+ new DeoptimizeMethodTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ // to prevent inlining #method into #compile()
+ WHITE_BOX.setDontInlineMethod(METHOD, true);
+ compile();
+ checkCompiled(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ checkNotCompiled(METHOD);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test IsMethodCompilableTest
+ * @bug 8007270
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI IsMethodCompilableTest.java
+ * @run main/othervm/timeout=600 -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI IsMethodCompilableTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class IsMethodCompilableTest extends CompilerWhiteBoxTest {
+ protected static final long PER_METHOD_RECOMPILATION_CUTOFF;
+
+ static {
+ long tmp = Long.parseLong(
+ getVMOption("PerMethodRecompilationCutoff", "400"));
+ if (tmp == -1) {
+ PER_METHOD_RECOMPILATION_CUTOFF = -1 /* Inf */;
+ } else {
+ PER_METHOD_RECOMPILATION_CUTOFF = 1 + (0xFFFFFFFFL & tmp);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ new IsMethodCompilableTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ if (!WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD + " must be compilable");
+ }
+ System.out.println("PerMethodRecompilationCutoff = "
+ + PER_METHOD_RECOMPILATION_CUTOFF);
+ if (PER_METHOD_RECOMPILATION_CUTOFF == -1) {
+ System.err.println(
+ "Warning: test is not applicable if PerMethodRecompilationCutoff == Inf");
+ return;
+ }
+ // to prevent inlining #method into #compile()
+ WHITE_BOX.setDontInlineMethod(METHOD, true);
+ boolean madeNotCompilable = false;
+
+ for (long i = 0; i < PER_METHOD_RECOMPILATION_CUTOFF; ++i) {
+ compile();
+ waitBackgroundCompilation(METHOD);
+ WHITE_BOX.deoptimizeMethod(METHOD);
+ if (!WHITE_BOX.isMethodCompilable(METHOD)) {
+ madeNotCompilable = true;
+ break;
+ }
+ }
+ if (!madeNotCompilable) {
+ throw new RuntimeException(METHOD + " is still compilable after "
+ + PER_METHOD_RECOMPILATION_CUTOFF + " iterations");
+ }
+ compile();
+ if (WHITE_BOX.isMethodCompiled(METHOD)) {
+ printInfo(METHOD);
+ throw new RuntimeException(
+ METHOD + " is not compilable but compiled");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test MakeMethodNotCompilableTest
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI MakeMethodNotCompilableTest.java
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI MakeMethodNotCompilableTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class MakeMethodNotCompilableTest extends CompilerWhiteBoxTest {
+
+ public static void main(String[] args) throws Exception {
+ new MakeMethodNotCompilableTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ if (!WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD + " must be compilable");
+ }
+ WHITE_BOX.makeMethodNotCompilable(METHOD);
+ if (WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD + " must be not compilable");
+ }
+ compile();
+ if (WHITE_BOX.isMethodQueuedForCompilation(METHOD)) {
+ throw new RuntimeException(METHOD + " must not be in queue");
+ }
+ checkNotCompiled(METHOD);
+ if (WHITE_BOX.isMethodCompilable(METHOD)) {
+ throw new RuntimeException(METHOD + " must be not compilable");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test SetDontInlineMethodTest
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI CompilerWhiteBoxTest.java
+ * @compile -J-XX:+UnlockDiagnosticVMOptions -J-XX:+WhiteBoxAPI SetDontInlineMethodTest.java
+ * @run main/othervm -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI SetDontInlineMethodTest
+ * @author igor.ignatyev@oracle.com
+ */
+public class SetDontInlineMethodTest extends CompilerWhiteBoxTest {
+
+ public static void main(String[] args) throws Exception {
+ new SetDontInlineMethodTest().runTest();
+ }
+
+ protected void test() throws Exception {
+ if (WHITE_BOX.setDontInlineMethod(METHOD, true)) {
+ throw new RuntimeException("on start " + METHOD
+ + " must be inlineable");
+ }
+ if (!WHITE_BOX.setDontInlineMethod(METHOD, true)) {
+ throw new RuntimeException("after first change to true " + METHOD
+ + " must be not inlineable");
+ }
+ if (!WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after second change to true " + METHOD
+ + " must be still not inlineable");
+ }
+ if (WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after first change to false" + METHOD
+ + " must be inlineable");
+ }
+ if (WHITE_BOX.setDontInlineMethod(METHOD, false)) {
+ throw new RuntimeException("after second change to false " + METHOD
+ + " must be inlineable");
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/8007320/ConstMethodTest.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8007320
+ * @summary Test all optional fields in ConstMethod
+ * @compile -g -parameters ConstMethodTest.java
+ * @run main ConstMethodTest
+ */
+
+import java.util.*;
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+import java.io.Serializable;
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface MyAnnotation {
+ public String name();
+ public String value();
+ public String date() default "today";
+}
+
+@Target(ElementType.TYPE_USE)
+@Retention(RetentionPolicy.RUNTIME)
+@interface TypeAnno {
+ String value();
+}
+
+@Target(ElementType.TYPE_USE)
+@Retention(RetentionPolicy.RUNTIME)
+@interface TypeAnno2 {
+ String value();
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+@interface Named {
+ String value();
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface ScalarTypesWithDefault {
+ byte b() default 11;
+ short s() default 12;
+ int i() default 13;
+ long l() default 14;
+ char c() default 'V';
+}
+
+// Some exception class
+class OkException extends RuntimeException {};
+
+
+@MyAnnotation(name="someName", value = "Hello World")
+public class ConstMethodTest {
+
+ private static void check(boolean b) {
+ if (!b)
+ throw new RuntimeException();
+ }
+ private static void fail(String msg) {
+ System.err.println(msg);
+ throw new RuntimeException();
+ }
+ private static void equal(Object x, Object y) {
+ if (x == null ? y == null : x.equals(y)) {
+ } else {
+ fail(x + " not equal to " + y);
+ }
+ }
+ private static final String[] parameter_names = {
+ "parameter", "parameter2", "x"
+ };
+
+ // Declare a function with everything in it.
+ @MyAnnotation(name="someName", value="Hello World")
+ static <T> void kitchenSinkFunc(@Named(value="aName") String parameter,
+ @Named("bName") String parameter2,
+ @ScalarTypesWithDefault T x)
+ throws @TypeAnno("RE") @TypeAnno2("RE2") RuntimeException,
+ NullPointerException,
+ @TypeAnno("AIOOBE") ArrayIndexOutOfBoundsException {
+ int i, j, k;
+ try {
+ System.out.println("calling kitchenSinkFunc " + parameter);
+ throw new OkException(); // to see stack trace with line numbers
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static void test1() throws Throwable {
+ for (Method m : ConstMethodTest.class.getDeclaredMethods()) {
+ if (m.getName().equals("kitchenSinkFunc")) {
+ Annotation[][] ann = m.getParameterAnnotations();
+ equal(ann.length, 3);
+ Annotation foo = ann[0][0];
+ Annotation bar = ann[1][0];
+ equal(foo.toString(), "@Named(value=aName)");
+ equal(bar.toString(), "@Named(value=bName)");
+ check(foo.equals(foo));
+ check(bar.equals(bar));
+ check(! foo.equals(bar));
+ // method annotations
+ Annotation[] ann2 = m.getAnnotations();
+ equal(ann2.length, 1);
+ Annotation mann = ann2[0];
+ equal(mann.toString(), "@MyAnnotation(date=today, name=someName, value=Hello World)");
+ // Test Method parameter names
+ Parameter[] parameters = m.getParameters();
+ if(parameters == null)
+ throw new Exception("getParameters should never be null");
+ for(int i = 0; i < parameters.length; i++) {
+ Parameter p = parameters[i];
+ equal(parameters[i].getName(), parameter_names[i]);
+ }
+ }
+ }
+ }
+
+ public static void main(java.lang.String[] unused) throws Throwable {
+ // pass 5 so kitchenSinkFunc is instantiated with an int
+ kitchenSinkFunc("parameter", "param2", 5);
+ test1();
+ }
+};
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/BooleanFlagWithInvalidValue.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8006298
+ * @summary Setting an invalid value for a bool argument should result in a useful error message
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class BooleanFlagWithInvalidValue {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+UseLargePages=8", "-version");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Improperly specified VM option 'UseLargePages=8'");
+ output.shouldHaveExitValue(1);
+
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:-UseLargePages=8", "-version");
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Improperly specified VM option 'UseLargePages=8'");
+ output.shouldHaveExitValue(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/FlagWithInvalidValue.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8006298
+ * @summary Setting a flag to an invalid value should print a useful error message
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class FlagWithInvalidValue {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:ObjectAlignmentInBytes=v", "-version");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Improperly specified VM option 'ObjectAlignmentInBytes=v'");
+ output.shouldHaveExitValue(1);
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/NonBooleanFlagWithInvalidBooleanPrefix.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8006298
+ * @summary Using a bool (+/-) prefix on non-bool flag should result in a useful error message
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class NonBooleanFlagWithInvalidBooleanPrefix {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:-ObjectAlignmentInBytes=16", "-version");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Unexpected +/- setting in VM option 'ObjectAlignmentInBytes=16'");
+ output.shouldHaveExitValue(1);
+
+ pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:+ObjectAlignmentInBytes=16", "-version");
+
+ output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Unexpected +/- setting in VM option 'ObjectAlignmentInBytes=16'");
+ output.shouldHaveExitValue(1);
+
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/runtime/CommandLine/UnrecognizedVMOption.java Wed Jul 05 18:41:05 2017 +0200
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 8006298
+ * @summary Using an unrecognized VM option should print the name of the option
+ * @library /testlibrary
+ */
+
+import com.oracle.java.testlibrary.*;
+
+public class UnrecognizedVMOption {
+ public static void main(String[] args) throws Exception {
+ ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+ "-XX:bogus_option", "-version");
+
+ OutputAnalyzer output = new OutputAnalyzer(pb.start());
+ output.shouldContain("Unrecognized VM option 'bogus_option'");
+ output.shouldHaveExitValue(1);
+ }
+}
--- a/make/scripts/webrev.ksh Tue Feb 19 17:32:10 2013 -0500
+++ b/make/scripts/webrev.ksh Wed Jul 05 18:41:05 2017 +0200
@@ -19,7 +19,7 @@
#
# CDDL HEADER END
#
-# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
# Use is subject to license terms.
#
# This script takes a file list and a workspace and builds a set of html files
@@ -27,7 +27,7 @@
# Documentation is available via 'webrev -h'.
#
-WEBREV_UPDATED=23.18-hg
+WEBREV_UPDATED=23.18-hg+jbs
HTML='<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
@@ -146,7 +146,7 @@
#
bug2url()
{
- sed -e 's|[0-9]\{5,\}|<a href=\"'$BUGURL'&\">&</a>|g'
+ sed -e 's|[0-9]\{5,\}|<a href=\"'$BUGURL$IDPREFIX'&\">&</a>|g'
}
#
@@ -230,8 +230,8 @@
# $ sdiff_to_html old/usr/src/tools/scripts/webrev.sh \
# new/usr/src/tools/scripts/webrev.sh \
# webrev.sh usr/src/tools/scripts \
-# '<a href="http://monaco.sfbay.sun.com/detail.jsp?cr=1234567">
-# 1234567</a> my bugid' > <file>.html
+# '<a href="https://jbs.oracle.com/bugs/browse/JDK-1234567">
+# JDK-1234567</a> my bugid' > <file>.html
#
# framed_sdiff() is then called which creates $2.frames.html
# in the webrev tree.
@@ -1160,7 +1160,7 @@
print "$comm"
return
fi
-
+
print "$comm" | html_quote | bug2url | sac2url
)
fi
@@ -1418,7 +1418,7 @@
next;}
END {for (tree in trees)
{ rev=revs[trees[tree]];
- if (rev > 0)
+ if (rev > 0)
{printf("%s %d\n",trees[tree],rev-1)}
}}' | while read LINE
do
@@ -1459,7 +1459,7 @@
{
TREE=$1
HGCMD="hg -R $CWS/$TREE status $FSTAT_OPT"
-
+
$HGCMD -mdn 2>/dev/null | $FILTER | while read F
do
echo $TREE/$F
@@ -1543,7 +1543,7 @@
if (n == 0)
{ printf("A %s/%s\n",tree,$2)}
else
- { printf("A %s\n",$2)};
+ { printf("A %s\n",$2)};
next}
/^ / {n=index($1,tree);
if (n == 0)
@@ -1604,7 +1604,7 @@
# We need at least one of default-push or default paths set in .hg/hgrc
# If neither are set we don't know who to compare with.
-function flist_from_mercurial
+function flist_from_mercurial
{
# if [ "${PWS##ssh://}" != "$PWS" -o \
# "${PWS##http://}" != "$PWS" -o \
@@ -1757,7 +1757,7 @@
elif [[ "$OS" == "Linux" ]]; then
DEVTOOLS="/java/devtools/linux/bin"
fi
-
+
ppath=$PATH
ppath=$ppath:/usr/sfw/bin:/usr/bin:/usr/sbin
ppath=$ppath:/opt/teamware/bin:/opt/onbld/bin
@@ -1844,7 +1844,7 @@
ssh_host=`echo $CMD | sed -e 's/ssh:\/\/\([^/]*\)\/.*/\1/'`
ssh_dir=`echo $CMD | sed -e 's/ssh:\/\/[^/]*\/\(.*\)/\1/'`
fi
-
+
}
function build_old_new_mercurial
@@ -2096,7 +2096,7 @@
PARENT_REV=$OPTARG;;
v) print "$0 version: $WEBREV_UPDATED";;
-
+
?) usage;;
esac
@@ -2338,7 +2338,7 @@
#
[[ -z $codemgr_ws && -n $CODEMGR_WS ]] && codemgr_ws=$CODEMGR_WS
[[ -z $codemgr_ws && -n $WSPACE ]] && codemgr_ws=`$WSPACE name`
-
+
if [[ -n $codemgr_ws && ! -d $codemgr_ws ]]; then
print -u2 "$codemgr_ws: no such workspace"
exit 1
@@ -2521,10 +2521,16 @@
# Bug IDs will be replaced by a URL. Order of precedence
# is: default location, $WEBREV_BUGURL, the -O flag.
#
-BUGURL='http://monaco.sfbay.sun.com/detail.jsp?cr='
+BUGURL='https://jbs.oracle.com/bugs/browse/'
[[ -n $WEBREV_BUGURL ]] && BUGURL="$WEBREV_BUGURL"
-[[ -n "$Oflag" ]] && \
+if [[ -n "$Oflag" ]]; then
+ CRID=`echo $CRID | sed -e 's/JDK-//'`
BUGURL='http://bugs.sun.com/bugdatabase/view_bug.do?bug_id='
+ IDPREFIX=''
+else
+ IDPREFIX='JDK-'
+fi
+
#
# Likewise, ARC cases will be replaced by a URL. Order of precedence
@@ -2561,7 +2567,7 @@
#
# Should we ignore changes in white spaces when generating diffs?
-#
+#
if [[ -n $bflag ]]; then
DIFFOPTS="-t"
else
@@ -2748,7 +2754,7 @@
fi
fi
else
-
+
#
# If we have old and new versions of the file then run the
# appropriate diffs. This is complicated by a couple of factors:
@@ -3000,22 +3006,31 @@
# external URL has a <title> like:
# <title>Bug ID: 6641309 Wrong Cookie separator used in HttpURLConnection</title>
# while internal URL has <title> like:
-# <title>6641309: Wrong Cookie separator used in HttpURLConnection</title>
+# <title>[#JDK-6641309] Wrong Cookie separator used in HttpURLConnection</title>
#
if [[ -n $CRID ]]; then
for id in $CRID
do
+ if [[ -z "$Oflag" ]]; then
+ #add "JDK-" to raw bug id for jbs links.
+ id=`echo ${id} | sed 's/^\([0-9]\{5,\}\)$/JDK-\1/'`
+ fi
print "<tr><th>Bug id:</th><td>"
url="${BUGURL}${id}"
- if [[ -n $WGET ]]; then
- msg=`$WGET -q $url -O - | grep '<title>' | sed 's/<title>\(.*\)<\/title>/\1/' | sed 's/Bug ID://'`
+ if [[ -n "$Oflag" ]]; then
+ cleanup='s/Bug ID: \([0-9]\{5,\}\) \(.*\)/JDK-\1 : \2/'
+ else
+ cleanup='s|\[#\(JDK-[0-9]\{5,\}\)\] \(.*\)|\1 : \2|'
fi
- if [[ -n $msg ]]; then
- print "<a href=\"$url\">$msg</a>"
- else
- print $id | bug2url
+ if [[ -n $WGET ]]; then
+ msg=`$WGET --timeout=10 --tries=1 -q $url -O - | grep '<title>' | sed 's/<title>\(.*\)<\/title>/\1/' | sed "$cleanup"`
fi
-
+ if [[ -z $msg ]]; then
+ msg="${id}"
+ fi
+
+ print "<a href=\"$url\">$msg</a>"
+
print "</td></tr>"
done
fi
@@ -3179,4 +3194,3 @@
print "Done."
print "Output to: $WDIR"
-
--- a/test/Makefile Tue Feb 19 17:32:10 2013 -0500
+++ b/test/Makefile Wed Jul 05 18:41:05 2017 +0200
@@ -38,8 +38,8 @@
define SUBDIR_TEST # subdirectory target
if [ -d $1 ] ; then \
if [ -r $1/test/Makefile ] ; then \
- echo "$(MAKE) -C $1/test $2" ; \
- $(MAKE) -C $1/test $2 ; \
+ echo "$(MAKE) -k -C $1/test $2" ; \
+ $(MAKE) -k -C $1/test $2 ; \
else \
echo "ERROR: File does not exist: $1/test/Makefile"; \
exit 1; \
@@ -53,7 +53,7 @@
LANGTOOLS_TEST_LIST = langtools_jtreg
# Test target list for jdk repository
-JDK_DEFAULT_TEST_LIST = \
+JDK_ALL_TEST_LIST = \
jdk_beans1 \
jdk_io \
jdk_lang \
@@ -64,10 +64,7 @@
jdk_security1 \
jdk_text \
jdk_util \
- jdk_time
-
-# These tests are not part of the default testing list
-JDK_NONDEFAULT_TEST_LIST = \
+ jdk_time \
jdk_awt \
jdk_beans2 jdk_beans3 \
jdk_management \
@@ -80,14 +77,14 @@
jdk_jdi \
jdk_jfr
-# All jdk tests
-JDK_ALL_TEST_LIST = $(JDK_DEFAULT_TEST_LIST) $(JDK_NONDEFAULT_TEST_LIST)
+# Theses are meta test targets in jdk
+JDK_META_TEST_LIST = jdk_all jdk_default jdk_core
# These are the current jck test targets in the jdk repository
JDK_JCK7_LIST = jck7devtools jck7compiler jck7runtime
-# Default test target (everything)
-default: $(JDK_DEFAULT_TEST_LIST) $(LANGTOOLS_TEST_LIST)
+# Default test target (core)
+default: jdk_core $(LANGTOOLS_TEST_LIST)
# All testing
all: $(JDK_ALL_TEST_LIST) $(LANGTOOLS_TEST_LIST)
@@ -95,7 +92,8 @@
# Test targets
$(LANGTOOLS_TEST_LIST):
@$(NO_STOPPING)$(call SUBDIR_TEST, $(LANGTOOLS_DIR), $(subst langtools_,,$@))
-$(JDK_ALL_TEST_LIST) $(JDK_JCK7_LIST):
+
+$(JDK_ALL_TEST_LIST) $(JDK_META_TEST_LIST) $(JDK_JCK7_LIST):
@$(NO_STOPPING)$(call SUBDIR_TEST, $(JDK_DIR), $@)
clean:
@@ -104,7 +102,7 @@
# Phony targets (e.g. these are not filenames)
.PHONY: all clean \
- $(JDK_ALL_TEST_LIST) $(JDK_JCK7_LIST) \
+ $(JDK_ALL_TEST_LIST) $(JDK_META_TEST_LIST) $(JDK_JCK7_LIST) \
$(LANGTOOLS_TEST_LIST)
################################################################