This commit is contained in:
J. Duke 2017-07-05 23:21:47 +02:00
commit 844b1a72d0
766 changed files with 14694 additions and 49326 deletions

View File

@ -400,6 +400,7 @@ ef056360ddf3977d7d2ddbeb456a4d612d19ea05 jdk-9+152
8d26916eaa21b689835ffc1c0dbf12470aa9be61 jdk-9+154 8d26916eaa21b689835ffc1c0dbf12470aa9be61 jdk-9+154
688a3863c00ebc089ab17ee1fc46272cbbd96815 jdk-9+155 688a3863c00ebc089ab17ee1fc46272cbbd96815 jdk-9+155
783ec7542cf7154e5d2b87f55bb97d28f81e9ada jdk-9+156 783ec7542cf7154e5d2b87f55bb97d28f81e9ada jdk-9+156
4df5f619c9ead4604d2f97ed231b3a35ec688c41 jdk-10+1
4eb77fb98952dc477a4229575c81d2263a9ce711 jdk-9+157 4eb77fb98952dc477a4229575c81d2263a9ce711 jdk-9+157
a4087bc10a88a43ea3ad0919b5b4af1c86977221 jdk-9+158 a4087bc10a88a43ea3ad0919b5b4af1c86977221 jdk-9+158
fe8466adaef8178dba94be53c789a0aaa87d13bb jdk-9+159 fe8466adaef8178dba94be53c789a0aaa87d13bb jdk-9+159
@ -410,3 +411,10 @@ c38c6b270ccc8e2b86d1631bcf42248241b54d2c jdk-9+163
7810f75d016a52e32295c4233009de5ca90e31af jdk-9+164 7810f75d016a52e32295c4233009de5ca90e31af jdk-9+164
aff4f339acd40942d3dab499846b52acd87b3af1 jdk-9+165 aff4f339acd40942d3dab499846b52acd87b3af1 jdk-9+165
ba5b16c9c6d80632b61959a33d424b1c3398ce62 jdk-9+166 ba5b16c9c6d80632b61959a33d424b1c3398ce62 jdk-9+166
35017c286513ddcbcc6b63b99679c604993fc639 jdk-9+167
143d4c87bc1ef1ed6dadd613cd9dd4488fdefc29 jdk-9+168
9c7248b787c39b034d4f48d4aa48df903836cca7 jdk-10+2
06373236a30801f72e2a31ee5c691c2a1e500f57 jdk-10+3
8ec175c61fc3f58328a3324f07d7ded00e060be3 jdk-10+4
111e2e7d00f45c983cdbc9c59ae40552152fcc23 jdk-10+5
03fe61bb7670644cf6e46b5cfafb6b27c0e0157e jdk-10+6

View File

@ -1095,6 +1095,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
OTOOL="true" OTOOL="true"
fi fi
BASIC_PATH_PROGS(READELF, [greadelf readelf]) BASIC_PATH_PROGS(READELF, [greadelf readelf])
BASIC_PATH_PROGS(DOT, dot)
BASIC_PATH_PROGS(HG, hg) BASIC_PATH_PROGS(HG, hg)
BASIC_PATH_PROGS(STAT, stat) BASIC_PATH_PROGS(STAT, stat)
BASIC_PATH_PROGS(TIME, time) BASIC_PATH_PROGS(TIME, time)

View File

@ -918,6 +918,7 @@ COMPRESS_JARS
INCLUDE_SA INCLUDE_SA
UNLIMITED_CRYPTO UNLIMITED_CRYPTO
CACERTS_FILE CACERTS_FILE
ENABLE_FULL_DOCS
ENABLE_HEADLESS_ONLY ENABLE_HEADLESS_ONLY
DEFAULT_MAKE_TARGET DEFAULT_MAKE_TARGET
OS_VERSION_MICRO OS_VERSION_MICRO
@ -936,6 +937,7 @@ FLOCK
TIME TIME
STAT STAT
HG HG
DOT
READELF READELF
OTOOL OTOOL
LDD LDD
@ -994,9 +996,8 @@ OPENJDK_TARGET_CPU_OSARCH
OPENJDK_TARGET_CPU_ISADIR OPENJDK_TARGET_CPU_ISADIR
OPENJDK_TARGET_CPU_LEGACY_LIB OPENJDK_TARGET_CPU_LEGACY_LIB
OPENJDK_TARGET_CPU_LEGACY OPENJDK_TARGET_CPU_LEGACY
REQUIRED_OS_VERSION OPENJDK_MODULE_TARGET_OS_ARCH
REQUIRED_OS_ARCH OPENJDK_MODULE_TARGET_OS_NAME
REQUIRED_OS_NAME
COMPILE_TYPE COMPILE_TYPE
OPENJDK_TARGET_CPU_ENDIAN OPENJDK_TARGET_CPU_ENDIAN
OPENJDK_TARGET_CPU_BITS OPENJDK_TARGET_CPU_BITS
@ -1139,6 +1140,7 @@ with_conf_name
with_output_sync with_output_sync
with_default_make_target with_default_make_target
enable_headless_only enable_headless_only
enable_full_docs
with_cacerts_file with_cacerts_file
enable_unlimited_crypto enable_unlimited_crypto
with_copyright_year with_copyright_year
@ -1291,6 +1293,7 @@ ZIPEXE
LDD LDD
OTOOL OTOOL
READELF READELF
DOT
HG HG
STAT STAT
TIME TIME
@ -1972,6 +1975,8 @@ Optional Features:
--enable-debug set the debug level to fastdebug (shorthand for --enable-debug set the debug level to fastdebug (shorthand for
--with-debug-level=fastdebug) [disabled] --with-debug-level=fastdebug) [disabled]
--enable-headless-only only build headless (no GUI) support [disabled] --enable-headless-only only build headless (no GUI) support [disabled]
--enable-full-docs build complete documentation [enabled if all tools
found]
--disable-unlimited-crypto --disable-unlimited-crypto
Disable unlimited crypto policy [enabled] Disable unlimited crypto policy [enabled]
--disable-keep-packaged-modules --disable-keep-packaged-modules
@ -2256,6 +2261,7 @@ Some influential environment variables:
LDD Override default value for LDD LDD Override default value for LDD
OTOOL Override default value for OTOOL OTOOL Override default value for OTOOL
READELF Override default value for READELF READELF Override default value for READELF
DOT Override default value for DOT
HG Override default value for HG HG Override default value for HG
STAT Override default value for STAT STAT Override default value for STAT
TIME Override default value for TIME TIME Override default value for TIME
@ -5177,7 +5183,7 @@ VS_SDK_PLATFORM_NAME_2013=
#CUSTOM_AUTOCONF_INCLUDE #CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks: # Do not change or remove the following line, it is needed for consistency checks:
DATE_WHEN_GENERATED=1490900744 DATE_WHEN_GENERATED=1492975963
############################################################################### ###############################################################################
# #
@ -16025,32 +16031,17 @@ $as_echo_n "checking compilation type... " >&6; }
$as_echo "$COMPILE_TYPE" >&6; } $as_echo "$COMPILE_TYPE" >&6; }
if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then if test "x$OPENJDK_TARGET_OS" = xmacosx; then
REQUIRED_OS_NAME=SunOS OPENJDK_MODULE_TARGET_OS_NAME="macos"
REQUIRED_OS_VERSION=5.10 else
OPENJDK_MODULE_TARGET_OS_NAME="$OPENJDK_TARGET_OS"
fi fi
if test "x$OPENJDK_TARGET_OS" = "xlinux"; then
REQUIRED_OS_NAME=Linux
REQUIRED_OS_VERSION=2.6
fi
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
REQUIRED_OS_NAME=Windows
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
REQUIRED_OS_VERSION=5.2
else
REQUIRED_OS_VERSION=5.1
fi
fi
if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
REQUIRED_OS_NAME="Mac OS X"
REQUIRED_OS_VERSION=11.2
fi
if test "x$OPENJDK_TARGET_OS" = "xaix"; then
REQUIRED_OS_NAME=AIX
REQUIRED_OS_VERSION=7.1
fi
REQUIRED_OS_ARCH=${OPENJDK_TARGET_CPU}
if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
OPENJDK_MODULE_TARGET_OS_ARCH="amd64"
else
OPENJDK_MODULE_TARGET_OS_ARCH="$OPENJDK_TARGET_CPU"
fi
@ -22473,6 +22464,203 @@ $as_echo "$tool_specified" >&6; }
# Publish this variable in the help.
if [ -z "${DOT+x}" ]; then
# The variable is not set by user, try to locate tool using the code snippet
for ac_prog in dot
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
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 ${ac_cv_path_DOT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DOT in
[\\/]* | ?:[\\/]*)
ac_cv_path_DOT="$DOT" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_DOT="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
DOT=$ac_cv_path_DOT
if test -n "$DOT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5
$as_echo "$DOT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$DOT" && break
done
else
# The variable is set, but is it from the command line or the environment?
# Try to remove the string !DOT! from our list.
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!DOT!/}
if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
# If it failed, the variable was not from the command line. Ignore it,
# but warn the user (except for BASH, which is always set by the calling BASH).
if test "xDOT" != xBASH; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of DOT from the environment. Use command line variables instead." >&5
$as_echo "$as_me: WARNING: Ignoring value of DOT from the environment. Use command line variables instead." >&2;}
fi
# Try to locate tool using the code snippet
for ac_prog in dot
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
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 ${ac_cv_path_DOT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DOT in
[\\/]* | ?:[\\/]*)
ac_cv_path_DOT="$DOT" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_DOT="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
DOT=$ac_cv_path_DOT
if test -n "$DOT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5
$as_echo "$DOT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -n "$DOT" && break
done
else
# If it succeeded, then it was overridden by the user. We will use it
# for the tool.
# First remove it from the list of overridden variables, so we can test
# for unknown variables in the end.
CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
# Check if we try to supply an empty value
if test "x$DOT" = x; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool DOT= (no value)" >&5
$as_echo "$as_me: Setting user supplied tool DOT= (no value)" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOT" >&5
$as_echo_n "checking for DOT... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
$as_echo "disabled" >&6; }
else
# Check if the provided tool contains a complete path.
tool_specified="$DOT"
tool_basename="${tool_specified##*/}"
if test "x$tool_basename" = "x$tool_specified"; then
# A command without a complete path is provided, search $PATH.
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool DOT=$tool_basename" >&5
$as_echo "$as_me: Will search for user supplied tool DOT=$tool_basename" >&6;}
# Extract the first word of "$tool_basename", so it can be a program name with args.
set dummy $tool_basename; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_DOT+:} false; then :
$as_echo_n "(cached) " >&6
else
case $DOT in
[\\/]* | ?:[\\/]*)
ac_cv_path_DOT="$DOT" # Let the user override the test with a path.
;;
*)
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
test -z "$as_dir" && as_dir=.
for ac_exec_ext in '' $ac_executable_extensions; do
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
ac_cv_path_DOT="$as_dir/$ac_word$ac_exec_ext"
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
break 2
fi
done
done
IFS=$as_save_IFS
;;
esac
fi
DOT=$ac_cv_path_DOT
if test -n "$DOT"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5
$as_echo "$DOT" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
if test "x$DOT" = x; then
as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
fi
else
# Otherwise we believe it is a complete path. Use it as it is.
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool DOT=$tool_specified" >&5
$as_echo "$as_me: Will use user supplied tool DOT=$tool_specified" >&6;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DOT" >&5
$as_echo_n "checking for DOT... " >&6; }
if test ! -x "$tool_specified"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
as_fn_error $? "User supplied tool DOT=$tool_specified does not exist or is not executable" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
$as_echo "$tool_specified" >&6; }
fi
fi
fi
fi
# Publish this variable in the help. # Publish this variable in the help.
@ -24723,6 +24911,101 @@ $as_echo "no" >&6; }
# Should we build the complete docs, or just a lightweight version?
# Check whether --enable-full-docs was given.
if test "${enable_full_docs+set}" = set; then :
enableval=$enable_full_docs;
fi
# Verify dependencies
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for graphviz dot" >&5
$as_echo_n "checking for graphviz dot... " >&6; }
if test "x$DOT" != "x"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, cannot generate full docs" >&5
$as_echo "no, cannot generate full docs" >&6; }
FULL_DOCS_DEP_MISSING=true
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pandoc" >&5
$as_echo_n "checking for pandoc... " >&6; }
if test "x$PANDOC" != "x"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, cannot generate full docs" >&5
$as_echo "no, cannot generate full docs" >&6; }
FULL_DOCS_DEP_MISSING=true
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking full docs" >&5
$as_echo_n "checking full docs... " >&6; }
if test "x$enable_full_docs" = xyes; then
if test "x$FULL_DOCS_DEP_MISSING" = "xtrue"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, missing dependencies" >&5
$as_echo "no, missing dependencies" >&6; }
# Print a helpful message on how to acquire the necessary build dependency.
# dot is the help tag: freetype, cups, alsa etc
MISSING_DEPENDENCY=dot
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
cygwin_help $MISSING_DEPENDENCY
elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then
msys_help $MISSING_DEPENDENCY
else
PKGHANDLER_COMMAND=
case $PKGHANDLER in
apt-get)
apt_help $MISSING_DEPENDENCY ;;
yum)
yum_help $MISSING_DEPENDENCY ;;
brew)
brew_help $MISSING_DEPENDENCY ;;
port)
port_help $MISSING_DEPENDENCY ;;
pkgutil)
pkgutil_help $MISSING_DEPENDENCY ;;
pkgadd)
pkgadd_help $MISSING_DEPENDENCY ;;
esac
if test "x$PKGHANDLER_COMMAND" != x; then
HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'."
fi
fi
as_fn_error $? "Cannot enable full docs with missing dependencies. See above. $HELP_MSG" "$LINENO" 5
else
ENABLE_FULL_DOCS=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, forced" >&5
$as_echo "yes, forced" >&6; }
fi
elif test "x$enable_full_docs" = xno; then
ENABLE_FULL_DOCS=false
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, forced" >&5
$as_echo "no, forced" >&6; }
elif test "x$enable_full_docs" = x; then
# Check for prerequisites
if test "x$FULL_DOCS_DEP_MISSING" = xtrue; then
ENABLE_FULL_DOCS=false
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no, missing dependencies" >&5
$as_echo "no, missing dependencies" >&6; }
else
ENABLE_FULL_DOCS=true
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, dependencies present" >&5
$as_echo "yes, dependencies present" >&6; }
fi
else
as_fn_error $? "--enable-full-docs can only take yes or no" "$LINENO" 5
fi
# Choose cacerts source file # Choose cacerts source file
# Check whether --with-cacerts-file was given. # Check whether --with-cacerts-file was given.

View File

@ -154,6 +154,55 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS],
AC_SUBST(ENABLE_HEADLESS_ONLY) AC_SUBST(ENABLE_HEADLESS_ONLY)
# Should we build the complete docs, or just a lightweight version?
AC_ARG_ENABLE([full-docs], [AS_HELP_STRING([--enable-full-docs],
[build complete documentation @<:@enabled if all tools found@:>@])])
# Verify dependencies
AC_MSG_CHECKING([for graphviz dot])
if test "x$DOT" != "x"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no, cannot generate full docs])
FULL_DOCS_DEP_MISSING=true
fi
AC_MSG_CHECKING([for pandoc])
if test "x$PANDOC" != "x"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no, cannot generate full docs])
FULL_DOCS_DEP_MISSING=true
fi
AC_MSG_CHECKING([full docs])
if test "x$enable_full_docs" = xyes; then
if test "x$FULL_DOCS_DEP_MISSING" = "xtrue"; then
AC_MSG_RESULT([no, missing dependencies])
HELP_MSG_MISSING_DEPENDENCY([dot])
AC_MSG_ERROR([Cannot enable full docs with missing dependencies. See above. $HELP_MSG])
else
ENABLE_FULL_DOCS=true
AC_MSG_RESULT([yes, forced])
fi
elif test "x$enable_full_docs" = xno; then
ENABLE_FULL_DOCS=false
AC_MSG_RESULT([no, forced])
elif test "x$enable_full_docs" = x; then
# Check for prerequisites
if test "x$FULL_DOCS_DEP_MISSING" = xtrue; then
ENABLE_FULL_DOCS=false
AC_MSG_RESULT([no, missing dependencies])
else
ENABLE_FULL_DOCS=true
AC_MSG_RESULT([yes, dependencies present])
fi
else
AC_MSG_ERROR([--enable-full-docs can only take yes or no])
fi
AC_SUBST(ENABLE_FULL_DOCS)
# Choose cacerts source file # Choose cacerts source file
AC_ARG_WITH(cacerts-file, [AS_HELP_STRING([--with-cacerts-file], AC_ARG_WITH(cacerts-file, [AS_HELP_STRING([--with-cacerts-file],
[specify alternative cacerts file])]) [specify alternative cacerts file])])

View File

@ -433,37 +433,22 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
]) ])
AC_DEFUN([PLATFORM_SET_RELEASE_FILE_OS_VALUES], AC_DEFUN([PLATFORM_SET_MODULE_TARGET_OS_VALUES],
[ [
if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then if test "x$OPENJDK_TARGET_OS" = xmacosx; then
REQUIRED_OS_NAME=SunOS OPENJDK_MODULE_TARGET_OS_NAME="macos"
REQUIRED_OS_VERSION=5.10 else
OPENJDK_MODULE_TARGET_OS_NAME="$OPENJDK_TARGET_OS"
fi fi
if test "x$OPENJDK_TARGET_OS" = "xlinux"; then
REQUIRED_OS_NAME=Linux
REQUIRED_OS_VERSION=2.6
fi
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
REQUIRED_OS_NAME=Windows
if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then
REQUIRED_OS_VERSION=5.2
else
REQUIRED_OS_VERSION=5.1
fi
fi
if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
REQUIRED_OS_NAME="Mac OS X"
REQUIRED_OS_VERSION=11.2
fi
if test "x$OPENJDK_TARGET_OS" = "xaix"; then
REQUIRED_OS_NAME=AIX
REQUIRED_OS_VERSION=7.1
fi
REQUIRED_OS_ARCH=${OPENJDK_TARGET_CPU}
AC_SUBST(REQUIRED_OS_NAME) if test "x$OPENJDK_TARGET_CPU" = xx86_64; then
AC_SUBST(REQUIRED_OS_ARCH) OPENJDK_MODULE_TARGET_OS_ARCH="amd64"
AC_SUBST(REQUIRED_OS_VERSION) else
OPENJDK_MODULE_TARGET_OS_ARCH="$OPENJDK_TARGET_CPU"
fi
AC_SUBST(OPENJDK_MODULE_TARGET_OS_NAME)
AC_SUBST(OPENJDK_MODULE_TARGET_OS_ARCH)
]) ])
#%%% Build and target systems %%% #%%% Build and target systems %%%
@ -480,7 +465,7 @@ AC_DEFUN_ONCE([PLATFORM_SETUP_OPENJDK_BUILD_AND_TARGET],
PLATFORM_EXTRACT_TARGET_AND_BUILD PLATFORM_EXTRACT_TARGET_AND_BUILD
PLATFORM_SETUP_TARGET_CPU_BITS PLATFORM_SETUP_TARGET_CPU_BITS
PLATFORM_SET_RELEASE_FILE_OS_VALUES PLATFORM_SET_MODULE_TARGET_OS_VALUES
PLATFORM_SETUP_LEGACY_VARS PLATFORM_SETUP_LEGACY_VARS
]) ])

View File

@ -101,10 +101,9 @@ OPENJDK_BUILD_CPU_ARCH:=@OPENJDK_BUILD_CPU_ARCH@
OPENJDK_BUILD_CPU_BITS:=@OPENJDK_BUILD_CPU_BITS@ OPENJDK_BUILD_CPU_BITS:=@OPENJDK_BUILD_CPU_BITS@
OPENJDK_BUILD_CPU_ENDIAN:=@OPENJDK_BUILD_CPU_ENDIAN@ OPENJDK_BUILD_CPU_ENDIAN:=@OPENJDK_BUILD_CPU_ENDIAN@
# OS values for use in release file. # OS values for use in ModuleTarget class file attribute.
REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@ OPENJDK_MODULE_TARGET_OS_NAME:=@OPENJDK_MODULE_TARGET_OS_NAME@
REQUIRED_OS_ARCH:=@REQUIRED_OS_ARCH@ OPENJDK_MODULE_TARGET_OS_ARCH:=@OPENJDK_MODULE_TARGET_OS_ARCH@
REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@
LIBM:=@LIBM@ LIBM:=@LIBM@
LIBDL:=@LIBDL@ LIBDL:=@LIBDL@
@ -245,6 +244,8 @@ USE_PRECOMPILED_HEADER := @USE_PRECOMPILED_HEADER@
# Only build headless support or not # Only build headless support or not
ENABLE_HEADLESS_ONLY := @ENABLE_HEADLESS_ONLY@ ENABLE_HEADLESS_ONLY := @ENABLE_HEADLESS_ONLY@
ENABLE_FULL_DOCS := @ENABLE_FULL_DOCS@
# JDK_OUTPUTDIR specifies where a working jvm is built. # JDK_OUTPUTDIR specifies where a working jvm is built.
# You can run $(JDK_OUTPUTDIR)/bin/java # You can run $(JDK_OUTPUTDIR)/bin/java
# Though the layout of the contents of $(JDK_OUTPUTDIR) is not # Though the layout of the contents of $(JDK_OUTPUTDIR) is not
@ -679,6 +680,7 @@ OTOOL:=@OTOOL@
READELF:=@READELF@ READELF:=@READELF@
EXPR:=@EXPR@ EXPR:=@EXPR@
FILE:=@FILE@ FILE:=@FILE@
DOT:=@DOT@
HG:=@HG@ HG:=@HG@
OBJCOPY:=@OBJCOPY@ OBJCOPY:=@OBJCOPY@
SETFILE:=@SETFILE@ SETFILE:=@SETFILE@
@ -842,11 +844,6 @@ JRE_COMPACT3_BUNDLE_NAME := \
jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact3_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz jre-$(VERSION_SHORT)+$(VERSION_BUILD)-compact3_$(OPENJDK_TARGET_BUNDLE_PLATFORM)_bin$(DEBUG_PART).tar.gz
JDK_SYMBOLS_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz JDK_SYMBOLS_BUNDLE_NAME := jdk-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
JRE_SYMBOLS_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz JRE_SYMBOLS_BUNDLE_NAME := jre-$(BASE_NAME)_bin$(DEBUG_PART)-symbols.tar.gz
ifeq ($(OPENJDK_TARGET_OS), windows)
DEMOS_BUNDLE_NAME := jdk-$(BASE_NAME)_demo$(DEBUG_PART).zip
else
DEMOS_BUNDLE_NAME := jdk-$(BASE_NAME)_demo$(DEBUG_PART).tar.gz
endif
TEST_BUNDLE_NAME := jdk-$(BASE_NAME)_bin-tests$(DEBUG_PART).tar.gz TEST_BUNDLE_NAME := jdk-$(BASE_NAME)_bin-tests$(DEBUG_PART).tar.gz
DOCS_BUNDLE_NAME := jdk-$(BASE_NAME)_doc-api-spec$(DEBUG_PART).tar.gz DOCS_BUNDLE_NAME := jdk-$(BASE_NAME)_doc-api-spec$(DEBUG_PART).tar.gz
@ -854,7 +851,6 @@ JDK_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JDK_BUNDLE_NAME)
JRE_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JRE_BUNDLE_NAME) JRE_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JRE_BUNDLE_NAME)
JDK_SYMBOLS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JDK_SYMBOLS_BUNDLE_NAME) JDK_SYMBOLS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JDK_SYMBOLS_BUNDLE_NAME)
JRE_SYMBOLS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JRE_SYMBOLS_BUNDLE_NAME) JRE_SYMBOLS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(JRE_SYMBOLS_BUNDLE_NAME)
DEMOS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(DEMOS_BUNDLE_NAME)
TEST_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(TEST_BUNDLE_NAME) TEST_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(TEST_BUNDLE_NAME)
DOCS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(DOCS_BUNDLE_NAME) DOCS_BUNDLE := $(BUNDLES_OUTPUTDIR)/$(DOCS_BUNDLE_NAME)

View File

@ -38,25 +38,9 @@ fi
if [ "$OPENJDK_TARGET_OS" = "linux" ]; then if [ "$OPENJDK_TARGET_OS" = "linux" ]; then
STRIP_BEFORE_COMPARE=" STRIP_BEFORE_COMPARE="
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
" "
ACCEPTED_BIN_DIFF=" ACCEPTED_BIN_DIFF="
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
./lib/client/libjsig.so ./lib/client/libjsig.so
./lib/client/libjvm.so ./lib/client/libjvm.so
./lib/libattach.so ./lib/libattach.so
@ -151,15 +135,6 @@ fi
if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
STRIP_BEFORE_COMPARE=" STRIP_BEFORE_COMPARE="
./demo/jni/Poller/lib/libPoller.so
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
" "
SORT_SYMBOLS=" SORT_SYMBOLS="
@ -174,15 +149,6 @@ if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ];
SKIP_BIN_DIFF="true" SKIP_BIN_DIFF="true"
ACCEPTED_SMALL_SIZE_DIFF=" ACCEPTED_SMALL_SIZE_DIFF="
./demo/jni/Poller/lib/libPoller.so
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
./lib/jli/libjli.so ./lib/jli/libjli.so
./lib/jspawnhelper ./lib/jspawnhelper
./lib/libJdbcOdbc.so ./lib/libJdbcOdbc.so
@ -279,19 +245,9 @@ fi
if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then
STRIP_BEFORE_COMPARE=" STRIP_BEFORE_COMPARE="
./demo/jni/Poller/lib/libPoller.so
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
" "
SORT_SYMBOLS=" SORT_SYMBOLS="
./demo/jvmti/waiters/lib/libwaiters.so
./lib/libjsig.so ./lib/libjsig.so
./lib/libfontmanager.so ./lib/libfontmanager.so
./lib/libjimage.so ./lib/libjimage.so
@ -305,15 +261,6 @@ if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]
SKIP_BIN_DIFF="true" SKIP_BIN_DIFF="true"
ACCEPTED_SMALL_SIZE_DIFF=" ACCEPTED_SMALL_SIZE_DIFF="
./demo/jni/Poller/lib/libPoller.so
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so
./demo/jvmti/gctest/lib/libgctest.so
./demo/jvmti/heapTracker/lib/libheapTracker.so
./demo/jvmti/heapViewer/lib/libheapViewer.so
./demo/jvmti/minst/lib/libminst.so
./demo/jvmti/mtrace/lib/libmtrace.so
./demo/jvmti/versionCheck/lib/libversionCheck.so
./demo/jvmti/waiters/lib/libwaiters.so
./lib/client/libjvm.so ./lib/client/libjvm.so
./lib/jli/libjli.so ./lib/jli/libjli.so
./lib/jspawnhelper ./lib/jspawnhelper
@ -438,9 +385,6 @@ if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
# Probably should add all libs here # Probably should add all libs here
ACCEPTED_SMALL_SIZE_DIFF=" ACCEPTED_SMALL_SIZE_DIFF="
./demo/jvmti/gctest/lib/gctest.dll
./demo/jvmti/heapTracker/lib/heapTracker.dll
./demo/jvmti/minst/lib/minst.dll
./bin/attach.dll ./bin/attach.dll
./bin/jsoundds.dll ./bin/jsoundds.dll
./bin/client/jvm.dll ./bin/client/jvm.dll
@ -579,14 +523,6 @@ if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
./bin/wsgen ./bin/wsgen
./bin/wsimport ./bin/wsimport
./bin/xjc ./bin/xjc
./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.dylib
./demo/jvmti/gctest/lib/libgctest.dylib
./demo/jvmti/heapTracker/lib/libheapTracker.dylib
./demo/jvmti/heapViewer/lib/libheapViewer.dylib
./demo/jvmti/minst/lib/libminst.dylib
./demo/jvmti/mtrace/lib/libmtrace.dylib
./demo/jvmti/versionCheck/lib/libversionCheck.dylib
./demo/jvmti/waiters/lib/libwaiters.dylib
./Contents/Home/bin/_javaws ./Contents/Home/bin/_javaws
./Contents/Home/bin/javaws ./Contents/Home/bin/javaws
./Contents/Home/bin/idlj ./Contents/Home/bin/idlj

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -422,8 +422,9 @@ var getJibProfilesProfiles = function (input, common, data) {
"linux-x64": { "linux-x64": {
target_os: "linux", target_os: "linux",
target_cpu: "x64", target_cpu: "x64",
dependencies: ["devkit"], dependencies: ["devkit", "graphviz", "pandoc"],
configure_args: concat(common.configure_args_64bit, "--with-zlib=system"), configure_args: concat(common.configure_args_64bit,
"--enable-full-docs", "--with-zlib=system"),
default_make_targets: ["docs-bundles"], default_make_targets: ["docs-bundles"],
}, },
@ -964,7 +965,23 @@ var getJibProfilesDependencies = function (input, common) {
ext: "tar.gz", ext: "tar.gz",
revision: "2.7.1-v120+1.0", revision: "2.7.1-v120+1.0",
module: "freetype-" + input.target_platform module: "freetype-" + input.target_platform
} },
graphviz: {
organization: common.organization,
ext: "tar.gz",
revision: "2.38.0-1+1.1",
module: "graphviz-" + input.target_platform,
configure_args: "DOT=" + input.get("graphviz", "install_path") + "/dot"
},
pandoc: {
organization: common.organization,
ext: "tar.gz",
revision: "1.17.2+1.0",
module: "pandoc-" + input.target_platform,
configure_args: "PANDOC=" + input.get("pandoc", "install_path") + "/pandoc/pandoc"
},
}; };
return dependencies; return dependencies;

View File

@ -982,52 +982,6 @@
</df> </df>
</df> </df>
<df name="src"> <df name="src">
<df name="demo">
<df name="share">
<df name="jvmti">
<df name="agent_util">
<in>agent_util.c</in>
</df>
<df name="compiledMethodLoad">
<in>compiledMethodLoad.c</in>
</df>
<df name="gctest">
<in>gctest.c</in>
</df>
<df name="heapTracker">
<in>heapTracker.c</in>
</df>
<df name="heapViewer">
<in>heapViewer.c</in>
</df>
<df name="java_crw_demo">
<in>java_crw_demo.c</in>
</df>
<df name="minst">
<in>minst.c</in>
</df>
<df name="mtrace">
<in>mtrace.c</in>
</df>
<df name="versionCheck">
<in>versionCheck.c</in>
</df>
<df name="waiters">
<in>Agent.cpp</in>
<in>Monitor.cpp</in>
<in>Thread.cpp</in>
<in>waiters.cpp</in>
</df>
</df>
</df>
<df name="solaris">
<df name="jni">
<df name="Poller">
<in>Poller.c</in>
</df>
</df>
</df>
</df>
<df name="java.base"> <df name="java.base">
<df name="linux"> <df name="linux">
<df name="native"> <df name="native">
@ -21533,89 +21487,6 @@
</incDir> </incDir>
</ccTool> </ccTool>
</item> </item>
<item path="../../jdk/src/demo/share/jvmti/agent_util/agent_util.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/compiledMethodLoad/compiledMethodLoad.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/gctest/gctest.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapTracker/heapTracker.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapViewer/heapViewer.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/java_crw_demo/java_crw_demo.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/minst/minst.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/mtrace/mtrace.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/versionCheck/versionCheck.c"
ex="false"
tool="0"
flavor2="3">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Agent.cpp"
ex="false"
tool="1"
flavor2="4">
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Monitor.cpp"
ex="false"
tool="1"
flavor2="4">
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Thread.cpp"
ex="false"
tool="1"
flavor2="4">
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/waiters.cpp"
ex="false"
tool="1"
flavor2="4">
</item>
<item path="../../jdk/src/java.base/macosx/native/libjava/HostLocaleProviderAdapter_md.c" <item path="../../jdk/src/java.base/macosx/native/libjava/HostLocaleProviderAdapter_md.c"
ex="false" ex="false"
tool="0" tool="0"
@ -30509,113 +30380,6 @@
</incDir> </incDir>
</cTool> </cTool>
</folder> </folder>
<folder path="0/jdk/src/demo">
<cTool>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</cTool>
<ccTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/waiters</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</ccTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/agent_util">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/compiledMethodLoad">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/compiledMethodLoad</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/gctest">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/gctest</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapTracker">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapViewer">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/heapViewer</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/java_crw_demo">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/minst">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/minst</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/mtrace">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/mtrace</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/versionCheck">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/demo/share/jvmti/versionCheck</pElem>
<pElem>../../jdk/src/java.base/macosx/native/include</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/java.base"> <folder path="0/jdk/src/java.base">
<cTool> <cTool>
<incDir> <incDir>
@ -36906,106 +36670,6 @@
<cTool flags="3"> <cTool flags="3">
</cTool> </cTool>
</item> </item>
<item path="../../jdk/src/demo/share/jvmti/agent_util/agent_util.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/compiledMethodLoad/compiledMethodLoad.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/gctest/gctest.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapTracker/heapTracker.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapViewer/heapViewer.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/java_crw_demo/java_crw_demo.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/minst/minst.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/mtrace/mtrace.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/versionCheck/versionCheck.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="5">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Agent.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="2">
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Monitor.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="2">
<preprocessorList>
<Elem>THIS_FILE="Monitor.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Thread.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="2">
<preprocessorList>
<Elem>THIS_FILE="Thread.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/waiters.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="2">
<preprocessorList>
<Elem>THIS_FILE="waiters.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c" <item path="../../jdk/src/java.base/linux/native/libjava/ProcessHandleImpl_linux.c"
ex="false" ex="false"
tool="0" tool="0"
@ -46197,183 +45861,6 @@
</preprocessorList> </preprocessorList>
</cTool> </cTool>
</folder> </folder>
<folder path="0/jdk/src/demo">
<cTool>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</cTool>
<ccTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/waiters</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</ccTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/agent_util">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/compiledMethodLoad">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/compiledMethodLoad</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="compiledMethodLoad.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/gctest">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/gctest</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="gctest.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapTracker">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="heapTracker.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapViewer">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapViewer</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="heapViewer.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/java_crw_demo">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="java_crw_demo.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/minst">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/minst</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="minst.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/mtrace">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/mtrace</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="mtrace.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/versionCheck">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/versionCheck</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/linux/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="versionCheck.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/java.base"> <folder path="0/jdk/src/java.base">
<cTool> <cTool>
<preprocessorList> <preprocessorList>
@ -55235,113 +54722,6 @@
<ccTool flags="0"> <ccTool flags="0">
</ccTool> </ccTool>
</item> </item>
<item path="../../jdk/src/demo/share/jvmti/agent_util/agent_util.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/compiledMethodLoad/compiledMethodLoad.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/gctest/gctest.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapTracker/heapTracker.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/heapViewer/heapViewer.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/java_crw_demo/java_crw_demo.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/minst/minst.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/mtrace/mtrace.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/versionCheck/versionCheck.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="3">
</cTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Agent.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="0">
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Monitor.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="0">
<preprocessorList>
<Elem>THIS_FILE="Monitor.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/Thread.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="0">
<preprocessorList>
<Elem>THIS_FILE="Thread.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/demo/share/jvmti/waiters/waiters.cpp"
ex="false"
tool="1"
flavor2="0">
<ccTool flags="0">
<preprocessorList>
<Elem>THIS_FILE="waiters.cpp"</Elem>
</preprocessorList>
</ccTool>
</item>
<item path="../../jdk/src/demo/solaris/jni/Poller/Poller.c"
ex="false"
tool="0"
flavor2="0">
<cTool flags="2">
</cTool>
</item>
<item path="../../jdk/src/java.base/share/native/launcher/main.c" <item path="../../jdk/src/java.base/share/native/launcher/main.c"
ex="false" ex="false"
tool="0" tool="0"
@ -64674,8 +64054,6 @@
</cTool> </cTool>
<ccTool> <ccTool>
<incDir> <incDir>
<pElem>../../jdk/src/demo/share/jvmti/waiters</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem> <pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem> <pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem> <pElem>../../jdk/src/java.base/unix/native/include</pElem>
@ -64699,189 +64077,6 @@
</preprocessorList> </preprocessorList>
</ccTool> </ccTool>
</folder> </folder>
<folder path="0/jdk/src/demo">
<cTool>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</cTool>
<ccTool>
<preprocessorList>
<Elem>DEBUG</Elem>
</preprocessorList>
</ccTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/agent_util">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/compiledMethodLoad">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/compiledMethodLoad</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="compiledMethodLoad.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/gctest">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/gctest</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="gctest.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapTracker">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="heapTracker.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/heapViewer">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapViewer</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="heapViewer.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/java_crw_demo">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/heapTracker</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="java_crw_demo.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/minst">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/minst</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="minst.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/mtrace">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/mtrace</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/demo/share/jvmti/java_crw_demo</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="mtrace.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/share/jvmti/versionCheck">
<cTool>
<incDir>
<pElem>../../jdk/src/demo/share/jvmti/versionCheck</pElem>
<pElem>../../jdk/src/demo/share/jvmti/agent_util</pElem>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="versionCheck.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/demo/solaris">
<cTool>
<incDir>
<pElem>../../jdk/src/java.base/share/native/include</pElem>
<pElem>../../jdk/src/java.base/solaris/native/include</pElem>
<pElem>../../jdk/src/java.base/unix/native/include</pElem>
<pElem>../../jdk/src/java.base/share/native/libjava</pElem>
<pElem>../../jdk/src/java.base/unix/native/libjava</pElem>
<pElem>../../build/support/demos/classes/jni/Poller</pElem>
<pElem>../../jdk/make</pElem>
</incDir>
<preprocessorList>
<Elem>THIS_FILE="Poller.c"</Elem>
</preprocessorList>
</cTool>
</folder>
<folder path="0/jdk/src/java.base"> <folder path="0/jdk/src/java.base">
<cTool> <cTool>
<incDir> <incDir>

View File

@ -560,6 +560,7 @@ fc7e94cb748507366b839e859f865f724467446a jdk-10+0
a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154 a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154
f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155 f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155
43139c588ea48b6504e52b6c3dec530b17b1fdb4 jdk-9+156 43139c588ea48b6504e52b6c3dec530b17b1fdb4 jdk-9+156
1ea217626ba0995dd03127f8322ba3687926a085 jdk-10+1
b2d0a906afd73dcf27f572217eb1be0f196ec16c jdk-9+157 b2d0a906afd73dcf27f572217eb1be0f196ec16c jdk-9+157
4e78f30935229f13ce7c43089621cf7169f5abac jdk-9+158 4e78f30935229f13ce7c43089621cf7169f5abac jdk-9+158
9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159 9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159
@ -570,3 +571,10 @@ b01c519b715ef6f785d0631adee0a6537cf6c12e jdk-9+162
0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164 0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164
c92c6416ca03b1464d5ed99cf6201e52b5ba0a70 jdk-9+165 c92c6416ca03b1464d5ed99cf6201e52b5ba0a70 jdk-9+165
560d7aa083a24b6a56443feb8de0f40435d33aa9 jdk-9+166 560d7aa083a24b6a56443feb8de0f40435d33aa9 jdk-9+166
48809c513ed5ebb4d4dbf2f454afcce2780db6db jdk-10+2
6c3b6b3438c4a63e619f00bd5732d1260ffd5600 jdk-10+3
8295ca08f5cb09c090eb048bbdd338d7e270c8bf jdk-10+4
7b5ca2ff1f78873ca3ee99b6589d3cb4dde2e454 jdk-10+5
762465099d938fd96cd1efda193bc1fa23d070d3 jdk-10+6
1ca7ed1b17b5776930d641d1379834f3140a74e4 jdk-9+167
fbb9c802649585d19f6d7e81b4a519d44806225a jdk-9+168

View File

@ -3,7 +3,7 @@
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> <pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
<path>/.mx.jvmci</path> <path>/mx.jvmci</path>
</pydev_pathproperty> </pydev_pathproperty>
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
<path>/mx</path> <path>/mx</path>

View File

@ -1221,12 +1221,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
// info for exceptions // info for exceptions
CodeEmitInfo* info_for_exception = state_for(x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
CodeStub* stub; CodeStub* stub;
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception,
Deoptimization::Reason_class_check,
Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
} }

View File

@ -34,10 +34,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
#define SUPPORTS_NATIVE_CX8 #define SUPPORTS_NATIVE_CX8
// The maximum B/BL offset range on AArch64 is 128MB.
#undef CODE_CACHE_DEFAULT_LIMIT
#define CODE_CACHE_DEFAULT_LIMIT (128*M)
// According to the ARMv8 ARM, "Concurrent modification and execution // According to the ARMv8 ARM, "Concurrent modification and execution
// of instructions can lead to the resulting instruction performing // of instructions can lead to the resulting instruction performing
// any behavior that can be achieved by executing any sequence of // any behavior that can be achieved by executing any sequence of

View File

@ -1453,10 +1453,11 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
ciKlass* k = op->klass(); ciKlass* k = op->klass();
assert_different_registers(res, k_RInfo, klass_RInfo, Rtemp); assert_different_registers(res, k_RInfo, klass_RInfo, Rtemp);
if (stub->is_simple_exception_stub()) {
// TODO: ARM - Late binding is used to prevent confusion of register allocator // TODO: ARM - Late binding is used to prevent confusion of register allocator
assert(stub->is_exception_throw_stub(), "must be"); assert(stub->is_exception_throw_stub(), "must be");
((SimpleExceptionStub*)stub)->set_obj(op->result_opr()); ((SimpleExceptionStub*)stub)->set_obj(op->result_opr());
}
ciMethodData* md; ciMethodData* md;
ciProfileData* data; ciProfileData* data;
int mdo_offset_bias = 0; int mdo_offset_bias = 0;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -1412,12 +1412,20 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
CodeEmitInfo* info_for_exception = state_for(x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
CodeStub* stub; CodeStub* stub;
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id,
LIR_OprFact::illegalOpr, info_for_exception); LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception,
Deoptimization::Reason_class_check,
Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id,
LIR_OprFact::illegalOpr, info_for_exception); LIR_OprFact::illegalOpr, info_for_exception);

View File

@ -1131,12 +1131,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
LIR_Opr out_reg = rlock_result(x); LIR_Opr out_reg = rlock_result(x);
CodeStub* stub; CodeStub* stub;
CodeEmitInfo* info_for_exception = state_for(x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id,
LIR_OprFact::illegalOpr, info_for_exception); LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception,
Deoptimization::Reason_class_check,
Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
} }

View File

@ -993,12 +993,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
// info for exceptions // info for exceptions
CodeEmitInfo* info_for_exception = state_for (x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
CodeStub* stub; CodeStub* stub;
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception,
Deoptimization::Reason_class_check,
Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
} }

View File

@ -1196,11 +1196,18 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
LIR_Opr out_reg = rlock_result(x); LIR_Opr out_reg = rlock_result(x);
CodeStub* stub; CodeStub* stub;
CodeEmitInfo* info_for_exception = state_for(x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception,
Deoptimization::Reason_class_check,
Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
} }

View File

@ -1429,12 +1429,17 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
obj.load_item(); obj.load_item();
// info for exceptions // info for exceptions
CodeEmitInfo* info_for_exception = state_for(x); CodeEmitInfo* info_for_exception =
(x->needs_exception_state() ? state_for(x) :
state_for(x, x->state_before(), true /*ignore_xhandler*/));
CodeStub* stub; CodeStub* stub;
if (x->is_incompatible_class_change_check()) { if (x->is_incompatible_class_change_check()) {
assert(patching_info == NULL, "can't patch this"); assert(patching_info == NULL, "can't patch this");
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
} else if (x->is_invokespecial_receiver_check()) {
assert(patching_info == NULL, "can't patch this");
stub = new DeoptimizeStub(info_for_exception, Deoptimization::Reason_class_check, Deoptimization::Action_none);
} else { } else {
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception); stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -763,12 +763,11 @@ void VM_Version::get_processor_features() {
FLAG_SET_DEFAULT(UseCRC32Intrinsics, false); FLAG_SET_DEFAULT(UseCRC32Intrinsics, false);
} }
if (supports_sse4_2()) { if (supports_sse4_2() && supports_clmul()) {
if (FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) { if (FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
UseCRC32CIntrinsics = true; UseCRC32CIntrinsics = true;
} }
} } else if (UseCRC32CIntrinsics) {
else if (UseCRC32CIntrinsics) {
if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) { if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
warning("CRC32C intrinsics are not available on this CPU"); warning("CRC32C intrinsics are not available on this CPU");
} }

View File

@ -0,0 +1,94 @@
/*
* Copyright (c) 2017, 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.
*
*/
package sun.jvm.hotspot.memory;
public class AltHashing {
public static long murmur3_32(long seed, byte[] data) {
long h1 = seed;
int len = data.length;
int count = len;
int offset = 0;
// body
while (count >= 4) {
long k1 = (data[offset] & 0x0FF)
| (data[offset + 1] & 0x0FF) << 8
| (data[offset + 2] & 0x0FF) << 16
| data[offset + 3] << 24;
count -= 4;
offset += 4;
k1 *= 0xcc9e2d51;
k1 = Integer.rotateLeft((int)k1, 15);
k1 *= 0x1b873593;
k1 &= 0xFFFFFFFFL;
h1 ^= k1;
h1 = Integer.rotateLeft((int)h1, 13);
h1 = h1 * 5 + 0xe6546b64;
h1 &= 0xFFFFFFFFL;
}
//tail
if (count > 0) {
long k1 = 0;
switch (count) {
case 3:
k1 ^= (data[offset + 2] & 0xff) << 16;
// fall through
case 2:
k1 ^= (data[offset + 1] & 0xff) << 8;
// fall through
case 1:
k1 ^= (data[offset] & 0xff);
// fall through
default:
k1 *= 0xcc9e2d51;
k1 = Integer.rotateLeft((int)k1, 15);
k1 *= 0x1b873593;
k1 &= 0xFFFFFFFFL;
h1 ^= k1;
h1 &= 0xFFFFFFFFL;
}
}
// finalization
h1 ^= len;
// finalization mix force all bits of a hash block to avalanche
h1 ^= h1 >> 16;
h1 *= 0x85ebca6b;
h1 &= 0xFFFFFFFFL;
h1 ^= h1 >> 13;
h1 *= 0xc2b2ae35;
h1 &= 0xFFFFFFFFL;
h1 ^= h1 >> 16;
return h1 & 0xFFFFFFFFL;
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -45,11 +45,14 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
Type type = db.lookupType("SymbolTable"); Type type = db.lookupType("SymbolTable");
theTableField = type.getAddressField("_the_table"); theTableField = type.getAddressField("_the_table");
sharedTableField = type.getAddressField("_shared_table"); sharedTableField = type.getAddressField("_shared_table");
type = db.lookupType("RehashableSymbolHashtable");
seedField = type.getCIntegerField("_seed");
} }
// Fields // Fields
private static AddressField theTableField; private static AddressField theTableField;
private static AddressField sharedTableField; private static AddressField sharedTableField;
private static CIntegerField seedField;
private CompactHashTable sharedTable; private CompactHashTable sharedTable;
@ -62,6 +65,17 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
return table; return table;
} }
public static long getSeed() {
return (long) seedField.getValue();
}
public static boolean useAlternateHashcode() {
if (getSeed() != 0) {
return true;
}
return false;
}
public SymbolTable(Address addr) { public SymbolTable(Address addr) {
super(addr); super(addr);
} }
@ -86,11 +100,17 @@ public class SymbolTable extends sun.jvm.hotspot.utilities.Hashtable {
public Symbol probe(byte[] name) { public Symbol probe(byte[] name) {
long hashValue = hashSymbol(name); long hashValue = hashSymbol(name);
// shared table does not use alternate hashing algorithm,
// it always uses the same original hash code.
Symbol s = sharedTable.probe(name, hashValue); Symbol s = sharedTable.probe(name, hashValue);
if (s != null) { if (s != null) {
return s; return s;
} }
if (useAlternateHashcode()) {
hashValue = AltHashing.murmur3_32(getSeed(), name);
}
for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) { for (HashtableEntry e = (HashtableEntry) bucket(hashToIndex(hashValue)); e != null; e = (HashtableEntry) e.next()) {
if (e.hash() == hashValue) { if (e.hash() == hashValue) {
Symbol sym = Symbol.create(e.literalValue()); Symbol sym = Symbol.create(e.literalValue());

View File

@ -24,7 +24,6 @@ package jdk.vm.ci.hotspot;
import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilationEvent; import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilationEvent;
import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilerFailureEvent; import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilerFailureEvent;
import jdk.vm.ci.services.JVMCIPermission;
/** /**
* Service-provider class for logging compiler related events. * Service-provider class for logging compiler related events.

View File

@ -28,9 +28,9 @@ import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.JVMCICompilerFactory; import jdk.vm.ci.runtime.JVMCICompilerFactory;
import jdk.vm.ci.runtime.JVMCIRuntime; import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.JVMCIPermission; import jdk.vm.ci.services.JVMCIPermission;
import jdk.vm.ci.services.Services; import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.internal.ReflectionAccessJDK;
final class HotSpotJVMCICompilerConfig { final class HotSpotJVMCICompilerConfig {
@ -47,7 +47,7 @@ final class HotSpotJVMCICompilerConfig {
@Override @Override
public String getCompilerName() { public String getCompilerName() {
return "<none>"; return "null";
} }
@Override @Override
@ -73,19 +73,23 @@ final class HotSpotJVMCICompilerConfig {
JVMCICompilerFactory factory = null; JVMCICompilerFactory factory = null;
String compilerName = Option.Compiler.getString(); String compilerName = Option.Compiler.getString();
if (compilerName != null) { if (compilerName != null) {
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) { if (compilerName.isEmpty() || compilerName.equals("null")) {
if (f.getCompilerName().equals(compilerName)) { factory = new DummyCompilerFactory();
factory = f; } else {
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
if (f.getCompilerName().equals(compilerName)) {
factory = f;
}
}
if (factory == null) {
throw new JVMCIError("JVMCI compiler '%s' not found", compilerName);
} }
}
if (factory == null) {
throw new JVMCIError("JVMCI compiler '%s' not found", compilerName);
} }
} else { } else {
// Auto select a single available compiler // Auto select a single available compiler
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) { for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
if (factory == null) { if (factory == null) {
Services.exportJVMCITo(f.getClass()); ReflectionAccessJDK.openJVMCITo(f.getClass());
factory = f; factory = f;
} else { } else {
// Multiple factories seen - cancel auto selection // Multiple factories seen - cancel auto selection

View File

@ -32,6 +32,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.ServiceLoader;
import java.util.TreeMap; import java.util.TreeMap;
import jdk.internal.misc.VM; import jdk.internal.misc.VM;
@ -50,7 +51,6 @@ import jdk.vm.ci.runtime.JVMCIBackend;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.runtime.JVMCICompilerFactory; import jdk.vm.ci.runtime.JVMCICompilerFactory;
import jdk.vm.ci.services.JVMCIServiceLocator; import jdk.vm.ci.services.JVMCIServiceLocator;
import jdk.vm.ci.services.Services;
/** /**
* HotSpot implementation of a JVMCI runtime. * HotSpot implementation of a JVMCI runtime.
@ -88,7 +88,10 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider {
*/ */
public enum Option { public enum Option {
// @formatter:off // @formatter:off
Compiler(String.class, null, "Selects the system compiler."), Compiler(String.class, null, "Selects the system compiler. This must match the getCompilerName() value returned " +
"by a jdk.vm.ci.runtime.JVMCICompilerFactory provider. " +
"An empty string or the value \"null\" selects a compiler " +
"that will raise an exception upon receiving a compilation request."),
// Note: The following one is not used (see InitTimer.ENABLED). It is added here // Note: The following one is not used (see InitTimer.ENABLED). It is added here
// so that -XX:+JVMCIPrintProperties shows the option. // so that -XX:+JVMCIPrintProperties shows the option.
InitTimer(Boolean.class, false, "Specifies if initialization timing is enabled."), InitTimer(Boolean.class, false, "Specifies if initialization timing is enabled."),
@ -208,7 +211,7 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider {
} }
public static HotSpotJVMCIBackendFactory findFactory(String architecture) { public static HotSpotJVMCIBackendFactory findFactory(String architecture) {
for (HotSpotJVMCIBackendFactory factory : Services.load(HotSpotJVMCIBackendFactory.class)) { for (HotSpotJVMCIBackendFactory factory : ServiceLoader.load(HotSpotJVMCIBackendFactory.class, ClassLoader.getSystemClassLoader())) {
if (factory.getArchitecture().equalsIgnoreCase(architecture)) { if (factory.getArchitecture().equalsIgnoreCase(architecture)) {
return factory; return factory;
} }

View File

@ -98,7 +98,7 @@ class HotSpotMemoryAccessProviderImpl implements HotSpotMemoryAccessProvider {
boolean aligned = ((displacement - headerSize) % sizeOfElement) == 0; boolean aligned = ((displacement - headerSize) % sizeOfElement) == 0;
if (displacement < 0 || displacement > (arrayEnd - sizeOfElement) || (kind == JavaKind.Object && !aligned)) { if (displacement < 0 || displacement > (arrayEnd - sizeOfElement) || (kind == JavaKind.Object && !aligned)) {
int index = (int) ((displacement - headerSize) / sizeOfElement); int index = (int) ((displacement - headerSize) / sizeOfElement);
throw new AssertionError("Unsafe array access: reading element of kind " + kind + throw new IllegalArgumentException("Unsafe array access: reading element of kind " + kind +
" at offset " + displacement + " (index ~ " + index + ") in " + " at offset " + displacement + " (index ~ " + index + ") in " +
type.toJavaName() + " object of length " + length); type.toJavaName() + " object of length " + length);
} }

View File

@ -801,8 +801,7 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
} }
if (elementType.getName().startsWith("Ljava/")) { if (elementType.getName().startsWith("Ljava/")) {
// Classes in a java.* package can only be defined by the // Classes in a java.* package can only be defined by the
// boot class loader. This is enforced by ClassLoader.preDefineClass() // boot or platform class loader.
assert mirror().getClassLoader() == null;
return true; return true;
} }
ClassLoader thisCl = mirror().getClassLoader(); ClassLoader thisCl = mirror().getClassLoader();

View File

@ -24,12 +24,15 @@ package jdk.vm.ci.services;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.ServiceLoader;
import jdk.vm.ci.services.internal.ReflectionAccessJDK;
/** /**
* Service-provider class for the runtime to locate providers of JVMCI services where the latter are * Service-provider class for the runtime to locate providers of JVMCI services where the latter are
* not in packages exported by the JVMCI module. As part of instantiating * not in packages exported by the JVMCI module. As part of instantiating a
* {@link JVMCIServiceLocator}, all JVMCI packages will be {@linkplain Services#exportJVMCITo(Class) * {@link JVMCIServiceLocator}, all JVMCI packages will be opened to the module defining the class
* exported} to the module defining the class of the instantiated object. * of the instantiated object.
* *
* While the {@link #getProvider(Class)} method can be used directly, it's usually easier to use * While the {@link #getProvider(Class)} method can be used directly, it's usually easier to use
* {@link #getProviders(Class)}. * {@link #getProviders(Class)}.
@ -49,30 +52,39 @@ public abstract class JVMCIServiceLocator {
} }
/** /**
* Creates a capability for accessing JVMCI. Once successfully instantiated, JVMCI exports all * Creates a capability for accessing JVMCI. Once successfully instantiated, JVMCI opens all its
* its packages to the module defining the type of this object. * packages to the module defining the type of this object.
* *
* @throws SecurityException if a security manager has been installed and it denies * @throws SecurityException if a security manager has been installed and it denies
* {@link JVMCIPermission} * {@link JVMCIPermission}
*/ */
protected JVMCIServiceLocator() { protected JVMCIServiceLocator() {
this(checkPermission()); this(checkPermission());
Services.exportJVMCITo(getClass()); Services.checkJVMCIEnabled();
ReflectionAccessJDK.openJVMCITo(getClass());
} }
/** /**
* Gets the provider of the service defined by {@code service} or {@code null} if this object * Gets the provider of the service defined by {@code service} or {@code null} if this object
* does not have a provider for {@code service}. * does not have a provider for {@code service}.
*/ */
public abstract <S> S getProvider(Class<S> service); protected abstract <S> S getProvider(Class<S> service);
/** /**
* Gets the providers of the service defined by {@code service} by querying the * Gets the providers of the service defined by {@code service} by querying the available
* {@link JVMCIServiceLocator} providers obtained by {@link Services#load(Class)}. * {@link JVMCIServiceLocator} providers.
*
* @throws SecurityException if a security manager is present and it denies
* {@link JVMCIPermission}
*/ */
public static <S> List<S> getProviders(Class<S> service) { public static <S> List<S> getProviders(Class<S> service) {
Services.checkJVMCIEnabled();
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
List<S> providers = new ArrayList<>(); List<S> providers = new ArrayList<>();
for (JVMCIServiceLocator access : Services.load(JVMCIServiceLocator.class)) { for (JVMCIServiceLocator access : ServiceLoader.load(JVMCIServiceLocator.class, ClassLoader.getSystemClassLoader())) {
S provider = access.getProvider(service); S provider = access.getProvider(service);
if (provider != null) { if (provider != null) {
providers.add(provider); providers.add(provider);

View File

@ -22,167 +22,64 @@
*/ */
package jdk.vm.ci.services; package jdk.vm.ci.services;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Formatter; import java.util.Map;
import java.util.Iterator;
import java.util.ServiceConfigurationError;
import java.util.ServiceLoader;
import java.util.Set;
/** /**
* A mechanism for accessing service providers via JVMCI. * Provides utilities needed by JVMCI clients.
*/ */
public final class Services { public final class Services {
// This class must be compilable and executable on JDK 8 since it's used in annotation
// processors while building JDK 9 so use of API added in JDK 9 is made via reflection.
private Services() { private Services() {
} }
private static int getJavaSpecificationVersion() {
String value = System.getProperty("java.specification.version");
if (value.startsWith("1.")) {
value = value.substring(2);
}
return Integer.parseInt(value);
}
/**
* The integer value corresponding to the value of the {@code java.specification.version} system
* property after any leading {@code "1."} has been stripped.
*/
public static final int JAVA_SPECIFICATION_VERSION = getJavaSpecificationVersion();
// Use reflection so that this compiles on Java 8
private static final Method getModule;
private static final Method getPackages;
private static final Method addUses;
private static final Method isExported;
private static final Method addExports;
static {
if (JAVA_SPECIFICATION_VERSION >= 9) {
try {
getModule = Class.class.getMethod("getModule");
Class<?> moduleClass = getModule.getReturnType();
getPackages = moduleClass.getMethod("getPackages");
addUses = moduleClass.getMethod("addUses", Class.class);
isExported = moduleClass.getMethod("isExported", String.class, moduleClass);
addExports = moduleClass.getMethod("addExports", String.class, moduleClass);
} catch (NoSuchMethodException | SecurityException e) {
throw new InternalError(e);
}
} else {
getModule = null;
getPackages = null;
addUses = null;
isExported = null;
addExports = null;
}
}
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
static <T> T invoke(Method method, Object receiver, Object... args) { private static Map<String, String> initSavedProperties() throws InternalError {
try { try {
return (T) method.invoke(receiver, args); Class<?> vmClass = Class.forName("jdk.internal.misc.VM");
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { Method m = vmClass.getMethod("getSavedProperties");
return (Map<String, String>) m.invoke(null);
} catch (Exception e) {
throw new InternalError(e); throw new InternalError(e);
} }
} }
static final Map<String, String> SAVED_PROPERTIES = initSavedProperties();
static final boolean JVMCI_ENABLED = Boolean.parseBoolean(SAVED_PROPERTIES.get("jdk.internal.vm.ci.enabled"));
/** /**
* Performs any required security checks and dynamic reconfiguration to allow the module of a * Checks that JVMCI is enabled in the VM and throws an error if it isn't.
* given class to access the classes in the JVMCI module.
*
* Note: This API uses {@link Class} instead of {@code Module} to provide backwards
* compatibility for JVMCI clients compiled against a JDK release earlier than 9.
*
* @param requestor a class requesting access to the JVMCI module for its module
* @throws SecurityException if a security manager is present and it denies
* {@link JVMCIPermission}
*/ */
public static void exportJVMCITo(Class<?> requestor) { static void checkJVMCIEnabled() {
SecurityManager sm = System.getSecurityManager(); if (!JVMCI_ENABLED) {
if (sm != null) { throw new Error("The EnableJVMCI VM option must be true (i.e., -XX:+EnableJVMCI) to use JVMCI");
sm.checkPermission(new JVMCIPermission());
}
if (JAVA_SPECIFICATION_VERSION >= 9) {
Object jvmci = invoke(getModule, Services.class);
Object requestorModule = invoke(getModule, requestor);
if (jvmci != requestorModule) {
Set<String> packages = invoke(getPackages, jvmci);
for (String pkg : packages) {
// Export all JVMCI packages dynamically instead
// of requiring a long list of --add-exports
// options on the JVM command line.
boolean exported = invoke(isExported, jvmci, pkg, requestorModule);
if (!exported) {
invoke(addExports, jvmci, pkg, requestorModule);
}
}
}
} }
} }
/** /**
* Gets an {@link Iterable} of the JVMCI providers available for a given service. * Gets an unmodifiable copy of the system properties saved when {@link System} is initialized.
*
* @throws SecurityException if a security manager is present and it denies
* {@link JVMCIPermission}
*/ */
public static <S> Iterable<S> load(Class<S> service) { public static Map<String, String> getSavedProperties() {
checkJVMCIEnabled();
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) { if (sm != null) {
sm.checkPermission(new JVMCIPermission()); sm.checkPermission(new JVMCIPermission());
} }
if (JAVA_SPECIFICATION_VERSION >= 9) { return SAVED_PROPERTIES;
Object jvmci = invoke(getModule, Services.class);
invoke(addUses, jvmci, service);
}
// Restrict JVMCI clients to be on the class path or module path
return ServiceLoader.load(service, ClassLoader.getSystemClassLoader());
} }
/** /**
* Gets the JVMCI provider for a given service for which at most one provider must be available. * Causes the JVMCI subsystem to be initialized if it isn't already initialized.
*
* @param service the service whose provider is being requested
* @param required specifies if an {@link InternalError} should be thrown if no provider of
* {@code service} is available
* @throws SecurityException if a security manager is present and it denies
* {@link JVMCIPermission}
*/ */
public static <S> S loadSingle(Class<S> service, boolean required) { public static void initializeJVMCI() {
SecurityManager sm = System.getSecurityManager(); checkJVMCIEnabled();
if (sm != null) {
sm.checkPermission(new JVMCIPermission());
}
if (JAVA_SPECIFICATION_VERSION >= 9) {
Object jvmci = invoke(getModule, Services.class);
invoke(addUses, jvmci, service);
}
// Restrict JVMCI clients to be on the class path or module path
Iterable<S> providers = ServiceLoader.load(service, ClassLoader.getSystemClassLoader());
S singleProvider = null;
try { try {
for (Iterator<S> it = providers.iterator(); it.hasNext();) { Class.forName("jdk.vm.ci.runtime.JVMCI");
singleProvider = it.next(); } catch (ClassNotFoundException e) {
if (it.hasNext()) { throw new InternalError(e);
throw new InternalError(String.format("Multiple %s providers found", service.getName()));
}
}
} catch (ServiceConfigurationError e) {
// If the service is required we will bail out below.
} }
if (singleProvider == null && required) {
String javaHome = System.getProperty("java.home");
String vmName = System.getProperty("java.vm.name");
Formatter errorMessage = new Formatter();
errorMessage.format("The VM does not expose required service %s.%n", service.getName());
errorMessage.format("Currently used Java home directory is %s.%n", javaHome);
errorMessage.format("Currently used VM configuration is: %s", vmName);
throw new UnsupportedOperationException(errorMessage.toString());
}
return singleProvider;
} }
} }

View File

@ -0,0 +1,91 @@
/*
* Copyright (c) 2017, 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.
*/
package jdk.vm.ci.services.internal;
import java.lang.reflect.Method;
import java.util.Set;
import jdk.vm.ci.services.Services;
/**
* Reflection based access to API introduced in JDK 9. This allows the API to be used in code that
* must be compiled (but not executed) on JDK 8.
*/
public final class ReflectionAccessJDK {
/**
* {@code Class.getModule()}.
*/
private static final Method getModule;
/**
* {@code java.lang.Module.addOpens(String, Module)}.
*/
private static final Method addOpens;
/**
* {@code java.lang.Module.getPackages(Module, String, Module)}.
*/
private static final Method getPackages;
/**
* {@code java.lang.Module.isOpen(String, Module)}.
*/
private static final Method isOpenTo;
/**
* Opens all JVMCI packages to the module of a given class.
*
* @param other all JVMCI packages will be opened to the module of this class
*/
@SuppressWarnings("unchecked")
public static void openJVMCITo(Class<?> other) {
try {
Object jvmci = getModule.invoke(Services.class);
Object otherModule = getModule.invoke(other);
if (jvmci != otherModule) {
Set<String> packages = (Set<String>) getPackages.invoke(jvmci);
for (String pkg : packages) {
boolean opened = (Boolean) isOpenTo.invoke(jvmci, pkg, otherModule);
if (!opened) {
addOpens.invoke(jvmci, pkg, otherModule);
}
}
}
} catch (Exception e) {
throw new InternalError(e);
}
}
static {
try {
getModule = Class.class.getMethod("getModule");
Class<?> moduleClass = getModule.getReturnType();
getPackages = moduleClass.getMethod("getPackages");
isOpenTo = moduleClass.getMethod("isOpen", String.class, moduleClass);
addOpens = moduleClass.getDeclaredMethod("addOpens", String.class, moduleClass);
} catch (NoSuchMethodException | SecurityException e) {
throw new InternalError(e);
}
}
}

View File

@ -33,37 +33,4 @@ module jdk.internal.vm.ci {
jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory, jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory,
jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory, jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory,
jdk.vm.ci.hotspot.sparc.SPARCHotSpotJVMCIBackendFactory; jdk.vm.ci.hotspot.sparc.SPARCHotSpotJVMCIBackendFactory;
exports jdk.vm.ci.aarch64 to
jdk.internal.vm.compiler;
exports jdk.vm.ci.amd64 to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.code to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.code.site to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.code.stack to
jdk.internal.vm.compiler;
exports jdk.vm.ci.common to
jdk.internal.vm.compiler;
exports jdk.vm.ci.hotspot to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.hotspot.aarch64 to
jdk.internal.vm.compiler;
exports jdk.vm.ci.hotspot.amd64 to
jdk.internal.vm.compiler;
exports jdk.vm.ci.hotspot.sparc to
jdk.internal.vm.compiler;
exports jdk.vm.ci.meta to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.runtime to
jdk.aot,
jdk.internal.vm.compiler;
exports jdk.vm.ci.sparc to
jdk.internal.vm.compiler;
} }

View File

@ -3,9 +3,9 @@
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> <pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH"> <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
<path>/mx.graal</path> <path>/.mx.graal</path>
<path>/mx.graal</path> <path>/.mx.graal</path>
<path>/mx.graal</path> <path>/.mx.graal</path>
</pydev_pathproperty> </pydev_pathproperty>
</pydev_project> </pydev_project>

View File

@ -8,6 +8,36 @@ suite = {
# (e.g., macosx-x86_64-normal-server-release). # (e.g., macosx-x86_64-normal-server-release).
"outputRoot" : "../../../build/mx/hotspot", "outputRoot" : "../../../build/mx/hotspot",
"jdklibraries" : {
"JVMCI_SERVICES" : {
"path" : "lib/jvmci-services.jar",
"sourcePath" : "lib/jvmci-services.src.zip",
"optional" : False,
"jdkStandardizedSince" : "9",
"module" : "jdk.internal.vm.ci"
},
"JVMCI_API" : {
"path" : "lib/jvmci/jvmci-api.jar",
"sourcePath" : "lib/jvmci/jvmci-api.src.zip",
"dependencies" : [
"JVMCI_SERVICES",
],
"optional" : False,
"jdkStandardizedSince" : "9",
"module" : "jdk.internal.vm.ci"
},
"JVMCI_HOTSPOT" : {
"path" : "lib/jvmci/jvmci-hotspot.jar",
"sourcePath" : "lib/jvmci/jvmci-hotspot.src.zip",
"dependencies" : [
"JVMCI_API",
],
"optional" : False,
"jdkStandardizedSince" : "9",
"module" : "jdk.internal.vm.ci"
},
},
"libraries" : { "libraries" : {
# ------------- Libraries ------------- # ------------- Libraries -------------
@ -17,6 +47,16 @@ suite = {
"sha1" : "476d9a44cd19d6b55f81571077dfa972a4f8a083", "sha1" : "476d9a44cd19d6b55f81571077dfa972a4f8a083",
"bootClassPathAgent" : "true", "bootClassPathAgent" : "true",
}, },
"ASM5" : {
"sha1" : "0da08b8cce7bbf903602a25a3a163ae252435795",
"urls" : ["https://lafo.ssw.uni-linz.ac.at/pub/graal-external-deps/asm-5.0.4.jar"],
},
"ASM_TREE5" : {
"sha1" : "396ce0c07ba2b481f25a70195c7c94922f0d1b0b",
"urls" : ["https://lafo.ssw.uni-linz.ac.at/pub/graal-external-deps/asm-tree-5.0.4.jar"],
"dependencies" : ["ASM5"],
},
}, },
"projects" : { "projects" : {
@ -32,6 +72,7 @@ suite = {
"org.graalvm.compiler.serviceprovider" : { "org.graalvm.compiler.serviceprovider" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"dependencies" : ["JVMCI_SERVICES"],
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -49,6 +90,7 @@ suite = {
"org.graalvm.compiler.options" : { "org.graalvm.compiler.options" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"dependencies" : ["JVMCI_SERVICES", "JVMCI_API"],
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -83,6 +125,7 @@ suite = {
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"dependencies" : [ "dependencies" : [
"JVMCI_API",
"org.graalvm.compiler.serviceprovider", "org.graalvm.compiler.serviceprovider",
"org.graalvm.compiler.options" "org.graalvm.compiler.options"
], ],
@ -137,6 +180,7 @@ suite = {
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"dependencies" : [ "dependencies" : [
"JVMCI_HOTSPOT",
"org.graalvm.compiler.core.test", "org.graalvm.compiler.core.test",
], ],
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -146,6 +190,9 @@ suite = {
"org.graalvm.compiler.api.runtime" : { "org.graalvm.compiler.api.runtime" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : [
"JVMCI_API",
],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
"workingSets" : "API,Graal", "workingSets" : "API,Graal",
@ -156,6 +203,7 @@ suite = {
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : [ "dependencies" : [
"mx:JUNIT", "mx:JUNIT",
"JVMCI_SERVICES",
"org.graalvm.compiler.api.runtime", "org.graalvm.compiler.api.runtime",
], ],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
@ -166,6 +214,7 @@ suite = {
"org.graalvm.compiler.api.replacements" : { "org.graalvm.compiler.api.replacements" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : ["JVMCI_API"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
"workingSets" : "API,Graal,Replacements", "workingSets" : "API,Graal,Replacements",
@ -175,6 +224,7 @@ suite = {
"subDir" : "share/classes", "subDir" : "share/classes",
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : [ "dependencies" : [
"JVMCI_HOTSPOT",
"org.graalvm.compiler.api.runtime", "org.graalvm.compiler.api.runtime",
"org.graalvm.compiler.replacements", "org.graalvm.compiler.replacements",
"org.graalvm.compiler.runtime", "org.graalvm.compiler.runtime",
@ -261,6 +311,8 @@ suite = {
"org.graalvm.compiler.hotspot", "org.graalvm.compiler.hotspot",
"org.graalvm.compiler.lir.jtt", "org.graalvm.compiler.lir.jtt",
"org.graalvm.compiler.lir.test", "org.graalvm.compiler.lir.test",
"JVMCI_API",
"JVMCI_HOTSPOT",
], ],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -347,6 +399,9 @@ suite = {
"org.graalvm.compiler.asm" : { "org.graalvm.compiler.asm" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : [
"JVMCI_API",
],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
"workingSets" : "Graal,Assembler", "workingSets" : "Graal,Assembler",
@ -403,6 +458,7 @@ suite = {
"org.graalvm.compiler.bytecode" : { "org.graalvm.compiler.bytecode" : {
"subDir" : "share/classes", "subDir" : "share/classes",
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : ["JVMCI_API"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
"workingSets" : "Graal,Java", "workingSets" : "Graal,Java",
@ -774,6 +830,7 @@ suite = {
"dependencies" : [ "dependencies" : [
"org.graalvm.compiler.lir.jtt", "org.graalvm.compiler.lir.jtt",
"org.graalvm.compiler.lir.aarch64", "org.graalvm.compiler.lir.aarch64",
"JVMCI_HOTSPOT"
], ],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -803,6 +860,7 @@ suite = {
"dependencies" : [ "dependencies" : [
"org.graalvm.compiler.lir.jtt", "org.graalvm.compiler.lir.jtt",
"org.graalvm.compiler.lir.amd64", "org.graalvm.compiler.lir.amd64",
"JVMCI_HOTSPOT"
], ],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -831,6 +889,7 @@ suite = {
"sourceDirs" : ["src"], "sourceDirs" : ["src"],
"dependencies" : [ "dependencies" : [
"org.graalvm.compiler.lir.jtt", "org.graalvm.compiler.lir.jtt",
"JVMCI_HOTSPOT"
], ],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",
"javaCompliance" : "1.8", "javaCompliance" : "1.8",
@ -908,6 +967,7 @@ suite = {
"org.graalvm.compiler.graph.test", "org.graalvm.compiler.graph.test",
"org.graalvm.compiler.printer", "org.graalvm.compiler.printer",
"JAVA_ALLOCATION_INSTRUMENTER", "JAVA_ALLOCATION_INSTRUMENTER",
"ASM_TREE5",
], ],
"annotationProcessors" : ["GRAAL_NODEINFO_PROCESSOR"], "annotationProcessors" : ["GRAAL_NODEINFO_PROCESSOR"],
"checkstyle" : "org.graalvm.compiler.graph", "checkstyle" : "org.graalvm.compiler.graph",

View File

@ -40,7 +40,7 @@ public class Graal {
private static final GraalRuntime runtime = initializeRuntime(); private static final GraalRuntime runtime = initializeRuntime();
private static GraalRuntime initializeRuntime() { private static GraalRuntime initializeRuntime() {
Services.exportJVMCITo(Graal.class); Services.initializeJVMCI();
JVMCICompiler compiler = JVMCI.getRuntime().getCompiler(); JVMCICompiler compiler = JVMCI.getRuntime().getCompiler();
if (compiler instanceof GraalJVMCICompiler) { if (compiler instanceof GraalJVMCICompiler) {
GraalJVMCICompiler graal = (GraalJVMCICompiler) compiler; GraalJVMCICompiler graal = (GraalJVMCICompiler) compiler;

View File

@ -52,11 +52,6 @@ public final class ModuleAPI {
*/ */
public static final ModuleAPI getModule; public static final ModuleAPI getModule;
/**
* {@code jdk.internal.module.Modules.addExports(Module, String, Module)}.
*/
public static final ModuleAPI addExports;
/** /**
* {@code java.lang.Module.getResourceAsStream(String)}. * {@code java.lang.Module.getResourceAsStream(String)}.
*/ */
@ -116,13 +111,11 @@ public final class ModuleAPI {
try { try {
getModule = new ModuleAPI(Class.class.getMethod("getModule")); getModule = new ModuleAPI(Class.class.getMethod("getModule"));
Class<?> moduleClass = getModule.method.getReturnType(); Class<?> moduleClass = getModule.method.getReturnType();
Class<?> modulesClass = Class.forName("jdk.internal.module.Modules");
getResourceAsStream = new ModuleAPI(moduleClass.getMethod("getResourceAsStream", String.class)); getResourceAsStream = new ModuleAPI(moduleClass.getMethod("getResourceAsStream", String.class));
canRead = new ModuleAPI(moduleClass.getMethod("canRead", moduleClass)); canRead = new ModuleAPI(moduleClass.getMethod("canRead", moduleClass));
isExported = new ModuleAPI(moduleClass.getMethod("isExported", String.class)); isExported = new ModuleAPI(moduleClass.getMethod("isExported", String.class));
isExportedTo = new ModuleAPI(moduleClass.getMethod("isExported", String.class, moduleClass)); isExportedTo = new ModuleAPI(moduleClass.getMethod("isExported", String.class, moduleClass));
addExports = new ModuleAPI(modulesClass.getDeclaredMethod("addExports", moduleClass, String.class, moduleClass)); } catch (NoSuchMethodException | SecurityException e) {
} catch (NoSuchMethodException | SecurityException | ClassNotFoundException e) {
throw new InternalError(e); throw new InternalError(e);
} }
} else { } else {
@ -132,8 +125,6 @@ public final class ModuleAPI {
canRead = unavailable; canRead = unavailable;
isExported = unavailable; isExported = unavailable;
isExportedTo = unavailable; isExportedTo = unavailable;
addExports = unavailable;
} }
} }
} }

View File

@ -127,7 +127,7 @@ public class CheckGraalInvariants extends GraalTest {
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -26,15 +26,14 @@ import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType; import java.lang.invoke.MethodType;
import org.junit.Test;
import org.graalvm.compiler.code.CompilationResult; import org.graalvm.compiler.code.CompilationResult;
import org.graalvm.compiler.test.ExportingClassLoader; import org.graalvm.compiler.test.ExportingClassLoader;
import org.junit.Test;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Label;
import jdk.internal.org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes;
import jdk.vm.ci.code.InstalledCode; import jdk.vm.ci.code.InstalledCode;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;

View File

@ -44,19 +44,17 @@ import java.util.Objects;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import java.util.Set; import java.util.Set;
import org.junit.Test;
import org.graalvm.compiler.options.OptionDescriptor; import org.graalvm.compiler.options.OptionDescriptor;
import org.graalvm.compiler.options.OptionDescriptors; import org.graalvm.compiler.options.OptionDescriptors;
import org.graalvm.compiler.options.OptionValue; import org.graalvm.compiler.options.OptionValue;
import org.graalvm.compiler.test.GraalTest; import org.graalvm.compiler.test.GraalTest;
import org.junit.Test;
import jdk.internal.org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassReader;
import jdk.internal.org.objectweb.asm.ClassVisitor; import org.objectweb.asm.ClassVisitor;
import jdk.internal.org.objectweb.asm.Label; import org.objectweb.asm.Label;
import jdk.internal.org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import jdk.internal.org.objectweb.asm.Type; import org.objectweb.asm.Type;
/** /**
* Verifies a class declaring one or more {@linkplain OptionValue options} has a class initializer * Verifies a class declaring one or more {@linkplain OptionValue options} has a class initializer

View File

@ -83,7 +83,7 @@ public class StaticInterfaceFieldTest extends GraalTest {
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -24,10 +24,10 @@ package org.graalvm.compiler.core.test;
import jdk.vm.ci.code.BailoutException; import jdk.vm.ci.code.BailoutException;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;
import jdk.internal.org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Label; import org.objectweb.asm.Label;
import jdk.internal.org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import static org.graalvm.compiler.core.common.CompilationIdentifier.INVALID_COMPILATION_ID; import static org.graalvm.compiler.core.common.CompilationIdentifier.INVALID_COMPILATION_ID;
@ -86,7 +86,7 @@ public class UnbalancedMonitorsTest extends GraalCompilerTest implements Opcodes
ResolvedJavaMethod method = getResolvedJavaMethod(LOADER.findClass(INNER_CLASS_NAME), name); ResolvedJavaMethod method = getResolvedJavaMethod(LOADER.findClass(INNER_CLASS_NAME), name);
try { try {
StructuredGraph graph = new StructuredGraph(method, AllowAssumptions.NO, INVALID_COMPILATION_ID); StructuredGraph graph = new StructuredGraph(method, AllowAssumptions.NO, INVALID_COMPILATION_ID);
Plugins plugins = new Plugins(new InvocationPlugins(getMetaAccess())); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration graphBuilderConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration graphBuilderConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
OptimisticOptimizations optimisticOpts = OptimisticOptimizations.NONE; OptimisticOptimizations optimisticOpts = OptimisticOptimizations.NONE;

View File

@ -122,7 +122,7 @@ public class VerifyBailoutUsageTest {
Providers providers = rt.getHostBackend().getProviders(); Providers providers = rt.getHostBackend().getProviders();
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -300,7 +300,7 @@ public class VerifyDebugUsageTest {
Providers providers = rt.getHostBackend().getProviders(); Providers providers = rt.getHostBackend().getProviders();
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -267,7 +267,7 @@ public class VerifyVirtualizableTest {
Providers providers = rt.getHostBackend().getProviders(); Providers providers = rt.getHostBackend().getProviders();
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -249,7 +249,7 @@ public class VerifyMethodMetricsTest {
Providers providers = rt.getHostBackend().getProviders(); Providers providers = rt.getHostBackend().getProviders();
MetaAccessProvider metaAccess = providers.getMetaAccess(); MetaAccessProvider metaAccess = providers.getMetaAccess();
PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>(); PhaseSuite<HighTierContext> graphBuilderSuite = new PhaseSuite<>();
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration config = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
graphBuilderSuite.appendPhase(new GraphBuilderPhase(config)); graphBuilderSuite.appendPhase(new GraphBuilderPhase(config));
HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE); HighTierContext context = new HighTierContext(providers, graphBuilderSuite, OptimisticOptimizations.NONE);

View File

@ -253,7 +253,7 @@ public class StaticAnalysis {
* the code before static analysis, the classes would otherwise be not loaded * the code before static analysis, the classes would otherwise be not loaded
* yet and the bytecode parser would only create a graph. * yet and the bytecode parser would only create a graph.
*/ */
Plugins plugins = new Plugins(new InvocationPlugins(metaAccess)); Plugins plugins = new Plugins(new InvocationPlugins());
GraphBuilderConfiguration graphBuilderConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true); GraphBuilderConfiguration graphBuilderConfig = GraphBuilderConfiguration.getDefault(plugins).withEagerResolving(true);
/* /*
* For simplicity, we ignore all exception handling during the static analysis. * For simplicity, we ignore all exception handling during the static analysis.

View File

@ -29,15 +29,12 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.junit.Test;
import org.graalvm.compiler.api.test.Graal; import org.graalvm.compiler.api.test.Graal;
import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
@ -45,12 +42,15 @@ import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Binding;
import org.graalvm.compiler.runtime.RuntimeProvider; import org.graalvm.compiler.runtime.RuntimeProvider;
import org.graalvm.compiler.test.GraalTest; import org.graalvm.compiler.test.GraalTest;
import org.junit.Test;
import jdk.vm.ci.hotspot.HotSpotVMConfigStore; import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
import jdk.vm.ci.hotspot.VMIntrinsicMethod; import jdk.vm.ci.hotspot.VMIntrinsicMethod;
import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.MetaUtil;
import jdk.vm.ci.meta.MethodHandleAccessProvider.IntrinsicMethod; import jdk.vm.ci.meta.MethodHandleAccessProvider.IntrinsicMethod;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;
@ -63,11 +63,10 @@ import jdk.vm.ci.meta.ResolvedJavaMethod;
*/ */
public class CheckGraalIntrinsics extends GraalTest { public class CheckGraalIntrinsics extends GraalTest {
public static boolean match(ResolvedJavaMethod method, VMIntrinsicMethod intrinsic) { public static boolean match(String type, Binding binding, VMIntrinsicMethod intrinsic) {
if (intrinsic.name.equals(method.getName())) { if (intrinsic.name.equals(binding.name)) {
if (intrinsic.descriptor.equals(method.getSignature().toMethodDescriptor())) { if (intrinsic.descriptor.startsWith(binding.argumentsDescriptor)) {
String declaringClass = method.getDeclaringClass().toClassName().replace('.', '/'); if (type.equals(intrinsic.declaringClass)) {
if (declaringClass.equals(intrinsic.declaringClass)) {
return true; return true;
} }
} }
@ -75,16 +74,20 @@ public class CheckGraalIntrinsics extends GraalTest {
return false; return false;
} }
private static ResolvedJavaMethod findMethod(Set<ResolvedJavaMethod> methods, VMIntrinsicMethod intrinsic) { public static InvocationPlugin findPlugin(Map<String, List<Binding>> bindings, VMIntrinsicMethod intrinsic) {
for (ResolvedJavaMethod method : methods) { for (Map.Entry<String, List<Binding>> e : bindings.entrySet()) {
if (match(method, intrinsic)) { // Match format of VMIntrinsicMethod.declaringClass
return method; String type = MetaUtil.internalNameToJava(e.getKey(), true, false).replace('.', '/');
for (Binding binding : e.getValue()) {
if (match(type, binding, intrinsic)) {
return binding.plugin;
}
} }
} }
return null; return null;
} }
private static ResolvedJavaMethod resolveIntrinsic(MetaAccessProvider metaAccess, VMIntrinsicMethod intrinsic) throws ClassNotFoundException { public static ResolvedJavaMethod resolveIntrinsic(MetaAccessProvider metaAccess, VMIntrinsicMethod intrinsic) throws ClassNotFoundException {
Class<?> c = Class.forName(intrinsic.declaringClass.replace('/', '.'), false, CheckGraalIntrinsics.class.getClassLoader()); Class<?> c = Class.forName(intrinsic.declaringClass.replace('/', '.'), false, CheckGraalIntrinsics.class.getClassLoader());
for (Method javaMethod : c.getDeclaredMethods()) { for (Method javaMethod : c.getDeclaredMethods()) {
if (javaMethod.getName().equals(intrinsic.name)) { if (javaMethod.getName().equals(intrinsic.name)) {
@ -425,28 +428,20 @@ public class CheckGraalIntrinsics extends GraalTest {
public void test() throws ClassNotFoundException { public void test() throws ClassNotFoundException {
HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class); HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class);
HotSpotProviders providers = rt.getHostBackend().getProviders(); HotSpotProviders providers = rt.getHostBackend().getProviders();
Map<ResolvedJavaMethod, Object> impl = new HashMap<>();
Plugins graphBuilderPlugins = providers.getGraphBuilderPlugins(); Plugins graphBuilderPlugins = providers.getGraphBuilderPlugins();
InvocationPlugins invocationPlugins = graphBuilderPlugins.getInvocationPlugins(); InvocationPlugins invocationPlugins = graphBuilderPlugins.getInvocationPlugins();
for (ResolvedJavaMethod method : invocationPlugins.getMethods()) {
InvocationPlugin plugin = invocationPlugins.lookupInvocation(method);
assert plugin != null;
impl.put(method, plugin);
}
Set<ResolvedJavaMethod> methods = invocationPlugins.getMethods();
HotSpotVMConfigStore store = rt.getVMConfig().getStore(); HotSpotVMConfigStore store = rt.getVMConfig().getStore();
List<VMIntrinsicMethod> intrinsics = store.getIntrinsics(); List<VMIntrinsicMethod> intrinsics = store.getIntrinsics();
List<String> missing = new ArrayList<>(); List<String> missing = new ArrayList<>();
Map<String, List<Binding>> bindings = invocationPlugins.getBindings(true);
for (VMIntrinsicMethod intrinsic : intrinsics) { for (VMIntrinsicMethod intrinsic : intrinsics) {
ResolvedJavaMethod method = findMethod(methods, intrinsic); InvocationPlugin plugin = findPlugin(bindings, intrinsic);
if (method == null) { if (plugin == null) {
method = resolveIntrinsic(providers.getMetaAccess(), intrinsic); ResolvedJavaMethod method = resolveIntrinsic(providers.getMetaAccess(), intrinsic);
IntrinsicMethod intrinsicMethod = null;
if (method != null) { if (method != null) {
intrinsicMethod = providers.getConstantReflection().getMethodHandleAccess().lookupMethodHandleIntrinsic(method); IntrinsicMethod intrinsicMethod = providers.getConstantReflection().getMethodHandleAccess().lookupMethodHandleIntrinsic(method);
if (intrinsicMethod != null) { if (intrinsicMethod != null) {
continue; continue;
} }

View File

@ -39,9 +39,9 @@ import org.graalvm.compiler.nodes.StructuredGraph.AllowAssumptions;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
import jdk.internal.org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;
public class ConstantPoolSubstitutionsTests extends GraalCompilerTest implements Opcodes { public class ConstantPoolSubstitutionsTests extends GraalCompilerTest implements Opcodes {

View File

@ -22,13 +22,12 @@
*/ */
package org.graalvm.compiler.hotspot.test; package org.graalvm.compiler.hotspot.test;
import java.util.List; import static org.graalvm.compiler.core.common.CompilationIdentifier.INVALID_COMPILATION_ID;
import java.util.Set;
import org.junit.Test; import java.util.List;
import java.util.Map;
import org.graalvm.compiler.api.test.Graal; import org.graalvm.compiler.api.test.Graal;
import org.graalvm.compiler.core.common.CompilationIdentifier;
import org.graalvm.compiler.core.test.GraalCompilerTest; import org.graalvm.compiler.core.test.GraalCompilerTest;
import org.graalvm.compiler.hotspot.HotSpotGraalCompiler; import org.graalvm.compiler.hotspot.HotSpotGraalCompiler;
import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider; import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
@ -37,8 +36,10 @@ import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins; import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugin;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins; import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins;
import org.graalvm.compiler.nodes.graphbuilderconf.InvocationPlugins.Binding;
import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin; import org.graalvm.compiler.nodes.graphbuilderconf.MethodSubstitutionPlugin;
import org.graalvm.compiler.runtime.RuntimeProvider; import org.graalvm.compiler.runtime.RuntimeProvider;
import org.junit.Test;
import jdk.vm.ci.hotspot.HotSpotVMConfigStore; import jdk.vm.ci.hotspot.HotSpotVMConfigStore;
import jdk.vm.ci.hotspot.VMIntrinsicMethod; import jdk.vm.ci.hotspot.VMIntrinsicMethod;
@ -50,46 +51,27 @@ import jdk.vm.ci.runtime.JVMCI;
*/ */
public class TestIntrinsicCompiles extends GraalCompilerTest { public class TestIntrinsicCompiles extends GraalCompilerTest {
private static boolean match(ResolvedJavaMethod method, VMIntrinsicMethod intrinsic) {
if (intrinsic.name.equals(method.getName())) {
if (intrinsic.descriptor.equals(method.getSignature().toMethodDescriptor())) {
String declaringClass = method.getDeclaringClass().toClassName().replace('.', '/');
if (declaringClass.equals(intrinsic.declaringClass)) {
return true;
}
}
}
return false;
}
private static ResolvedJavaMethod findMethod(Set<ResolvedJavaMethod> methods, VMIntrinsicMethod intrinsic) {
for (ResolvedJavaMethod method : methods) {
if (match(method, intrinsic)) {
return method;
}
}
return null;
}
@Test @Test
@SuppressWarnings("try") @SuppressWarnings("try")
public void test() { public void test() throws ClassNotFoundException {
HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) JVMCI.getRuntime().getCompiler(); HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) JVMCI.getRuntime().getCompiler();
HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class); HotSpotGraalRuntimeProvider rt = (HotSpotGraalRuntimeProvider) Graal.getRequiredCapability(RuntimeProvider.class);
HotSpotProviders providers = rt.getHostBackend().getProviders(); HotSpotProviders providers = rt.getHostBackend().getProviders();
Plugins graphBuilderPlugins = providers.getGraphBuilderPlugins(); Plugins graphBuilderPlugins = providers.getGraphBuilderPlugins();
InvocationPlugins invocationPlugins = graphBuilderPlugins.getInvocationPlugins(); InvocationPlugins invocationPlugins = graphBuilderPlugins.getInvocationPlugins();
Set<ResolvedJavaMethod> pluginMethods = invocationPlugins.getMethods(); Map<String, List<Binding>> bindings = invocationPlugins.getBindings(true);
HotSpotVMConfigStore store = rt.getVMConfig().getStore(); HotSpotVMConfigStore store = rt.getVMConfig().getStore();
List<VMIntrinsicMethod> intrinsics = store.getIntrinsics(); List<VMIntrinsicMethod> intrinsics = store.getIntrinsics();
for (VMIntrinsicMethod intrinsic : intrinsics) { for (VMIntrinsicMethod intrinsic : intrinsics) {
ResolvedJavaMethod method = findMethod(pluginMethods, intrinsic); InvocationPlugin plugin = CheckGraalIntrinsics.findPlugin(bindings, intrinsic);
if (method != null) { if (plugin != null) {
InvocationPlugin plugin = invocationPlugins.lookupInvocation(method); if (plugin instanceof MethodSubstitutionPlugin) {
if (plugin instanceof MethodSubstitutionPlugin && !method.isNative()) { ResolvedJavaMethod method = CheckGraalIntrinsics.resolveIntrinsic(getMetaAccess(), intrinsic);
StructuredGraph graph = compiler.getIntrinsicGraph(method, providers, CompilationIdentifier.INVALID_COMPILATION_ID); if (!method.isNative()) {
getCode(method, graph); StructuredGraph graph = compiler.getIntrinsicGraph(method, providers, INVALID_COMPILATION_ID);
getCode(method, graph);
}
} }
} }
} }

View File

@ -102,7 +102,6 @@ import jdk.vm.ci.meta.ConstantPool;
import jdk.vm.ci.meta.MetaAccessProvider; import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.runtime.JVMCI; import jdk.vm.ci.runtime.JVMCI;
import jdk.vm.ci.runtime.JVMCICompiler; import jdk.vm.ci.runtime.JVMCICompiler;
import jdk.vm.ci.services.Services;
/** /**
* This class implements compile-the-world functionality with JVMCI. * This class implements compile-the-world functionality with JVMCI.
@ -785,7 +784,6 @@ public final class CompileTheWorld {
} }
public static void main(String[] args) throws Throwable { public static void main(String[] args) throws Throwable {
Services.exportJVMCITo(CompileTheWorld.class);
HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) HotSpotJVMCIRuntime.runtime().getCompiler(); HotSpotGraalCompiler compiler = (HotSpotGraalCompiler) HotSpotJVMCIRuntime.runtime().getCompiler();
compiler.compileTheWorld(); compiler.compileTheWorld();
} }

View File

@ -22,21 +22,19 @@
*/ */
package org.graalvm.compiler.hotspot; package org.graalvm.compiler.hotspot;
import static org.graalvm.compiler.core.common.util.Util.Java8OrEarlier;
import static org.graalvm.compiler.options.OptionValue.PROFILE_OPTIONVALUE_PROPERTY_NAME;
import static jdk.vm.ci.common.InitTimer.timer; import static jdk.vm.ci.common.InitTimer.timer;
import static org.graalvm.compiler.options.OptionValue.PROFILE_OPTIONVALUE_PROPERTY_NAME;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.lang.reflect.Field;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties; import java.util.Properties;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import org.graalvm.compiler.debug.GraalError;
import org.graalvm.compiler.debug.MethodFilter; import org.graalvm.compiler.debug.MethodFilter;
import org.graalvm.compiler.options.Option; import org.graalvm.compiler.options.Option;
import org.graalvm.compiler.options.OptionDescriptors; import org.graalvm.compiler.options.OptionDescriptors;
@ -46,10 +44,11 @@ import org.graalvm.compiler.options.OptionsParser;
import org.graalvm.compiler.phases.tiers.CompilerConfiguration; import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
import jdk.vm.ci.common.InitTimer; import jdk.vm.ci.common.InitTimer;
import jdk.vm.ci.hotspot.HotSpotJVMCICompilerFactory;
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime; import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
import jdk.vm.ci.hotspot.HotSpotSignature; import jdk.vm.ci.hotspot.HotSpotSignature;
import jdk.vm.ci.hotspot.HotSpotJVMCICompilerFactory;
import jdk.vm.ci.runtime.JVMCIRuntime; import jdk.vm.ci.runtime.JVMCIRuntime;
import jdk.vm.ci.services.Services;
public final class HotSpotGraalCompilerFactory extends HotSpotJVMCICompilerFactory { public final class HotSpotGraalCompilerFactory extends HotSpotJVMCICompilerFactory {
@ -135,8 +134,8 @@ public final class HotSpotGraalCompilerFactory extends HotSpotJVMCICompilerFacto
if (allOptionsSettings == null) { if (allOptionsSettings == null) {
try (InitTimer t = timer("InitializeOptions")) { try (InitTimer t = timer("InitializeOptions")) {
ServiceLoader<OptionDescriptors> loader = ServiceLoader.load(OptionDescriptors.class, OptionDescriptors.class.getClassLoader()); ServiceLoader<OptionDescriptors> loader = ServiceLoader.load(OptionDescriptors.class, OptionDescriptors.class.getClassLoader());
Properties savedProps = getSavedProperties(Java8OrEarlier); Map<String, String> savedProps = Services.getSavedProperties();
String optionsFile = savedProps.getProperty(GRAAL_OPTIONS_FILE_PROPERTY_NAME); String optionsFile = savedProps.get(GRAAL_OPTIONS_FILE_PROPERTY_NAME);
if (optionsFile != null) { if (optionsFile != null) {
File graalOptions = new File(optionsFile); File graalOptions = new File(optionsFile);
@ -165,15 +164,15 @@ public final class HotSpotGraalCompilerFactory extends HotSpotJVMCICompilerFacto
} }
Map<String, String> optionSettings = new HashMap<>(); Map<String, String> optionSettings = new HashMap<>();
for (Map.Entry<Object, Object> e : savedProps.entrySet()) { for (Entry<String, String> e : savedProps.entrySet()) {
String name = (String) e.getKey(); String name = e.getKey();
if (name.startsWith(GRAAL_OPTION_PROPERTY_PREFIX)) { if (name.startsWith(GRAAL_OPTION_PROPERTY_PREFIX)) {
if (name.equals("graal.PrintFlags") || name.equals("graal.ShowFlags")) { if (name.equals("graal.PrintFlags") || name.equals("graal.ShowFlags")) {
System.err.println("The " + name + " option has been removed and will be ignored. Use -XX:+JVMCIPrintProperties instead."); System.err.println("The " + name + " option has been removed and will be ignored. Use -XX:+JVMCIPrintProperties instead.");
} else if (name.equals(GRAAL_OPTIONS_FILE_PROPERTY_NAME) || name.equals(GRAAL_VERSION_PROPERTY_NAME) || name.equals(PROFILE_OPTIONVALUE_PROPERTY_NAME)) { } else if (name.equals(GRAAL_OPTIONS_FILE_PROPERTY_NAME) || name.equals(GRAAL_VERSION_PROPERTY_NAME) || name.equals(PROFILE_OPTIONVALUE_PROPERTY_NAME)) {
// Ignore well known properties that do not denote an option // Ignore well known properties that do not denote an option
} else { } else {
String value = (String) e.getValue(); String value = e.getValue();
optionSettings.put(name.substring(GRAAL_OPTION_PROPERTY_PREFIX.length()), value); optionSettings.put(name.substring(GRAAL_OPTION_PROPERTY_PREFIX.length()), value);
} }
} }
@ -206,18 +205,6 @@ public final class HotSpotGraalCompilerFactory extends HotSpotJVMCICompilerFacto
} }
} }
private static Properties getSavedProperties(boolean jdk8OrEarlier) {
try {
String vmClassName = jdk8OrEarlier ? "sun.misc.VM" : "jdk.internal.misc.VM";
Class<?> vmClass = Class.forName(vmClassName);
Field savedPropsField = vmClass.getDeclaredField("savedProps");
savedPropsField.setAccessible(true);
return (Properties) savedPropsField.get(null);
} catch (Exception e) {
throw new GraalError(e);
}
}
@Override @Override
public HotSpotGraalCompiler createCompiler(JVMCIRuntime runtime) { public HotSpotGraalCompiler createCompiler(JVMCIRuntime runtime) {
HotSpotGraalCompiler compiler = createCompiler(runtime, CompilerConfigurationFactory.selectFactory(null)); HotSpotGraalCompiler compiler = createCompiler(runtime, CompilerConfigurationFactory.selectFactory(null));

View File

@ -22,10 +22,6 @@
*/ */
package org.graalvm.compiler.hotspot; package org.graalvm.compiler.hotspot;
import static org.graalvm.compiler.core.common.util.ModuleAPI.addExports;
import static org.graalvm.compiler.core.common.util.ModuleAPI.getModule;
import static org.graalvm.compiler.core.common.util.Util.JAVA_SPECIFICATION_VERSION;
import org.graalvm.compiler.serviceprovider.ServiceProvider; import org.graalvm.compiler.serviceprovider.ServiceProvider;
import jdk.vm.ci.hotspot.HotSpotVMEventListener; import jdk.vm.ci.hotspot.HotSpotVMEventListener;
@ -35,43 +31,45 @@ import jdk.vm.ci.services.JVMCIServiceLocator;
@ServiceProvider(JVMCIServiceLocator.class) @ServiceProvider(JVMCIServiceLocator.class)
public final class HotSpotGraalJVMCIServiceLocator extends JVMCIServiceLocator { public final class HotSpotGraalJVMCIServiceLocator extends JVMCIServiceLocator {
private boolean exportsAdded;
/** /**
* Dynamically exports various internal JDK packages to the Graal module. This requires only * Holds the state shared between all {@link HotSpotGraalJVMCIServiceLocator} instances. This is
* {@code --add-exports=java.base/jdk.internal.module=org.graalvm.compiler.graal_core} on the VM * necessary as a service provider instance is created each time the service is loaded.
* command line instead of a {@code --add-exports} instance for each JDK internal package used
* by Graal.
*/ */
private void addExports() { private static final class Shared {
if (JAVA_SPECIFICATION_VERSION >= 9 && !exportsAdded) { static final Shared SINGLETON = new Shared();
Object javaBaseModule = getModule.invoke(String.class);
Object graalModule = getModule.invoke(getClass()); <T> T getProvider(Class<T> service, HotSpotGraalJVMCIServiceLocator locator) {
addExports.invokeStatic(javaBaseModule, "jdk.internal.misc", graalModule); if (service == JVMCICompilerFactory.class) {
addExports.invokeStatic(javaBaseModule, "jdk.internal.jimage", graalModule); return service.cast(new HotSpotGraalCompilerFactory(locator));
addExports.invokeStatic(javaBaseModule, "com.sun.crypto.provider", graalModule); } else if (service == HotSpotVMEventListener.class) {
exportsAdded = true; if (graalRuntime != null) {
return service.cast(new HotSpotGraalVMEventListener(graalRuntime));
}
}
return null;
}
private HotSpotGraalRuntime graalRuntime;
/**
* Notifies this object of the compiler created via {@link HotSpotGraalJVMCIServiceLocator}.
*/
void onCompilerCreation(HotSpotGraalCompiler compiler) {
assert this.graalRuntime == null : "only expect a single JVMCICompiler to be created";
this.graalRuntime = (HotSpotGraalRuntime) compiler.getGraalRuntime();
} }
} }
private HotSpotGraalRuntime graalRuntime;
@Override @Override
public <T> T getProvider(Class<T> service) { public <T> T getProvider(Class<T> service) {
if (service == JVMCICompilerFactory.class) { return Shared.SINGLETON.getProvider(service, this);
addExports();
return service.cast(new HotSpotGraalCompilerFactory(this));
} else if (service == HotSpotVMEventListener.class) {
if (graalRuntime != null) {
addExports();
return service.cast(new HotSpotGraalVMEventListener(graalRuntime));
}
}
return null;
} }
public void onCompilerCreation(HotSpotGraalCompiler compiler) { /**
assert this.graalRuntime == null : "only expect a single JVMCICompiler to be created"; * Notifies this object of the compiler created via {@link HotSpotGraalJVMCIServiceLocator}.
this.graalRuntime = (HotSpotGraalRuntime) compiler.getGraalRuntime(); */
@SuppressWarnings("static-method")
void onCompilerCreation(HotSpotGraalCompiler compiler) {
Shared.SINGLETON.onCompilerCreation(compiler);
} }
} }

View File

@ -128,7 +128,7 @@ public class HotSpotGraphBuilderPlugins {
*/ */
public static Plugins create(GraalHotSpotVMConfig config, HotSpotWordTypes wordTypes, MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection, public static Plugins create(GraalHotSpotVMConfig config, HotSpotWordTypes wordTypes, MetaAccessProvider metaAccess, ConstantReflectionProvider constantReflection,
SnippetReflectionProvider snippetReflection, ForeignCallsProvider foreignCalls, StampProvider stampProvider, ReplacementsImpl replacements) { SnippetReflectionProvider snippetReflection, ForeignCallsProvider foreignCalls, StampProvider stampProvider, ReplacementsImpl replacements) {
InvocationPlugins invocationPlugins = new HotSpotInvocationPlugins(config, metaAccess); InvocationPlugins invocationPlugins = new HotSpotInvocationPlugins(config);
Plugins plugins = new Plugins(invocationPlugins); Plugins plugins = new Plugins(invocationPlugins);
NodeIntrinsificationProvider nodeIntrinsificationProvider = new NodeIntrinsificationProvider(metaAccess, snippetReflection, foreignCalls, wordTypes); NodeIntrinsificationProvider nodeIntrinsificationProvider = new NodeIntrinsificationProvider(metaAccess, snippetReflection, foreignCalls, wordTypes);

View File

@ -38,7 +38,6 @@ import org.graalvm.compiler.nodes.type.StampTool;
import org.graalvm.compiler.replacements.nodes.MacroNode; import org.graalvm.compiler.replacements.nodes.MacroNode;
import jdk.vm.ci.meta.JavaKind; import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.MetaAccessProvider;
import jdk.vm.ci.meta.ResolvedJavaType; import jdk.vm.ci.meta.ResolvedJavaType;
/** /**
@ -47,8 +46,7 @@ import jdk.vm.ci.meta.ResolvedJavaType;
final class HotSpotInvocationPlugins extends InvocationPlugins { final class HotSpotInvocationPlugins extends InvocationPlugins {
final GraalHotSpotVMConfig config; final GraalHotSpotVMConfig config;
HotSpotInvocationPlugins(GraalHotSpotVMConfig config, MetaAccessProvider metaAccess) { HotSpotInvocationPlugins(GraalHotSpotVMConfig config) {
super(metaAccess);
this.config = config; this.config = config;
} }

View File

@ -29,8 +29,6 @@ import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.VERY_SLO
import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability; import static org.graalvm.compiler.nodes.extended.BranchProbabilityNode.probability;
import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset; import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayBaseOffset;
import java.lang.reflect.Field;
import org.graalvm.compiler.api.replacements.ClassSubstitution; import org.graalvm.compiler.api.replacements.ClassSubstitution;
import org.graalvm.compiler.api.replacements.MethodSubstitution; import org.graalvm.compiler.api.replacements.MethodSubstitution;
import org.graalvm.compiler.core.common.LocationIdentity; import org.graalvm.compiler.core.common.LocationIdentity;
@ -61,7 +59,7 @@ public class AESCryptSubstitutions {
static final long kOffset; static final long kOffset;
static final long lastKeyOffset; static final long lastKeyOffset;
static final Class<?> AESCryptClass; static final Class<?> AESCryptClass;
static final int AES_BLOCK_SIZE; static final int AES_BLOCK_SIZE_IN_BYTES;
static { static {
try { try {
@ -72,9 +70,9 @@ public class AESCryptSubstitutions {
AESCryptClass = Class.forName("com.sun.crypto.provider.AESCrypt", true, cl); AESCryptClass = Class.forName("com.sun.crypto.provider.AESCrypt", true, cl);
kOffset = UnsafeAccess.UNSAFE.objectFieldOffset(AESCryptClass.getDeclaredField("K")); kOffset = UnsafeAccess.UNSAFE.objectFieldOffset(AESCryptClass.getDeclaredField("K"));
lastKeyOffset = UnsafeAccess.UNSAFE.objectFieldOffset(AESCryptClass.getDeclaredField("lastKey")); lastKeyOffset = UnsafeAccess.UNSAFE.objectFieldOffset(AESCryptClass.getDeclaredField("lastKey"));
Field aesBlockSizeField = Class.forName("com.sun.crypto.provider.AESConstants", true, cl).getDeclaredField("AES_BLOCK_SIZE"); // Thankfully the AES block size is a constant (128 bits) and so we don't need to
aesBlockSizeField.setAccessible(true); // reflect on com.sun.crypto.provider.AESConstants.AES_BLOCK_SIZE.
AES_BLOCK_SIZE = aesBlockSizeField.getInt(null); AES_BLOCK_SIZE_IN_BYTES = 16;
} catch (Exception ex) { } catch (Exception ex) {
throw new GraalError(ex); throw new GraalError(ex);
} }
@ -141,7 +139,7 @@ public class AESCryptSubstitutions {
* Perform null and array bounds checks for arguments to a cipher operation. * Perform null and array bounds checks for arguments to a cipher operation.
*/ */
static void checkArgs(byte[] in, int inOffset, byte[] out, int outOffset) { static void checkArgs(byte[] in, int inOffset, byte[] out, int outOffset) {
if (probability(VERY_SLOW_PATH_PROBABILITY, inOffset < 0 || in.length - AES_BLOCK_SIZE < inOffset || outOffset < 0 || out.length - AES_BLOCK_SIZE < outOffset)) { if (probability(VERY_SLOW_PATH_PROBABILITY, inOffset < 0 || in.length - AES_BLOCK_SIZE_IN_BYTES < inOffset || outOffset < 0 || out.length - AES_BLOCK_SIZE_IN_BYTES < outOffset)) {
DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint); DeoptimizeNode.deopt(DeoptimizationAction.None, DeoptimizationReason.RuntimeConstraint);
} }
} }

View File

@ -57,7 +57,7 @@ public class CRC32Substitutions {
return config.crcTableAddress; return config.crcTableAddress;
} }
@MethodSubstitution @MethodSubstitution(optional = true)
static int update(int crc, int b) { static int update(int crc, int b) {
final long crcTableRawAddress = GraalHotSpotVMConfigNode.crcTableAddress(); final long crcTableRawAddress = GraalHotSpotVMConfigNode.crcTableAddress();
@ -69,7 +69,7 @@ public class CRC32Substitutions {
return ~result; return ~result;
} }
@MethodSubstitution @MethodSubstitution(optional = true)
static int updateBytes(int crc, byte[] buf, int off, int len) { static int updateBytes(int crc, byte[] buf, int off, int len) {
Word bufAddr = Word.unsigned(ComputeObjectAddressNode.get(buf, arrayBaseOffset(JavaKind.Byte) + off)); Word bufAddr = Word.unsigned(ComputeObjectAddressNode.get(buf, arrayBaseOffset(JavaKind.Byte) + off));
return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len);
@ -84,7 +84,7 @@ public class CRC32Substitutions {
return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len);
} }
@MethodSubstitution @MethodSubstitution(optional = true)
static int updateByteBuffer(int crc, long addr, int off, int len) { static int updateByteBuffer(int crc, long addr, int off, int len) {
Word bufAddr = Word.unsigned(addr).add(off); Word bufAddr = Word.unsigned(addr).add(off);
return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len); return updateBytesCRC32(UPDATE_BYTES_CRC32, crc, bufAddr, len);

View File

@ -45,7 +45,7 @@ import org.graalvm.compiler.word.Word;
@ClassSubstitution(Thread.class) @ClassSubstitution(Thread.class)
public class ThreadSubstitutions { public class ThreadSubstitutions {
@MethodSubstitution(isStatic = false) @MethodSubstitution(isStatic = false, optional = true)
public static boolean isInterrupted(final Thread thisObject, boolean clearInterrupted) { public static boolean isInterrupted(final Thread thisObject, boolean clearInterrupted) {
Word javaThread = CurrentJavaThreadNode.get(); Word javaThread = CurrentJavaThreadNode.get();
Object thread = javaThread.readObject(threadObjectOffset(INJECTED_VMCONFIG), JAVA_THREAD_THREAD_OBJECT_LOCATION); Object thread = javaThread.readObject(threadObjectOffset(INJECTED_VMCONFIG), JAVA_THREAD_THREAD_OBJECT_LOCATION);

View File

@ -40,8 +40,7 @@ public interface InvocationPlugin extends GraphBuilderPlugin {
/** /**
* The receiver in a non-static method. The class literal for this interface must be used with * The receiver in a non-static method. The class literal for this interface must be used with
* {@link InvocationPlugins#put(InvocationPlugin, boolean, boolean, boolean, Class, String, Class...)} * {@link InvocationPlugins#put} to denote the receiver argument for such a non-static method.
* to denote the receiver argument for such a non-static method.
*/ */
public interface Receiver { public interface Receiver {
/** /**

View File

@ -69,8 +69,7 @@ interface GraphPrinter extends Closeable {
void close(); void close();
/** /**
* A JVMCI package {@linkplain Services#exportJVMCITo(Class) dynamically exported} to trusted * A JVMCI package dynamically exported to trusted modules.
* modules.
*/ */
String JVMCI_RUNTIME_PACKAGE = JVMCI.class.getPackage().getName(); String JVMCI_RUNTIME_PACKAGE = JVMCI.class.getPackage().getName();

View File

@ -30,10 +30,10 @@ import org.graalvm.compiler.test.ExportingClassLoader;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import jdk.internal.org.objectweb.asm.ClassWriter; import org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Label; import org.objectweb.asm.Label;
import jdk.internal.org.objectweb.asm.MethodVisitor; import org.objectweb.asm.MethodVisitor;
import jdk.internal.org.objectweb.asm.Opcodes; import org.objectweb.asm.Opcodes;
import jdk.vm.ci.meta.ResolvedJavaMethod; import jdk.vm.ci.meta.ResolvedJavaMethod;
/** /**

View File

@ -22,9 +22,17 @@
*/ */
package org.graalvm.compiler.serviceprovider; package org.graalvm.compiler.serviceprovider;
import static org.graalvm.compiler.serviceprovider.JDK9Method.Java8OrEarlier;
import static org.graalvm.compiler.serviceprovider.JDK9Method.addOpens;
import static org.graalvm.compiler.serviceprovider.JDK9Method.getModule;
import static org.graalvm.compiler.serviceprovider.JDK9Method.getPackages;
import static org.graalvm.compiler.serviceprovider.JDK9Method.isOpenTo;
import java.lang.reflect.Method;
import java.util.Iterator; import java.util.Iterator;
import java.util.ServiceConfigurationError; import java.util.ServiceConfigurationError;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import java.util.Set;
import jdk.vm.ci.services.JVMCIPermission; import jdk.vm.ci.services.JVMCIPermission;
import jdk.vm.ci.services.Services; import jdk.vm.ci.services.Services;
@ -32,14 +40,32 @@ import jdk.vm.ci.services.Services;
/** /**
* A mechanism for accessing service providers that abstracts over whether Graal is running on * A mechanism for accessing service providers that abstracts over whether Graal is running on
* JVMCI-8 or JVMCI-9. In JVMCI-8, a JVMCI specific mechanism is used to lookup services via the * JVMCI-8 or JVMCI-9. In JVMCI-8, a JVMCI specific mechanism is used to lookup services via the
* hidden JVMCI class loader. in JVMCI-9, the standard {@link ServiceLoader} mechanism is used. * hidden JVMCI class loader. In JVMCI-9, the standard {@link ServiceLoader} mechanism is used.
*/ */
public final class GraalServices { public final class GraalServices {
private GraalServices() { private GraalServices() {
} }
public static final boolean Java8OrEarlier = System.getProperty("java.specification.version").compareTo("1.9") < 0; /**
* Opens all JVMCI packages to the module of a given class. This relies on JVMCI already having
* opened all its packages to the module defining {@link GraalServices}.
*
* @param other all JVMCI packages will be opened to the module defining this class
*/
public static void openJVMCITo(Class<?> other) {
Object jvmci = getModule.invoke(Services.class);
Object otherModule = getModule.invoke(other);
if (jvmci != otherModule) {
Set<String> packages = getPackages.invoke(jvmci);
for (String pkg : packages) {
boolean opened = isOpenTo.invoke(jvmci, pkg, otherModule);
if (!opened) {
addOpens.invoke(jvmci, pkg, otherModule);
}
}
}
}
/** /**
* Gets an {@link Iterable} of the providers available for a given service. * Gets an {@link Iterable} of the providers available for a given service.
@ -50,9 +76,9 @@ public final class GraalServices {
public static <S> Iterable<S> load(Class<S> service) { public static <S> Iterable<S> load(Class<S> service) {
assert !service.getName().startsWith("jdk.vm.ci") : "JVMCI services must be loaded via " + Services.class.getName(); assert !service.getName().startsWith("jdk.vm.ci") : "JVMCI services must be loaded via " + Services.class.getName();
if (Java8OrEarlier) { if (Java8OrEarlier) {
return Services.load(service); return load8(service);
} }
ServiceLoader<S> iterable = ServiceLoader.load(service); Iterable<S> iterable = ServiceLoader.load(service);
return new Iterable<S>() { return new Iterable<S>() {
@Override @Override
public Iterator<S> iterator() { public Iterator<S> iterator() {
@ -66,8 +92,8 @@ public final class GraalServices {
@Override @Override
public S next() { public S next() {
S provider = iterator.next(); S provider = iterator.next();
// Allow Graal extensions to access JVMCI assuming they have JVMCIPermission // Allow Graal extensions to access JVMCI
Services.exportJVMCITo(provider.getClass()); openJVMCITo(provider.getClass());
return provider; return provider;
} }
@ -80,6 +106,23 @@ public final class GraalServices {
}; };
} }
/**
* {@code Services.load(Class)} is only defined in JVMCI-8.
*/
private static volatile Method loadMethod;
@SuppressWarnings("unchecked")
private static <S> Iterable<S> load8(Class<S> service) throws InternalError {
try {
if (loadMethod == null) {
loadMethod = Services.class.getMethod("load", Class.class);
}
return (Iterable<S>) loadMethod.invoke(null, service);
} catch (Exception e) {
throw new InternalError(e);
}
}
/** /**
* Gets the provider for a given service for which at most one provider must be available. * Gets the provider for a given service for which at most one provider must be available.
* *
@ -92,16 +135,14 @@ public final class GraalServices {
*/ */
public static <S> S loadSingle(Class<S> service, boolean required) { public static <S> S loadSingle(Class<S> service, boolean required) {
assert !service.getName().startsWith("jdk.vm.ci") : "JVMCI services must be loaded via " + Services.class.getName(); assert !service.getName().startsWith("jdk.vm.ci") : "JVMCI services must be loaded via " + Services.class.getName();
if (Java8OrEarlier) { Iterable<S> providers = load(service);
return Services.loadSingle(service, required);
}
Iterable<S> providers = ServiceLoader.load(service);
S singleProvider = null; S singleProvider = null;
try { try {
for (Iterator<S> it = providers.iterator(); it.hasNext();) { for (Iterator<S> it = providers.iterator(); it.hasNext();) {
singleProvider = it.next(); singleProvider = it.next();
if (it.hasNext()) { if (it.hasNext()) {
throw new InternalError(String.format("Multiple %s providers found", service.getName())); S other = it.next();
throw new InternalError(String.format("Multiple %s providers found: %s, %s", service.getName(), singleProvider.getClass().getName(), other.getClass().getName()));
} }
} }
} catch (ServiceConfigurationError e) { } catch (ServiceConfigurationError e) {
@ -111,9 +152,6 @@ public final class GraalServices {
if (required) { if (required) {
throw new InternalError(String.format("No provider for %s found", service.getName())); throw new InternalError(String.format("No provider for %s found", service.getName()));
} }
} else {
// Allow Graal extensions to access JVMCI assuming they have JVMCIPermission
Services.exportJVMCITo(singleProvider.getClass());
} }
return singleProvider; return singleProvider;
} }

View File

@ -0,0 +1,148 @@
/*
* Copyright (c) 2016, 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.
*/
package org.graalvm.compiler.serviceprovider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* Reflection based access to API introduced by JDK 9. This allows the API to be used in code that
* must be compiled on a JDK prior to 9.
*/
public final class JDK9Method {
private static int getJavaSpecificationVersion() {
String value = System.getProperty("java.specification.version");
if (value.startsWith("1.")) {
value = value.substring(2);
}
return Integer.parseInt(value);
}
/**
* The integer value corresponding to the value of the {@code java.specification.version} system
* property after any leading {@code "1."} has been stripped.
*/
public static final int JAVA_SPECIFICATION_VERSION = getJavaSpecificationVersion();
public JDK9Method(Class<?> declaringClass, String name, Class<?>... parameterTypes) {
try {
this.method = declaringClass.getMethod(name, parameterTypes);
} catch (Exception e) {
throw new InternalError(e);
}
}
/**
* Determines if the Java runtime is version 8 or earlier.
*/
public static final boolean Java8OrEarlier = JAVA_SPECIFICATION_VERSION <= 8;
public final Method method;
public Class<?> getReturnType() {
return method.getReturnType();
}
/**
* {@code Class.getModule()}.
*/
public static final JDK9Method getModule;
/**
* {@code java.lang.Module.getPackages()}.
*/
public static final JDK9Method getPackages;
/**
* {@code java.lang.Module.getResourceAsStream(String)}.
*/
public static final JDK9Method getResourceAsStream;
/**
* {@code java.lang.Module.addOpens(String, Module)}.
*/
public static final JDK9Method addOpens;
/**
* {@code java.lang.Module.isOpen(String, Module)}.
*/
public static final JDK9Method isOpenTo;
/**
* Invokes the static Module API method represented by this object.
*/
@SuppressWarnings("unchecked")
public <T> T invokeStatic(Object... args) {
checkAvailability();
assert Modifier.isStatic(method.getModifiers());
try {
return (T) method.invoke(null, args);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new InternalError(e);
}
}
/**
* Invokes the non-static Module API method represented by this object.
*/
@SuppressWarnings("unchecked")
public <T> T invoke(Object receiver, Object... args) {
checkAvailability();
assert !Modifier.isStatic(method.getModifiers());
try {
return (T) method.invoke(receiver, args);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new InternalError(e);
}
}
private void checkAvailability() throws InternalError {
if (method == null) {
throw new InternalError("Cannot use Module API on JDK " + JAVA_SPECIFICATION_VERSION);
}
}
static {
if (JAVA_SPECIFICATION_VERSION >= 9) {
getModule = new JDK9Method(Class.class, "getModule");
Class<?> moduleClass = getModule.getReturnType();
getPackages = new JDK9Method(moduleClass, "getPackages");
addOpens = new JDK9Method(moduleClass, "addOpens", String.class, moduleClass);
getResourceAsStream = new JDK9Method(moduleClass, "getResourceAsStream", String.class);
isOpenTo = new JDK9Method(moduleClass, "isOpen", String.class, moduleClass);
} else {
JDK9Method unavailable = new JDK9Method();
getModule = unavailable;
getPackages = unavailable;
addOpens = unavailable;
getResourceAsStream = unavailable;
isOpenTo = unavailable;
}
}
private JDK9Method() {
method = null;
}
}

View File

@ -96,6 +96,7 @@ public class JLModule {
} }
} }
@SuppressWarnings("unchecked")
public Set<String> getPackages() { public Set<String> getPackages() {
try { try {
return (Set<String>) getPackagesMethod.invoke(realModule); return (Set<String>) getPackagesMethod.invoke(realModule);

View File

@ -58,6 +58,7 @@ class CodeStub: public CompilationResourceObj {
virtual bool is_exception_throw_stub() const { return false; } virtual bool is_exception_throw_stub() const { return false; }
virtual bool is_range_check_stub() const { return false; } virtual bool is_range_check_stub() const { return false; }
virtual bool is_divbyzero_stub() const { return false; } virtual bool is_divbyzero_stub() const { return false; }
virtual bool is_simple_exception_stub() const { return false; }
#ifndef PRODUCT #ifndef PRODUCT
virtual void print_name(outputStream* out) const = 0; virtual void print_name(outputStream* out) const = 0;
#endif #endif
@ -483,6 +484,7 @@ class SimpleExceptionStub: public CodeStub {
virtual void emit_code(LIR_Assembler* e); virtual void emit_code(LIR_Assembler* e);
virtual CodeEmitInfo* info() const { return _info; } virtual CodeEmitInfo* info() const { return _info; }
virtual bool is_exception_throw_stub() const { return true; } virtual bool is_exception_throw_stub() const { return true; }
virtual bool is_simple_exception_stub() const { return true; }
virtual void visit(LIR_OpVisitState* visitor) { virtual void visit(LIR_OpVisitState* visitor) {
if (_obj->is_valid()) visitor->do_input(_obj); if (_obj->is_valid()) visitor->do_input(_obj);
visitor->do_slow_case(_info); visitor->do_slow_case(_info);

View File

@ -1829,6 +1829,20 @@ void GraphBuilder::invoke(Bytecodes::Code code) {
log->identify(target), log->identify(target),
Bytecodes::name(code)); Bytecodes::name(code));
// invoke-special-super
if (bc_raw == Bytecodes::_invokespecial && !target->is_object_initializer()) {
ciInstanceKlass* sender_klass =
calling_klass->is_anonymous() ? calling_klass->host_klass() :
calling_klass;
if (sender_klass->is_interface()) {
int index = state()->stack_size() - (target->arg_size_no_receiver() + 1);
Value receiver = state()->stack_at(index);
CheckCast* c = new CheckCast(sender_klass, receiver, copy_state_before());
c->set_invokespecial_receiver_check();
state()->stack_at_put(index, append_split(c));
}
}
// Some methods are obviously bindable without any type checks so // Some methods are obviously bindable without any type checks so
// convert them directly to an invokespecial or invokestatic. // convert them directly to an invokespecial or invokestatic.
if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) { if (target->is_loaded() && !target->is_abstract() && target->can_be_statically_bound()) {

View File

@ -372,6 +372,7 @@ class Instruction: public CompilationResourceObj {
UnorderedIsTrueFlag, UnorderedIsTrueFlag,
NeedsPatchingFlag, NeedsPatchingFlag,
ThrowIncompatibleClassChangeErrorFlag, ThrowIncompatibleClassChangeErrorFlag,
InvokeSpecialReceiverCheckFlag,
ProfileMDOFlag, ProfileMDOFlag,
IsLinkedInBlockFlag, IsLinkedInBlockFlag,
NeedsRangeCheckFlag, NeedsRangeCheckFlag,
@ -1454,6 +1455,16 @@ LEAF(CheckCast, TypeCheck)
bool is_incompatible_class_change_check() const { bool is_incompatible_class_change_check() const {
return check_flag(ThrowIncompatibleClassChangeErrorFlag); return check_flag(ThrowIncompatibleClassChangeErrorFlag);
} }
void set_invokespecial_receiver_check() {
set_flag(InvokeSpecialReceiverCheckFlag, true);
}
bool is_invokespecial_receiver_check() const {
return check_flag(InvokeSpecialReceiverCheckFlag);
}
virtual bool needs_exception_state() const {
return !is_invokespecial_receiver_check();
}
ciType* declared_type() const; ciType* declared_type() const;
}; };

View File

@ -595,6 +595,16 @@ ciInstanceKlass* ciInstanceKlass::implementor() {
return impl; return impl;
} }
ciInstanceKlass* ciInstanceKlass::host_klass() {
assert(is_loaded(), "must be loaded");
if (is_anonymous()) {
VM_ENTRY_MARK
Klass* host_klass = get_instanceKlass()->host_klass();
return CURRENT_ENV->get_instance_klass(host_klass);
}
return NULL;
}
// Utility class for printing of the contents of the static fields for // Utility class for printing of the contents of the static fields for
// use by compilation replay. It only prints out the information that // use by compilation replay. It only prints out the information that
// could be consumed by the compiler, so for primitive types it prints // could be consumed by the compiler, so for primitive types it prints

View File

@ -260,6 +260,8 @@ public:
return NULL; return NULL;
} }
ciInstanceKlass* host_klass();
bool can_be_instantiated() { bool can_be_instantiated() {
assert(is_loaded(), "must be loaded"); assert(is_loaded(), "must be loaded");
return !is_interface() && !is_abstract(); return !is_interface() && !is_abstract();

View File

@ -951,6 +951,13 @@ bool ciMethod::is_compiled_lambda_form() const {
return iid == vmIntrinsics::_compiledLambdaForm; return iid == vmIntrinsics::_compiledLambdaForm;
} }
// ------------------------------------------------------------------
// ciMethod::is_object_initializer
//
bool ciMethod::is_object_initializer() const {
return name() == ciSymbol::object_initializer_name();
}
// ------------------------------------------------------------------ // ------------------------------------------------------------------
// ciMethod::has_member_arg // ciMethod::has_member_arg
// //

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -337,6 +337,7 @@ class ciMethod : public ciMetadata {
bool has_reserved_stack_access() const { return _has_reserved_stack_access; } bool has_reserved_stack_access() const { return _has_reserved_stack_access; }
bool is_boxing_method() const; bool is_boxing_method() const;
bool is_unboxing_method() const; bool is_unboxing_method() const;
bool is_object_initializer() const;
// Replay data methods // Replay data methods
void dump_name_as_ascii(outputStream* st); void dump_name_as_ascii(outputStream* st);

View File

@ -720,7 +720,8 @@ void InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code byte
Thread* THREAD = thread; Thread* THREAD = thread;
// extract receiver from the outgoing argument list if necessary // extract receiver from the outgoing argument list if necessary
Handle receiver(thread, NULL); Handle receiver(thread, NULL);
if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface) { if (bytecode == Bytecodes::_invokevirtual || bytecode == Bytecodes::_invokeinterface ||
bytecode == Bytecodes::_invokespecial) {
ResourceMark rm(thread); ResourceMark rm(thread);
methodHandle m (thread, method(thread)); methodHandle m (thread, method(thread));
Bytecode_invoke call(m, bci(thread)); Bytecode_invoke call(m, bci(thread));
@ -783,16 +784,25 @@ void InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code byte
int index = info.resolved_method()->itable_index(); int index = info.resolved_method()->itable_index();
assert(info.itable_index() == index, ""); assert(info.itable_index() == index, "");
} }
} else if (bytecode == Bytecodes::_invokespecial) {
assert(info.call_kind() == CallInfo::direct_call, "must be direct call");
} else { } else {
assert(info.call_kind() == CallInfo::direct_call || assert(info.call_kind() == CallInfo::direct_call ||
info.call_kind() == CallInfo::vtable_call, ""); info.call_kind() == CallInfo::vtable_call, "");
} }
#endif #endif
// Get sender or sender's host_klass, and only set cpCache entry to resolved if
// it is not an interface. The receiver for invokespecial calls within interface
// methods must be checked for every call.
InstanceKlass* sender = pool->pool_holder();
sender = sender->is_anonymous() ? sender->host_klass() : sender;
switch (info.call_kind()) { switch (info.call_kind()) {
case CallInfo::direct_call: case CallInfo::direct_call:
cp_cache_entry->set_direct_call( cp_cache_entry->set_direct_call(
bytecode, bytecode,
info.resolved_method()); info.resolved_method(),
sender->is_interface());
break; break;
case CallInfo::vtable_call: case CallInfo::vtable_call:
cp_cache_entry->set_vtable_call( cp_cache_entry->set_vtable_call(

View File

@ -1057,12 +1057,14 @@ methodHandle LinkResolver::linktime_resolve_static_method(const LinkInfo& link_i
void LinkResolver::resolve_special_call(CallInfo& result, void LinkResolver::resolve_special_call(CallInfo& result,
Handle recv,
const LinkInfo& link_info, const LinkInfo& link_info,
TRAPS) { TRAPS) {
methodHandle resolved_method = linktime_resolve_special_method(link_info, CHECK); methodHandle resolved_method = linktime_resolve_special_method(link_info, CHECK);
runtime_resolve_special_method(result, resolved_method, runtime_resolve_special_method(result, resolved_method,
link_info.resolved_klass(), link_info.resolved_klass(),
link_info.current_klass(), link_info.current_klass(),
recv,
link_info.check_access(), CHECK); link_info.check_access(), CHECK);
} }
@ -1149,6 +1151,7 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result,
const methodHandle& resolved_method, const methodHandle& resolved_method,
KlassHandle resolved_klass, KlassHandle resolved_klass,
KlassHandle current_klass, KlassHandle current_klass,
Handle recv,
bool check_access, TRAPS) { bool check_access, TRAPS) {
// resolved method is selected method unless we have an old-style lookup // resolved method is selected method unless we have an old-style lookup
@ -1157,21 +1160,19 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result,
// no checks for shadowing // no checks for shadowing
methodHandle sel_method(THREAD, resolved_method()); methodHandle sel_method(THREAD, resolved_method());
// check if this is an old-style super call and do a new lookup if so if (check_access &&
{ KlassHandle method_klass = KlassHandle(THREAD, // check if the method is not <init>
resolved_method->method_holder()); resolved_method->name() != vmSymbols::object_initializer_name()) {
if (check_access && // check if this is an old-style super call and do a new lookup if so
// a) check if ACC_SUPER flag is set for the current class // a) check if ACC_SUPER flag is set for the current class
(current_klass->is_super() || !AllowNonVirtualCalls) && if ((current_klass->is_super() || !AllowNonVirtualCalls) &&
// b) check if the class of the resolved_klass is a superclass // b) check if the class of the resolved_klass is a superclass
// (not supertype in order to exclude interface classes) of the current class. // (not supertype in order to exclude interface classes) of the current class.
// This check is not performed for super.invoke for interface methods // This check is not performed for super.invoke for interface methods
// in super interfaces. // in super interfaces.
current_klass->is_subclass_of(resolved_klass()) && current_klass->is_subclass_of(resolved_klass()) &&
current_klass() != resolved_klass() && current_klass() != resolved_klass()) {
// c) check if the method is not <init>
resolved_method->name() != vmSymbols::object_initializer_name()) {
// Lookup super method // Lookup super method
KlassHandle super_klass(THREAD, current_klass->super()); KlassHandle super_klass(THREAD, current_klass->super());
sel_method = lookup_instance_method_in_klasses(super_klass, sel_method = lookup_instance_method_in_klasses(super_klass,
@ -1186,6 +1187,27 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result,
resolved_method->signature())); resolved_method->signature()));
} }
} }
// Check that the class of objectref (the receiver) is the current class or interface,
// or a subtype of the current class or interface (the sender), otherwise invokespecial
// throws IllegalAccessError.
// The verifier checks that the sender is a subtype of the class in the I/MR operand.
// The verifier also checks that the receiver is a subtype of the sender, if the sender is
// a class. If the sender is an interface, the check has to be performed at runtime.
InstanceKlass* sender = InstanceKlass::cast(current_klass());
sender = sender->is_anonymous() ? sender->host_klass() : sender;
if (sender->is_interface() && recv.not_null()) {
Klass* receiver_klass = recv->klass();
if (!receiver_klass->is_subtype_of(sender)) {
ResourceMark rm(THREAD);
char buf[500];
jio_snprintf(buf, sizeof(buf),
"Receiver class %s must be the current class or a subtype of interface %s",
receiver_klass->name()->as_C_string(),
sender->name()->as_C_string());
THROW_MSG(vmSymbols::java_lang_IllegalAccessError(), buf);
}
}
} }
// check if not static // check if not static
@ -1518,7 +1540,7 @@ methodHandle LinkResolver::resolve_static_call_or_null(const LinkInfo& link_info
methodHandle LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) { methodHandle LinkResolver::resolve_special_call_or_null(const LinkInfo& link_info) {
EXCEPTION_MARK; EXCEPTION_MARK;
CallInfo info; CallInfo info;
resolve_special_call(info, link_info, THREAD); resolve_special_call(info, Handle(), link_info, THREAD);
if (HAS_PENDING_EXCEPTION) { if (HAS_PENDING_EXCEPTION) {
CLEAR_PENDING_EXCEPTION; CLEAR_PENDING_EXCEPTION;
return methodHandle(); return methodHandle();
@ -1534,7 +1556,7 @@ methodHandle LinkResolver::resolve_special_call_or_null(const LinkInfo& link_inf
void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) { void LinkResolver::resolve_invoke(CallInfo& result, Handle recv, const constantPoolHandle& pool, int index, Bytecodes::Code byte, TRAPS) {
switch (byte) { switch (byte) {
case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break; case Bytecodes::_invokestatic : resolve_invokestatic (result, pool, index, CHECK); break;
case Bytecodes::_invokespecial : resolve_invokespecial (result, pool, index, CHECK); break; case Bytecodes::_invokespecial : resolve_invokespecial (result, recv, pool, index, CHECK); break;
case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break; case Bytecodes::_invokevirtual : resolve_invokevirtual (result, recv, pool, index, CHECK); break;
case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break; case Bytecodes::_invokehandle : resolve_invokehandle (result, pool, index, CHECK); break;
case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break; case Bytecodes::_invokedynamic : resolve_invokedynamic (result, pool, index, CHECK); break;
@ -1563,7 +1585,7 @@ void LinkResolver::resolve_invoke(CallInfo& result, Handle& recv,
resolve_static_call(result, link_info, /*initialize_class=*/false, CHECK); resolve_static_call(result, link_info, /*initialize_class=*/false, CHECK);
break; break;
case Bytecodes::_invokespecial: case Bytecodes::_invokespecial:
resolve_special_call(result, link_info, CHECK); resolve_special_call(result, recv, link_info, CHECK);
break; break;
default: default:
fatal("bad call: %s", Bytecodes::name(byte)); fatal("bad call: %s", Bytecodes::name(byte));
@ -1576,9 +1598,10 @@ void LinkResolver::resolve_invokestatic(CallInfo& result, const constantPoolHand
} }
void LinkResolver::resolve_invokespecial(CallInfo& result, const constantPoolHandle& pool, int index, TRAPS) { void LinkResolver::resolve_invokespecial(CallInfo& result, Handle recv,
const constantPoolHandle& pool, int index, TRAPS) {
LinkInfo link_info(pool, index, CHECK); LinkInfo link_info(pool, index, CHECK);
resolve_special_call(result, link_info, CHECK); resolve_special_call(result, recv, link_info, CHECK);
} }

View File

@ -230,6 +230,7 @@ class LinkResolver: AllStatic {
const methodHandle& resolved_method, const methodHandle& resolved_method,
KlassHandle resolved_klass, KlassHandle resolved_klass,
KlassHandle current_klass, KlassHandle current_klass,
Handle recv,
bool check_access, TRAPS); bool check_access, TRAPS);
static void runtime_resolve_virtual_method (CallInfo& result, static void runtime_resolve_virtual_method (CallInfo& result,
const methodHandle& resolved_method, const methodHandle& resolved_method,
@ -256,7 +257,7 @@ class LinkResolver: AllStatic {
// runtime resolving from constant pool // runtime resolving from constant pool
static void resolve_invokestatic (CallInfo& result, static void resolve_invokestatic (CallInfo& result,
const constantPoolHandle& pool, int index, TRAPS); const constantPoolHandle& pool, int index, TRAPS);
static void resolve_invokespecial (CallInfo& result, static void resolve_invokespecial (CallInfo& result, Handle recv,
const constantPoolHandle& pool, int index, TRAPS); const constantPoolHandle& pool, int index, TRAPS);
static void resolve_invokevirtual (CallInfo& result, Handle recv, static void resolve_invokevirtual (CallInfo& result, Handle recv,
const constantPoolHandle& pool, int index, TRAPS); const constantPoolHandle& pool, int index, TRAPS);
@ -289,6 +290,7 @@ class LinkResolver: AllStatic {
const LinkInfo& link_info, const LinkInfo& link_info,
bool initialize_klass, TRAPS); bool initialize_klass, TRAPS);
static void resolve_special_call (CallInfo& result, static void resolve_special_call (CallInfo& result,
Handle recv,
const LinkInfo& link_info, const LinkInfo& link_info,
TRAPS); TRAPS);
static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass, static void resolve_virtual_call (CallInfo& result, Handle recv, KlassHandle recv_klass,

View File

@ -140,7 +140,8 @@ void ConstantPoolCacheEntry::set_parameter_size(int value) {
void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_code, void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_code,
methodHandle method, methodHandle method,
int vtable_index) { int vtable_index,
bool sender_is_interface) {
bool is_vtable_call = (vtable_index >= 0); // FIXME: split this method on this boolean bool is_vtable_call = (vtable_index >= 0); // FIXME: split this method on this boolean
assert(method->interpreter_entry() != NULL, "should have been set at this point"); assert(method->interpreter_entry() != NULL, "should have been set at this point");
assert(!method->is_obsolete(), "attempt to write obsolete method to cpCache"); assert(!method->is_obsolete(), "attempt to write obsolete method to cpCache");
@ -204,7 +205,13 @@ void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_co
if (byte_no == 1) { if (byte_no == 1) {
assert(invoke_code != Bytecodes::_invokevirtual && assert(invoke_code != Bytecodes::_invokevirtual &&
invoke_code != Bytecodes::_invokeinterface, ""); invoke_code != Bytecodes::_invokeinterface, "");
// Don't mark invokespecial to method as resolved if sender is an interface. The receiver
// has to be checked that it is a subclass of the current class every time this bytecode
// is executed.
if (invoke_code != Bytecodes::_invokespecial || !sender_is_interface ||
method->name() == vmSymbols::object_initializer_name()) {
set_bytecode_1(invoke_code); set_bytecode_1(invoke_code);
}
} else if (byte_no == 2) { } else if (byte_no == 2) {
if (change_to_virtual) { if (change_to_virtual) {
assert(invoke_code == Bytecodes::_invokeinterface, ""); assert(invoke_code == Bytecodes::_invokeinterface, "");
@ -234,17 +241,18 @@ void ConstantPoolCacheEntry::set_direct_or_vtable_call(Bytecodes::Code invoke_co
NOT_PRODUCT(verify(tty)); NOT_PRODUCT(verify(tty));
} }
void ConstantPoolCacheEntry::set_direct_call(Bytecodes::Code invoke_code, methodHandle method) { void ConstantPoolCacheEntry::set_direct_call(Bytecodes::Code invoke_code, methodHandle method,
bool sender_is_interface) {
int index = Method::nonvirtual_vtable_index; int index = Method::nonvirtual_vtable_index;
// index < 0; FIXME: inline and customize set_direct_or_vtable_call // index < 0; FIXME: inline and customize set_direct_or_vtable_call
set_direct_or_vtable_call(invoke_code, method, index); set_direct_or_vtable_call(invoke_code, method, index, sender_is_interface);
} }
void ConstantPoolCacheEntry::set_vtable_call(Bytecodes::Code invoke_code, methodHandle method, int index) { void ConstantPoolCacheEntry::set_vtable_call(Bytecodes::Code invoke_code, methodHandle method, int index) {
// either the method is a miranda or its holder should accept the given index // either the method is a miranda or its holder should accept the given index
assert(method->method_holder()->is_interface() || method->method_holder()->verify_vtable_index(index), ""); assert(method->method_holder()->is_interface() || method->method_holder()->verify_vtable_index(index), "");
// index >= 0; FIXME: inline and customize set_direct_or_vtable_call // index >= 0; FIXME: inline and customize set_direct_or_vtable_call
set_direct_or_vtable_call(invoke_code, method, index); set_direct_or_vtable_call(invoke_code, method, index, false);
} }
void ConstantPoolCacheEntry::set_itable_call(Bytecodes::Code invoke_code, const methodHandle& method, int index) { void ConstantPoolCacheEntry::set_itable_call(Bytecodes::Code invoke_code, const methodHandle& method, int index) {

View File

@ -230,13 +230,15 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
void set_direct_or_vtable_call( void set_direct_or_vtable_call(
Bytecodes::Code invoke_code, // the bytecode used for invoking the method Bytecodes::Code invoke_code, // the bytecode used for invoking the method
methodHandle method, // the method/prototype if any (NULL, otherwise) methodHandle method, // the method/prototype if any (NULL, otherwise)
int vtable_index // the vtable index if any, else negative int vtable_index, // the vtable index if any, else negative
bool sender_is_interface
); );
public: public:
void set_direct_call( // sets entry to exact concrete method entry void set_direct_call( // sets entry to exact concrete method entry
Bytecodes::Code invoke_code, // the bytecode used for invoking the method Bytecodes::Code invoke_code, // the bytecode used for invoking the method
methodHandle method // the method to call methodHandle method, // the method to call
bool sender_is_interface
); );
void set_vtable_call( // sets entry to vtable index void set_vtable_call( // sets entry to vtable index

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -505,6 +505,30 @@ void Parse::do_call() {
speculative_receiver_type = receiver_type != NULL ? receiver_type->speculative_type() : NULL; speculative_receiver_type = receiver_type != NULL ? receiver_type->speculative_type() : NULL;
} }
// invoke-super-special
if (iter().cur_bc_raw() == Bytecodes::_invokespecial && !orig_callee->is_object_initializer()) {
ciInstanceKlass* calling_klass = method()->holder();
ciInstanceKlass* sender_klass =
calling_klass->is_anonymous() ? calling_klass->host_klass() :
calling_klass;
if (sender_klass->is_interface()) {
Node* receiver_node = stack(sp() - nargs);
Node* cls_node = makecon(TypeKlassPtr::make(sender_klass));
Node* bad_type_ctrl = NULL;
Node* casted_receiver = gen_checkcast(receiver_node, cls_node, &bad_type_ctrl);
if (bad_type_ctrl != NULL) {
PreserveJVMState pjvms(this);
set_control(bad_type_ctrl);
uncommon_trap(Deoptimization::Reason_class_check,
Deoptimization::Action_none);
}
if (stopped()) {
return; // MUST uncommon-trap?
}
set_stack(sp() - nargs, casted_receiver);
}
}
// Note: It's OK to try to inline a virtual call. // Note: It's OK to try to inline a virtual call.
// The call generator will not attempt to inline a polymorphic call // The call generator will not attempt to inline a polymorphic call
// unless it knows how to optimize the receiver dispatch. // unless it knows how to optimize the receiver dispatch.

View File

@ -61,6 +61,15 @@ const TypePtr *MemNode::adr_type() const {
return calculate_adr_type(adr->bottom_type(), cross_check); return calculate_adr_type(adr->bottom_type(), cross_check);
} }
bool MemNode::check_if_adr_maybe_raw(Node* adr) {
if (adr != NULL) {
if (adr->bottom_type()->base() == Type::RawPtr || adr->bottom_type()->base() == Type::AnyPtr) {
return true;
}
}
return false;
}
#ifndef PRODUCT #ifndef PRODUCT
void MemNode::dump_spec(outputStream *st) const { void MemNode::dump_spec(outputStream *st) const {
if (in(Address) == NULL) return; // node is dead if (in(Address) == NULL) return; // node is dead
@ -560,6 +569,7 @@ Node* MemNode::find_previous_store(PhaseTransform* phase) {
if (offset == Type::OffsetBot) if (offset == Type::OffsetBot)
return NULL; // cannot unalias unless there are precise offsets return NULL; // cannot unalias unless there are precise offsets
const bool adr_maybe_raw = check_if_adr_maybe_raw(adr);
const TypeOopPtr *addr_t = adr->bottom_type()->isa_oopptr(); const TypeOopPtr *addr_t = adr->bottom_type()->isa_oopptr();
intptr_t size_in_bytes = memory_size(); intptr_t size_in_bytes = memory_size();
@ -577,6 +587,13 @@ Node* MemNode::find_previous_store(PhaseTransform* phase) {
Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, phase, st_offset); Node* st_base = AddPNode::Ideal_base_and_offset(st_adr, phase, st_offset);
if (st_base == NULL) if (st_base == NULL)
break; // inscrutable pointer break; // inscrutable pointer
// For raw accesses it's not enough to prove that constant offsets don't intersect.
// We need the bases to be the equal in order for the offset check to make sense.
if ((adr_maybe_raw || check_if_adr_maybe_raw(st_adr)) && st_base != base) {
break;
}
if (st_offset != offset && st_offset != Type::OffsetBot) { if (st_offset != offset && st_offset != Type::OffsetBot) {
const int MAX_STORE = BytesPerLong; const int MAX_STORE = BytesPerLong;
if (st_offset >= offset + size_in_bytes || if (st_offset >= offset + size_in_bytes ||

View File

@ -78,6 +78,7 @@ protected:
} }
virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const { return NULL; } virtual Node* find_previous_arraycopy(PhaseTransform* phase, Node* ld_alloc, Node*& mem, bool can_see_stored_value) const { return NULL; }
static bool check_if_adr_maybe_raw(Node* adr);
public: public:
// Helpers for the optimizer. Documented in memnode.cpp. // Helpers for the optimizer. Documented in memnode.cpp.

View File

@ -727,7 +727,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS
assert(!is_signature_polymorphic_static(mh_invoke_id), ""); assert(!is_signature_polymorphic_static(mh_invoke_id), "");
LinkResolver::resolve_handle_call(result, link_info, THREAD); LinkResolver::resolve_handle_call(result, link_info, THREAD);
} else if (ref_kind == JVM_REF_invokeSpecial) { } else if (ref_kind == JVM_REF_invokeSpecial) {
LinkResolver::resolve_special_call(result, LinkResolver::resolve_special_call(result, Handle(),
link_info, THREAD); link_info, THREAD);
} else if (ref_kind == JVM_REF_invokeVirtual) { } else if (ref_kind == JVM_REF_invokeVirtual) {
LinkResolver::resolve_virtual_call(result, Handle(), defc, LinkResolver::resolve_virtual_call(result, Handle(), defc,
@ -755,7 +755,7 @@ Handle MethodHandles::resolve_MemberName(Handle mname, KlassHandle caller, TRAPS
{ {
assert(!HAS_PENDING_EXCEPTION, ""); assert(!HAS_PENDING_EXCEPTION, "");
if (name == vmSymbols::object_initializer_name()) { if (name == vmSymbols::object_initializer_name()) {
LinkResolver::resolve_special_call(result, link_info, THREAD); LinkResolver::resolve_special_call(result, Handle(), link_info, THREAD);
} else { } else {
break; // will throw after end of switch break; // will throw after end of switch
} }

View File

@ -375,6 +375,7 @@ static SpecialFlag const special_jvm_flags[] = {
// -------------- Deprecated Flags -------------- // -------------- Deprecated Flags --------------
// --- Non-alias flags - sorted by obsolete_in then expired_in: // --- Non-alias flags - sorted by obsolete_in then expired_in:
{ "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, { "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() },
{ "UseConcMarkSweepGC", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::undefined() },
// --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in: // --- Deprecated alias flags (see also aliased_jvm_flags) - sorted by obsolete_in then expired_in:
{ "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() }, { "DefaultMaxRAMFraction", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() },
@ -2240,8 +2241,6 @@ jint Arguments::set_aggressive_heap_flags() {
if (FLAG_SET_CMDLINE(bool, UseParallelGC, true) != Flag::SUCCESS) { if (FLAG_SET_CMDLINE(bool, UseParallelGC, true) != Flag::SUCCESS) {
return JNI_EINVAL; return JNI_EINVAL;
} }
FLAG_SET_DEFAULT(ParallelGCThreads,
Abstract_VM_Version::parallel_worker_threads());
// Encourage steady state memory management // Encourage steady state memory management
if (FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100) != Flag::SUCCESS) { if (FLAG_SET_CMDLINE(uintx, ThresholdTolerance, 100) != Flag::SUCCESS) {
@ -2440,6 +2439,9 @@ bool Arguments::check_vm_args_consistency() {
status = status && check_jvmci_args_consistency(); status = status && check_jvmci_args_consistency();
if (EnableJVMCI) { if (EnableJVMCI) {
PropertyList_unique_add(&_system_properties, "jdk.internal.vm.ci.enabled", "true",
AddProperty, UnwriteableProperty, InternalProperty);
if (!ScavengeRootsInCode) { if (!ScavengeRootsInCode) {
warning("forcing ScavengeRootsInCode non-zero because JVMCI is enabled"); warning("forcing ScavengeRootsInCode non-zero because JVMCI is enabled");
ScavengeRootsInCode = 1; ScavengeRootsInCode = 1;

View File

@ -221,7 +221,7 @@ void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spe
void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) { void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
CallInfo callinfo; CallInfo callinfo;
LinkInfo link_info(klass, name, signature); LinkInfo link_info(klass, name, signature);
LinkResolver::resolve_special_call(callinfo, link_info, CHECK); LinkResolver::resolve_special_call(callinfo, args->receiver(), link_info, CHECK);
methodHandle method = callinfo.selected_method(); methodHandle method = callinfo.selected_method();
assert(method.not_null(), "should have thrown exception"); assert(method.not_null(), "should have thrown exception");

View File

@ -199,6 +199,7 @@ typedef Hashtable<Klass*, mtClass> KlassHashtable;
typedef HashtableEntry<Klass*, mtClass> KlassHashtableEntry; typedef HashtableEntry<Klass*, mtClass> KlassHashtableEntry;
typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable; typedef TwoOopHashtable<Symbol*, mtClass> SymbolTwoOopHashtable;
typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable; typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
typedef RehashableHashtable<Symbol*, mtSymbol> RehashableSymbolHashtable;
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
// VM_STRUCTS // VM_STRUCTS
@ -584,6 +585,7 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
\ \
static_field(SymbolTable, _the_table, SymbolTable*) \ static_field(SymbolTable, _the_table, SymbolTable*) \
static_field(SymbolTable, _shared_table, SymbolCompactHashTable) \ static_field(SymbolTable, _shared_table, SymbolCompactHashTable) \
static_field(RehashableSymbolHashtable, _seed, juint) \
\ \
/***************/ \ /***************/ \
/* StringTable */ \ /* StringTable */ \
@ -1602,6 +1604,8 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
\ \
declare_toplevel_type(BasicHashtable<mtInternal>) \ declare_toplevel_type(BasicHashtable<mtInternal>) \
declare_type(IntptrHashtable, BasicHashtable<mtInternal>) \ declare_type(IntptrHashtable, BasicHashtable<mtInternal>) \
declare_toplevel_type(BasicHashtable<mtSymbol>) \
declare_type(RehashableSymbolHashtable, BasicHashtable<mtSymbol>) \
declare_type(SymbolTable, SymbolHashtable) \ declare_type(SymbolTable, SymbolHashtable) \
declare_type(StringTable, StringHashtable) \ declare_type(StringTable, StringHashtable) \
declare_type(LoaderConstraintTable, KlassHashtable) \ declare_type(LoaderConstraintTable, KlassHashtable) \

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -294,6 +294,7 @@ protected:
}; };
template <class T, MEMFLAGS F> class RehashableHashtable : public Hashtable<T, F> { template <class T, MEMFLAGS F> class RehashableHashtable : public Hashtable<T, F> {
friend class VMStructs;
protected: protected:
enum { enum {

View File

@ -59,3 +59,6 @@ external.lib.roots = ../../
# Use new module options # Use new module options
useNewOptions=true useNewOptions=true
# Use --patch-module instead of -Xmodule:
useNewPatchModule=true

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -36,7 +36,22 @@ import java.util.zip.CRC32;
import java.util.zip.Checksum; import java.util.zip.Checksum;
public class TestCRC32 { public class TestCRC32 {
public static void main(String[] args) { // standard CRC32 polynomial
// coefficients in different forms
// normal: polyBits = 0x04c11db7 = 0b0000 0100 1100 0001 0001 1101 1011 0111
// reversed: polybits = 0xedb88320 = 0b1110 1101 1011 1000 1000 0011 0010 0000
// reversed reciprocal polybits = 0x82608edb = 0b1000 0010 0110 0000 1000 1110 1101 1011
//
// 0 5 9 13 17 21 25 29
// | | | | | | | |
// reversed shiftL 1 polyBits = 0x1db710641L = 0b1 1101 1011 0111 0001 0000 0110 0100 0001
final static long polyBits = (1L<<(32-32)) + (1L<<(32-26)) + (1L<<(32-23)) + (1L<<(32-22))
+ (1L<<(32-16)) + (1L<<(32-12)) + (1L<<(32-11)) + (1L<<(32-10))
+ (1L<<(32-8)) + (1L<<(32-7)) + (1L<<(32-5)) + (1L<<(32-4))
+ (1L<<(32-2)) + (1L<<(32-1)) + (1L<<(32-0));
final static long polyBitsShifted = polyBits>>1;
public static void main(String[] args) throws Exception {
int offset = Integer.getInteger("offset", 0); int offset = Integer.getInteger("offset", 0);
int msgSize = Integer.getInteger("msgSize", 512); int msgSize = Integer.getInteger("msgSize", 512);
boolean multi = false; boolean multi = false;
@ -65,11 +80,14 @@ public class TestCRC32 {
byte[] b = initializedBytes(msgSize, offset); byte[] b = initializedBytes(msgSize, offset);
final long crcReference = update_byteLoop(0, b, offset);
CRC32 crc0 = new CRC32(); CRC32 crc0 = new CRC32();
CRC32 crc1 = new CRC32(); CRC32 crc1 = new CRC32();
CRC32 crc2 = new CRC32(); CRC32 crc2 = new CRC32();
crc0.update(b, offset, msgSize); crc0.update(b, offset, msgSize);
check(crc0, crcReference);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
@ -77,27 +95,35 @@ public class TestCRC32 {
for (int i = 0; i < warmupIters; i++) { for (int i = 0; i < warmupIters; i++) {
crc1.reset(); crc1.reset();
crc1.update(b, offset, msgSize); crc1.update(b, offset, msgSize);
check(crc1, crcReference);
} }
/* measure performance */ /* check correctness
* Do that before measuring performance
* to even better heat up involved methods.
*/
for (int i = 0; i < iters; i++) {
crc1.reset();
crc1.update(b, offset, msgSize);
check(crc1, crcReference);
}
report("CRCs", crc1, crcReference);
/* measure performance
* Don't spoil times with error checking.
*/
long start = System.nanoTime(); long start = System.nanoTime();
for (int i = 0; i < iters; i++) { for (int i = 0; i < iters; i++) {
crc1.reset(); crc1.reset();
crc1.update(b, offset, msgSize); crc1.update(b, offset, msgSize);
} }
long end = System.nanoTime(); long end = System.nanoTime();
double total = (double)(end - start)/1e9; // in seconds double total = (double)(end - start)/1e9; // in seconds
double thruput = (double)msgSize*iters/1e6/total; // in MB/s double thruput = (double)msgSize*iters/1e6/total; // in MB/s
System.out.println("CRC32.update(byte[]) runtime = " + total + " seconds"); System.out.println("CRC32.update(byte[]) runtime = " + total + " seconds");
System.out.println("CRC32.update(byte[]) throughput = " + thruput + " MB/s"); System.out.println("CRC32.update(byte[]) throughput = " + thruput + " MB/s");
report("CRCs", crc1, crcReference);
/* check correctness */
for (int i = 0; i < iters; i++) {
crc1.reset();
crc1.update(b, offset, msgSize);
if (!check(crc0, crc1)) break;
}
report("CRCs", crc0, crc1);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
@ -110,9 +136,24 @@ public class TestCRC32 {
crc2.reset(); crc2.reset();
crc2.update(buf); crc2.update(buf);
buf.rewind(); buf.rewind();
check(crc2, crcReference);
} }
/* measure performance */ /* check correctness
* Do that before measuring performance
* to even better heat up involved methods.
*/
for (int i = 0; i < iters; i++) {
crc2.reset();
crc2.update(buf);
buf.rewind();
check(crc2, crcReference);
}
report("CRCs", crc2, crcReference);
/* measure performance
* Don't spoil times with error checking.
*/
start = System.nanoTime(); start = System.nanoTime();
for (int i = 0; i < iters; i++) { for (int i = 0; i < iters; i++) {
crc2.reset(); crc2.reset();
@ -124,31 +165,57 @@ public class TestCRC32 {
thruput = (double)msgSize*iters/1e6/total; // in MB/s thruput = (double)msgSize*iters/1e6/total; // in MB/s
System.out.println("CRC32.update(ByteBuffer) runtime = " + total + " seconds"); System.out.println("CRC32.update(ByteBuffer) runtime = " + total + " seconds");
System.out.println("CRC32.update(ByteBuffer) throughput = " + thruput + " MB/s"); System.out.println("CRC32.update(ByteBuffer) throughput = " + thruput + " MB/s");
report("CRCs", crc2, crcReference);
/* check correctness */
for (int i = 0; i < iters; i++) {
crc2.reset();
crc2.update(buf);
buf.rewind();
if (!check(crc0, crc2)) break;
}
report("CRCs", crc0, crc2);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
} }
private static void report(String s, Checksum crc0, Checksum crc1) { // Just a loop over a byte array, updating the CRC byte by byte.
System.out.printf("%s: crc0 = %08x, crc1 = %08x\n", public static long update_byteLoop(long crc, byte[] buf, int offset) {
s, crc0.getValue(), crc1.getValue()); return update_byteLoop(crc, buf, offset, buf.length-offset);
} }
private static boolean check(Checksum crc0, Checksum crc1) { // Just a loop over a byte array, with given length, updating the CRC byte by byte.
if (crc0.getValue() != crc1.getValue()) { public static long update_byteLoop(long crc, byte[] buf, int offset, int length) {
System.err.printf("ERROR: crc0 = %08x, crc1 = %08x\n", int end = length+offset;
crc0.getValue(), crc1.getValue()); for (int i = offset; i < end; i++) {
return false; crc = update_singlebyte(crc, polyBitsShifted, buf[i]);
}
return crc;
}
// Straight-forward implementation of CRC update by one byte.
// We use this very basic implementation to calculate reference
// results. It is necessary to have full control over how the
// reference results are calculated. It is not sufficient to rely
// on the interpreter (or c1, or c2) to do the right thing.
public static long update_singlebyte(long crc, long polynomial, int val) {
crc = (crc ^ -1L) & 0x00000000ffffffffL; // use 1's complement of crc
crc = crc ^ (val&0xff); // XOR in next byte from stream
for (int i = 0; i < 8; i++) {
boolean bitset = (crc & 0x01L) != 0;
crc = crc>>1;
if (bitset) {
crc = crc ^ polynomial;
crc = crc & 0x00000000ffffffffL;
}
}
crc = (crc ^ -1L) & 0x00000000ffffffffL; // revert taking 1's complement
return crc;
}
private static void report(String s, Checksum crc, long crcReference) {
System.out.printf("%s: crc = %08x, crcReference = %08x\n",
s, crc.getValue(), crcReference);
}
private static void check(Checksum crc, long crcReference) throws Exception {
if (crc.getValue() != crcReference) {
System.err.printf("ERROR: crc = %08x, crcReference = %08x\n",
crc.getValue(), crcReference);
throw new Exception("TestCRC32 Error");
} }
return true;
} }
private static byte[] initializedBytes(int M, int offset) { private static byte[] initializedBytes(int M, int offset) {
@ -162,7 +229,7 @@ public class TestCRC32 {
return bytes; return bytes;
} }
private static void test_multi(int iters) { private static void test_multi(int iters) throws Exception {
int len1 = 8; // the 8B/iteration loop int len1 = 8; // the 8B/iteration loop
int len2 = 32; // the 32B/iteration loop int len2 = 32; // the 32B/iteration loop
int len3 = 4096; // the 4KB/iteration loop int len3 = 4096; // the 4KB/iteration loop
@ -185,37 +252,31 @@ public class TestCRC32 {
(len1+len2+len3)*2+5, (len1+len2+len3)*2+7, (len1+len2+len3)*2+5, (len1+len2+len3)*2+7,
(len1+len2+len3)*3, (len1+len2+len3)*3-1, (len1+len2+len3)*3-3, (len1+len2+len3)*3, (len1+len2+len3)*3-1, (len1+len2+len3)*3-3,
(len1+len2+len3)*3-5, (len1+len2+len3)*3-7 }; (len1+len2+len3)*3-5, (len1+len2+len3)*3-7 };
CRC32[] crc0 = new CRC32[offsets.length*sizes.length];
CRC32[] crc1 = new CRC32[offsets.length*sizes.length]; CRC32[] crc1 = new CRC32[offsets.length*sizes.length];
long[] crcReference = new long[offsets.length*sizes.length];
int i, j, k; int i, j, k;
System.out.printf("testing %d cases ...\n", offsets.length*sizes.length); System.out.printf("testing %d cases ...\n", offsets.length*sizes.length);
/* set the result from interpreter as reference */ // Initialize CRC32 result arrays, CRC32 reference array.
// Reference is calculated using a very basic Java implementation.
for (i = 0; i < offsets.length; i++) { for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) { for (j = 0; j < sizes.length; j++) {
crc0[i*sizes.length + j] = new CRC32();
crc1[i*sizes.length + j] = new CRC32(); crc1[i*sizes.length + j] = new CRC32();
crc0[i*sizes.length + j].update(b, offsets[i], sizes[j]); crcReference[i*sizes.length + j] = update_byteLoop(0, b, offsets[i], sizes[j]);
} }
} }
/* warm up the JIT compiler and get result */ // Warm up the JIT compiler. Over time, all methods involved will
// be executed by the interpreter, then get compiled by c1 and
// finally by c2. Each calculated CRC value must, in each iteration,
// be equal to the precalculated reference value for the test to pass.
for (k = 0; k < iters; k++) { for (k = 0; k < iters; k++) {
for (i = 0; i < offsets.length; i++) { for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) { for (j = 0; j < sizes.length; j++) {
crc1[i*sizes.length + j].reset(); crc1[i*sizes.length + j].reset();
crc1[i*sizes.length + j].update(b, offsets[i], sizes[j]); crc1[i*sizes.length + j].update(b, offsets[i], sizes[j]);
} check(crc1[i*sizes.length + j], crcReference[i*sizes.length + j]);
}
}
/* check correctness */
for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) {
if (!check(crc0[i*sizes.length + j], crc1[i*sizes.length + j])) {
System.out.printf("offsets[%d] = %d", i, offsets[i]);
System.out.printf("\tsizes[%d] = %d\n", j, sizes[j]);
} }
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -36,7 +36,23 @@ import java.util.zip.CRC32C;
import java.util.zip.Checksum; import java.util.zip.Checksum;
public class TestCRC32C { public class TestCRC32C {
public static void main(String[] args) { // CRC32C (Castagnoli) polynomial
// coefficients in different forms
// normal: polyBits = 0x1edc6f41 = 0b0001 1110 1101 1100 0110 1111 0100 0001
// reversed: polybits = 0x82f63b78 = 0b1000 0010 1111 0110 0011 1011 0111 1000
// reversed reciprocal polybits = 0x8f6e37a0 = 0b1000 1111 0110 1110 0011 0111 1010 0000
//
// 0 5 9 13 17 21 25 29
// | | | | | | | |
// reversed shiftL 1 polyBits = 0x105ec76f1L = 0b1 0000 0101 1110 1100 0111 0110 1111 0001
final static long polyBits = (1L<<(32-32)) + (1L<<(32-28)) + (1L<<(32-27))
+ (1L<<(32-26)) + (1L<<(32-25)) + (1L<<(32-23)) + (1L<<(32-22))
+ (1L<<(32-20)) + (1L<<(32-19)) + (1L<<(32-18)) + (1L<<(32-14))
+ (1L<<(32-13)) + (1L<<(32-11)) + (1L<<(32-10)) + (1L<<(32-9))
+ (1L<<(32-8)) + (1L<<(32-6)) + (1L<<(32-0));
final static long polyBitsShifted = polyBits>>1;
public static void main(String[] args) throws Exception {
int offset = Integer.getInteger("offset", 0); int offset = Integer.getInteger("offset", 0);
int msgSize = Integer.getInteger("msgSize", 512); int msgSize = Integer.getInteger("msgSize", 512);
boolean multi = false; boolean multi = false;
@ -65,11 +81,14 @@ public class TestCRC32C {
byte[] b = initializedBytes(msgSize, offset); byte[] b = initializedBytes(msgSize, offset);
final long crcReference = update_byteLoop(0, b, offset);
CRC32C crc0 = new CRC32C(); CRC32C crc0 = new CRC32C();
CRC32C crc1 = new CRC32C(); CRC32C crc1 = new CRC32C();
CRC32C crc2 = new CRC32C(); CRC32C crc2 = new CRC32C();
crc0.update(b, offset, msgSize); crc0.update(b, offset, msgSize);
check(crc0, crcReference);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
@ -77,27 +96,35 @@ public class TestCRC32C {
for (int i = 0; i < warmupIters; i++) { for (int i = 0; i < warmupIters; i++) {
crc1.reset(); crc1.reset();
crc1.update(b, offset, msgSize); crc1.update(b, offset, msgSize);
check(crc1, crcReference);
} }
/* measure performance */ /* check correctness
* Do that before measuring performance
* to even better heat up involved methods.
*/
for (int i = 0; i < iters; i++) {
crc1.reset();
crc1.update(b, offset, msgSize);
check(crc1, crcReference);
}
report("CRCs", crc1, crcReference);
/* measure performance
* Don't spoil times with error checking.
*/
long start = System.nanoTime(); long start = System.nanoTime();
for (int i = 0; i < iters; i++) { for (int i = 0; i < iters; i++) {
crc1.reset(); crc1.reset();
crc1.update(b, offset, msgSize); crc1.update(b, offset, msgSize);
} }
long end = System.nanoTime(); long end = System.nanoTime();
double total = (double)(end - start)/1e9; // in seconds double total = (double)(end - start)/1e9; // in seconds
double thruput = (double)msgSize*iters/1e6/total; // in MB/s double thruput = (double)msgSize*iters/1e6/total; // in MB/s
System.out.println("CRC32C.update(byte[]) runtime = " + total + " seconds"); System.out.println("CRC32C.update(byte[]) runtime = " + total + " seconds");
System.out.println("CRC32C.update(byte[]) throughput = " + thruput + " MB/s"); System.out.println("CRC32C.update(byte[]) throughput = " + thruput + " MB/s");
report("CRCs", crc1, crcReference);
/* check correctness */
for (int i = 0; i < iters; i++) {
crc1.reset();
crc1.update(b, offset, msgSize);
if (!check(crc0, crc1)) break;
}
report("CRCs", crc0, crc1);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
@ -110,9 +137,24 @@ public class TestCRC32C {
crc2.reset(); crc2.reset();
crc2.update(buf); crc2.update(buf);
buf.rewind(); buf.rewind();
check(crc2, crcReference);
} }
/* measure performance */ /* check correctness
* Do that before measuring performance
* to even better heat up involved methods.
*/
for (int i = 0; i < iters; i++) {
crc2.reset();
crc2.update(buf);
buf.rewind();
check(crc2, crcReference);
}
report("CRCs", crc2, crcReference);
/* measure performance
* Don't spoil times with error checking.
*/
start = System.nanoTime(); start = System.nanoTime();
for (int i = 0; i < iters; i++) { for (int i = 0; i < iters; i++) {
crc2.reset(); crc2.reset();
@ -124,31 +166,57 @@ public class TestCRC32C {
thruput = (double)msgSize*iters/1e6/total; // in MB/s thruput = (double)msgSize*iters/1e6/total; // in MB/s
System.out.println("CRC32C.update(ByteBuffer) runtime = " + total + " seconds"); System.out.println("CRC32C.update(ByteBuffer) runtime = " + total + " seconds");
System.out.println("CRC32C.update(ByteBuffer) throughput = " + thruput + " MB/s"); System.out.println("CRC32C.update(ByteBuffer) throughput = " + thruput + " MB/s");
report("CRCs", crc2, crcReference);
/* check correctness */
for (int i = 0; i < iters; i++) {
crc2.reset();
crc2.update(buf);
buf.rewind();
if (!check(crc0, crc2)) break;
}
report("CRCs", crc0, crc2);
System.out.println("-------------------------------------------------------"); System.out.println("-------------------------------------------------------");
} }
private static void report(String s, Checksum crc0, Checksum crc1) { // Just a loop over a byte array, updating the CRC byte by byte.
System.out.printf("%s: crc0 = %08x, crc1 = %08x\n", public static long update_byteLoop(long crc, byte[] buf, int offset) {
s, crc0.getValue(), crc1.getValue()); return update_byteLoop(crc, buf, offset, buf.length-offset);
} }
private static boolean check(Checksum crc0, Checksum crc1) { // Just a loop over a byte array, with given length, updating the CRC byte by byte.
if (crc0.getValue() != crc1.getValue()) { public static long update_byteLoop(long crc, byte[] buf, int offset, int length) {
System.err.printf("ERROR: crc0 = %08x, crc1 = %08x\n", int end = length+offset;
crc0.getValue(), crc1.getValue()); for (int i = offset; i < end; i++) {
return false; crc = update_singlebyte(crc, polyBitsShifted, buf[i]);
}
return crc;
}
// Straight-forward implementation of CRC update by one byte.
// We use this very basic implementation to calculate reference
// results. It is necessary to have full control over how the
// reference results are calculated. It is not sufficient to rely
// on the interpreter (or c1, or c2) to do the right thing.
public static long update_singlebyte(long crc, long polynomial, int val) {
crc = (crc ^ -1L) & 0x00000000ffffffffL; // use 1's complement of crc
crc = crc ^ (val&0xff); // XOR in next byte from stream
for (int i = 0; i < 8; i++) {
boolean bitset = (crc & 0x01L) != 0;
crc = crc>>1;
if (bitset) {
crc = crc ^ polynomial;
crc = crc & 0x00000000ffffffffL;
}
}
crc = (crc ^ -1L) & 0x00000000ffffffffL; // revert taking 1's complement
return crc;
}
private static void report(String s, Checksum crc, long crcReference) {
System.out.printf("%s: crc = %08x, crcReference = %08x\n",
s, crc.getValue(), crcReference);
}
private static void check(Checksum crc, long crcReference) throws Exception {
if (crc.getValue() != crcReference) {
System.err.printf("ERROR: crc = %08x, crcReference = %08x\n",
crc.getValue(), crcReference);
throw new Exception("TestCRC32C Error");
} }
return true;
} }
private static byte[] initializedBytes(int M, int offset) { private static byte[] initializedBytes(int M, int offset) {
@ -162,7 +230,7 @@ public class TestCRC32C {
return bytes; return bytes;
} }
private static void test_multi(int iters) { private static void test_multi(int iters) throws Exception {
int len1 = 8; // the 8B/iteration loop int len1 = 8; // the 8B/iteration loop
int len2 = 32; // the 32B/iteration loop int len2 = 32; // the 32B/iteration loop
int len3 = 4096; // the 4KB/iteration loop int len3 = 4096; // the 4KB/iteration loop
@ -185,37 +253,31 @@ public class TestCRC32C {
(len1+len2+len3)*2+5, (len1+len2+len3)*2+7, (len1+len2+len3)*2+5, (len1+len2+len3)*2+7,
(len1+len2+len3)*3, (len1+len2+len3)*3-1, (len1+len2+len3)*3-3, (len1+len2+len3)*3, (len1+len2+len3)*3-1, (len1+len2+len3)*3-3,
(len1+len2+len3)*3-5, (len1+len2+len3)*3-7 }; (len1+len2+len3)*3-5, (len1+len2+len3)*3-7 };
CRC32C[] crc0 = new CRC32C[offsets.length*sizes.length];
CRC32C[] crc1 = new CRC32C[offsets.length*sizes.length]; CRC32C[] crc1 = new CRC32C[offsets.length*sizes.length];
long[] crcReference = new long[offsets.length*sizes.length];
int i, j, k; int i, j, k;
System.out.printf("testing %d cases ...\n", offsets.length*sizes.length); System.out.printf("testing %d cases ...\n", offsets.length*sizes.length);
/* set the result from interpreter as reference */ // Initialize CRC32C result arrays, CRC32C reference array.
// Reference is calculated using a very basic Java implementation.
for (i = 0; i < offsets.length; i++) { for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) { for (j = 0; j < sizes.length; j++) {
crc0[i*sizes.length + j] = new CRC32C();
crc1[i*sizes.length + j] = new CRC32C(); crc1[i*sizes.length + j] = new CRC32C();
crc0[i*sizes.length + j].update(b, offsets[i], sizes[j]); crcReference[i*sizes.length + j] = update_byteLoop(0, b, offsets[i], sizes[j]);
} }
} }
/* warm up the JIT compiler and get result */ // Warm up the JIT compiler. Over time, all methods involved will
// be executed by the interpreter, then get compiled by c1 and
// finally by c2. Each calculated CRC value must, in each iteration,
// be equal to the precalculated reference value for the test to pass.
for (k = 0; k < iters; k++) { for (k = 0; k < iters; k++) {
for (i = 0; i < offsets.length; i++) { for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) { for (j = 0; j < sizes.length; j++) {
crc1[i*sizes.length + j].reset(); crc1[i*sizes.length + j].reset();
crc1[i*sizes.length + j].update(b, offsets[i], sizes[j]); crc1[i*sizes.length + j].update(b, offsets[i], sizes[j]);
} check(crc1[i*sizes.length + j], crcReference[i*sizes.length + j]);
}
}
/* check correctness */
for (i = 0; i < offsets.length; i++) {
for (j = 0; j < sizes.length; j++) {
if (!check(crc0[i*sizes.length + j], crc1[i*sizes.length + j])) {
System.out.printf("offsets[%d] = %d", i, offsets[i]);
System.out.printf("\tsizes[%d] = %d\n", j, sizes[j]);
} }
} }
} }

View File

@ -30,7 +30,7 @@
* @modules jdk.internal.vm.ci/jdk.vm.ci.runtime * @modules jdk.internal.vm.ci/jdk.vm.ci.runtime
* @run main/othervm -XX:+UnlockExperimentalVMOptions * @run main/othervm -XX:+UnlockExperimentalVMOptions
* -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=true * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=true
* -XX:+EnableJVMCI * -XX:+EnableJVMCI -Djvmci.Compiler=null
* compiler.jvmci.JVM_GetJVMCIRuntimeTest * compiler.jvmci.JVM_GetJVMCIRuntimeTest
* @run main/othervm -XX:+UnlockExperimentalVMOptions * @run main/othervm -XX:+UnlockExperimentalVMOptions
* -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=false * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=false
@ -39,7 +39,7 @@
* @run main/othervm -XX:+UnlockExperimentalVMOptions * @run main/othervm -XX:+UnlockExperimentalVMOptions
* -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=true * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=true
* -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.threaded=true * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.threaded=true
* -XX:+EnableJVMCI * -XX:+EnableJVMCI -Djvmci.Compiler=null
* compiler.jvmci.JVM_GetJVMCIRuntimeTest * compiler.jvmci.JVM_GetJVMCIRuntimeTest
* @run main/othervm -XX:+UnlockExperimentalVMOptions * @run main/othervm -XX:+UnlockExperimentalVMOptions
* -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=false * -Dcompiler.jvmci.JVM_GetJVMCIRuntimeTest.positive=false

View File

@ -36,11 +36,11 @@ public class TestJVMCIPrintProperties {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
"-XX:+UnlockExperimentalVMOptions", "-XX:+UnlockExperimentalVMOptions",
"-XX:+EnableJVMCI", "-XX:+EnableJVMCI", "-Djvmci.Compiler=null",
"-XX:+JVMCIPrintProperties"); "-XX:+JVMCIPrintProperties");
OutputAnalyzer output = new OutputAnalyzer(pb.start()); OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldContain("[JVMCI properties]"); // expected message output.shouldContain("[JVMCI properties]"); // expected message
output.shouldContain("jvmci.Compiler = null"); // expected message output.shouldContain("jvmci.Compiler := \"null\""); // expected message
output.shouldContain("jvmci.InitTimer = false"); // expected message output.shouldContain("jvmci.InitTimer = false"); // expected message
output.shouldContain("jvmci.PrintConfig = false"); // expected message output.shouldContain("jvmci.PrintConfig = false"); // expected message
output.shouldContain("jvmci.TraceMethodDataFilter = null"); // expected message output.shouldContain("jvmci.TraceMethodDataFilter = null"); // expected message

View File

@ -34,7 +34,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.code * jdk.internal.vm.ci/jdk.vm.ci.code
* jdk.internal.vm.ci/jdk.vm.ci.meta * jdk.internal.vm.ci/jdk.vm.ci.meta
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.AsResolvedJavaMethodTest * compiler.jvmci.compilerToVM.AsResolvedJavaMethodTest
*/ */

View File

@ -39,6 +39,7 @@
* @run main/othervm -Xbootclasspath/a:. * @run main/othervm -Xbootclasspath/a:.
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
* -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.DoNotInlineOrCompileTest * compiler.jvmci.compilerToVM.DoNotInlineOrCompileTest
*/ */

View File

@ -36,6 +36,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.runtime * jdk.internal.vm.ci/jdk.vm.ci.runtime
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.FindUniqueConcreteMethodTest * compiler.jvmci.compilerToVM.FindUniqueConcreteMethodTest
*/ */

View File

@ -34,6 +34,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.code * jdk.internal.vm.ci/jdk.vm.ci.code
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetBytecodeTest * compiler.jvmci.compilerToVM.GetBytecodeTest
*/ */

View File

@ -31,6 +31,7 @@
* @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot * @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetClassInitializerTest * compiler.jvmci.compilerToVM.GetClassInitializerTest
*/ */

View File

@ -38,6 +38,7 @@
* @run main/othervm -Xbootclasspath/a:. * @run main/othervm -Xbootclasspath/a:.
* -XX:+UnlockDiagnosticVMOptions * -XX:+UnlockDiagnosticVMOptions
* -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetConstantPoolTest * compiler.jvmci.compilerToVM.GetConstantPoolTest
*/ */
package compiler.jvmci.compilerToVM; package compiler.jvmci.compilerToVM;

View File

@ -34,6 +34,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.code * jdk.internal.vm.ci/jdk.vm.ci.code
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetExceptionTableTest * compiler.jvmci.compilerToVM.GetExceptionTableTest
*/ */
@ -137,4 +138,3 @@ public class GetExceptionTableTest {
} }
} }
} }

View File

@ -31,6 +31,7 @@
* @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot * @modules jdk.internal.vm.ci/jdk.vm.ci.hotspot
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetImplementorTest * compiler.jvmci.compilerToVM.GetImplementorTest
*/ */

View File

@ -35,6 +35,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.code * jdk.internal.vm.ci/jdk.vm.ci.code
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetLineNumberTableTest * compiler.jvmci.compilerToVM.GetLineNumberTableTest
*/ */

View File

@ -38,6 +38,7 @@
* @compile -g DummyClass.java * @compile -g DummyClass.java
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetLocalVariableTableTest * compiler.jvmci.compilerToVM.GetLocalVariableTableTest
* @clean compiler.jvmci.compilerToVM.* * @clean compiler.jvmci.compilerToVM.*
*/ */

View File

@ -35,6 +35,7 @@
* jdk.internal.vm.ci/jdk.vm.ci.meta * jdk.internal.vm.ci/jdk.vm.ci.meta
* @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * @build jdk.internal.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
* @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * @run main/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetNextStackFrameTest * compiler.jvmci.compilerToVM.GetNextStackFrameTest
*/ */

View File

@ -38,6 +38,7 @@
* @run main/othervm -Xbootclasspath/a:. * @run main/othervm -Xbootclasspath/a:.
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI * -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
* -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
* -Djvmci.Compiler=null
* compiler.jvmci.compilerToVM.GetResolvedJavaMethodTest * compiler.jvmci.compilerToVM.GetResolvedJavaMethodTest
*/ */

Some files were not shown because too many files have changed in this diff Show More