OpenJDK / jdk / jdk
changeset 48819:ee513596f3ee
Merge
author | jwilhelm |
---|---|
date | Tue, 30 Jan 2018 16:41:40 +0100 |
parents | ec4a84ba2aaf f944d1b7ab25 |
children | 9a411a9a17f0 |
files | make/devkit/createWindowsDevkit.sh src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp src/hotspot/share/jvmci/jvmciCompilerToVM.cpp src/hotspot/share/oops/cpCache.cpp src/hotspot/share/oops/klassVtable.cpp src/hotspot/share/prims/jni.cpp src/hotspot/share/runtime/arguments.cpp src/hotspot/share/runtime/vmStructs.cpp src/java.compiler/share/classes/javax/lang/model/overview.html src/java.compiler/share/classes/javax/tools/overview.html src/java.xml/share/classes/com/sun/org/apache/xalan/internal/utils/FactoryImpl.java src/jdk.jdeps/share/classes/com/sun/tools/javap/overview.html test/jdk/sun/security/krb5/auto/principalProperty/TestHosts test/langtools/tools/javac/T8192885/AddGotoAfterForLoopToLNTTest.java |
diffstat | 918 files changed, 17769 insertions(+), 6736 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags Tue Jan 30 16:26:40 2018 +0100 +++ b/.hgtags Tue Jan 30 16:41:40 2018 +0100 @@ -464,3 +464,5 @@ 959f2f7cbaa6d2ee45d50029744efb219721576c jdk-10+36 4f830b447edf04fb4a52151a5ad44d9bb60723cd jdk-10+37 e569e83139fdfbecfeb3cd9014d560917787f158 jdk-10+38 +5b834ec962366e00d4445352a999a3ac14e26f64 jdk-10+39 +860326263d1f6a83996d7da0f4c66806ae4aa1eb jdk-10+40
--- a/bin/idea.sh Tue Jan 30 16:26:40 2018 +0100 +++ b/bin/idea.sh Tue Jan 30 16:41:40 2018 +0100 @@ -30,9 +30,10 @@ } SCRIPT_DIR=`dirname $0` -PWD=`pwd` +#assume TOP is the dir from which the script has been called +TOP=`pwd` cd $SCRIPT_DIR; SCRIPT_DIR=`pwd` -cd ../; TOP=`pwd`; cd $PWD +cd $TOP; IDEA_OUTPUT=$TOP/.idea VERBOSE="false" @@ -66,30 +67,42 @@ mkdir $IDEA_OUTPUT || exit 1 cd $IDEA_OUTPUT; IDEA_OUTPUT=`pwd` -IDEA_MAKE="$TOP/make/idea" +MAKE_DIR="$SCRIPT_DIR/../make" +IDEA_MAKE="$MAKE_DIR/idea" IDEA_TEMPLATE="$IDEA_MAKE/template" -IML_TEMPLATE="$IDEA_TEMPLATE/jdk.iml" -ANT_TEMPLATE="$IDEA_TEMPLATE/ant.xml" -MISC_TEMPLATE="$IDEA_TEMPLATE/misc.xml" -IDEA_IML="$IDEA_OUTPUT/jdk.iml" -IDEA_ANT="$IDEA_OUTPUT/ant.xml" -IDEA_MISC="$IDEA_OUTPUT/misc.xml" + +cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT" + +#init template variables +for file in `ls -p $IDEA_TEMPLATE | grep -v /`; do + VAR_SUFFIX=`echo $file | cut -d'.' -f1 | tr [:lower:] [:upper:]` + eval "$VAR_SUFFIX"_TEMPLATE="$IDEA_TEMPLATE"/$file + eval IDEA_"$VAR_SUFFIX"="$IDEA_OUTPUT"/$file +done + +#override template variables +if [ -d "$TEMPLATES_OVERRIDE" ] ; then + for file in `ls -p "$TEMPLATES_OVERRIDE" | grep -v /`; do + cp "$TEMPLATES_OVERRIDE"/$file "$IDEA_OUTPUT"/ + VAR_SUFFIX=`echo $file | cut -d'.' -f1 | tr [:lower:] [:upper:]` + eval "$VAR_SUFFIX"_TEMPLATE="$TEMPLATES_OVERRIDE"/$file + done +fi if [ "$VERBOSE" = "true" ] ; then echo "output dir: $IDEA_OUTPUT" echo "idea template dir: $IDEA_TEMPLATE" fi -if [ ! -f "$IML_TEMPLATE" ] ; then - echo "FATAL: cannot find $IML_TEMPLATE" >&2; exit 1 +if [ ! -f "$JDK_TEMPLATE" ] ; then + echo "FATAL: cannot find $JDK_TEMPLATE" >&2; exit 1 fi if [ ! -f "$ANT_TEMPLATE" ] ; then echo "FATAL: cannot find $ANT_TEMPLATE" >&2; exit 1 fi -cp -r "$IDEA_TEMPLATE"/* "$IDEA_OUTPUT" -cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I make/common idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1 +cd $TOP ; make -f "$IDEA_MAKE/idea.gmk" -I $MAKE_DIR/.. idea MAKEOVERRIDES= OUT=$IDEA_OUTPUT/env.cfg MODULES="$*" || exit 1 cd $SCRIPT_DIR . $IDEA_OUTPUT/env.cfg @@ -118,11 +131,12 @@ root=$@ relativePath="`echo "$root" | sed -e s@"$TOP/\(.*$\)"@"\1"@`" folder="`echo "$SOURCE_FOLDER" | sed -e s@"\(.*/\)####\(.*\)"@"\1$relativePath\2"@`" - printf "%s\n" "$folder" >> $IDEA_IML + printf "%s\n" "$folder" >> $IDEA_JDK } ### Generate project iml -rm -f $IDEA_IML + +rm -f $IDEA_JDK while IFS= read -r line do if echo "$line" | egrep "^ .* <sourceFolder.*####" > /dev/null ; then @@ -133,9 +147,9 @@ done fi else - printf "%s\n" "$line" >> $IDEA_IML + printf "%s\n" "$line" >> $IDEA_JDK fi -done < "$IML_TEMPLATE" +done < "$JDK_TEMPLATE" MODULE_NAME=" <property name=\"module.name\" value=\"####\" />"
--- a/make/autoconf/basics.m4 Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/basics.m4 Tue Jan 30 16:41:40 2018 +0100 @@ -586,69 +586,71 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT], [ AC_ARG_WITH([devkit], [AS_HELP_STRING([--with-devkit], - [use this devkit for compilers, tools and resources])], - [ - BASIC_FIXUP_PATH([with_devkit]) - DEVKIT_ROOT="$with_devkit" - # Check for a meta data info file in the root of the devkit - if test -f "$DEVKIT_ROOT/devkit.info"; then - . $DEVKIT_ROOT/devkit.info - # This potentially sets the following: - # A descriptive name of the devkit - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_NAME]) - # Corresponds to --with-extra-path - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_EXTRA_PATH]) - # Corresponds to --with-toolchain-path - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_TOOLCHAIN_PATH]) - # Corresponds to --with-sysroot - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_SYSROOT]) + [use this devkit for compilers, tools and resources])]) - # Identifies the Visual Studio version in the devkit - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_VERSION]) - # The Visual Studio include environment variable - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_INCLUDE]) - # The Visual Studio lib environment variable - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_LIB]) - # Corresponds to --with-msvcr-dll - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_MSVCR_DLL]) - # Corresponds to --with-msvcp-dll - BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_MSVCP_DLL]) - fi + if test "x$with_devkit" = xyes; then + AC_MSG_ERROR([--with-devkit must have a value]) + elif test "x$with_devkit" != x && test "x$with_devkit" != xno; then + BASIC_FIXUP_PATH([with_devkit]) + DEVKIT_ROOT="$with_devkit" + # Check for a meta data info file in the root of the devkit + if test -f "$DEVKIT_ROOT/devkit.info"; then + . $DEVKIT_ROOT/devkit.info + # This potentially sets the following: + # A descriptive name of the devkit + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_NAME]) + # Corresponds to --with-extra-path + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_EXTRA_PATH]) + # Corresponds to --with-toolchain-path + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_TOOLCHAIN_PATH]) + # Corresponds to --with-sysroot + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_SYSROOT]) - AC_MSG_CHECKING([for devkit]) - if test "x$DEVKIT_NAME" != x; then - AC_MSG_RESULT([$DEVKIT_NAME in $DEVKIT_ROOT]) - else - AC_MSG_RESULT([$DEVKIT_ROOT]) - fi + # Identifies the Visual Studio version in the devkit + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_VERSION]) + # The Visual Studio include environment variable + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_INCLUDE]) + # The Visual Studio lib environment variable + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_VS_LIB]) + # Corresponds to --with-msvcr-dll + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_MSVCR_DLL]) + # Corresponds to --with-msvcp-dll + BASIC_EVAL_DEVKIT_VARIABLE([DEVKIT_MSVCP_DLL]) + fi - BASIC_PREPEND_TO_PATH([EXTRA_PATH],$DEVKIT_EXTRA_PATH) + AC_MSG_CHECKING([for devkit]) + if test "x$DEVKIT_NAME" != x; then + AC_MSG_RESULT([$DEVKIT_NAME in $DEVKIT_ROOT]) + else + AC_MSG_RESULT([$DEVKIT_ROOT]) + fi - # Fallback default of just /bin if DEVKIT_PATH is not defined - if test "x$DEVKIT_TOOLCHAIN_PATH" = x; then - DEVKIT_TOOLCHAIN_PATH="$DEVKIT_ROOT/bin" - fi - BASIC_PREPEND_TO_PATH([TOOLCHAIN_PATH],$DEVKIT_TOOLCHAIN_PATH) + BASIC_PREPEND_TO_PATH([EXTRA_PATH],$DEVKIT_EXTRA_PATH) - # If DEVKIT_SYSROOT is set, use that, otherwise try a couple of known - # places for backwards compatiblity. - if test "x$DEVKIT_SYSROOT" != x; then - SYSROOT="$DEVKIT_SYSROOT" - elif test -d "$DEVKIT_ROOT/$host_alias/libc"; then - SYSROOT="$DEVKIT_ROOT/$host_alias/libc" - elif test -d "$DEVKIT_ROOT/$host/sys-root"; then - SYSROOT="$DEVKIT_ROOT/$host/sys-root" - fi + # Fallback default of just /bin if DEVKIT_PATH is not defined + if test "x$DEVKIT_TOOLCHAIN_PATH" = x; then + DEVKIT_TOOLCHAIN_PATH="$DEVKIT_ROOT/bin" + fi + BASIC_PREPEND_TO_PATH([TOOLCHAIN_PATH],$DEVKIT_TOOLCHAIN_PATH) - if test "x$DEVKIT_ROOT" != x; then - DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib" - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib64" - fi - AC_SUBST(DEVKIT_LIB_DIR) - fi - ] - ) + # If DEVKIT_SYSROOT is set, use that, otherwise try a couple of known + # places for backwards compatiblity. + if test "x$DEVKIT_SYSROOT" != x; then + SYSROOT="$DEVKIT_SYSROOT" + elif test -d "$DEVKIT_ROOT/$host_alias/libc"; then + SYSROOT="$DEVKIT_ROOT/$host_alias/libc" + elif test -d "$DEVKIT_ROOT/$host/sys-root"; then + SYSROOT="$DEVKIT_ROOT/$host/sys-root" + fi + + if test "x$DEVKIT_ROOT" != x; then + DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib" + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib64" + fi + AC_SUBST(DEVKIT_LIB_DIR) + fi + fi # You can force the sysroot if the sysroot encoded into the compiler tools # is not correct.
--- a/make/autoconf/generated-configure.sh Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/generated-configure.sh Tue Jan 30 16:41:40 2018 +0100 @@ -902,6 +902,9 @@ VERSION_UPDATE VERSION_INTERIM VERSION_FEATURE +VENDOR_URL_VM_BUG +VENDOR_URL_BUG +VENDOR_URL COMPANY_NAME MACOSX_BUNDLE_ID_BASE MACOSX_BUNDLE_NAME_BASE @@ -1150,6 +1153,9 @@ with_version_minor with_version_security with_vendor_name +with_vendor_url +with_vendor_bug_url +with_vendor_vm_bug_url with_version_string with_version_pre with_version_opt @@ -2074,7 +2080,16 @@ compatibility and is ignored --with-version-security Deprecated. Option is kept for backwards compatibility and is ignored - --with-vendor-name Set vendor name [not specified] + --with-vendor-name Set vendor name. Among others, used to set the + 'java.vendor' and 'java.vm.vendor' system + properties. [not specified] + --with-vendor-url Set the 'java.vendor.url' system property [not + specified] + --with-vendor-bug-url Set the 'java.vendor.url.bug' system property [not + specified] + --with-vendor-vm-bug-url + Sets the bug URL which will be displayed when the VM + crashes [not specified] --with-version-string Set version string [calculated] --with-version-pre Set the base part of the version 'PRE' field (pre-release identifier) ['internal'] @@ -5102,7 +5117,7 @@ ################################################################################ # The order of these defines the priority by which we try to find them. -VALID_VS_VERSIONS="2013 2012 2010" +VALID_VS_VERSIONS="2013 2012 2010 2015 2017" VS_DESCRIPTION_2010="Microsoft Visual Studio 2010" VS_VERSION_INTERNAL_2010=100 @@ -5135,6 +5150,30 @@ VS_VS_PLATFORM_NAME_2013="v120" VS_SDK_PLATFORM_NAME_2013= +VS_DESCRIPTION_2015="Microsoft Visual Studio 2015 - CURRENTLY NOT WORKING" +VS_VERSION_INTERNAL_2015=140 +VS_MSVCR_2015=vcruntime140.dll +VS_MSVCP_2015=msvcp140.dll +VS_ENVVAR_2015="VS140COMNTOOLS" +VS_VS_INSTALLDIR_2015="Microsoft Visual Studio 14.0" +VS_SDK_INSTALLDIR_2015= +VS_VS_PLATFORM_NAME_2015="v140" +VS_SDK_PLATFORM_NAME_2015= +# The vcvars of 2015 breaks if 2017 is also installed. Work around this by +# explicitly specifying Windows Kit 8.1 to be used. +VS_ENV_ARGS_2015="8.1" + +VS_DESCRIPTION_2017="Microsoft Visual Studio 2017 - CURRENTLY NOT WORKING" +VS_VERSION_INTERNAL_2017=141 +VS_MSVCR_2017=vcruntime140.dll +VS_MSVCP_2017=msvcp140.dll +VS_ENVVAR_2017="VS150COMNTOOLS" +VS_VS_INSTALLDIR_2017="Microsoft Visual Studio/2017" +VS_EDITIONS_2017="Community Professional Enterprise" +VS_SDK_INSTALLDIR_2017= +VS_VS_PLATFORM_NAME_2017="v141" +VS_SDK_PLATFORM_NAME_2017= + ################################################################################ @@ -5176,7 +5215,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1513805283 +DATE_WHEN_GENERATED=1517244998 ############################################################################### # @@ -17098,6 +17137,12 @@ # Check whether --with-devkit was given. if test "${with_devkit+set}" = set; then : withval=$with_devkit; +fi + + + if test "x$with_devkit" = xyes; then + as_fn_error $? "--with-devkit must have a value" "$LINENO" 5 + elif test "x$with_devkit" != x && test "x$with_devkit" != xno; then # Only process if variable expands to non-empty @@ -17230,77 +17275,77 @@ fi fi - DEVKIT_ROOT="$with_devkit" - # Check for a meta data info file in the root of the devkit - if test -f "$DEVKIT_ROOT/devkit.info"; then - . $DEVKIT_ROOT/devkit.info - # This potentially sets the following: - # A descriptive name of the devkit + DEVKIT_ROOT="$with_devkit" + # Check for a meta data info file in the root of the devkit + if test -f "$DEVKIT_ROOT/devkit.info"; then + . $DEVKIT_ROOT/devkit.info + # This potentially sets the following: + # A descriptive name of the devkit if test "x$DEVKIT_NAME" = x; then eval DEVKIT_NAME="\${DEVKIT_NAME_${OPENJDK_TARGET_CPU}}" fi - # Corresponds to --with-extra-path + # Corresponds to --with-extra-path if test "x$DEVKIT_EXTRA_PATH" = x; then eval DEVKIT_EXTRA_PATH="\${DEVKIT_EXTRA_PATH_${OPENJDK_TARGET_CPU}}" fi - # Corresponds to --with-toolchain-path + # Corresponds to --with-toolchain-path if test "x$DEVKIT_TOOLCHAIN_PATH" = x; then eval DEVKIT_TOOLCHAIN_PATH="\${DEVKIT_TOOLCHAIN_PATH_${OPENJDK_TARGET_CPU}}" fi - # Corresponds to --with-sysroot + # Corresponds to --with-sysroot if test "x$DEVKIT_SYSROOT" = x; then eval DEVKIT_SYSROOT="\${DEVKIT_SYSROOT_${OPENJDK_TARGET_CPU}}" fi - # Identifies the Visual Studio version in the devkit + # Identifies the Visual Studio version in the devkit if test "x$DEVKIT_VS_VERSION" = x; then eval DEVKIT_VS_VERSION="\${DEVKIT_VS_VERSION_${OPENJDK_TARGET_CPU}}" fi - # The Visual Studio include environment variable + # The Visual Studio include environment variable if test "x$DEVKIT_VS_INCLUDE" = x; then eval DEVKIT_VS_INCLUDE="\${DEVKIT_VS_INCLUDE_${OPENJDK_TARGET_CPU}}" fi - # The Visual Studio lib environment variable + # The Visual Studio lib environment variable if test "x$DEVKIT_VS_LIB" = x; then eval DEVKIT_VS_LIB="\${DEVKIT_VS_LIB_${OPENJDK_TARGET_CPU}}" fi - # Corresponds to --with-msvcr-dll + # Corresponds to --with-msvcr-dll if test "x$DEVKIT_MSVCR_DLL" = x; then eval DEVKIT_MSVCR_DLL="\${DEVKIT_MSVCR_DLL_${OPENJDK_TARGET_CPU}}" fi - # Corresponds to --with-msvcp-dll + # Corresponds to --with-msvcp-dll if test "x$DEVKIT_MSVCP_DLL" = x; then eval DEVKIT_MSVCP_DLL="\${DEVKIT_MSVCP_DLL_${OPENJDK_TARGET_CPU}}" fi - fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for devkit" >&5 + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for devkit" >&5 $as_echo_n "checking for devkit... " >&6; } - if test "x$DEVKIT_NAME" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEVKIT_NAME in $DEVKIT_ROOT" >&5 + if test "x$DEVKIT_NAME" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEVKIT_NAME in $DEVKIT_ROOT" >&5 $as_echo "$DEVKIT_NAME in $DEVKIT_ROOT" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEVKIT_ROOT" >&5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DEVKIT_ROOT" >&5 $as_echo "$DEVKIT_ROOT" >&6; } - fi + fi if test "x$DEVKIT_EXTRA_PATH" != x; then @@ -17312,10 +17357,10 @@ fi - # Fallback default of just /bin if DEVKIT_PATH is not defined - if test "x$DEVKIT_TOOLCHAIN_PATH" = x; then - DEVKIT_TOOLCHAIN_PATH="$DEVKIT_ROOT/bin" - fi + # Fallback default of just /bin if DEVKIT_PATH is not defined + if test "x$DEVKIT_TOOLCHAIN_PATH" = x; then + DEVKIT_TOOLCHAIN_PATH="$DEVKIT_ROOT/bin" + fi if test "x$DEVKIT_TOOLCHAIN_PATH" != x; then if test "x$TOOLCHAIN_PATH" = x; then @@ -17326,27 +17371,24 @@ fi - # If DEVKIT_SYSROOT is set, use that, otherwise try a couple of known - # places for backwards compatiblity. - if test "x$DEVKIT_SYSROOT" != x; then - SYSROOT="$DEVKIT_SYSROOT" - elif test -d "$DEVKIT_ROOT/$host_alias/libc"; then - SYSROOT="$DEVKIT_ROOT/$host_alias/libc" - elif test -d "$DEVKIT_ROOT/$host/sys-root"; then - SYSROOT="$DEVKIT_ROOT/$host/sys-root" - fi - - if test "x$DEVKIT_ROOT" != x; then - DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib" - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib64" - fi - - fi - - -fi - + # If DEVKIT_SYSROOT is set, use that, otherwise try a couple of known + # places for backwards compatiblity. + if test "x$DEVKIT_SYSROOT" != x; then + SYSROOT="$DEVKIT_SYSROOT" + elif test -d "$DEVKIT_ROOT/$host_alias/libc"; then + SYSROOT="$DEVKIT_ROOT/$host_alias/libc" + elif test -d "$DEVKIT_ROOT/$host/sys-root"; then + SYSROOT="$DEVKIT_ROOT/$host/sys-root" + fi + + if test "x$DEVKIT_ROOT" != x; then + DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib" + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + DEVKIT_LIB_DIR="$DEVKIT_ROOT/lib64" + fi + + fi + fi # You can force the sysroot if the sysroot encoded into the compiler tools # is not correct. @@ -25072,12 +25114,62 @@ if test "x$with_vendor_name" = xyes; then as_fn_error $? "--with-vendor-name must have a value" "$LINENO" 5 elif ! [[ $with_vendor_name =~ ^[[:print:]]*$ ]] ; then - as_fn_error $? "--with--vendor-name contains non-printing characters: $with_vendor_name" "$LINENO" 5 - else + as_fn_error $? "--with-vendor-name contains non-printing characters: $with_vendor_name" "$LINENO" 5 + elif test "x$with_vendor_name" != x; then + # Only set COMPANY_NAME if '--with-vendor-name' was used and is not empty. + # Otherwise we will use the value from "version-numbers" included above. COMPANY_NAME="$with_vendor_name" fi + # The vendor URL, if any + +# Check whether --with-vendor-url was given. +if test "${with_vendor_url+set}" = set; then : + withval=$with_vendor_url; +fi + + if test "x$with_vendor_url" = xyes; then + as_fn_error $? "--with-vendor-url must have a value" "$LINENO" 5 + elif ! [[ $with_vendor_url =~ ^[[:print:]]*$ ]] ; then + as_fn_error $? "--with-vendor-url contains non-printing characters: $with_vendor_url" "$LINENO" 5 + else + VENDOR_URL="$with_vendor_url" + fi + + + # The vendor bug URL, if any + +# Check whether --with-vendor-bug-url was given. +if test "${with_vendor_bug_url+set}" = set; then : + withval=$with_vendor_bug_url; +fi + + if test "x$with_vendor_bug_url" = xyes; then + as_fn_error $? "--with-vendor-bug-url must have a value" "$LINENO" 5 + elif ! [[ $with_vendor_bug_url =~ ^[[:print:]]*$ ]] ; then + as_fn_error $? "--with-vendor-bug-url contains non-printing characters: $with_vendor_bug_url" "$LINENO" 5 + else + VENDOR_URL_BUG="$with_vendor_bug_url" + fi + + + # The vendor VM bug URL, if any + +# Check whether --with-vendor-vm-bug-url was given. +if test "${with_vendor_vm_bug_url+set}" = set; then : + withval=$with_vendor_vm_bug_url; +fi + + if test "x$with_vendor_vm_bug_url" = xyes; then + as_fn_error $? "--with-vendor-vm-bug-url must have a value" "$LINENO" 5 + elif ! [[ $with_vendor_vm_bug_url =~ ^[[:print:]]*$ ]] ; then + as_fn_error $? "--with-vendor-vm-bug-url contains non-printing characters: $with_vendor_vm_bug_url" "$LINENO" 5 + else + VENDOR_URL_VM_BUG="$with_vendor_vm_bug_url" + fi + + # Override version from arguments # If --with-version-string is set, process it first. It is possible to @@ -32234,7 +32326,11 @@ elif test "x$DEVKIT_VS_VERSION" != x; then VS_VERSION=$DEVKIT_VS_VERSION TOOLCHAIN_VERSION=$VS_VERSION - eval VS_DESCRIPTION="\${VS_DESCRIPTION_${VS_VERSION}}" + # If the devkit has a name, use that as description + VS_DESCRIPTION="$DEVKIT_NAME" + if test "x$VS_DESCRIPTION" = x; then + eval VS_DESCRIPTION="\${VS_DESCRIPTION_${VS_VERSION}}" + fi eval VS_VERSION_INTERNAL="\${VS_VERSION_INTERNAL_${VS_VERSION}}" eval MSVCR_NAME="\${VS_MSVCR_${VS_VERSION}}" eval MSVCP_NAME="\${VS_MSVCP_${VS_VERSION}}" @@ -32302,7 +32398,9 @@ eval VS_COMNTOOLS_VAR="\${VS_ENVVAR_${VS_VERSION}}" eval VS_COMNTOOLS="\$${VS_COMNTOOLS_VAR}" eval VS_INSTALL_DIR="\${VS_VS_INSTALLDIR_${VS_VERSION}}" + eval VS_EDITIONS="\${VS_EDITIONS_${VS_VERSION}}" eval SDK_INSTALL_DIR="\${VS_SDK_INSTALLDIR_${VS_VERSION}}" + eval VS_ENV_ARGS="\${VS_ENV_ARGS_${VS_VERSION}}" # When using --with-tools-dir, assume it points to the correct and default # version of Visual Studio or that --with-toolchain-version was also set. @@ -32313,12 +32411,6 @@ VS_BASE="$with_tools_dir/../.." METHOD="--with-tools-dir" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32329,19 +32421,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32352,12 +32467,6 @@ VS_BASE="$with_tools_dir/../../.." METHOD="--with-tools-dir" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32368,19 +32477,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32399,7 +32531,6 @@ fi VS_ENV_CMD="" - VS_ENV_ARGS="" if test "x$VS_COMNTOOLS" != x; then @@ -32408,12 +32539,6 @@ VS_BASE="$VS_COMNTOOLS/../.." METHOD="$VS_COMNTOOLS_VAR variable" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32424,19 +32549,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32449,12 +32597,6 @@ VS_BASE="$PROGRAMFILES/$VS_INSTALL_DIR" METHOD="well-known name" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32465,19 +32607,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32492,12 +32657,6 @@ VS_BASE="$PROGRAMFILES_X86/$VS_INSTALL_DIR" METHOD="well-known name" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32508,19 +32667,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32532,12 +32714,6 @@ VS_BASE="C:/Program Files/$VS_INSTALL_DIR" METHOD="well-known name" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32548,19 +32724,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32571,12 +32770,6 @@ VS_BASE="C:/Program Files (x86)/$VS_INSTALL_DIR" METHOD="well-known name" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" - fi - windows_path="$VS_BASE" if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -32587,19 +32780,42 @@ VS_BASE="$unix_path" fi + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done + fi + if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 $as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&5 +$as_echo "$as_me: Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring" >&6;} + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS_BASE using $METHOD" >&5 -$as_echo "$as_me: Found Visual Studio installation at $VS_BASE using $METHOD" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 -$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} fi fi fi @@ -32852,6 +33068,11 @@ fi done + TOOLCHAIN_DESCRIPTION="$VS_DESCRIPTION" + if test "$TOOLCHAIN_VERSION" -gt 2013; then + UNSUPPORTED_TOOLCHAIN_VERSION=yes + fi + # If we have a devkit, skip all of the below. if test "x$DEVKIT_VS_VERSION" = x; then @@ -33184,6 +33405,9 @@ # This will end up something like: # call C:/progra~2/micros~2.0/vc/bin/amd64/vcvars64.bat $ECHO "call $WINPATH_VS_ENV_CMD $VS_ENV_ARGS" >> $EXTRACT_VC_ENV_BAT_FILE + # In some cases, the VS_ENV_CMD will change directory, change back so + # the set-vs-env.sh ends up in the right place. + $ECHO 'cd %~dp0' >> $EXTRACT_VC_ENV_BAT_FILE # These will end up something like: # C:/CygWin/bin/bash -c 'echo VS_PATH=\"$PATH\" > localdevenv.sh # The trailing space for everyone except PATH is no typo, but is needed due @@ -33605,7 +33829,7 @@ if test "x$XCODE_VERSION_OUTPUT" != x; then # For Xcode, we set the Xcode version as TOOLCHAIN_VERSION TOOLCHAIN_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | $CUT -f 2 -d ' '` - TOOLCHAIN_DESCRIPTION="$TOOLCHAIN_DESCRIPTION from Xcode" + TOOLCHAIN_DESCRIPTION="$TOOLCHAIN_DESCRIPTION from Xcode $TOOLCHAIN_VERSION" else # Currently we do not define this for other toolchains. This might change as the need arise. TOOLCHAIN_VERSION= @@ -55823,7 +56047,6 @@ MSVC_DLL= if test "x$MSVC_DLL" = x; then - # Probe: Using well-known location from Visual Studio 10.0 if test "x$VCINSTALLDIR" != x; then CYGWIN_VC_INSTALL_DIR="$VCINSTALLDIR" @@ -55836,15 +56059,27 @@ CYGWIN_VC_INSTALL_DIR="$unix_path" fi - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" - else - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" - fi - $ECHO "POSSIBLE_MSVC_DLL $POSSIBLEMSVC_DLL" + if test "$VS_VERSION" -lt 2017; then + # Probe: Using well-known location from Visual Studio 12.0 and older + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + else + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + fi + else + # Probe: Using well-known location from VS 2017 + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + else + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + fi + fi + # In case any of the above finds more than one file, loop over them. + for possible_msvc_dll in $POSSIBLE_MSVC_DLL; do + $ECHO "POSSIBLE_MSVC_DLL $possible_msvc_dll" DLL_NAME="$DLL_NAME" - POSSIBLE_MSVC_DLL="$POSSIBLE_MSVC_DLL" + POSSIBLE_MSVC_DLL="$possible_msvc_dll" METHOD="well-known location in VCINSTALLDIR" if test -n "$POSSIBLE_MSVC_DLL" -a -e "$POSSIBLE_MSVC_DLL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Found $DLL_NAME at $POSSIBLE_MSVC_DLL using $METHOD" >&5 @@ -56017,6 +56252,7 @@ fi fi + done fi fi @@ -57172,7 +57408,6 @@ MSVC_DLL= if test "x$MSVC_DLL" = x; then - # Probe: Using well-known location from Visual Studio 10.0 if test "x$VCINSTALLDIR" != x; then CYGWIN_VC_INSTALL_DIR="$VCINSTALLDIR" @@ -57185,15 +57420,27 @@ CYGWIN_VC_INSTALL_DIR="$unix_path" fi - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" - else - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" - fi - $ECHO "POSSIBLE_MSVC_DLL $POSSIBLEMSVC_DLL" + if test "$VS_VERSION" -lt 2017; then + # Probe: Using well-known location from Visual Studio 12.0 and older + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + else + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + fi + else + # Probe: Using well-known location from VS 2017 + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + else + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + fi + fi + # In case any of the above finds more than one file, loop over them. + for possible_msvc_dll in $POSSIBLE_MSVC_DLL; do + $ECHO "POSSIBLE_MSVC_DLL $possible_msvc_dll" DLL_NAME="$DLL_NAME" - POSSIBLE_MSVC_DLL="$POSSIBLE_MSVC_DLL" + POSSIBLE_MSVC_DLL="$possible_msvc_dll" METHOD="well-known location in VCINSTALLDIR" if test -n "$POSSIBLE_MSVC_DLL" -a -e "$POSSIBLE_MSVC_DLL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Found $DLL_NAME at $POSSIBLE_MSVC_DLL using $METHOD" >&5 @@ -57366,6 +57613,7 @@ fi fi + done fi fi @@ -70158,10 +70406,7 @@ printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" fi printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" - if test "x$TOOLCHAIN_VERSION" != "x"; then - print_version=" $TOOLCHAIN_VERSION" - fi - printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n" + printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)\n" printf "* C Compiler: Version $CC_VERSION_NUMBER (at $CC)\n" printf "* C++ Compiler: Version $CXX_VERSION_NUMBER (at $CXX)\n" @@ -70209,6 +70454,12 @@ printf "\n" fi + if test "x$UNSUPPORTED_TOOLCHAIN_VERSION" = "xyes"; then + printf "WARNING: The toolchain version used is known to have issues. Please\n" + printf "consider using a supported version unless you know what you are doing.\n" + printf "\n" + fi + # Locate config.log.
--- a/make/autoconf/help.m4 Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/help.m4 Tue Jan 30 16:41:40 2018 +0100 @@ -242,10 +242,7 @@ printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" fi printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" - if test "x$TOOLCHAIN_VERSION" != "x"; then - print_version=" $TOOLCHAIN_VERSION" - fi - printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION$print_version)\n" + printf "* Toolchain: $TOOLCHAIN_TYPE ($TOOLCHAIN_DESCRIPTION)\n" printf "* C Compiler: Version $CC_VERSION_NUMBER (at $CC)\n" printf "* C++ Compiler: Version $CXX_VERSION_NUMBER (at $CXX)\n" @@ -292,6 +289,12 @@ printf "You should run without '--no-create | -n' to create the configuration.\n" printf "\n" fi + + if test "x$UNSUPPORTED_TOOLCHAIN_VERSION" = "xyes"; then + printf "WARNING: The toolchain version used is known to have issues. Please\n" + printf "consider using a supported version unless you know what you are doing.\n" + printf "\n" + fi ]) AC_DEFUN_ONCE([HELP_REPEAT_WARNINGS],
--- a/make/autoconf/jdk-version.m4 Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/jdk-version.m4 Tue Jan 30 16:41:40 2018 +0100 @@ -80,16 +80,55 @@ # The vendor name, if any AC_ARG_WITH(vendor-name, [AS_HELP_STRING([--with-vendor-name], - [Set vendor name @<:@not specified@:>@])]) + [Set vendor name. Among others, used to set the 'java.vendor' + and 'java.vm.vendor' system properties. @<:@not specified@:>@])]) if test "x$with_vendor_name" = xyes; then AC_MSG_ERROR([--with-vendor-name must have a value]) elif [ ! [[ $with_vendor_name =~ ^[[:print:]]*$ ]] ]; then - AC_MSG_ERROR([--with--vendor-name contains non-printing characters: $with_vendor_name]) - else + AC_MSG_ERROR([--with-vendor-name contains non-printing characters: $with_vendor_name]) + elif test "x$with_vendor_name" != x; then + # Only set COMPANY_NAME if '--with-vendor-name' was used and is not empty. + # Otherwise we will use the value from "version-numbers" included above. COMPANY_NAME="$with_vendor_name" fi AC_SUBST(COMPANY_NAME) + # The vendor URL, if any + AC_ARG_WITH(vendor-url, [AS_HELP_STRING([--with-vendor-url], + [Set the 'java.vendor.url' system property @<:@not specified@:>@])]) + if test "x$with_vendor_url" = xyes; then + AC_MSG_ERROR([--with-vendor-url must have a value]) + elif [ ! [[ $with_vendor_url =~ ^[[:print:]]*$ ]] ]; then + AC_MSG_ERROR([--with-vendor-url contains non-printing characters: $with_vendor_url]) + else + VENDOR_URL="$with_vendor_url" + fi + AC_SUBST(VENDOR_URL) + + # The vendor bug URL, if any + AC_ARG_WITH(vendor-bug-url, [AS_HELP_STRING([--with-vendor-bug-url], + [Set the 'java.vendor.url.bug' system property @<:@not specified@:>@])]) + if test "x$with_vendor_bug_url" = xyes; then + AC_MSG_ERROR([--with-vendor-bug-url must have a value]) + elif [ ! [[ $with_vendor_bug_url =~ ^[[:print:]]*$ ]] ]; then + AC_MSG_ERROR([--with-vendor-bug-url contains non-printing characters: $with_vendor_bug_url]) + else + VENDOR_URL_BUG="$with_vendor_bug_url" + fi + AC_SUBST(VENDOR_URL_BUG) + + # The vendor VM bug URL, if any + AC_ARG_WITH(vendor-vm-bug-url, [AS_HELP_STRING([--with-vendor-vm-bug-url], + [Sets the bug URL which will be displayed when the VM crashes @<:@not specified@:>@])]) + if test "x$with_vendor_vm_bug_url" = xyes; then + AC_MSG_ERROR([--with-vendor-vm-bug-url must have a value]) + elif [ ! [[ $with_vendor_vm_bug_url =~ ^[[:print:]]*$ ]] ]; then + AC_MSG_ERROR([--with-vendor-vm-bug-url contains non-printing characters: $with_vendor_vm_bug_url]) + else + VENDOR_URL_VM_BUG="$with_vendor_vm_bug_url" + fi + AC_SUBST(VENDOR_URL_VM_BUG) + # Override version from arguments # If --with-version-string is set, process it first. It is possible to
--- a/make/autoconf/spec.gmk.in Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/spec.gmk.in Tue Jan 30 16:41:40 2018 +0100 @@ -142,6 +142,20 @@ COPYRIGHT_YEAR:=@COPYRIGHT_YEAR@ +# Platform naming variables +LAUNCHER_NAME:=@LAUNCHER_NAME@ +PRODUCT_NAME:=@PRODUCT_NAME@ +PRODUCT_SUFFIX:=@PRODUCT_SUFFIX@ +JDK_RC_PLATFORM_NAME:=@JDK_RC_PLATFORM_NAME@ +COMPANY_NAME:=@COMPANY_NAME@ +HOTSPOT_VM_DISTRO:=@HOTSPOT_VM_DISTRO@ +MACOSX_BUNDLE_NAME_BASE=@MACOSX_BUNDLE_NAME_BASE@ +MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@ +USERNAME:=@USERNAME@ +VENDOR_URL:=@VENDOR_URL@ +VENDOR_URL_BUG:=@VENDOR_URL_BUG@ +VENDOR_URL_VM_BUG:=@VENDOR_URL_VM_BUG@ + # New (JEP-223) version information ## Building blocks of the version string @@ -201,16 +215,30 @@ -DVERSION_CLASSFILE_MINOR=$(VERSION_CLASSFILE_MINOR) \ # -# Platform naming variables -LAUNCHER_NAME:=@LAUNCHER_NAME@ -PRODUCT_NAME:=@PRODUCT_NAME@ -PRODUCT_SUFFIX:=@PRODUCT_SUFFIX@ -JDK_RC_PLATFORM_NAME:=@JDK_RC_PLATFORM_NAME@ -COMPANY_NAME:=@COMPANY_NAME@ -HOTSPOT_VM_DISTRO:=@HOTSPOT_VM_DISTRO@ -MACOSX_BUNDLE_NAME_BASE=@MACOSX_BUNDLE_NAME_BASE@ -MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@ -USERNAME:=@USERNAME@ +ifneq ($(COMPANY_NAME),) + # COMPANY_NAME is set to "N/A" in $AUTOCONF_DIR/version-numbers by default, + # but can be customized with the '--with-vendor-name' configure option. + # Only export "VENDOR" to the build if COMPANY_NAME contains a real value. + # Otherwise the default value for VENDOR, which is used to set the "java.vendor" + # and "java.vm.vendor" properties is hard-coded into the source code (i.e. in + # System.c in the jdk for "vm.vendor" and vm_version.cpp in the VM for "java.vm.vendor") + ifneq ($(COMPANY_NAME), N/A) + VERSION_CFLAGS += -DVENDOR='"$(COMPANY_NAME)"' + endif +endif + +# Only export VENDOR_URL, VENDOR_URL_BUG and VENDOR_VM_URL_BUG to the build if +# they are not empty. Otherwise, default values which are defined in the sources +# will be used. +ifneq ($(VENDOR_URL),) + VERSION_CFLAGS += -DVENDOR_URL='"$(VENDOR_URL)"' +endif +ifneq ($(VENDOR_URL_BUG),) + VERSION_CFLAGS += -DVENDOR_URL_BUG='"$(VENDOR_URL_BUG)"' +endif +ifneq ($(VENDOR_URL_VM_BUG),) + VERSION_CFLAGS += -DVENDOR_URL_VM_BUG='"$(VENDOR_URL_VM_BUG)"' +endif # Different naming strings generated from the above information. RUNTIME_NAME=$(PRODUCT_NAME) $(PRODUCT_SUFFIX)
--- a/make/autoconf/toolchain.m4 Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/toolchain.m4 Tue Jan 30 16:41:40 2018 +0100 @@ -286,7 +286,7 @@ if test "x$XCODE_VERSION_OUTPUT" != x; then # For Xcode, we set the Xcode version as TOOLCHAIN_VERSION TOOLCHAIN_VERSION=`$ECHO $XCODE_VERSION_OUTPUT | $CUT -f 2 -d ' '` - TOOLCHAIN_DESCRIPTION="$TOOLCHAIN_DESCRIPTION from Xcode" + TOOLCHAIN_DESCRIPTION="$TOOLCHAIN_DESCRIPTION from Xcode $TOOLCHAIN_VERSION" else # Currently we do not define this for other toolchains. This might change as the need arise. TOOLCHAIN_VERSION=
--- a/make/autoconf/toolchain_windows.m4 Tue Jan 30 16:26:40 2018 +0100 +++ b/make/autoconf/toolchain_windows.m4 Tue Jan 30 16:41:40 2018 +0100 @@ -25,7 +25,7 @@ ################################################################################ # The order of these defines the priority by which we try to find them. -VALID_VS_VERSIONS="2013 2012 2010" +VALID_VS_VERSIONS="2013 2012 2010 2015 2017" VS_DESCRIPTION_2010="Microsoft Visual Studio 2010" VS_VERSION_INTERNAL_2010=100 @@ -58,6 +58,30 @@ VS_VS_PLATFORM_NAME_2013="v120" VS_SDK_PLATFORM_NAME_2013= +VS_DESCRIPTION_2015="Microsoft Visual Studio 2015 - CURRENTLY NOT WORKING" +VS_VERSION_INTERNAL_2015=140 +VS_MSVCR_2015=vcruntime140.dll +VS_MSVCP_2015=msvcp140.dll +VS_ENVVAR_2015="VS140COMNTOOLS" +VS_VS_INSTALLDIR_2015="Microsoft Visual Studio 14.0" +VS_SDK_INSTALLDIR_2015= +VS_VS_PLATFORM_NAME_2015="v140" +VS_SDK_PLATFORM_NAME_2015= +# The vcvars of 2015 breaks if 2017 is also installed. Work around this by +# explicitly specifying Windows Kit 8.1 to be used. +VS_ENV_ARGS_2015="8.1" + +VS_DESCRIPTION_2017="Microsoft Visual Studio 2017 - CURRENTLY NOT WORKING" +VS_VERSION_INTERNAL_2017=141 +VS_MSVCR_2017=vcruntime140.dll +VS_MSVCP_2017=msvcp140.dll +VS_ENVVAR_2017="VS150COMNTOOLS" +VS_VS_INSTALLDIR_2017="Microsoft Visual Studio/2017" +VS_EDITIONS_2017="Community Professional Enterprise" +VS_SDK_INSTALLDIR_2017= +VS_VS_PLATFORM_NAME_2017="v141" +VS_SDK_PLATFORM_NAME_2017= + ################################################################################ AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT], @@ -67,23 +91,41 @@ VS_BASE="$2" METHOD="$3" - if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - VCVARSFILE="vc/bin/vcvars32.bat" - else - VCVARSFILE="vc/bin/amd64/vcvars64.bat" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VS_BASE) + # In VS 2017, the default installation is in a subdir named after the edition. + # Find the first one present and use that. + if test "x$VS_EDITIONS" != x; then + for edition in $VS_EDITIONS; do + if test -d "$VS_BASE/$edition"; then + VS_BASE="$VS_BASE/$edition" + break + fi + done fi - BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VS_BASE) if test -d "$VS_BASE"; then - if test -f "$VS_BASE/$VCVARSFILE"; then - AC_MSG_NOTICE([Found Visual Studio installation at $VS_BASE using $METHOD]) - VS_ENV_CMD="$VS_BASE/$VCVARSFILE" - # PLATFORM_TOOLSET is used during the compilation of the freetype sources (see - # 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', 'v110' or 'v120' for VS 2010, 2012 or VS2013 + AC_MSG_NOTICE([Found Visual Studio installation at $VS_BASE using $METHOD]) + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat" + else + VCVARSFILES="vc/bin/amd64/vcvars64.bat vc/bin/x86_amd64/vcvarsx86_amd64.bat \ + vc/auxiliary/build/vcvarsx86_amd64.bat vc/auxiliary/build/vcvars64.bat" + fi + + for VCVARSFILE in $VCVARSFILES; do + if test -f "$VS_BASE/$VCVARSFILE"; then + VS_ENV_CMD="$VS_BASE/$VCVARSFILE" + break + fi + done + + if test "x$VS_ENV_CMD" = x; then + AC_MSG_NOTICE([Warning: None of $VCVARSFILES were found, Visual Studio installation not recognized. Ignoring]) + else + # PLATFORM_TOOLSET is used during the compilation of the freetype sources + # (see 'LIB_BUILD_FREETYPE' in libraries.m4) and must be one of 'v100', + # 'v110' or 'v120' for VS 2010, 2012 or VS2013 eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}" - else - AC_MSG_NOTICE([Found Visual Studio installation at $VS_BASE using $METHOD]) - AC_MSG_NOTICE([Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring]) fi fi fi @@ -133,7 +175,9 @@ eval VS_COMNTOOLS_VAR="\${VS_ENVVAR_${VS_VERSION}}" eval VS_COMNTOOLS="\$${VS_COMNTOOLS_VAR}" eval VS_INSTALL_DIR="\${VS_VS_INSTALLDIR_${VS_VERSION}}" + eval VS_EDITIONS="\${VS_EDITIONS_${VS_VERSION}}" eval SDK_INSTALL_DIR="\${VS_SDK_INSTALLDIR_${VS_VERSION}}" + eval VS_ENV_ARGS="\${VS_ENV_ARGS_${VS_VERSION}}" # When using --with-tools-dir, assume it points to the correct and default # version of Visual Studio or that --with-toolchain-version was also set. @@ -153,7 +197,6 @@ fi VS_ENV_CMD="" - VS_ENV_ARGS="" if test "x$VS_COMNTOOLS" != x; then TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([${VS_VERSION}], @@ -213,7 +256,11 @@ elif test "x$DEVKIT_VS_VERSION" != x; then VS_VERSION=$DEVKIT_VS_VERSION TOOLCHAIN_VERSION=$VS_VERSION - eval VS_DESCRIPTION="\${VS_DESCRIPTION_${VS_VERSION}}" + # If the devkit has a name, use that as description + VS_DESCRIPTION="$DEVKIT_NAME" + if test "x$VS_DESCRIPTION" = x; then + eval VS_DESCRIPTION="\${VS_DESCRIPTION_${VS_VERSION}}" + fi eval VS_VERSION_INTERNAL="\${VS_VERSION_INTERNAL_${VS_VERSION}}" eval MSVCR_NAME="\${VS_MSVCR_${VS_VERSION}}" eval MSVCP_NAME="\${VS_MSVCP_${VS_VERSION}}" @@ -267,6 +314,11 @@ break fi done + + TOOLCHAIN_DESCRIPTION="$VS_DESCRIPTION" + if test "$TOOLCHAIN_VERSION" -gt 2013; then + UNSUPPORTED_TOOLCHAIN_VERSION=yes + fi ]) ################################################################################ @@ -320,6 +372,9 @@ # This will end up something like: # call C:/progra~2/micros~2.0/vc/bin/amd64/vcvars64.bat $ECHO "call $WINPATH_VS_ENV_CMD $VS_ENV_ARGS" >> $EXTRACT_VC_ENV_BAT_FILE + # In some cases, the VS_ENV_CMD will change directory, change back so + # the set-vs-env.sh ends up in the right place. + $ECHO 'cd %~dp0' >> $EXTRACT_VC_ENV_BAT_FILE # These will end up something like: # C:/CygWin/bin/bash -c 'echo VS_PATH=\"$PATH\" > localdevenv.sh # The trailing space for everyone except PATH is no typo, but is needed due @@ -483,18 +538,30 @@ MSVC_DLL= if test "x$MSVC_DLL" = x; then - # Probe: Using well-known location from Visual Studio 10.0 if test "x$VCINSTALLDIR" != x; then CYGWIN_VC_INSTALL_DIR="$VCINSTALLDIR" BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(CYGWIN_VC_INSTALL_DIR) - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + if test "$VS_VERSION" -lt 2017; then + # Probe: Using well-known location from Visual Studio 12.0 and older + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + else + POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + fi else - POSSIBLE_MSVC_DLL="$CYGWIN_VC_INSTALL_DIR/redist/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME" + # Probe: Using well-known location from VS 2017 + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x64/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + else + POSSIBLE_MSVC_DLL="`ls $CYGWIN_VC_INSTALL_DIR/Redist/MSVC/*/x86/Microsoft.VC${VS_VERSION_INTERNAL}.CRT/$DLL_NAME`" + fi fi - $ECHO "POSSIBLE_MSVC_DLL $POSSIBLEMSVC_DLL" - TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL([$DLL_NAME], [$POSSIBLE_MSVC_DLL], - [well-known location in VCINSTALLDIR]) + # In case any of the above finds more than one file, loop over them. + for possible_msvc_dll in $POSSIBLE_MSVC_DLL; do + $ECHO "POSSIBLE_MSVC_DLL $possible_msvc_dll" + TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL([$DLL_NAME], [$possible_msvc_dll], + [well-known location in VCINSTALLDIR]) + done fi fi @@ -576,7 +643,7 @@ TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($MSVCR_NAME, [$DEVKIT_MSVCR_DLL], [devkit]) if test "x$MSVC_DLL" = x; then AC_MSG_ERROR([Could not find a proper $MSVCR_NAME as specified by devkit]) - fi + fi MSVCR_DLL="$MSVC_DLL" else TOOLCHAIN_SETUP_MSVC_DLL([${MSVCR_NAME}]) @@ -599,7 +666,7 @@ TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($MSVCP_NAME, [$DEVKIT_MSVCP_DLL], [devkit]) if test "x$MSVC_DLL" = x; then AC_MSG_ERROR([Could not find a proper $MSVCP_NAME as specified by devkit]) - fi + fi MSVCP_DLL="$MSVC_DLL" else TOOLCHAIN_SETUP_MSVC_DLL([${MSVCP_NAME}])
--- a/make/data/currency/CurrencyData.properties Tue Jan 30 16:26:40 2018 +0100 +++ b/make/data/currency/CurrencyData.properties Tue Jan 30 16:41:40 2018 +0100 @@ -32,7 +32,7 @@ # Version of the currency code information in this class. # It is a serial number that accompanies with each amendment. -dataVersion=162 +dataVersion=164 # List of all valid ISO 4217 currency codes. # To ensure compatibility, do not remove codes. @@ -52,7 +52,7 @@ NIO558-NLG528-NOK578-NPR524-NZD554-OMR512-PAB590-PEN604-PGK598-PHP608-\ PKR586-PLN985-PTE620-PYG600-QAR634-ROL946-RON946-RSD941-RUB643-RUR810-RWF646-SAR682-\ SBD090-SCR690-SDD736-SDG938-SEK752-SGD702-SHP654-SIT705-SKK703-SLL694-SOS706-\ - SRD968-SRG740-SSP728-STD678-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TMT934-TND788-TOP776-\ + SRD968-SRG740-SSP728-STD678-STN930-SVC222-SYP760-SZL748-THB764-TJS972-TMM795-TMT934-TND788-TOP776-\ TPE626-TRL792-TRY949-TTD780-TWD901-TZS834-UAH980-UGX800-USD840-USN997-USS998-UYI940-\ UYU858-UZS860-VEB862-VEF937-VND704-VUV548-WST882-XAF950-XAG961-XAU959-XBA955-\ XBB956-XBC957-XBD958-XCD951-XDR960-XFO000-XFU000-XOF952-XPD964-XPF953-\ @@ -196,7 +196,7 @@ CW=ANG # CYPRUS CY=EUR -# CZECH REPUBLIC (THE) +# CZECHIA CZ=CZK # DENMARK DK=DKK @@ -470,7 +470,7 @@ # SOUTH SUDAN SS=SSP # SAO TOME AND PRINCIPE -ST=STD +ST=STN # SAUDI ARABIA SA=SAR # SENEGAL
--- a/make/devkit/createWindowsDevkit.sh Tue Jan 30 16:26:40 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2015, 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. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# 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. -# - -# This script copies parts of a Visual Studio 2013 installation into a devkit -# suitable for building OpenJDK and OracleJDK. Needs to run in Cygwin. -# erik.joelsson@oracle.com - -VS_VERSION="2013" -VS_VERSION_NUM="12.0" -VS_VERSION_NUM_NODOT="120" -SDK_VERSION="8.1" -VS_VERSION_SP="SP4" - -SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)" -BUILD_DIR="${SCRIPT_DIR}/../../build/devkit" -DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}${VS_VERSION_SP}-devkit" -DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz" - -echo "Creating devkit in $DEVKIT_ROOT" - -MSVCR_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcr${VS_VERSION_NUM_NODOT}.dll -MSVCP_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcp${VS_VERSION_NUM_NODOT}.dll - -################################################################################ -# Copy Visual Studio files - -eval VSNNNCOMNTOOLS="\"\${VS${VS_VERSION_NUM_NODOT}COMNTOOLS}\"" -VS_INSTALL_DIR="$(cygpath "$VSNNNCOMNTOOLS/../..")" -echo "VS_INSTALL_DIR: $VS_INSTALL_DIR" - -if [ ! -d $DEVKIT_ROOT/VC ]; then - echo "Copying VC..." - mkdir -p $DEVKIT_ROOT/VC/bin - cp -r "$VS_INSTALL_DIR/VC/bin/amd64" $DEVKIT_ROOT/VC/bin/ - cp "$VS_INSTALL_DIR/VC/bin/"*.* $DEVKIT_ROOT/VC/bin/ - cp -r "$VS_INSTALL_DIR/VC/bin/1033/" $DEVKIT_ROOT/VC/bin/ - mkdir -p $DEVKIT_ROOT/VC/lib - cp -r "$VS_INSTALL_DIR/VC/lib/amd64" $DEVKIT_ROOT/VC/lib/ - cp "$VS_INSTALL_DIR/VC/lib/"*.* $DEVKIT_ROOT/VC/lib/ - cp -r "$VS_INSTALL_DIR/VC/include" $DEVKIT_ROOT/VC/ - mkdir -p $DEVKIT_ROOT/VC/atlmfc/lib - cp -r "$VS_INSTALL_DIR/VC/atlmfc/include" $DEVKIT_ROOT/VC/atlmfc/ - cp -r "$VS_INSTALL_DIR/VC/atlmfc/lib/amd64" $DEVKIT_ROOT/VC/atlmfc/lib/ - cp "$VS_INSTALL_DIR/VC/atlmfc/lib/"*.* $DEVKIT_ROOT/VC/atlmfc/lib/ - mkdir -p $DEVKIT_ROOT/VC/redist - cp -r "$VS_INSTALL_DIR/VC/redist/x64" $DEVKIT_ROOT/VC/redist/ - cp -r "$VS_INSTALL_DIR/VC/redist/x86" $DEVKIT_ROOT/VC/redist/ - # The redist runtime libs are needed to run the compiler but may not be - # installed on the machine where the devkit will be used. - cp $DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/ - cp $DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/ - cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/amd64/ - cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/amd64/ - # The msvcdis dll is needed to run some of the tools in VC/bin but is not - # shipped in that directory. Copy it from the common dir. - cp "$VS_INSTALL_DIR/Common7/IDE/msvcdis${VS_VERSION_NUM_NODOT}.dll" \ - $DEVKIT_ROOT/VC/bin/ -fi - -################################################################################ -# Copy SDK files - -PROGRAMFILES_X86="`env | sed -n 's/^ProgramFiles(x86)=//p'`" -SDK_INSTALL_DIR="$(cygpath "$PROGRAMFILES_X86/Windows Kits/$SDK_VERSION")" -echo "SDK_INSTALL_DIR: $SDK_INSTALL_DIR" - -if [ ! -d $DEVKIT_ROOT/$SDK_VERSION ]; then - echo "Copying SDK..." - mkdir -p $DEVKIT_ROOT/$SDK_VERSION/bin - cp -r "$SDK_INSTALL_DIR/bin/x64" $DEVKIT_ROOT/$SDK_VERSION/bin/ - cp -r "$SDK_INSTALL_DIR/bin/x86" $DEVKIT_ROOT/$SDK_VERSION/bin/ - mkdir -p $DEVKIT_ROOT/$SDK_VERSION/lib - cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x64 $DEVKIT_ROOT/$SDK_VERSION/lib/ - cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x86 $DEVKIT_ROOT/$SDK_VERSION/lib/ - cp -r "$SDK_INSTALL_DIR/include" $DEVKIT_ROOT/$SDK_VERSION/ -fi - -################################################################################ -# Generate devkit.info - -echo-info() { - echo "$1" >> $DEVKIT_ROOT/devkit.info -} - -echo "Generating devkit.info..." -rm -f $DEVKIT_ROOT/devkit.info -echo-info "# This file describes to configure how to interpret the contents of this devkit" -echo-info "DEVKIT_NAME=\"Microsoft Visual Studio $VS_VERSION $VS_VERSION_SP (devkit)\"" -echo-info "DEVKIT_VS_VERSION=\"$VS_VERSION\"" -echo-info "" -echo-info "DEVKIT_TOOLCHAIN_PATH_x86=\"\$DEVKIT_ROOT/VC/bin:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" -echo-info "DEVKIT_VS_INCLUDE_x86=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" -echo-info "DEVKIT_VS_LIB_x86=\"\$DEVKIT_ROOT/VC/lib;\$DEVKIT_ROOT/VC/atlmfc/lib;\$DEVKIT_ROOT/$SDK_VERSION/lib/x86\"" -echo-info "DEVKIT_MSVCR_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL\"" -echo-info "DEVKIT_MSVCP_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL\"" -echo-info "" -echo-info "DEVKIT_TOOLCHAIN_PATH_x86_64=\"\$DEVKIT_ROOT/VC/bin/amd64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" -echo-info "DEVKIT_VS_INCLUDE_x86_64=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" -echo-info "DEVKIT_VS_LIB_x86_64=\"\$DEVKIT_ROOT/VC/lib/amd64;\$DEVKIT_ROOT/VC/atlmfc/lib/amd64;\$DEVKIT_ROOT/$SDK_VERSION/lib/x64\"" -echo-info "DEVKIT_MSVCR_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL\"" -echo-info "DEVKIT_MSVCP_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL\"" - -################################################################################ -# Copy this script - -echo "Copying this script..." -cp $0 $DEVKIT_ROOT/ - -################################################################################ -# Create bundle - -echo "Creating bundle: $DEVKIT_BUNDLE" -(cd "$DEVKIT_ROOT" && tar zcf "$DEVKIT_BUNDLE" .)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/devkit/createWindowsDevkit2013.sh Tue Jan 30 16:41:40 2018 +0100 @@ -0,0 +1,136 @@ +#!/bin/bash +# +# Copyright (c) 2015, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# This script copies parts of a Visual Studio 2013 installation into a devkit +# suitable for building OpenJDK and OracleJDK. Needs to run in Cygwin. +# erik.joelsson@oracle.com + +VS_VERSION="2013" +VS_VERSION_NUM="12.0" +VS_VERSION_NUM_NODOT="120" +SDK_VERSION="8.1" +VS_VERSION_SP="SP4" + +SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)" +BUILD_DIR="${SCRIPT_DIR}/../../build/devkit" +DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}${VS_VERSION_SP}-devkit" +DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz" + +echo "Creating devkit in $DEVKIT_ROOT" + +MSVCR_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcr${VS_VERSION_NUM_NODOT}.dll +MSVCP_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcp${VS_VERSION_NUM_NODOT}.dll + +################################################################################ +# Copy Visual Studio files + +eval VSNNNCOMNTOOLS="\"\${VS${VS_VERSION_NUM_NODOT}COMNTOOLS}\"" +VS_INSTALL_DIR="$(cygpath "$VSNNNCOMNTOOLS/../..")" +echo "VS_INSTALL_DIR: $VS_INSTALL_DIR" + +if [ ! -d $DEVKIT_ROOT/VC ]; then + echo "Copying VC..." + mkdir -p $DEVKIT_ROOT/VC/bin + cp -r "$VS_INSTALL_DIR/VC/bin/amd64" $DEVKIT_ROOT/VC/bin/ + cp "$VS_INSTALL_DIR/VC/bin/"*.* $DEVKIT_ROOT/VC/bin/ + cp -r "$VS_INSTALL_DIR/VC/bin/1033/" $DEVKIT_ROOT/VC/bin/ + mkdir -p $DEVKIT_ROOT/VC/lib + cp -r "$VS_INSTALL_DIR/VC/lib/amd64" $DEVKIT_ROOT/VC/lib/ + cp "$VS_INSTALL_DIR/VC/lib/"*.* $DEVKIT_ROOT/VC/lib/ + cp -r "$VS_INSTALL_DIR/VC/include" $DEVKIT_ROOT/VC/ + mkdir -p $DEVKIT_ROOT/VC/atlmfc/lib + cp -r "$VS_INSTALL_DIR/VC/atlmfc/include" $DEVKIT_ROOT/VC/atlmfc/ + cp -r "$VS_INSTALL_DIR/VC/atlmfc/lib/amd64" $DEVKIT_ROOT/VC/atlmfc/lib/ + cp "$VS_INSTALL_DIR/VC/atlmfc/lib/"*.* $DEVKIT_ROOT/VC/atlmfc/lib/ + mkdir -p $DEVKIT_ROOT/VC/redist + cp -r "$VS_INSTALL_DIR/VC/redist/x64" $DEVKIT_ROOT/VC/redist/ + cp -r "$VS_INSTALL_DIR/VC/redist/x86" $DEVKIT_ROOT/VC/redist/ + # The redist runtime libs are needed to run the compiler but may not be + # installed on the machine where the devkit will be used. + cp $DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/ + cp $DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/ + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/amd64/ + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/amd64/ + # The msvcdis dll is needed to run some of the tools in VC/bin but is not + # shipped in that directory. Copy it from the common dir. + cp "$VS_INSTALL_DIR/Common7/IDE/msvcdis${VS_VERSION_NUM_NODOT}.dll" \ + $DEVKIT_ROOT/VC/bin/ +fi + +################################################################################ +# Copy SDK files + +PROGRAMFILES_X86="`env | sed -n 's/^ProgramFiles(x86)=//p'`" +SDK_INSTALL_DIR="$(cygpath "$PROGRAMFILES_X86/Windows Kits/$SDK_VERSION")" +echo "SDK_INSTALL_DIR: $SDK_INSTALL_DIR" + +if [ ! -d $DEVKIT_ROOT/$SDK_VERSION ]; then + echo "Copying SDK..." + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/bin + cp -r "$SDK_INSTALL_DIR/bin/x64" $DEVKIT_ROOT/$SDK_VERSION/bin/ + cp -r "$SDK_INSTALL_DIR/bin/x86" $DEVKIT_ROOT/$SDK_VERSION/bin/ + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/lib + cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x64 $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x86 $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/include" $DEVKIT_ROOT/$SDK_VERSION/ +fi + +################################################################################ +# Generate devkit.info + +echo-info() { + echo "$1" >> $DEVKIT_ROOT/devkit.info +} + +echo "Generating devkit.info..." +rm -f $DEVKIT_ROOT/devkit.info +echo-info "# This file describes to configure how to interpret the contents of this devkit" +echo-info "DEVKIT_NAME=\"Microsoft Visual Studio $VS_VERSION $VS_VERSION_SP (devkit)\"" +echo-info "DEVKIT_VS_VERSION=\"$VS_VERSION\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86=\"\$DEVKIT_ROOT/VC/bin:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" +echo-info "DEVKIT_VS_LIB_x86=\"\$DEVKIT_ROOT/VC/lib;\$DEVKIT_ROOT/VC/atlmfc/lib;\$DEVKIT_ROOT/$SDK_VERSION/lib/x86\"" +echo-info "DEVKIT_MSVCR_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86_64=\"\$DEVKIT_ROOT/VC/bin/amd64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86_64=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" +echo-info "DEVKIT_VS_LIB_x86_64=\"\$DEVKIT_ROOT/VC/lib/amd64;\$DEVKIT_ROOT/VC/atlmfc/lib/amd64;\$DEVKIT_ROOT/$SDK_VERSION/lib/x64\"" +echo-info "DEVKIT_MSVCR_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL\"" + +################################################################################ +# Copy this script + +echo "Copying this script..." +cp $0 $DEVKIT_ROOT/ + +################################################################################ +# Create bundle + +echo "Creating bundle: $DEVKIT_BUNDLE" +(cd "$DEVKIT_ROOT" && tar zcf "$DEVKIT_BUNDLE" .)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/devkit/createWindowsDevkit2015.sh Tue Jan 30 16:41:40 2018 +0100 @@ -0,0 +1,142 @@ +#!/bin/bash +# +# Copyright (c) 2015, 2018, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# This script copies parts of a Visual Studio installation into a devkit +# suitable for building OpenJDK and OracleJDK. Needs to run in Cygwin. +# erik.joelsson@oracle.com + +VS_VERSION="2015" +VS_VERSION_NUM="14.0" +VS_VERSION_NUM_NODOT="140" +SDK_VERSION="8.1" +VS_VERSION_SP="update3" + +SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)" +BUILD_DIR="${SCRIPT_DIR}/../../build/devkit" +DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}${VS_VERSION_SP}-devkit" +DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz" + +echo "Creating devkit in $DEVKIT_ROOT" + +MSVCR_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/vcruntime${VS_VERSION_NUM_NODOT}.dll +MSVCP_DLL=Microsoft.VC${VS_VERSION_NUM_NODOT}.CRT/msvcp${VS_VERSION_NUM_NODOT}.dll + +################################################################################ +# Copy Visual Studio files + +eval VSNNNCOMNTOOLS="\"\${VS${VS_VERSION_NUM_NODOT}COMNTOOLS}\"" +VS_INSTALL_DIR="$(cygpath "$VSNNNCOMNTOOLS/../..")" +echo "VS_INSTALL_DIR: $VS_INSTALL_DIR" + +if [ ! -d $DEVKIT_ROOT/VC ]; then + echo "Copying VC..." + mkdir -p $DEVKIT_ROOT/VC/bin + cp -r "$VS_INSTALL_DIR/VC/bin/amd64" $DEVKIT_ROOT/VC/bin/ + cp "$VS_INSTALL_DIR/VC/bin/"*.* $DEVKIT_ROOT/VC/bin/ + cp -r "$VS_INSTALL_DIR/VC/bin/1033/" $DEVKIT_ROOT/VC/bin/ + mkdir -p $DEVKIT_ROOT/VC/lib + cp -r "$VS_INSTALL_DIR/VC/lib/amd64" $DEVKIT_ROOT/VC/lib/ + cp "$VS_INSTALL_DIR/VC/lib/"*.* $DEVKIT_ROOT/VC/lib/ + cp -r "$VS_INSTALL_DIR/VC/include" $DEVKIT_ROOT/VC/ + mkdir -p $DEVKIT_ROOT/VC/atlmfc/lib + cp -r "$VS_INSTALL_DIR/VC/atlmfc/include" $DEVKIT_ROOT/VC/atlmfc/ + cp -r "$VS_INSTALL_DIR/VC/atlmfc/lib/amd64" $DEVKIT_ROOT/VC/atlmfc/lib/ + cp "$VS_INSTALL_DIR/VC/atlmfc/lib/"*.* $DEVKIT_ROOT/VC/atlmfc/lib/ + mkdir -p $DEVKIT_ROOT/VC/redist + cp -r "$VS_INSTALL_DIR/VC/redist/x64" $DEVKIT_ROOT/VC/redist/ + cp -r "$VS_INSTALL_DIR/VC/redist/x86" $DEVKIT_ROOT/VC/redist/ + # The redist runtime libs are needed to run the compiler but may not be + # installed on the machine where the devkit will be used. + cp $DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/ + cp $DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/ + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/amd64/ + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/amd64/ + # The msvcdis dll is needed to run some of the tools in VC/bin but is not + # shipped in that directory. Copy it from the common dir. + cp "$VS_INSTALL_DIR/Common7/IDE/msvcdis${VS_VERSION_NUM_NODOT}.dll" \ + $DEVKIT_ROOT/VC/bin/ +fi + +################################################################################ +# Copy SDK files + +PROGRAMFILES_X86="`env | sed -n 's/^ProgramFiles(x86)=//p'`" +SDK_INSTALL_DIR="$(cygpath "$PROGRAMFILES_X86/Windows Kits/$SDK_VERSION")" +echo "SDK_INSTALL_DIR: $SDK_INSTALL_DIR" + +if [ ! -d $DEVKIT_ROOT/$SDK_VERSION ]; then + echo "Copying SDK..." + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/bin + cp -r "$SDK_INSTALL_DIR/bin/x64" $DEVKIT_ROOT/$SDK_VERSION/bin/ + cp -r "$SDK_INSTALL_DIR/bin/x86" $DEVKIT_ROOT/$SDK_VERSION/bin/ + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/lib + cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x64 $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/lib/"winv*/um/x86 $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/include" $DEVKIT_ROOT/$SDK_VERSION/ + # In 2015, the new Universal CRT is delivered in the sdk 10 directory + # so need to include that as well. + mkdir -p $DEVKIT_ROOT/10/lib + cp -r "$SDK_INSTALL_DIR/../10/lib/10.0.10240.0/ucrt" $DEVKIT_ROOT/10/lib/ + mkdir -p $DEVKIT_ROOT/10/include + cp -r "$SDK_INSTALL_DIR/../10/include/10.0.10240.0/ucrt" $DEVKIT_ROOT/10/include/ +fi + +################################################################################ +# Generate devkit.info + +echo-info() { + echo "$1" >> $DEVKIT_ROOT/devkit.info +} + +echo "Generating devkit.info..." +rm -f $DEVKIT_ROOT/devkit.info +echo-info "# This file describes to configure how to interpret the contents of this devkit" +echo-info "DEVKIT_NAME=\"Microsoft Visual Studio $VS_VERSION $VS_VERSION_SP (devkit)\"" +echo-info "DEVKIT_VS_VERSION=\"$VS_VERSION\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86=\"\$DEVKIT_ROOT/VC/bin:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt;\$DEVKIT_ROOT/10/include/ucrt\"" +echo-info "DEVKIT_VS_LIB_x86=\"\$DEVKIT_ROOT/VC/lib;\$DEVKIT_ROOT/VC/atlmfc/lib;\$DEVKIT_ROOT/$SDK_VERSION/lib/x86;\$DEVKIT_ROOT/10/lib/ucrt/x86\"" +echo-info "DEVKIT_MSVCR_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86_64=\"\$DEVKIT_ROOT/VC/bin/amd64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86_64=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt;\$DEVKIT_ROOT/10/include/ucrt\"" +echo-info "DEVKIT_VS_LIB_x86_64=\"\$DEVKIT_ROOT/VC/lib/amd64;\$DEVKIT_ROOT/VC/atlmfc/lib/amd64;\$DEVKIT_ROOT/$SDK_VERSION/lib/x64;\$DEVKIT_ROOT/10/lib/ucrt/x64\"" +echo-info "DEVKIT_MSVCR_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL\"" + +################################################################################ +# Copy this script + +echo "Copying this script..." +cp $0 $DEVKIT_ROOT/ + +################################################################################ +# Create bundle + +echo "Creating bundle: $DEVKIT_BUNDLE" +(cd "$DEVKIT_ROOT" && tar zcf "$DEVKIT_BUNDLE" .)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make/devkit/createWindowsDevkit2017.sh Tue Jan 30 16:41:40 2018 +0100 @@ -0,0 +1,172 @@ +#!/bin/bash +# +# Copyright (c) 2015, 2018, 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. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# 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. +# + +# This script copies parts of a Visual Studio installation into a devkit +# suitable for building OpenJDK and OracleJDK. Needs to run in Cygwin. +# erik.joelsson@oracle.com + +VS_VERSION="2017" +VS_VERSION_NUM_NODOT="150" +VS_DLL_VERSION="140" +SDK_VERSION="10" +SDK_FULL_VERSION="10.0.16299.0" +MSVC_DIR="Microsoft.VC141.CRT" + +SCRIPT_DIR="$(cd "$(dirname $0)" > /dev/null && pwd)" +BUILD_DIR="${SCRIPT_DIR}/../../build/devkit" + +################################################################################ +# Prepare settings + +# Work around the insanely named ProgramFiles(x86) env variable +PROGRAMFILES_X86="$(cygpath "$(env | sed -n 's/^ProgramFiles(x86)=//p')")" + +# Find Visual Studio installation dir +eval VSNNNCOMNTOOLS="\"\${VS${VS_VERSION_NUM_NODOT}COMNTOOLS}\"" +if [ -d "$VSNNNCOMNTOOLS" ]; then + VS_INSTALL_DIR="$(cygpath "$VSNNNCOMNTOOLS/../..")" +else + VS_INSTALL_DIR="${PROGRAMFILES_X86}/Microsoft Visual Studio/2017" + VS_INSTALL_DIR="$(ls -d "${VS_INSTALL_DIR}/"{Community,Professional} 2>/dev/null | head -n1)" + VS_INSTALL_DIR="$(cygpath "$VS_INSTALL_DIR")" +fi +echo "VS_INSTALL_DIR: $VS_INSTALL_DIR" + +# Extract semantic version +POTENTIAL_INI_FILES="Common7\IDE\wdexpress.isolation.ini Common7\IDE\devenv.isolation.ini" +for f in $POTENTIAL_INI_FILES; do + if [ -f "$VS_INSTALL_DIR/$f" ]; then + VS_VERSION_SP="$(grep ^SemanticVersion= "$VS_INSTALL_DIR/$f")" + # Remove SemnaticVersion= + VS_VERSION_SP="${VS_VERSION_SP#*=}" + # Remove suffix of too detailed numbering starting with + + VS_VERSION_SP="${VS_VERSION_SP%+*}" + break + fi +done +if [ -z "$VS_VERSION_SP" ]; then + echo "Failed to find SP version" + exit 1 +fi +echo "Found Version SP: $VS_VERSION_SP" + +# Setup output dirs +DEVKIT_ROOT="${BUILD_DIR}/VS${VS_VERSION}-${VS_VERSION_SP}-devkit" +DEVKIT_BUNDLE="${DEVKIT_ROOT}.tar.gz" + +echo "Creating devkit in $DEVKIT_ROOT" + +MSVCR_DLL=${MSVC_DIR}/vcruntime${VS_DLL_VERSION}.dll +MSVCP_DLL=${MSVC_DIR}/msvcp${VS_DLL_VERSION}.dll + +################################################################################ +# Copy Visual Studio files + +if [ ! -d $DEVKIT_ROOT/VC ]; then + VC_SUBDIR="VC/Tools/MSVC/14.12.25827" + REDIST_SUBDIR="VC/Redist/MSVC/14.12.25810" + echo "Copying VC..." + mkdir -p $DEVKIT_ROOT/VC/bin + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx64/x64" $DEVKIT_ROOT/VC/bin/ + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/bin/Hostx86/x86" $DEVKIT_ROOT/VC/bin/ + mkdir -p $DEVKIT_ROOT/VC/lib + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/lib/x64" $DEVKIT_ROOT/VC/lib/ + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/lib/x86" $DEVKIT_ROOT/VC/lib/ + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/include" $DEVKIT_ROOT/VC/ + mkdir -p $DEVKIT_ROOT/VC/atlmfc/lib + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/atlmfc/lib/x64" $DEVKIT_ROOT/VC/atlmfc/lib/ + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/atlmfc/lib/x86" $DEVKIT_ROOT/VC/atlmfc/lib/ + cp -r "$VS_INSTALL_DIR/${VC_SUBDIR}/atlmfc/include" $DEVKIT_ROOT/VC/atlmfc/ + mkdir -p $DEVKIT_ROOT/VC/Auxiliary + cp -r "$VS_INSTALL_DIR/VC/Auxiliary/Build" $DEVKIT_ROOT/VC/Auxiliary/ + mkdir -p $DEVKIT_ROOT/VC/redist + cp -r "$VS_INSTALL_DIR/$REDIST_SUBDIR/x64" $DEVKIT_ROOT/VC/redist/ + cp -r "$VS_INSTALL_DIR/$REDIST_SUBDIR/x86" $DEVKIT_ROOT/VC/redist/ + + # The redist runtime libs are needed to run the compiler but may not be + # installed on the machine where the devkit will be used. + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/x86 + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/x86 + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/x64 + cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/x64 +fi + +################################################################################ +# Copy SDK files + +SDK_INSTALL_DIR="$(cygpath "$PROGRAMFILES_X86/Windows Kits/$SDK_VERSION")" +echo "SDK_INSTALL_DIR: $SDK_INSTALL_DIR" + +if [ ! -d $DEVKIT_ROOT/$SDK_VERSION ]; then + echo "Copying SDK..." + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/bin + cp -r "$SDK_INSTALL_DIR/bin/$SDK_FULL_VERSION/x64" $DEVKIT_ROOT/$SDK_VERSION/bin/ + cp -r "$SDK_INSTALL_DIR/bin/$SDK_FULL_VERSION/x86" $DEVKIT_ROOT/$SDK_VERSION/bin/ + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/lib + cp -r "$SDK_INSTALL_DIR/lib/$SDK_FULL_VERSION/um/x64" $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/lib/$SDK_FULL_VERSION/um/x86" $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/lib/$SDK_FULL_VERSION/ucrt/x64" $DEVKIT_ROOT/$SDK_VERSION/lib/ + cp -r "$SDK_INSTALL_DIR/lib/$SDK_FULL_VERSION/ucrt/x86" $DEVKIT_ROOT/$SDK_VERSION/lib/ + mkdir -p $DEVKIT_ROOT/$SDK_VERSION/include + cp -r "$SDK_INSTALL_DIR/include/$SDK_FULL_VERSION/"* $DEVKIT_ROOT/$SDK_VERSION/include/ +fi + +################################################################################ +# Generate devkit.info + +echo-info() { + echo "$1" >> $DEVKIT_ROOT/devkit.info +} + +echo "Generating devkit.info..." +rm -f $DEVKIT_ROOT/devkit.info +echo-info "# This file describes to configure how to interpret the contents of this devkit" +echo-info "DEVKIT_NAME=\"Microsoft Visual Studio $VS_VERSION $VS_VERSION_SP (devkit)\"" +echo-info "DEVKIT_VS_VERSION=\"$VS_VERSION\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86=\"\$DEVKIT_ROOT/VC/bin/x86:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/ucrt;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" +echo-info "DEVKIT_VS_LIB_x86=\"\$DEVKIT_ROOT/VC/lib/x86;\$DEVKIT_ROOT/VC/atlmfc/lib/x86;\$DEVKIT_ROOT/$SDK_VERSION/lib/x86\"" +echo-info "DEVKIT_MSVCR_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86=\"\$DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL\"" +echo-info "" +echo-info "DEVKIT_TOOLCHAIN_PATH_x86_64=\"\$DEVKIT_ROOT/VC/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x64:\$DEVKIT_ROOT/$SDK_VERSION/bin/x86\"" +echo-info "DEVKIT_VS_INCLUDE_x86_64=\"\$DEVKIT_ROOT/VC/include;\$DEVKIT_ROOT/VC/atlmfc/include;\$DEVKIT_ROOT/$SDK_VERSION/include/shared;\$DEVKIT_ROOT/$SDK_VERSION/include/ucrt;\$DEVKIT_ROOT/$SDK_VERSION/include/um;\$DEVKIT_ROOT/$SDK_VERSION/include/winrt\"" +echo-info "DEVKIT_VS_LIB_x86_64=\"\$DEVKIT_ROOT/VC/lib/x64;\$DEVKIT_ROOT/VC/atlmfc/lib/x64;\$DEVKIT_ROOT/$SDK_VERSION/lib/x64\"" +echo-info "DEVKIT_MSVCR_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL\"" +echo-info "DEVKIT_MSVCP_DLL_x86_64=\"\$DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL\"" + +################################################################################ +# Copy this script + +echo "Copying this script..." +cp $0 $DEVKIT_ROOT/ + +################################################################################ +# Create bundle + +echo "Creating bundle: $DEVKIT_BUNDLE" +(cd "$DEVKIT_ROOT" && tar zcf "$DEVKIT_BUNDLE" .)
--- a/make/gensrc/Gensrc-java.desktop.gmk Tue Jan 30 16:26:40 2018 +0100 +++ b/make/gensrc/Gensrc-java.desktop.gmk Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2018, 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 @@ -46,7 +46,6 @@ $(TOPDIR)/src/java.desktop/share/classes/sun/awt/resources \ $(TOPDIR)/src/java.desktop/share/classes/com/sun/accessibility/internal/resources \ $(TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/resources \ - $(TOPDIR)/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/resources \ $(TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/basic/resources \ $(TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/metal/resources \ $(TOPDIR)/src/java.desktop/share/classes/com/sun/swing/internal/plaf/synth/resources \ @@ -61,7 +60,10 @@ endif ifeq ($(OPENJDK_TARGET_OS), windows) - PROP_SRC_DIRS += $(TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows + PROP_SRC_DIRS += \ + $(TOPDIR)/src/java.desktop/windows/classes/com/sun/java/swing/plaf/windows/resources \ + $(TOPDIR)/src/java.desktop/windows/classes/sun/awt/windows \ + # endif ifeq ($(filter $(OPENJDK_TARGET_OS), windows macosx), )
--- a/make/hotspot/lib/CompileJvm.gmk Tue Jan 30 16:26:40 2018 +0100 +++ b/make/hotspot/lib/CompileJvm.gmk Tue Jan 30 16:41:40 2018 +0100 @@ -222,6 +222,7 @@ CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ CXXFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \ vm_version.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \ + arguments.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \ DISABLED_WARNINGS_clang := tautological-compare, \ DISABLED_WARNINGS_xlc := 1540-0216 1540-0198 1540-1090 1540-1639 \ 1540-1088 1500-010, \
--- a/make/idea/idea.gmk Tue Jan 30 16:26:40 2018 +0100 +++ b/make/idea/idea.gmk Tue Jan 30 16:41:40 2018 +0100 @@ -20,16 +20,9 @@ SEL_MODULES := $(MODULES) endif - # Find all source dirs for a particular module - # $1 - Module to find source dirs for - FindIdeaModuleSrcDirs = \ - $(strip $(addsuffix /$(strip $1), $(GENERATED_SRC_DIRS) $(IMPORT_MODULES_SRC)) \ - $(wildcard $(foreach sub, $(SRC_SUBDIRS), $(addsuffix /$(strip $1)/$(sub), $(TOP_SRC_DIRS))))) - - idea: $(ECHO) "SUPPORT=$(SUPPORT_OUTPUTDIR)" >> $(OUT) - $(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindIdeaModuleSrcDirs,$(mod)))\"" >> $(OUT) + $(ECHO) "MODULE_ROOTS=\"$(foreach mod, $(SEL_MODULES), $(call FindModuleSrcDirs,$(mod)))\"" >> $(OUT) $(ECHO) "MODULE_NAMES=\"$(strip $(foreach mod, $(SEL_MODULES), $(mod)))\"" >> $(OUT) $(ECHO) "SEL_MODULES=\"$(SEL_MODULES)\"" >> $(OUT) $(ECHO) "BOOT_JDK=\"$(BOOT_JDK)\"" >> $(OUT)
--- a/make/idea/template/ant.xml Tue Jan 30 16:26:40 2018 +0100 +++ b/make/idea/template/ant.xml Tue Jan 30 16:41:40 2018 +0100 @@ -3,7 +3,6 @@ <component name="AntConfiguration"> <buildFile url="file://$PROJECT_DIR$/.idea/build.xml"> <properties> - <property name="boot.java.home" value="$JDKPath$" /> <property name="intellij.ismake" value="$IsMake$" /> <property name="build.target.dir" value="specDir" /> <!-- this will be replaced --> <property name="module.name" value="java.base" /> <!-- this will be replaced -->
--- a/make/idea/template/build.xml Tue Jan 30 16:26:40 2018 +0100 +++ b/make/idea/template/build.xml Tue Jan 30 16:41:40 2018 +0100 @@ -6,32 +6,16 @@ new JdkLogger(project) </script> - <!-- java.marker is set to a marker file to check for within a Java install dir. - The best file to check for across Solaris/Linux/Windows/MacOS is one of the - executables; regrettably, that is OS-specific. --> - <condition property="java.marker" value="bin/java"> - <os family="unix"/> - </condition> - <condition property="java.marker" value="bin/java.exe"> - <os family="windows"/> - </condition> - - <target name="-check-jtreg.home" depends="-def-check"> - <check name="jtreg" property="jtreg.home" marker="lib/jtreg.jar"/> - </target> - - <property name="test.dir" value="${basedir}/jdk/test"/> - <macrodef name="call-make"> - <attribute name="dir"/> - <attribute name="args"/> - <sequential> - <exec executable="make" dir="@{dir}" failonerror="true"> - <arg line="@{args}"/> - <env key="CLASSPATH" value = ""/> - </exec> - </sequential> - </macrodef> + <attribute name="dir"/> + <attribute name="args"/> + <sequential> + <exec executable="make" dir="@{dir}" failonerror="true"> + <arg line="@{args}"/> + <env key="CLASSPATH" value = ""/> + </exec> + </sequential> + </macrodef> <target name="cond-clean" unless="${intellij.ismake}"> <antcall target="clean"/> @@ -43,71 +27,17 @@ **** Global JDK Build Targets --> - <target name="clean" depends="-do-configure"> + <target name="clean"> <echo message="base = ${basedir}"/> + <call-make dir = "${build.target.dir}" args = "reconfigure"/> <call-make dir = "${build.target.dir}" args = "clean"/> </target> - <target name="-do-configure"> - <echo message="base = ${basedir}"/> - <fail message="Not part of a full JDK forest"> - <condition> - <not> - <available file="${basedir}/configure" /> - </not> - </condition> - </fail> - <exec executable="sh" dir="${basedir}" failonerror="true"> - <arg line="configure --with-boot-jdk=${boot.java.home}"/> - </exec> - </target> - <target name="images"> <call-make dir = "${build.target.dir}" args = "images"/> </target> - <target name="jimages"> - <call-make dir = "${build.target.dir}" args = "jimages"/> - </target> - - <target name="check-env"> - <exec executable="env" dir="${basedir}"/> - </target> - <target name="build-module"> <call-make dir = "${build.target.dir}" args = "${module.name}"/> </target> - - <target name="-check-boot.java.home" depends="-def-check"> - <check name="bootstrap java" property="boot.java.home" marker="${java.marker}"/> - </target> - - <target name="-def-check"> - <macrodef name="check"> - <attribute name="name"/> - <attribute name="property"/> - <attribute name="marker" default=""/> - <sequential> - <fail message="Cannot locate @{name}: please set @{property} to its location"> - <condition> - <not> - <isset property="@{property}"/> - </not> - </condition> - </fail> - <fail message="@{name} is not installed in ${@{property}}"> - <condition> - <and> - <not> - <equals arg1="@{marker}" arg2=""/> - </not> - <not> - <available file="${@{property}}/@{marker}"/> - </not> - </and> - </condition> - </fail> - </sequential> - </macrodef> - </target> </project>
--- a/make/idea/template/jdk.iml Tue Jan 30 16:26:40 2018 +0100 +++ b/make/idea/template/jdk.iml Tue Jan 30 16:41:40 2018 +0100 @@ -4,11 +4,9 @@ <exclude-output /> <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/####" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" /> - <excludeFolder url="file://$MODULE_DIR$/src" /> <excludeFolder url="file://$MODULE_DIR$/build" /> <excludeFolder url="file://$MODULE_DIR$/make" /> - </content> + </content> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="inheritedJdk" /> </component>
--- a/make/mapfiles/libjava/mapfile-vers Tue Jan 30 16:26:40 2018 +0100 +++ b/make/mapfiles/libjava/mapfile-vers Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2018, 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 @@ -74,6 +74,7 @@ JNU_ThrowStringIndexOutOfBoundsException; JNU_ToString; + Java_java_io_FileDescriptor_cleanupClose0; Java_java_io_FileDescriptor_close0; Java_java_io_FileDescriptor_initIDs; Java_java_io_FileDescriptor_sync;
--- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1049,7 +1049,8 @@ ldr(method_result, Address(method_result, vtable_offset_in_bytes)); } else { vtable_offset_in_bytes += vtable_index.as_constant() * wordSize; - ldr(method_result, Address(recv_klass, vtable_offset_in_bytes)); + ldr(method_result, + form_address(rscratch1, recv_klass, vtable_offset_in_bytes)); } }
--- a/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -774,7 +774,7 @@ __ load_klass(rscratch1, receiver); __ ldr(tmp, Address(holder, CompiledICHolder::holder_klass_offset())); __ cmp(rscratch1, tmp); - __ ldr(rmethod, Address(holder, CompiledICHolder::holder_method_offset())); + __ ldr(rmethod, Address(holder, CompiledICHolder::holder_metadata_offset())); __ br(Assembler::EQ, ok); __ far_jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
--- a/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/aarch64/vtableStubs_aarch64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -63,8 +63,8 @@ #ifndef PRODUCT if (CountCompiledCalls) { - __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); - __ incrementw(Address(r19)); + __ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); + __ incrementw(Address(r16)); } #endif @@ -73,13 +73,13 @@ // get receiver klass address npe_addr = __ pc(); - __ load_klass(r19, j_rarg0); + __ load_klass(r16, j_rarg0); #ifndef PRODUCT if (DebugVtables) { Label L; // check offset vs vtable length - __ ldrw(rscratch1, Address(r19, Klass::vtable_length_offset())); + __ ldrw(rscratch1, Address(r16, Klass::vtable_length_offset())); __ cmpw(rscratch1, vtable_index * vtableEntry::size()); __ br(Assembler::GT, L); __ enter(); @@ -91,7 +91,7 @@ } #endif // PRODUCT - __ lookup_virtual_method(r19, vtable_index, rmethod); + __ lookup_virtual_method(r16, vtable_index, rmethod); if (DebugVtables) { Label L; @@ -145,9 +145,9 @@ // j_rarg0: Receiver - // Most registers are in use; we'll use r0, rmethod, r10, r11 + // Most registers are in use; we'll use r16, rmethod, r10, r11 const Register recv_klass_reg = r10; - const Register holder_klass_reg = r0; // declaring interface klass (DECC) + const Register holder_klass_reg = r16; // declaring interface klass (DECC) const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC) const Register temp_reg = r11; const Register icholder_reg = rscratch2;
--- a/src/hotspot/cpu/arm/macroAssembler_arm.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/arm/macroAssembler_arm.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2475,49 +2475,65 @@ // On success, the result will be in method_result, and execution falls through. // On failure, execution transfers to the given label. void MacroAssembler::lookup_interface_method(Register Rklass, - Register Rinterf, - Register Rindex, + Register Rintf, + RegisterOrConstant itable_index, Register method_result, - Register temp_reg1, - Register temp_reg2, + Register Rscan, + Register Rtmp, Label& L_no_such_interface) { - assert_different_registers(Rklass, Rinterf, temp_reg1, temp_reg2, Rindex); - - Register Ritable = temp_reg1; + assert_different_registers(Rklass, Rintf, Rscan, Rtmp); + + const int entry_size = itableOffsetEntry::size() * HeapWordSize; + assert(itableOffsetEntry::interface_offset_in_bytes() == 0, "not added for convenience"); // Compute start of first itableOffsetEntry (which is at the end of the vtable) const int base = in_bytes(Klass::vtable_start_offset()); const int scale = exact_log2(vtableEntry::size_in_bytes()); - ldr_s32(temp_reg2, Address(Rklass, Klass::vtable_length_offset())); // Get length of vtable - add(Ritable, Rklass, base); - add(Ritable, Ritable, AsmOperand(temp_reg2, lsl, scale)); - - Label entry, search; - - b(entry); - - bind(search); - add(Ritable, Ritable, itableOffsetEntry::size() * HeapWordSize); - - bind(entry); - - // Check that the entry is non-null. A null entry means that the receiver - // class doesn't implement the interface, and wasn't the same as the - // receiver class checked when the interface was resolved. - - ldr(temp_reg2, Address(Ritable, itableOffsetEntry::interface_offset_in_bytes())); - cbz(temp_reg2, L_no_such_interface); - - cmp(Rinterf, temp_reg2); - b(search, ne); - - ldr_s32(temp_reg2, Address(Ritable, itableOffsetEntry::offset_offset_in_bytes())); - add(temp_reg2, temp_reg2, Rklass); // Add offset to Klass* - assert(itableMethodEntry::size() * HeapWordSize == wordSize, "adjust the scaling in the code below"); - assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust the offset in the code below"); - - ldr(method_result, Address::indexed_ptr(temp_reg2, Rindex)); + ldr_s32(Rtmp, Address(Rklass, Klass::vtable_length_offset())); // Get length of vtable + add(Rscan, Rklass, base); + add(Rscan, Rscan, AsmOperand(Rtmp, lsl, scale)); + + // Search through the itable for an interface equal to incoming Rintf + // itable looks like [intface][offset][intface][offset][intface][offset] + + Label loop; + bind(loop); + ldr(Rtmp, Address(Rscan, entry_size, post_indexed)); +#ifdef AARCH64 + Label found; + cmp(Rtmp, Rintf); + b(found, eq); + cbnz(Rtmp, loop); +#else + cmp(Rtmp, Rintf); // set ZF and CF if interface is found + cmn(Rtmp, 0, ne); // check if tmp == 0 and clear CF if it is + b(loop, ne); +#endif // AARCH64 + +#ifdef AARCH64 + b(L_no_such_interface); + bind(found); +#else + // CF == 0 means we reached the end of itable without finding icklass + b(L_no_such_interface, cc); +#endif // !AARCH64 + + if (method_result != noreg) { + // Interface found at previous position of Rscan, now load the method + ldr_s32(Rtmp, Address(Rscan, itableOffsetEntry::offset_offset_in_bytes() - entry_size)); + if (itable_index.is_register()) { + add(Rtmp, Rtmp, Rklass); // Add offset to Klass* + assert(itableMethodEntry::size() * HeapWordSize == wordSize, "adjust the scaling in the code below"); + assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust the offset in the code below"); + ldr(method_result, Address::indexed_ptr(Rtmp, itable_index.as_register())); + } else { + int method_offset = itableMethodEntry::size() * HeapWordSize * itable_index.as_constant() + + itableMethodEntry::method_offset_in_bytes(); + add_slow(method_result, Rklass, method_offset); + ldr(method_result, Address(method_result, Rtmp)); + } + } } #ifdef COMPILER2
--- a/src/hotspot/cpu/arm/macroAssembler_arm.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/arm/macroAssembler_arm.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1316,7 +1316,7 @@ void lookup_interface_method(Register recv_klass, Register intf_klass, - Register itable_index, + RegisterOrConstant itable_index, Register method_result, Register temp_reg1, Register temp_reg2,
--- a/src/hotspot/cpu/arm/sharedRuntime_arm.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/arm/sharedRuntime_arm.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -984,7 +984,7 @@ __ load_klass(receiver_klass, receiver); __ ldr(holder_klass, Address(Ricklass, CompiledICHolder::holder_klass_offset())); - __ ldr(Rmethod, Address(Ricklass, CompiledICHolder::holder_method_offset())); + __ ldr(Rmethod, Address(Ricklass, CompiledICHolder::holder_metadata_offset())); __ cmp(receiver_klass, holder_klass); #ifdef AARCH64
--- a/src/hotspot/cpu/arm/templateTable_arm.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/arm/templateTable_arm.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -4198,7 +4198,7 @@ const Register Rflags = R3_tmp; const Register Rklass = R3_tmp; - prepare_invoke(byte_no, Rinterf, Rindex, Rrecv, Rflags); + prepare_invoke(byte_no, Rinterf, Rmethod, Rrecv, Rflags); // Special case of invokeinterface called for virtual method of // java.lang.Object. See cpCacheOop.cpp for details. @@ -4207,56 +4207,39 @@ Label notMethod; __ tbz(Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift, notMethod); - __ mov(Rmethod, Rindex); invokevirtual_helper(Rmethod, Rrecv, Rflags); __ bind(notMethod); // Get receiver klass into Rklass - also a null check __ load_klass(Rklass, Rrecv); + Label no_such_interface; + + // Receiver subtype check against REFC. + __ lookup_interface_method(// inputs: rec. class, interface + Rklass, Rinterf, noreg, + // outputs: scan temp. reg1, scan temp. reg2 + noreg, Ritable, Rtemp, + no_such_interface); + // profile this call __ profile_virtual_call(R0_tmp, Rklass); - // Compute start of first itableOffsetEntry (which is at the end of the vtable) - const int base = in_bytes(Klass::vtable_start_offset()); - assert(vtableEntry::size() == 1, "adjust the scaling in the code below"); - __ ldr_s32(Rtemp, Address(Rklass, Klass::vtable_length_offset())); // Get length of vtable - __ add(Ritable, Rklass, base); - __ add(Ritable, Ritable, AsmOperand(Rtemp, lsl, LogBytesPerWord)); - - Label entry, search, interface_ok; - - __ b(entry); - - __ bind(search); - __ add(Ritable, Ritable, itableOffsetEntry::size() * HeapWordSize); - - __ bind(entry); - - // Check that the entry is non-null. A null entry means that the receiver - // class doesn't implement the interface, and wasn't the same as the - // receiver class checked when the interface was resolved. - - __ ldr(Rtemp, Address(Ritable, itableOffsetEntry::interface_offset_in_bytes())); - __ cbnz(Rtemp, interface_ok); - - // throw exception - __ call_VM(noreg, CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError)); - - // the call_VM checks for exception, so we should never return here. - __ should_not_reach_here(); - - __ bind(interface_ok); - - __ cmp(Rinterf, Rtemp); - __ b(search, ne); - - __ ldr_s32(Rtemp, Address(Ritable, itableOffsetEntry::offset_offset_in_bytes())); - __ add(Rtemp, Rtemp, Rklass); // Add offset to Klass* - assert(itableMethodEntry::size() == 1, "adjust the scaling in the code below"); - - __ ldr(Rmethod, Address::indexed_ptr(Rtemp, Rindex)); + // Get declaring interface class from method + __ ldr(Rtemp, Address(Rmethod, Method::const_offset())); + __ ldr(Rtemp, Address(Rtemp, ConstMethod::constants_offset())); + __ ldr(Rinterf, Address(Rtemp, ConstantPool::pool_holder_offset_in_bytes())); + + // Get itable index from method + __ ldr_s32(Rtemp, Address(Rmethod, Method::itable_index_offset())); + __ add(Rtemp, Rtemp, (-Method::itable_index_max)); // small negative constant is too large for an immediate on arm32 + __ neg(Rindex, Rtemp); + + __ lookup_interface_method(// inputs: rec. class, interface + Rklass, Rinterf, Rindex, + // outputs: scan temp. reg1, scan temp. reg2 + Rmethod, Ritable, Rtemp, + no_such_interface); // Rmethod: Method* to call @@ -4278,6 +4261,13 @@ // do the call __ jump_from_interpreted(Rmethod); + + // throw exception + __ bind(no_such_interface); + __ restore_method(); + __ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); + // the call_VM checks for exception, so we should never return here. + __ should_not_reach_here(); } void TemplateTable::invokehandle(int byte_no) {
--- a/src/hotspot/cpu/arm/vtableStubs_arm.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/arm/vtableStubs_arm.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -28,6 +28,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_arm.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -118,67 +119,48 @@ // R0-R3 / R0-R7 registers hold the arguments and cannot be spoiled const Register Rclass = AARCH64_ONLY(R9) NOT_AARCH64(R4); - const Register Rlength = AARCH64_ONLY(R10) NOT_AARCH64(R5); + const Register Rintf = AARCH64_ONLY(R10) NOT_AARCH64(R5); const Register Rscan = AARCH64_ONLY(R11) NOT_AARCH64(R6); - const Register tmp = Rtemp; - assert_different_registers(Ricklass, Rclass, Rlength, Rscan, tmp); + assert_different_registers(Ricklass, Rclass, Rintf, Rscan, Rtemp); // Calculate the start of itable (itable goes after vtable) const int scale = exact_log2(vtableEntry::size_in_bytes()); address npe_addr = __ pc(); __ load_klass(Rclass, R0); - __ ldr_s32(Rlength, Address(Rclass, Klass::vtable_length_offset())); - __ add(Rscan, Rclass, in_bytes(Klass::vtable_start_offset())); - __ add(Rscan, Rscan, AsmOperand(Rlength, lsl, scale)); + Label L_no_such_interface; - // Search through the itable for an interface equal to incoming Ricklass - // itable looks like [intface][offset][intface][offset][intface][offset] - const int entry_size = itableOffsetEntry::size() * HeapWordSize; - assert(itableOffsetEntry::interface_offset_in_bytes() == 0, "not added for convenience"); + // Receiver subtype check against REFC. + __ ldr(Rintf, Address(Ricklass, CompiledICHolder::holder_klass_offset())); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + Rclass, Rintf, noreg, + // outputs: temp reg1, temp reg2 + noreg, Rscan, Rtemp, + L_no_such_interface); - Label loop; - __ bind(loop); - __ ldr(tmp, Address(Rscan, entry_size, post_indexed)); -#ifdef AARCH64 - Label found; - __ cmp(tmp, Ricklass); - __ b(found, eq); - __ cbnz(tmp, loop); -#else - __ cmp(tmp, Ricklass); // set ZF and CF if interface is found - __ cmn(tmp, 0, ne); // check if tmp == 0 and clear CF if it is - __ b(loop, ne); -#endif // AARCH64 - - assert(StubRoutines::throw_IncompatibleClassChangeError_entry() != NULL, "Check initialization order"); -#ifdef AARCH64 - __ jump(StubRoutines::throw_IncompatibleClassChangeError_entry(), relocInfo::runtime_call_type, tmp); - __ bind(found); -#else - // CF == 0 means we reached the end of itable without finding icklass - __ jump(StubRoutines::throw_IncompatibleClassChangeError_entry(), relocInfo::runtime_call_type, noreg, cc); -#endif // !AARCH64 - - // Interface found at previous position of Rscan, now load the method oop - __ ldr_s32(tmp, Address(Rscan, itableOffsetEntry::offset_offset_in_bytes() - entry_size)); - { - const int method_offset = itableMethodEntry::size() * HeapWordSize * itable_index + - itableMethodEntry::method_offset_in_bytes(); - __ add_slow(Rmethod, Rclass, method_offset); - } - __ ldr(Rmethod, Address(Rmethod, tmp)); + // Get Method* and entry point for compiler + __ ldr(Rintf, Address(Ricklass, CompiledICHolder::holder_metadata_offset())); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + Rclass, Rintf, itable_index, + // outputs: temp reg1, temp reg2, temp reg3 + Rmethod, Rscan, Rtemp, + L_no_such_interface); address ame_addr = __ pc(); #ifdef AARCH64 - __ ldr(tmp, Address(Rmethod, Method::from_compiled_offset())); - __ br(tmp); + __ ldr(Rtemp, Address(Rmethod, Method::from_compiled_offset())); + __ br(Rtemp); #else __ ldr(PC, Address(Rmethod, Method::from_compiled_offset())); #endif // AARCH64 + __ bind(L_no_such_interface); + + assert(StubRoutines::throw_IncompatibleClassChangeError_entry() != NULL, "check initialization order"); + __ jump(StubRoutines::throw_IncompatibleClassChangeError_entry(), relocInfo::runtime_call_type, Rtemp); + masm->flush(); if (PrintMiscellaneous && (WizardMode || Verbose)) { @@ -205,7 +187,7 @@ instr_count = NOT_AARCH64(4) AARCH64_ONLY(5); } else { // itable stub size - instr_count = NOT_AARCH64(20) AARCH64_ONLY(20); + instr_count = NOT_AARCH64(31) AARCH64_ONLY(31); } #ifdef AARCH64
--- a/src/hotspot/cpu/ppc/globalDefinitions_ppc.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/globalDefinitions_ppc.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -55,5 +55,9 @@ #define SUPPORT_RESERVED_STACK_AREA #define THREAD_LOCAL_POLL +// If UseSIGTRAP is active, we only use the poll bit and no polling page. +// Otherwise, we fall back to usage of the polling page in nmethods. +// Define the condition to use this -XX flag. +#define USE_POLL_BIT_ONLY UseSIGTRAP #endif // CPU_PPC_VM_GLOBALDEFINITIONS_PPC_HPP
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1788,11 +1788,10 @@ RegisterOrConstant itable_index, Register method_result, Register scan_temp, - Register sethi_temp, - Label& L_no_such_interface) { + Register temp2, + Label& L_no_such_interface, + bool return_method) { assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); - assert(itable_index.is_constant() || itable_index.as_register() == method_result, - "caller must use same register for non-constant itable index as for method"); // Compute start of first itableOffsetEntry (which is at the end of the vtable). int vtable_base = in_bytes(Klass::vtable_start_offset()); @@ -1810,15 +1809,17 @@ add(scan_temp, recv_klass, scan_temp); // Adjust recv_klass by scaled itable_index, so we can free itable_index. - if (itable_index.is_register()) { - Register itable_offset = itable_index.as_register(); - sldi(itable_offset, itable_offset, logMEsize); - if (itentry_off) addi(itable_offset, itable_offset, itentry_off); - add(recv_klass, itable_offset, recv_klass); - } else { - long itable_offset = (long)itable_index.as_constant(); - load_const_optimized(sethi_temp, (itable_offset<<logMEsize)+itentry_off); // static address, no relocation - add(recv_klass, sethi_temp, recv_klass); + if (return_method) { + if (itable_index.is_register()) { + Register itable_offset = itable_index.as_register(); + sldi(method_result, itable_offset, logMEsize); + if (itentry_off) { addi(method_result, method_result, itentry_off); } + add(method_result, method_result, recv_klass); + } else { + long itable_offset = (long)itable_index.as_constant(); + // static address, no relocation + add_const_optimized(method_result, recv_klass, (itable_offset << logMEsize) + itentry_off, temp2); + } } // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { @@ -1831,12 +1832,12 @@ for (int peel = 1; peel >= 0; peel--) { // %%%% Could load both offset and interface in one ldx, if they were // in the opposite order. This would save a load. - ld(method_result, itableOffsetEntry::interface_offset_in_bytes(), scan_temp); + ld(temp2, itableOffsetEntry::interface_offset_in_bytes(), scan_temp); // Check that this entry is non-null. A null entry means that // the receiver class doesn't implement the interface, and wasn't the // same as when the caller was compiled. - cmpd(CCR0, method_result, intf_klass); + cmpd(CCR0, temp2, intf_klass); if (peel) { beq(CCR0, found_method); @@ -1849,7 +1850,7 @@ bind(search); - cmpdi(CCR0, method_result, 0); + cmpdi(CCR0, temp2, 0); beq(CCR0, L_no_such_interface); addi(scan_temp, scan_temp, scan_step); } @@ -1857,9 +1858,11 @@ bind(found_method); // Got a hit. - int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); - lwz(scan_temp, ito_offset, scan_temp); - ldx(method_result, scan_temp, recv_klass); + if (return_method) { + int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); + lwz(scan_temp, ito_offset, scan_temp); + ldx(method_result, scan_temp, method_result); + } } // virtual method calling
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -519,7 +519,8 @@ RegisterOrConstant itable_index, Register method_result, Register temp_reg, Register temp2_reg, - Label& no_such_interface); + Label& no_such_interface, + bool return_method = true); // virtual method calling void lookup_virtual_method(Register recv_klass,
--- a/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/macroAssembler_ppc.inline.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -30,6 +30,7 @@ #include "asm/macroAssembler.hpp" #include "asm/codeBuffer.hpp" #include "code/codeCache.hpp" +#include "runtime/safepointMechanism.hpp" inline bool MacroAssembler::is_ld_largeoffset(address a) { const int inst1 = *(int *)a; @@ -261,7 +262,12 @@ // Read from the polling page, its address is already in a register. inline void MacroAssembler::load_from_polling_page(Register polling_page_address, int offset) { - ld(R0, offset, polling_page_address); + if (SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) { + int encoding = SafepointMechanism::poll_bit(); + tdi(traptoGreaterThanUnsigned | traptoEqual, polling_page_address, encoding); + } else { + ld(R0, offset, polling_page_address); + } } // Trap-instruction-based checks.
--- a/src/hotspot/cpu/ppc/nativeInst_ppc.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/nativeInst_ppc.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -30,6 +30,7 @@ #include "memory/allocation.hpp" #include "runtime/icache.hpp" #include "runtime/os.hpp" +#include "runtime/safepointMechanism.hpp" // We have interfaces for the following instructions: // @@ -92,6 +93,11 @@ bool is_safepoint_poll() { // Is the current instruction a POTENTIAL read access to the polling page? // The current arguments of the instruction are not checked! + if (SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) { + int encoding = SafepointMechanism::poll_bit(); + return MacroAssembler::is_tdi(long_at(0), Assembler::traptoGreaterThanUnsigned | Assembler::traptoEqual, + -1, encoding); + } return MacroAssembler::is_load_from_polling_page(long_at(0), NULL); }
--- a/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1188,7 +1188,7 @@ // Argument is valid and klass is as expected, continue. // Extract method from inline cache, verified entry point needs it. - __ ld(R19_method, CompiledICHolder::holder_method_offset(), ic); + __ ld(R19_method, CompiledICHolder::holder_metadata_offset(), ic); assert(R19_method == ic, "the inline cache register is dead here"); __ ld(code, method_(code));
--- a/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/templateTable_ppc_64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -3486,11 +3486,11 @@ void TemplateTable::invokeinterface_object_method(Register Rrecv_klass, Register Rret, Register Rflags, - Register Rindex, + Register Rmethod, Register Rtemp1, Register Rtemp2) { - assert_different_registers(Rindex, Rret, Rrecv_klass, Rflags, Rtemp1, Rtemp2); + assert_different_registers(Rmethod, Rret, Rrecv_klass, Rflags, Rtemp1, Rtemp2); Label LnotFinal; // Check for vfinal. @@ -3502,14 +3502,14 @@ // Final call case. __ profile_final_call(Rtemp1, Rscratch); // Argument and return type profiling. - __ profile_arguments_type(Rindex, Rscratch, Rrecv_klass /* scratch */, true); + __ profile_arguments_type(Rmethod, Rscratch, Rrecv_klass /* scratch */, true); // Do the final call - the index (f2) contains the method. - __ call_from_interpreter(Rindex, Rret, Rscratch, Rrecv_klass /* scratch */); + __ call_from_interpreter(Rmethod, Rret, Rscratch, Rrecv_klass /* scratch */); // Non-final callc case. __ bind(LnotFinal); __ profile_virtual_call(Rrecv_klass, Rtemp1, Rscratch, false); - generate_vtable_call(Rrecv_klass, Rindex, Rret, Rscratch); + generate_vtable_call(Rrecv_klass, Rmethod, Rret, Rscratch); } void TemplateTable::invokeinterface(int byte_no) { @@ -3518,58 +3518,61 @@ const Register Rscratch1 = R11_scratch1, Rscratch2 = R12_scratch2, - Rscratch3 = R9_ARG7, - Rscratch4 = R10_ARG8, - Rtable_addr = Rscratch2, + Rmethod = R6_ARG4, + Rmethod2 = R9_ARG7, Rinterface_klass = R5_ARG3, - Rret_type = R8_ARG6, - Rret_addr = Rret_type, - Rindex = R6_ARG4, - Rreceiver = R4_ARG2, - Rrecv_klass = Rreceiver, + Rret_addr = R8_ARG6, + Rindex = R10_ARG8, + Rreceiver = R3_ARG1, + Rrecv_klass = R4_ARG2, Rflags = R7_ARG5; - prepare_invoke(byte_no, Rinterface_klass, Rret_addr, Rindex, Rreceiver, Rflags, Rscratch1); + prepare_invoke(byte_no, Rinterface_klass, Rret_addr, Rmethod, Rreceiver, Rflags, Rscratch1); // Get receiver klass. - __ null_check_throw(Rreceiver, oopDesc::klass_offset_in_bytes(), Rscratch3); + __ null_check_throw(Rreceiver, oopDesc::klass_offset_in_bytes(), Rscratch2); __ load_klass(Rrecv_klass, Rreceiver); // Check corner case object method. - Label LobjectMethod; - + Label LobjectMethod, L_no_such_interface, Lthrow_ame; __ testbitdi(CCR0, R0, Rflags, ConstantPoolCacheEntry::is_forced_virtual_shift); __ btrue(CCR0, LobjectMethod); - // Fallthrough: The normal invokeinterface case. + __ lookup_interface_method(Rrecv_klass, Rinterface_klass, noreg, noreg, Rscratch1, Rscratch2, + L_no_such_interface, /*return_method=*/false); + __ profile_virtual_call(Rrecv_klass, Rscratch1, Rscratch2, false); // Find entry point to call. - Label Lthrow_icc, Lthrow_ame; - // Result will be returned in Rindex. - __ mr(Rscratch4, Rrecv_klass); - __ mr(Rscratch3, Rindex); - __ lookup_interface_method(Rrecv_klass, Rinterface_klass, Rindex, Rindex, Rscratch1, Rscratch2, Lthrow_icc); - - __ cmpdi(CCR0, Rindex, 0); + + // Get declaring interface class from method + __ ld(Rinterface_klass, in_bytes(Method::const_offset()), Rmethod); + __ ld(Rinterface_klass, in_bytes(ConstMethod::constants_offset()), Rinterface_klass); + __ ld(Rinterface_klass, ConstantPool::pool_holder_offset_in_bytes(), Rinterface_klass); + + // Get itable index from method + __ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod); + __ subfic(Rindex, Rindex, Method::itable_index_max); + + __ lookup_interface_method(Rrecv_klass, Rinterface_klass, Rindex, Rmethod2, Rscratch1, Rscratch2, + L_no_such_interface); + + __ cmpdi(CCR0, Rmethod2, 0); __ beq(CCR0, Lthrow_ame); // Found entry. Jump off! // Argument and return type profiling. - __ profile_arguments_type(Rindex, Rscratch1, Rscratch2, true); - __ call_from_interpreter(Rindex, Rret_addr, Rscratch1, Rscratch2); + __ profile_arguments_type(Rmethod2, Rscratch1, Rscratch2, true); + //__ profile_called_method(Rindex, Rscratch1); + __ call_from_interpreter(Rmethod2, Rret_addr, Rscratch1, Rscratch2); // Vtable entry was NULL => Throw abstract method error. __ bind(Lthrow_ame); - __ mr(Rrecv_klass, Rscratch4); - __ mr(Rindex, Rscratch3); call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); // Interface was not found => Throw incompatible class change error. - __ bind(Lthrow_icc); - __ mr(Rrecv_klass, Rscratch4); + __ bind(L_no_such_interface); call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); - - __ should_not_reach_here(); + DEBUG_ONLY( __ should_not_reach_here(); ) // Special case of invokeinterface called for virtual method of // java.lang.Object. See ConstantPoolCacheEntry::set_method() for details: @@ -3577,7 +3580,7 @@ // to handle this corner case. This code isn't produced by javac, but could // be produced by another compliant java compiler. __ bind(LobjectMethod); - invokeinterface_object_method(Rrecv_klass, Rret_addr, Rflags, Rindex, Rscratch1, Rscratch2); + invokeinterface_object_method(Rrecv_klass, Rret_addr, Rflags, Rmethod, Rscratch1, Rscratch2); } void TemplateTable::invokedynamic(int byte_no) {
--- a/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/ppc/vtableStubs_ppc_64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,6 +1,6 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2012, 2016 SAP SE. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017 SAP SE. 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 @@ -28,6 +28,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_ppc.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -55,17 +56,22 @@ // PPC port: use fixed size. const int code_length = VtableStub::pd_code_size_limit(true); VtableStub* s = new (code_length) VtableStub(true, vtable_index); + + // Can be NULL if there is no free space in the code cache. + if (s == NULL) { + return NULL; + } + ResourceMark rm; CodeBuffer cb(s->entry_point(), code_length); MacroAssembler* masm = new MacroAssembler(&cb); - address start_pc; #ifndef PRODUCT if (CountCompiledCalls) { - __ load_const(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr()); - __ lwz(R12_scratch2, 0, R11_scratch1); + int offs = __ load_const_optimized(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr(), R12_scratch2, true); + __ lwz(R12_scratch2, offs, R11_scratch1); __ addi(R12_scratch2, R12_scratch2, 1); - __ stw(R12_scratch2, 0, R11_scratch1); + __ stw(R12_scratch2, offs, R11_scratch1); } #endif @@ -116,6 +122,7 @@ __ ld(R12_scratch2, in_bytes(Method::from_compiled_offset()), R19_method); __ mtctr(R12_scratch2); __ bctr(); + masm->flush(); guarantee(__ pc() <= s->code_end(), "overflowed buffer"); @@ -125,10 +132,16 @@ return s; } -VtableStub* VtableStubs::create_itable_stub(int vtable_index) { +VtableStub* VtableStubs::create_itable_stub(int itable_index) { // PPC port: use fixed size. const int code_length = VtableStub::pd_code_size_limit(false); - VtableStub* s = new (code_length) VtableStub(false, vtable_index); + VtableStub* s = new (code_length) VtableStub(false, itable_index); + + // Can be NULL if there is no free space in the code cache. + if (s == NULL) { + return NULL; + } + ResourceMark rm; CodeBuffer cb(s->entry_point(), code_length); MacroAssembler* masm = new MacroAssembler(&cb); @@ -136,10 +149,10 @@ #ifndef PRODUCT if (CountCompiledCalls) { - __ load_const(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr()); - __ lwz(R12_scratch2, 0, R11_scratch1); + int offs = __ load_const_optimized(R11_scratch1, SharedRuntime::nof_megamorphic_calls_addr(), R12_scratch2, true); + __ lwz(R12_scratch2, offs, R11_scratch1); __ addi(R12_scratch2, R12_scratch2, 1); - __ stw(R12_scratch2, 0, R11_scratch1); + __ stw(R12_scratch2, offs, R11_scratch1); } #endif @@ -148,62 +161,28 @@ // Entry arguments: // R19_method: Interface // R3_ARG1: Receiver - // - const Register rcvr_klass = R11_scratch1; - const Register vtable_len = R12_scratch2; - const Register itable_entry_addr = R21_tmp1; - const Register itable_interface = R22_tmp2; + Label L_no_such_interface; + const Register rcvr_klass = R11_scratch1, + interface = R12_scratch2, + tmp1 = R21_tmp1, + tmp2 = R22_tmp2; - // Get receiver klass. - - // We might implicit NULL fault here. address npe_addr = __ pc(); // npe = null pointer exception __ null_check(R3_ARG1, oopDesc::klass_offset_in_bytes(), /*implicit only*/NULL); __ load_klass(rcvr_klass, R3_ARG1); - BLOCK_COMMENT("Load start of itable entries into itable_entry."); - __ lwz(vtable_len, in_bytes(Klass::vtable_length_offset()), rcvr_klass); - __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size_in_bytes())); - __ add(itable_entry_addr, vtable_len, rcvr_klass); + // Receiver subtype check against REFC. + __ ld(interface, CompiledICHolder::holder_klass_offset(), R19_method); + __ lookup_interface_method(rcvr_klass, interface, noreg, + R0, tmp1, tmp2, + L_no_such_interface, /*return_method=*/ false); - // Loop over all itable entries until desired interfaceOop(Rinterface) found. - BLOCK_COMMENT("Increment itable_entry_addr in loop."); - const int vtable_base_offset = in_bytes(Klass::vtable_start_offset()); - __ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes()); - - const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize; - Label search; - __ bind(search); - __ ld(itable_interface, 0, itable_entry_addr); - - // Handle IncompatibleClassChangeError in itable stubs. - // If the entry is NULL then we've reached the end of the table - // without finding the expected interface, so throw an exception. - BLOCK_COMMENT("Handle IncompatibleClassChangeError in itable stubs."); - Label throw_icce; - __ cmpdi(CCR1, itable_interface, 0); - __ cmpd(CCR0, itable_interface, R19_method); - __ addi(itable_entry_addr, itable_entry_addr, itable_offset_search_inc); - __ beq(CCR1, throw_icce); - __ bne(CCR0, search); - - // Entry found and itable_entry_addr points to it, get offset of vtable for interface. - - const Register vtable_offset = R12_scratch2; - const Register itable_method = R11_scratch1; - - const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - - itableOffsetEntry::interface_offset_in_bytes()) - - itable_offset_search_inc; - __ lwz(vtable_offset, vtable_offset_offset, itable_entry_addr); - - // Compute itableMethodEntry and get method and entry point for compiler. - const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + - itableMethodEntry::method_offset_in_bytes(); - - __ add(itable_method, rcvr_klass, vtable_offset); - __ ld(R19_method, method_offset, itable_method); + // Get Method* and entrypoint for compiler + __ ld(interface, CompiledICHolder::holder_metadata_offset(), R19_method); + __ lookup_interface_method(rcvr_klass, interface, itable_index, + R19_method, tmp1, tmp2, + L_no_such_interface, /*return_method=*/ true); #ifndef PRODUCT if (DebugVtables) { @@ -219,7 +198,7 @@ address ame_addr = __ pc(); // ame = abstract method error // Must do an explicit check if implicit checks are disabled. - __ null_check(R19_method, in_bytes(Method::from_compiled_offset()), &throw_icce); + __ null_check(R19_method, in_bytes(Method::from_compiled_offset()), &L_no_such_interface); __ ld(R12_scratch2, in_bytes(Method::from_compiled_offset()), R19_method); __ mtctr(R12_scratch2); __ bctr(); @@ -229,8 +208,8 @@ // We force resolving of the call site by jumping to the "handle // wrong method" stub, and so let the interpreter runtime do all the // dirty work. - __ bind(throw_icce); - __ load_const(R11_scratch1, SharedRuntime::get_handle_wrong_method_stub()); + __ bind(L_no_such_interface); + __ load_const_optimized(R11_scratch1, SharedRuntime::get_handle_wrong_method_stub(), R12_scratch2); __ mtctr(R11_scratch1); __ bctr(); @@ -245,14 +224,15 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) { if (DebugVtables || CountCompiledCalls || VerifyOops) { return 1000; - } else { - int decode_klass_size = MacroAssembler::instr_size_for_decode_klass_not_null(); - if (is_vtable_stub) { - return 20 + decode_klass_size + 8 + 8; // Plain + cOops + Traps + safety - } else { - return 96 + decode_klass_size + 12 + 8; // Plain + cOops + Traps + safety - } } + int size = is_vtable_stub ? 20 + 8 : 164 + 20; // Plain + safety + if (UseCompressedClassPointers) { + size += MacroAssembler::instr_size_for_decode_klass_not_null(); + } + if (!ImplicitNullChecks || !os::zero_page_read_protected()) { + size += is_vtable_stub ? 8 : 12; + } + return size; } int VtableStub::pd_code_alignment() {
--- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2806,8 +2806,8 @@ RegisterOrConstant itable_index, Register method_result, Register temp1_reg, - Register temp2_reg, - Label& no_such_interface) { + Label& no_such_interface, + bool return_method) { const Register vtable_len = temp1_reg; // Used to compute itable_entry_addr. const Register itable_entry_addr = Z_R1_scratch; @@ -2842,38 +2842,36 @@ z_brne(search); // Entry found and itable_entry_addr points to it, get offset of vtable for interface. - - const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - - itableOffsetEntry::interface_offset_in_bytes()) - - itable_offset_search_inc; - - // Compute itableMethodEntry and get method and entry point - // we use addressing with index and displacement, since the formula - // for computing the entry's offset has a fixed and a dynamic part, - // the latter depending on the matched interface entry and on the case, - // that the itable index has been passed as a register, not a constant value. - int method_offset = itableMethodEntry::method_offset_in_bytes(); - // Fixed part (displacement), common operand. - Register itable_offset; // Dynamic part (index register). - - if (itable_index.is_register()) { - // Compute the method's offset in that register, for the formula, see the - // else-clause below. - itable_offset = itable_index.as_register(); - - z_sllg(itable_offset, itable_offset, exact_log2(itableMethodEntry::size() * wordSize)); - z_agf(itable_offset, vtable_offset_offset, itable_entry_addr); - } else { - itable_offset = Z_R1_scratch; - // Displacement increases. - method_offset += itableMethodEntry::size() * wordSize * itable_index.as_constant(); - - // Load index from itable. - z_llgf(itable_offset, vtable_offset_offset, itable_entry_addr); - } - - // Finally load the method's oop. - z_lg(method_result, method_offset, itable_offset, recv_klass); + if (return_method) { + const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - + itableOffsetEntry::interface_offset_in_bytes()) - + itable_offset_search_inc; + + // Compute itableMethodEntry and get method and entry point + // we use addressing with index and displacement, since the formula + // for computing the entry's offset has a fixed and a dynamic part, + // the latter depending on the matched interface entry and on the case, + // that the itable index has been passed as a register, not a constant value. + int method_offset = itableMethodEntry::method_offset_in_bytes(); + // Fixed part (displacement), common operand. + Register itable_offset = method_result; // Dynamic part (index register). + + if (itable_index.is_register()) { + // Compute the method's offset in that register, for the formula, see the + // else-clause below. + z_sllg(itable_offset, itable_index.as_register(), exact_log2(itableMethodEntry::size() * wordSize)); + z_agf(itable_offset, vtable_offset_offset, itable_entry_addr); + } else { + // Displacement increases. + method_offset += itableMethodEntry::size() * wordSize * itable_index.as_constant(); + + // Load index from itable. + z_llgf(itable_offset, vtable_offset_offset, itable_entry_addr); + } + + // Finally load the method's oop. + z_lg(method_result, method_offset, itable_offset, recv_klass); + } BLOCK_COMMENT("} lookup_interface_method"); }
--- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -671,8 +671,8 @@ RegisterOrConstant itable_index, Register method_result, Register temp1_reg, - Register temp2_reg, - Label& no_such_interface); + Label& no_such_interface, + bool return_method = true); // virtual method calling void lookup_virtual_method(Register recv_klass,
--- a/src/hotspot/cpu/s390/methodHandles_s390.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/methodHandles_s390.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -498,7 +498,7 @@ Label L_no_such_interface; __ lookup_interface_method(temp1_recv_klass, temp3_intf, // Note: next two args must be the same: - Z_index, Z_method, temp2, noreg, + Z_index, Z_method, temp2, L_no_such_interface); jump_from_method_handle(_masm, Z_method, temp2, Z_R0, for_compiler_entry);
--- a/src/hotspot/cpu/s390/sharedRuntime_s390.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/sharedRuntime_s390.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2660,9 +2660,9 @@ Label skip_fixup; { Label ic_miss; - const int klass_offset = oopDesc::klass_offset_in_bytes(); - const int holder_klass_offset = CompiledICHolder::holder_klass_offset(); - const int holder_method_offset = CompiledICHolder::holder_method_offset(); + const int klass_offset = oopDesc::klass_offset_in_bytes(); + const int holder_klass_offset = CompiledICHolder::holder_klass_offset(); + const int holder_metadata_offset = CompiledICHolder::holder_metadata_offset(); // Out-of-line call to ic_miss handler. __ call_ic_miss_handler(ic_miss, 0x11, 0, Z_R1_scratch); @@ -2691,7 +2691,7 @@ // This def MUST MATCH code in gen_c2i_adapter! const Register code = Z_R11; - __ z_lg(Z_method, holder_method_offset, Z_method); + __ z_lg(Z_method, holder_metadata_offset, Z_method); __ load_and_test_long(Z_R0, method_(code)); __ z_brne(ic_miss); // Cache miss: call runtime to handle this.
--- a/src/hotspot/cpu/s390/templateTable_s390.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/templateTable_s390.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -3557,66 +3557,67 @@ transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - Register interface = Z_tos; - Register index = Z_ARG3; - Register receiver = Z_tmp_1; - Register flags = Z_ARG5; + Register klass = Z_ARG2, + method = Z_ARG3, + interface = Z_ARG4, + flags = Z_ARG5, + receiver = Z_tmp_1; BLOCK_COMMENT("invokeinterface {"); - // Destroys Z_ARG1 and Z_ARG2, thus use Z_ARG4 and copy afterwards. - prepare_invoke(byte_no, Z_ARG4, index, // Get f1 klassOop, f2 itable index. + prepare_invoke(byte_no, interface, method, // Get f1 klassOop, f2 itable index. receiver, flags); // Z_R14 (== Z_bytecode) : return entry - __ z_lgr(interface, Z_ARG4); - // Special case of invokeinterface called for virtual method of // java.lang.Object. See cpCacheOop.cpp for details. // This code isn't produced by javac, but could be produced by // another compliant java compiler. - Label notMethod; + NearLabel notMethod, no_such_interface, no_such_method; __ testbit(flags, ConstantPoolCacheEntry::is_forced_virtual_shift); __ z_brz(notMethod); - invokevirtual_helper(index, receiver, flags); + invokevirtual_helper(method, receiver, flags); __ bind(notMethod); // Get receiver klass into klass - also a null check. - Register klass = flags; - __ restore_locals(); __ load_klass(klass, receiver); + __ lookup_interface_method(klass, interface, noreg, noreg, /*temp*/Z_ARG1, + no_such_interface, /*return_method=*/false); + // Profile this call. - __ profile_virtual_call(klass, Z_ARG2/*mdp*/, Z_ARG4/*scratch*/); - - NearLabel no_such_interface, no_such_method; - Register method = Z_tmp_2; - - // TK 2010-08-24: save the index to Z_ARG4. needed in case of an error - // in throw_AbstractMethodErrorByTemplateTable - __ z_lgr(Z_ARG4, index); - // TK 2011-03-24: copy also klass because it could be changed in - // lookup_interface_method - __ z_lgr(Z_ARG2, klass); - __ lookup_interface_method(// inputs: rec. class, interface, itable index - klass, interface, index, - // outputs: method, scan temp. reg - method, Z_tmp_2, Z_R1_scratch, - no_such_interface); + __ profile_virtual_call(klass, Z_ARG1/*mdp*/, flags/*scratch*/); + + // Find entry point to call. + + // Get declaring interface class from method + __ z_lg(interface, Address(method, Method::const_offset())); + __ z_lg(interface, Address(interface, ConstMethod::constants_offset())); + __ z_lg(interface, Address(interface, ConstantPool::pool_holder_offset_in_bytes())); + + // Get itable index from method + Register index = receiver, + method2 = flags; + __ z_lgf(index, Address(method, Method::itable_index_offset())); + __ z_aghi(index, -Method::itable_index_max); + __ z_lcgr(index, index); + + __ lookup_interface_method(klass, interface, index, method2, Z_tmp_2, + no_such_interface); // Check for abstract method error. // Note: This should be done more efficiently via a throw_abstract_method_error // interpreter entry point and a conditional jump to it in case of a null // method. - __ compareU64_and_branch(method, (intptr_t) 0, + __ compareU64_and_branch(method2, (intptr_t) 0, Assembler::bcondZero, no_such_method); - __ profile_arguments_type(Z_ARG3, method, Z_ARG5, true); + __ profile_arguments_type(Z_tmp_1, method2, Z_tmp_2, true); // Do the call. - __ jump_from_interpreted(method, Z_ARG5); + __ jump_from_interpreted(method2, Z_tmp_2); __ should_not_reach_here(); // exception handling code follows... @@ -3628,12 +3629,8 @@ // Throw exception. __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed). __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed). - // TK 2010-08-24: Call throw_AbstractMethodErrorByTemplateTable now with the - // relevant information for generating a better error message __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_AbstractMethodError), - Z_ARG2, interface, Z_ARG4); + CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_AbstractMethodError)); // The call_VM checks for exception, so we should never return here. __ should_not_reach_here(); @@ -3642,12 +3639,8 @@ // Throw exception. __ restore_bcp(); // Bcp must be correct for exception handler (was destroyed). __ restore_locals(); // Make sure locals pointer is correct as well (was destroyed). - // TK 2010-08-24: Call throw_IncompatibleClassChangeErrorByTemplateTable now with the - // relevant information for generating a better error message __ call_VM(noreg, - CAST_FROM_FN_PTR(address, - InterpreterRuntime::throw_IncompatibleClassChangeError), - Z_ARG2, interface); + CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); // The call_VM checks for exception, so we should never return here. __ should_not_reach_here();
--- a/src/hotspot/cpu/s390/vtableStubs_s390.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/s390/vtableStubs_s390.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * Copyright (c) 2016 SAP SE. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017 SAP SE. 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 @@ -28,6 +28,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_s390.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -57,7 +58,6 @@ ResourceMark rm; CodeBuffer cb(s->entry_point(), code_length); MacroAssembler *masm = new MacroAssembler(&cb); - address start_pc; int padding_bytes = 0; #if (!defined(PRODUCT) && defined(COMPILER2)) @@ -144,9 +144,9 @@ return s; } -VtableStub* VtableStubs::create_itable_stub(int vtable_index) { +VtableStub* VtableStubs::create_itable_stub(int itable_index) { const int code_length = VtableStub::pd_code_size_limit(false); - VtableStub *s = new(code_length) VtableStub(false, vtable_index); + VtableStub *s = new(code_length) VtableStub(false, itable_index); if (s == NULL) { // Indicates OOM in the code cache. return NULL; } @@ -154,7 +154,6 @@ ResourceMark rm; CodeBuffer cb(s->entry_point(), code_length); MacroAssembler *masm = new MacroAssembler(&cb); - address start_pc; int padding_bytes = 0; #if (!defined(PRODUCT) && defined(COMPILER2)) @@ -174,11 +173,9 @@ // Entry arguments: // Z_method: Interface // Z_ARG1: Receiver - const Register rcvr_klass = Z_tmp_1; // Used to compute itable_entry_addr. - // Use extra reg to avoid re-load. - const Register vtable_len = Z_tmp_2; // Used to compute itable_entry_addr. - const Register itable_entry_addr = Z_R1_scratch; - const Register itable_interface = Z_R0_scratch; + NearLabel no_such_interface; + const Register rcvr_klass = Z_tmp_1, + interface = Z_tmp_2; // Get receiver klass. // Must do an explicit check if implicit checks are disabled. @@ -186,50 +183,15 @@ __ null_check(Z_ARG1, Z_R1_scratch, oopDesc::klass_offset_in_bytes()); __ load_klass(rcvr_klass, Z_ARG1); - // Load start of itable entries into itable_entry. - __ z_llgf(vtable_len, Address(rcvr_klass, Klass::vtable_length_offset())); - __ z_sllg(vtable_len, vtable_len, exact_log2(vtableEntry::size_in_bytes())); + // Receiver subtype check against REFC. + __ z_lg(interface, Address(Z_method, CompiledICHolder::holder_klass_offset())); + __ lookup_interface_method(rcvr_klass, interface, noreg, + noreg, Z_R1, no_such_interface, /*return_method=*/ false); - // Loop over all itable entries until desired interfaceOop(Rinterface) found. - const int vtable_base_offset = in_bytes(Klass::vtable_start_offset()); - // Count unused bytes. - start_pc = __ pc(); - __ add2reg_with_index(itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes(), rcvr_klass, vtable_len); - padding_bytes += 20 - (__ pc() - start_pc); - - const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize; - Label search; - __ bind(search); - - // Handle IncompatibleClassChangeError in itable stubs. - // If the entry is NULL then we've reached the end of the table - // without finding the expected interface, so throw an exception. - NearLabel throw_icce; - __ load_and_test_long(itable_interface, Address(itable_entry_addr)); - __ z_bre(throw_icce); // Throw the exception out-of-line. - // Count unused bytes. - start_pc = __ pc(); - __ add2reg(itable_entry_addr, itable_offset_search_inc); - padding_bytes += 20 - (__ pc() - start_pc); - __ z_cgr(itable_interface, Z_method); - __ z_brne(search); - - // Entry found. Itable_entry_addr points to the subsequent entry (itable_offset_search_inc too far). - // Get offset of vtable for interface. - - const Register vtable_offset = Z_R1_scratch; - const Register itable_method = rcvr_klass; // Calculated before. - - const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() - - itableOffsetEntry::interface_offset_in_bytes()) - - itable_offset_search_inc; - __ z_llgf(vtable_offset, vtable_offset_offset, itable_entry_addr); - - // Compute itableMethodEntry and get method and entry point for compiler. - const int method_offset = (itableMethodEntry::size() * wordSize * vtable_index) + - itableMethodEntry::method_offset_in_bytes(); - - __ z_lg(Z_method, method_offset, vtable_offset, itable_method); + // Get Method* and entrypoint for compiler + __ z_lg(interface, Address(Z_method, CompiledICHolder::holder_metadata_offset())); + __ lookup_interface_method(rcvr_klass, interface, itable_index, + Z_method, Z_R1, no_such_interface, /*return_method=*/ true); #ifndef PRODUCT if (DebugVtables) { @@ -244,13 +206,13 @@ address ame_addr = __ pc(); // Must do an explicit check if implicit checks are disabled. if (!ImplicitNullChecks) { - __ compare64_and_branch(Z_method, (intptr_t) 0, Assembler::bcondEqual, throw_icce); + __ compare64_and_branch(Z_method, (intptr_t) 0, Assembler::bcondEqual, no_such_interface); } __ z_lg(Z_R1_scratch, in_bytes(Method::from_compiled_offset()), Z_method); __ z_br(Z_R1_scratch); // Handle IncompatibleClassChangeError in itable stubs. - __ bind(throw_icce); + __ bind(no_such_interface); // Count unused bytes // worst case actual size // We force resolving of the call site by jumping to @@ -273,13 +235,12 @@ if (CountCompiledCalls) { size += 6 * 4; } - if (is_vtable_stub) { - size += 52; - } else { - size += 104; + size += is_vtable_stub ? 36 : 140; + if (UseCompressedClassPointers) { + size += MacroAssembler::instr_size_for_decode_klass_not_null(); } - if (Universe::narrow_klass_base() != NULL) { - size += 16; // A guess. + if (!ImplicitNullChecks) { + size += 36; } return size; }
--- a/src/hotspot/cpu/sparc/macroAssembler_sparc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/sparc/macroAssembler_sparc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2058,9 +2058,10 @@ Register method_result, Register scan_temp, Register sethi_temp, - Label& L_no_such_interface) { + Label& L_no_such_interface, + bool return_method) { assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); - assert(itable_index.is_constant() || itable_index.as_register() == method_result, + assert(!return_method || itable_index.is_constant() || itable_index.as_register() == method_result, "caller must use same register for non-constant itable index as for method"); Label L_no_such_interface_restore; @@ -2092,11 +2093,13 @@ add(scan_temp, itb_offset, scan_temp); add(recv_klass, scan_temp, scan_temp); - // Adjust recv_klass by scaled itable_index, so we can free itable_index. - RegisterOrConstant itable_offset = itable_index; - itable_offset = regcon_sll_ptr(itable_index, exact_log2(itableMethodEntry::size() * wordSize), itable_offset); - itable_offset = regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes(), itable_offset); - add(recv_klass, ensure_simm13_or_reg(itable_offset, sethi_temp), recv_klass); + if (return_method) { + // Adjust recv_klass by scaled itable_index, so we can free itable_index. + RegisterOrConstant itable_offset = itable_index; + itable_offset = regcon_sll_ptr(itable_index, exact_log2(itableMethodEntry::size() * wordSize), itable_offset); + itable_offset = regcon_inc_ptr(itable_offset, itableMethodEntry::method_offset_in_bytes(), itable_offset); + add(recv_klass, ensure_simm13_or_reg(itable_offset, sethi_temp), recv_klass); + } // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { // if (scan->interface() == intf) { @@ -2131,12 +2134,14 @@ bind(L_found_method); - // Got a hit. - int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); - // scan_temp[-scan_step] points to the vtable offset we need - ito_offset -= scan_step; - lduw(scan_temp, ito_offset, scan_temp); - ld_ptr(recv_klass, scan_temp, method_result); + if (return_method) { + // Got a hit. + int ito_offset = itableOffsetEntry::offset_offset_in_bytes(); + // scan_temp[-scan_step] points to the vtable offset we need + ito_offset -= scan_step; + lduw(scan_temp, ito_offset, scan_temp); + ld_ptr(recv_klass, scan_temp, method_result); + } if (did_save) { Label L_done;
--- a/src/hotspot/cpu/sparc/macroAssembler_sparc.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/sparc/macroAssembler_sparc.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1277,7 +1277,8 @@ RegisterOrConstant itable_index, Register method_result, Register temp_reg, Register temp2_reg, - Label& no_such_interface); + Label& no_such_interface, + bool return_method = true); // virtual method calling void lookup_virtual_method(Register recv_klass,
--- a/src/hotspot/cpu/sparc/sharedRuntime_sparc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/sparc/sharedRuntime_sparc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -904,7 +904,7 @@ Label ok, ok2; __ brx(Assembler::equal, false, Assembler::pt, ok); - __ delayed()->ld_ptr(G5_method, CompiledICHolder::holder_method_offset(), G5_method); + __ delayed()->ld_ptr(G5_method, CompiledICHolder::holder_metadata_offset(), G5_method); __ jump_to(ic_miss, G3_scratch); __ delayed()->nop();
--- a/src/hotspot/cpu/sparc/templateTable_sparc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/sparc/templateTable_sparc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -3081,15 +3081,15 @@ assert(byte_no == f1_byte, "use this argument"); const Register Rinterface = G1_scratch; + const Register Rmethod = Lscratch; const Register Rret = G3_scratch; - const Register Rindex = Lscratch; const Register O0_recv = O0; const Register O1_flags = O1; const Register O2_Klass = O2; const Register Rscratch = G4_scratch; assert_different_registers(Rscratch, G5_method); - prepare_invoke(byte_no, Rinterface, Rret, Rindex, O0_recv, O1_flags); + prepare_invoke(byte_no, Rinterface, Rret, Rmethod, O0_recv, O1_flags); // get receiver klass __ null_check(O0_recv, oopDesc::klass_offset_in_bytes()); @@ -3109,55 +3109,40 @@ __ bind(notMethod); + Register Rtemp = O1_flags; + + Label L_no_such_interface; + + // Receiver subtype check against REFC. + __ lookup_interface_method(// inputs: rec. class, interface, itable index + O2_Klass, Rinterface, noreg, + // outputs: temp reg1, temp reg2, temp reg3 + G5_method, Rscratch, Rtemp, + L_no_such_interface, + /*return_method=*/false); + __ profile_virtual_call(O2_Klass, O4); // // find entry point to call // - // compute start of first itableOffsetEntry (which is at end of vtable) - const int base = in_bytes(Klass::vtable_start_offset()); - Label search; - Register Rtemp = O1_flags; - - __ ld(O2_Klass, in_bytes(Klass::vtable_length_offset()), Rtemp); - __ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4; - if (Assembler::is_simm13(base)) { - __ add(Rtemp, base, Rtemp); - } else { - __ set(base, Rscratch); - __ add(Rscratch, Rtemp, Rtemp); - } - __ add(O2_Klass, Rtemp, Rscratch); - - __ bind(search); - - __ ld_ptr(Rscratch, itableOffsetEntry::interface_offset_in_bytes(), Rtemp); - { - Label ok; - - // Check that entry is non-null. Null entries are probably a bytecode - // problem. If the interface isn't implemented by the receiver class, - // the VM should throw IncompatibleClassChangeError. linkResolver checks - // this too but that's only if the entry isn't already resolved, so we - // need to check again. - __ br_notnull_short( Rtemp, Assembler::pt, ok); - call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); - __ should_not_reach_here(); - __ bind(ok); - } - - __ cmp(Rinterface, Rtemp); - __ brx(Assembler::notEqual, true, Assembler::pn, search); - __ delayed()->add(Rscratch, itableOffsetEntry::size() * wordSize, Rscratch); - - // entry found and Rscratch points to it - __ ld(Rscratch, itableOffsetEntry::offset_offset_in_bytes(), Rscratch); - - assert(itableMethodEntry::method_offset_in_bytes() == 0, "adjust instruction below"); - __ sll(Rindex, exact_log2(itableMethodEntry::size() * wordSize), Rindex); // Rindex *= 8; - __ add(Rscratch, Rindex, Rscratch); - __ ld_ptr(O2_Klass, Rscratch, G5_method); + // Get declaring interface class from method + __ ld_ptr(Rmethod, Method::const_offset(), Rinterface); + __ ld_ptr(Rinterface, ConstMethod::constants_offset(), Rinterface); + __ ld_ptr(Rinterface, ConstantPool::pool_holder_offset_in_bytes(), Rinterface); + + // Get itable index from method + const Register Rindex = G5_method; + __ ld(Rmethod, Method::itable_index_offset(), Rindex); + __ sub(Rindex, Method::itable_index_max, Rindex); + __ neg(Rindex); + + __ lookup_interface_method(// inputs: rec. class, interface, itable index + O2_Klass, Rinterface, Rindex, + // outputs: method, scan temp reg, temp reg + G5_method, Rscratch, Rtemp, + L_no_such_interface); // Check for abstract method error. { @@ -3174,6 +3159,10 @@ __ profile_arguments_type(G5_method, Rcall, Gargs, true); __ profile_called_method(G5_method, Rscratch); __ call_from_interpreter(Rcall, Gargs, Rret); + + __ bind(L_no_such_interface); + call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::throw_IncompatibleClassChangeError)); + __ should_not_reach_here(); } void TemplateTable::invokehandle(int byte_no) {
--- a/src/hotspot/cpu/sparc/vtableStubs_sparc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/sparc/vtableStubs_sparc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -27,6 +27,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_sparc.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -140,7 +141,8 @@ MacroAssembler* masm = new MacroAssembler(&cb); Register G3_Klass = G3_scratch; - Register G5_interface = G5; // Passed in as an argument + Register G5_icholder = G5; // Passed in as an argument + Register G4_interface = G4_scratch; Label search; // Entry arguments: @@ -164,14 +166,26 @@ } #endif /* PRODUCT */ - Label throw_icce; + Label L_no_such_interface; Register L5_method = L5; + + // Receiver subtype check against REFC. + __ ld_ptr(G5_icholder, CompiledICHolder::holder_klass_offset(), G4_interface); __ lookup_interface_method(// inputs: rec. class, interface, itable index - G3_Klass, G5_interface, itable_index, + G3_Klass, G4_interface, itable_index, + // outputs: scan temp. reg1, scan temp. reg2 + L5_method, L2, L3, + L_no_such_interface, + /*return_method=*/ false); + + // Get Method* and entrypoint for compiler + __ ld_ptr(G5_icholder, CompiledICHolder::holder_metadata_offset(), G4_interface); + __ lookup_interface_method(// inputs: rec. class, interface, itable index + G3_Klass, G4_interface, itable_index, // outputs: method, scan temp. reg L5_method, L2, L3, - throw_icce); + L_no_such_interface); #ifndef PRODUCT if (DebugVtables) { @@ -197,7 +211,7 @@ __ JMP(G3_scratch, 0); __ delayed()->nop(); - __ bind(throw_icce); + __ bind(L_no_such_interface); AddressLiteral icce(StubRoutines::throw_IncompatibleClassChangeError_entry()); __ jump_to(icce, G3_scratch); __ delayed()->restore(); @@ -232,7 +246,7 @@ MacroAssembler::instr_size_for_decode_klass_not_null() : 0); return basic + slop; } else { - const int basic = 34 * BytesPerInstWord + + const int basic = 54 * BytesPerInstWord + // shift;add for load_klass (only shift with zero heap based) (UseCompressedClassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0);
--- a/src/hotspot/cpu/x86/macroAssembler_x86.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/macroAssembler_x86.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -5809,8 +5809,13 @@ RegisterOrConstant itable_index, Register method_result, Register scan_temp, - Label& L_no_such_interface) { - assert_different_registers(recv_klass, intf_klass, method_result, scan_temp); + Label& L_no_such_interface, + bool return_method) { + assert_different_registers(recv_klass, intf_klass, scan_temp); + assert_different_registers(method_result, intf_klass, scan_temp); + assert(recv_klass != method_result || !return_method, + "recv_klass can be destroyed when method isn't needed"); + assert(itable_index.is_constant() || itable_index.as_register() == method_result, "caller must use same register for non-constant itable index as for method"); @@ -5827,9 +5832,11 @@ // %%% Could store the aligned, prescaled offset in the klassoop. lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); - // Adjust recv_klass by scaled itable_index, so we can free itable_index. - assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); - lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); + if (return_method) { + // Adjust recv_klass by scaled itable_index, so we can free itable_index. + assert(itableMethodEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); + lea(recv_klass, Address(recv_klass, itable_index, Address::times_ptr, itentry_off)); + } // for (scan = klass->itable(); scan->interface() != NULL; scan += scan_step) { // if (scan->interface() == intf) { @@ -5863,9 +5870,11 @@ bind(found_method); - // Got a hit. - movl(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); - movptr(method_result, Address(recv_klass, scan_temp, Address::times_1)); + if (return_method) { + // Got a hit. + movl(scan_temp, Address(scan_temp, itableOffsetEntry::offset_offset_in_bytes())); + movptr(method_result, Address(recv_klass, scan_temp, Address::times_1)); + } }
--- a/src/hotspot/cpu/x86/macroAssembler_x86.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/macroAssembler_x86.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -544,7 +544,8 @@ RegisterOrConstant itable_index, Register method_result, Register scan_temp, - Label& no_such_interface); + Label& no_such_interface, + bool return_method = true); // virtual method calling void lookup_virtual_method(Register recv_klass,
--- a/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_32.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -957,7 +957,7 @@ Label missed; __ movptr(temp, Address(receiver, oopDesc::klass_offset_in_bytes())); __ cmpptr(temp, Address(holder, CompiledICHolder::holder_klass_offset())); - __ movptr(rbx, Address(holder, CompiledICHolder::holder_method_offset())); + __ movptr(rbx, Address(holder, CompiledICHolder::holder_metadata_offset())); __ jcc(Assembler::notEqual, missed); // Method might have been compiled since the call site was patched to // interpreted if that is the case treat it as a miss so we can get
--- a/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/sharedRuntime_x86_64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -949,7 +949,7 @@ { __ load_klass(temp, receiver); __ cmpptr(temp, Address(holder, CompiledICHolder::holder_klass_offset())); - __ movptr(rbx, Address(holder, CompiledICHolder::holder_method_offset())); + __ movptr(rbx, Address(holder, CompiledICHolder::holder_metadata_offset())); __ jcc(Assembler::equal, ok); __ jump(RuntimeAddress(SharedRuntime::get_ic_miss_stub()));
--- a/src/hotspot/cpu/x86/templateTable_x86.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/templateTable_x86.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -3712,11 +3712,11 @@ void TemplateTable::invokeinterface(int byte_no) { transition(vtos, vtos); assert(byte_no == f1_byte, "use this argument"); - prepare_invoke(byte_no, rax, rbx, // get f1 Klass*, f2 itable index + prepare_invoke(byte_no, rax, rbx, // get f1 Klass*, f2 Method* rcx, rdx); // recv, flags - // rax: interface klass (from f1) - // rbx: itable index (from f2) + // rax: reference klass (from f1) + // rbx: method (from f2) // rcx: receiver // rdx: flags @@ -3738,10 +3738,28 @@ __ null_check(rcx, oopDesc::klass_offset_in_bytes()); __ load_klass(rdx, rcx); + Label no_such_interface, no_such_method; + + // Receiver subtype check against REFC. + // Superklass in rax. Subklass in rdx. Blows rcx, rdi. + __ lookup_interface_method(// inputs: rec. class, interface, itable index + rdx, rax, noreg, + // outputs: scan temp. reg, scan temp. reg + rbcp, rlocals, + no_such_interface, + /*return_method=*/false); + // profile this call + __ restore_bcp(); // rbcp was destroyed by receiver type check __ profile_virtual_call(rdx, rbcp, rlocals); - Label no_such_interface, no_such_method; + // Get declaring interface class from method, and itable index + __ movptr(rax, Address(rbx, Method::const_offset())); + __ movptr(rax, Address(rax, ConstMethod::constants_offset())); + __ movptr(rax, Address(rax, ConstantPool::pool_holder_offset_in_bytes())); + __ movl(rbx, Address(rbx, Method::itable_index_offset())); + __ subl(rbx, Method::itable_index_max); + __ negl(rbx); __ lookup_interface_method(// inputs: rec. class, interface, itable index rdx, rax, rbx,
--- a/src/hotspot/cpu/x86/vtableStubs_x86_32.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/vtableStubs_x86_32.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -27,6 +27,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_x86.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -147,7 +148,7 @@ MacroAssembler* masm = new MacroAssembler(&cb); // Entry arguments: - // rax,: Interface + // rax: CompiledICHolder // rcx: Receiver #ifndef PRODUCT @@ -155,25 +156,42 @@ __ incrementl(ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr())); } #endif /* PRODUCT */ - // get receiver (need to skip return address on top of stack) - assert(VtableStub::receiver_location() == rcx->as_VMReg(), "receiver expected in rcx"); + // Most registers are in use; we'll use rax, rbx, rsi, rdi + // (If we need to make rsi, rdi callee-save, do a push/pop here.) + const Register recv_klass_reg = rsi; + const Register holder_klass_reg = rax; // declaring interface klass (DECC) + const Register resolved_klass_reg = rbx; // resolved interface klass (REFC) + const Register temp_reg = rdi; + + const Register icholder_reg = rax; + __ movptr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset())); + __ movptr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset())); + + Label L_no_such_interface; // get receiver klass (also an implicit null-check) address npe_addr = __ pc(); - __ movptr(rsi, Address(rcx, oopDesc::klass_offset_in_bytes())); + assert(VtableStub::receiver_location() == rcx->as_VMReg(), "receiver expected in rcx"); + __ load_klass(recv_klass_reg, rcx); - // Most registers are in use; we'll use rax, rbx, rsi, rdi - // (If we need to make rsi, rdi callee-save, do a push/pop here.) + // Receiver subtype check against REFC. + // Destroys recv_klass_reg value. + __ lookup_interface_method(// inputs: rec. class, interface + recv_klass_reg, resolved_klass_reg, noreg, + // outputs: scan temp. reg1, scan temp. reg2 + recv_klass_reg, temp_reg, + L_no_such_interface, + /*return_method=*/false); + + // Get selected method from declaring class and itable index const Register method = rbx; - Label throw_icce; - - // Get Method* and entrypoint for compiler + __ load_klass(recv_klass_reg, rcx); // restore recv_klass_reg __ lookup_interface_method(// inputs: rec. class, interface, itable index - rsi, rax, itable_index, + recv_klass_reg, holder_klass_reg, itable_index, // outputs: method, scan temp. reg - method, rdi, - throw_icce); + method, temp_reg, + L_no_such_interface); // method (rbx): Method* // rcx: receiver @@ -193,9 +211,10 @@ address ame_addr = __ pc(); __ jmp(Address(method, Method::from_compiled_offset())); - __ bind(throw_icce); + __ bind(L_no_such_interface); __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); - masm->flush(); + + __ flush(); if (PrintMiscellaneous && (WizardMode || Verbose)) { tty->print_cr("itable #%d at " PTR_FORMAT "[%d] left over: %d", @@ -220,7 +239,7 @@ return (DebugVtables ? 210 : 16) + (CountCompiledCalls ? 6 : 0); } else { // Itable stub size - return (DebugVtables ? 256 : 66) + (CountCompiledCalls ? 6 : 0); + return (DebugVtables ? 256 : 110) + (CountCompiledCalls ? 6 : 0); } // In order to tune these parameters, run the JVM with VM options // +PrintMiscellaneous and +WizardMode to see information about
--- a/src/hotspot/cpu/x86/vtableStubs_x86_64.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/cpu/x86/vtableStubs_x86_64.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -27,6 +27,7 @@ #include "code/vtableStubs.hpp" #include "interp_masm_x86.hpp" #include "memory/resourceArea.hpp" +#include "oops/compiledICHolder.hpp" #include "oops/instanceKlass.hpp" #include "oops/klassVtable.hpp" #include "runtime/sharedRuntime.hpp" @@ -147,36 +148,50 @@ #endif // Entry arguments: - // rax: Interface + // rax: CompiledICHolder // j_rarg0: Receiver - // Free registers (non-args) are rax (interface), rbx - - // get receiver (need to skip return address on top of stack) - - assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); - // get receiver klass (also an implicit null-check) - address npe_addr = __ pc(); - // Most registers are in use; we'll use rax, rbx, r10, r11 // (various calling sequences use r[cd]x, r[sd]i, r[89]; stay away from them) - __ load_klass(r10, j_rarg0); + const Register recv_klass_reg = r10; + const Register holder_klass_reg = rax; // declaring interface klass (DECC) + const Register resolved_klass_reg = rbx; // resolved interface klass (REFC) + const Register temp_reg = r11; + + Label L_no_such_interface; + + const Register icholder_reg = rax; + __ movptr(resolved_klass_reg, Address(icholder_reg, CompiledICHolder::holder_klass_offset())); + __ movptr(holder_klass_reg, Address(icholder_reg, CompiledICHolder::holder_metadata_offset())); + + // get receiver klass (also an implicit null-check) + assert(VtableStub::receiver_location() == j_rarg0->as_VMReg(), "receiver expected in j_rarg0"); + address npe_addr = __ pc(); + __ load_klass(recv_klass_reg, j_rarg0); + + // Receiver subtype check against REFC. + // Destroys recv_klass_reg value. + __ lookup_interface_method(// inputs: rec. class, interface + recv_klass_reg, resolved_klass_reg, noreg, + // outputs: scan temp. reg1, scan temp. reg2 + recv_klass_reg, temp_reg, + L_no_such_interface, + /*return_method=*/false); + + // Get selected method from declaring class and itable index + const Register method = rbx; + __ load_klass(recv_klass_reg, j_rarg0); // restore recv_klass_reg + __ lookup_interface_method(// inputs: rec. class, interface, itable index + recv_klass_reg, holder_klass_reg, itable_index, + // outputs: method, scan temp. reg + method, temp_reg, + L_no_such_interface); // If we take a trap while this arg is on the stack we will not // be able to walk the stack properly. This is not an issue except // when there are mistakes in this assembly code that could generate // a spurious fault. Ask me how I know... - const Register method = rbx; - Label throw_icce; - - // Get Method* and entrypoint for compiler - __ lookup_interface_method(// inputs: rec. class, interface, itable index - r10, rax, itable_index, - // outputs: method, scan temp. reg - method, r11, - throw_icce); - // method (rbx): Method* // j_rarg0: receiver @@ -197,7 +212,7 @@ address ame_addr = __ pc(); __ jmp(Address(method, Method::from_compiled_offset())); - __ bind(throw_icce); + __ bind(L_no_such_interface); __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); __ flush(); @@ -224,8 +239,8 @@ (UseCompressedClassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0); } else { // Itable stub size - return (DebugVtables ? 512 : 74) + (CountCompiledCalls ? 13 : 0) + - (UseCompressedClassPointers ? MacroAssembler::instr_size_for_decode_klass_not_null() : 0); + return (DebugVtables ? 512 : 140) + (CountCompiledCalls ? 13 : 0) + + (UseCompressedClassPointers ? 2 * MacroAssembler::instr_size_for_decode_klass_not_null() : 0); } // In order to tune these parameters, run the JVM with VM options // +PrintMiscellaneous and +WizardMode to see information about
--- a/src/hotspot/os/aix/safepointMechanism_aix.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/os/aix/safepointMechanism_aix.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -30,8 +30,18 @@ #include <sys/mman.h> void SafepointMechanism::pd_initialize() { + // No special code needed if we can use SIGTRAP + if (ThreadLocalHandshakes && USE_POLL_BIT_ONLY) { + default_initialize(); + return; + } + + // Allocate one protected page char* map_address = (char*)MAP_FAILED; const size_t page_size = os::vm_page_size(); + const int prot = PROT_READ; + const int flags = MAP_PRIVATE | MAP_ANONYMOUS; + // Use optimized addresses for the polling page, // e.g. map it to a special 32-bit address. if (OptimizePollingPageLocation) { @@ -57,14 +67,14 @@ // Try to map with current address wish. // AIX: AIX needs MAP_FIXED if we provide an address and mmap will // fail if the address is already mapped. - map_address = (char*) ::mmap(address_wishes[i] - (ssize_t)page_size, - page_size, PROT_READ, - MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, + map_address = (char*) ::mmap(address_wishes[i], + page_size, prot, + flags | MAP_FIXED, -1, 0); - log_debug(os)("SafePoint Polling Page address: %p (wish) => %p", - address_wishes[i], map_address + (ssize_t)page_size); + log_debug(os)("SafePoint Polling Page address: %p (wish) => %p", + address_wishes[i], map_address); - if (map_address + (ssize_t)page_size == address_wishes[i]) { + if (map_address == address_wishes[i]) { // Map succeeded and map_address is at wished address, exit loop. break; } @@ -78,8 +88,17 @@ } } if (map_address == (char*)MAP_FAILED) { - map_address = os::reserve_memory(page_size, NULL, page_size); + map_address = (char*) ::mmap(NULL, page_size, prot, flags, -1, 0); } guarantee(map_address != (char*)MAP_FAILED, "SafepointMechanism::pd_initialize: failed to allocate polling page"); + log_info(os)("SafePoint Polling address: " INTPTR_FORMAT, p2i(map_address)); os::set_polling_page((address)(map_address)); + + // Use same page for ThreadLocalHandshakes without SIGTRAP + if (ThreadLocalHandshakes) { + set_uses_thread_local_poll(); + intptr_t bad_page_val = reinterpret_cast<intptr_t>(map_address); + _poll_armed_value = reinterpret_cast<void*>(bad_page_val | poll_bit()); + _poll_disarmed_value = NULL; // Readable on AIX + } }
--- a/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/os_cpu/aix_ppc/os_aix_ppc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -47,6 +47,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/osThread.hpp" +#include "runtime/safepointMechanism.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.inline.hpp" @@ -374,9 +375,12 @@ goto run_stub; } - else if (sig == SIGSEGV && os::is_poll_address(addr)) { + else if ((SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) + ? (sig == SIGTRAP && ((NativeInstruction*)pc)->is_safepoint_poll()) + : (sig == SIGSEGV && os::is_poll_address(addr))) { if (TraceTraps) { - tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", pc); + tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (%s)", p2i(pc), + (SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) ? "SIGTRAP" : "SIGSEGV"); } stub = SharedRuntime::get_poll_stub(pc); goto run_stub;
--- a/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/os_cpu/linux_ppc/os_linux_ppc.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -46,6 +46,7 @@ #include "runtime/javaCalls.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/osThread.hpp" +#include "runtime/safepointMechanism.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" #include "runtime/thread.inline.hpp" @@ -382,7 +383,7 @@ stub = SharedRuntime::get_handle_wrong_method_stub(); } - else if (sig == SIGSEGV && + else if (sig == ((SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) ? SIGTRAP : SIGSEGV) && // A linux-ppc64 kernel before 2.6.6 doesn't set si_addr on some segfaults // in 64bit mode (cf. http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.6), // especially when we try to read from the safepoint polling page. So the check @@ -393,7 +394,8 @@ ((cb = CodeCache::find_blob(pc)) != NULL) && cb->is_compiled()) { if (TraceTraps) { - tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc)); + tty->print_cr("trap: safepoint_poll at " INTPTR_FORMAT " (%s)", p2i(pc), + (SafepointMechanism::uses_thread_local_poll() && USE_POLL_BIT_ONLY) ? "SIGTRAP" : "SIGSEGV"); } stub = SharedRuntime::get_poll_stub(pc); }
--- a/src/hotspot/share/aot/aotCompiledMethod.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/aot/aotCompiledMethod.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -270,7 +270,7 @@ CompiledIC *ic = CompiledIC_at(&iter); if (ic->is_icholder_call()) { CompiledICHolder* cichk = ic->cached_icholder(); - f(cichk->holder_method()); + f(cichk->holder_metadata()); f(cichk->holder_klass()); } else { // Get Klass* or NULL (if value is -1) from GOT cell of virtual call PLT stub.
--- a/src/hotspot/share/ci/ciEnv.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/ci/ciEnv.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1164,28 +1164,30 @@ void ciEnv::dump_compile_data(outputStream* out) { CompileTask* task = this->task(); - Method* method = task->method(); - int entry_bci = task->osr_bci(); - int comp_level = task->comp_level(); - out->print("compile %s %s %s %d %d", - method->klass_name()->as_quoted_ascii(), - method->name()->as_quoted_ascii(), - method->signature()->as_quoted_ascii(), - entry_bci, comp_level); - if (compiler_data() != NULL) { - if (is_c2_compile(comp_level)) { + if (task) { + Method* method = task->method(); + int entry_bci = task->osr_bci(); + int comp_level = task->comp_level(); + out->print("compile %s %s %s %d %d", + method->klass_name()->as_quoted_ascii(), + method->name()->as_quoted_ascii(), + method->signature()->as_quoted_ascii(), + entry_bci, comp_level); + if (compiler_data() != NULL) { + if (is_c2_compile(comp_level)) { #ifdef COMPILER2 - // Dump C2 inlining data. - ((Compile*)compiler_data())->dump_inline_data(out); + // Dump C2 inlining data. + ((Compile*)compiler_data())->dump_inline_data(out); #endif - } else if (is_c1_compile(comp_level)) { + } else if (is_c1_compile(comp_level)) { #ifdef COMPILER1 - // Dump C1 inlining data. - ((Compilation*)compiler_data())->dump_inline_data(out); + // Dump C1 inlining data. + ((Compilation*)compiler_data())->dump_inline_data(out); #endif + } } + out->cr(); } - out->cr(); } void ciEnv::dump_replay_data_unsafe(outputStream* out) {
--- a/src/hotspot/share/classfile/classLoaderData.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/classfile/classLoaderData.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -280,11 +280,6 @@ ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies); ~ClassLoaderData(); - // GC interface. - void clear_claimed() { _claimed = 0; } - bool claimed() const { return _claimed == 1; } - bool claim(); - // The CLD are not placed in the Heap, so the Card Table or // the Mod Union Table can't be used to mark when CLD have modified oops. // The CT and MUT bits saves this information for the whole class loader data. @@ -316,6 +311,10 @@ Dictionary* create_dictionary(); public: + // GC interface. + void clear_claimed() { _claimed = 0; } + bool claimed() const { return _claimed == 1; } + bool claim(); bool is_alive(BoolObjectClosure* is_alive_closure) const;
--- a/src/hotspot/share/classfile/systemDictionary.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/classfile/systemDictionary.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2734,43 +2734,68 @@ return method_type; } +Handle SystemDictionary::find_field_handle_type(Symbol* signature, + Klass* accessing_klass, + TRAPS) { + Handle empty; + ResourceMark rm(THREAD); + SignatureStream ss(signature, /*is_method=*/ false); + if (!ss.is_done()) { + Handle class_loader, protection_domain; + if (accessing_klass != NULL) { + class_loader = Handle(THREAD, accessing_klass->class_loader()); + protection_domain = Handle(THREAD, accessing_klass->protection_domain()); + } + oop mirror = ss.as_java_mirror(class_loader, protection_domain, SignatureStream::NCDFError, CHECK_(empty)); + ss.next(); + if (ss.is_done()) { + return Handle(THREAD, mirror); + } + } + return empty; +} + // Ask Java code to find or construct a method handle constant. Handle SystemDictionary::link_method_handle_constant(Klass* caller, int ref_kind, //e.g., JVM_REF_invokeVirtual Klass* callee, - Symbol* name_sym, + Symbol* name, Symbol* signature, TRAPS) { Handle empty; - Handle name = java_lang_String::create_from_symbol(name_sym, CHECK_(empty)); - Handle type; - if (signature->utf8_length() > 0 && signature->byte_at(0) == '(') { - type = find_method_handle_type(signature, caller, CHECK_(empty)); - } else if (caller == NULL) { - // This should not happen. JDK code should take care of that. + if (caller == NULL) { THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MH constant", empty); + } + Handle name_str = java_lang_String::create_from_symbol(name, CHECK_(empty)); + Handle signature_str = java_lang_String::create_from_symbol(signature, CHECK_(empty)); + + // Put symbolic info from the MH constant into freshly created MemberName and resolve it. + Handle mname = MemberName_klass()->allocate_instance_handle(CHECK_(empty)); + java_lang_invoke_MemberName::set_clazz(mname(), callee->java_mirror()); + java_lang_invoke_MemberName::set_name (mname(), name_str()); + java_lang_invoke_MemberName::set_type (mname(), signature_str()); + java_lang_invoke_MemberName::set_flags(mname(), MethodHandles::ref_kind_to_flags(ref_kind)); + + if (ref_kind == JVM_REF_invokeVirtual && + callee->name() == vmSymbols::java_lang_invoke_MethodHandle() && + (name == vmSymbols::invoke_name() || name == vmSymbols::invokeExact_name())) { + // Skip resolution for j.l.i.MethodHandle.invoke()/invokeExact(). + // They are public signature polymorphic methods, but require appendix argument + // which MemberName resolution doesn't handle. There's special logic on JDK side to handle them + // (see MethodHandles.linkMethodHandleConstant() and MethodHandles.findVirtualForMH()). } else { - ResourceMark rm(THREAD); - SignatureStream ss(signature, false); - if (!ss.is_done()) { - oop mirror = ss.as_java_mirror(Handle(THREAD, caller->class_loader()), - Handle(THREAD, caller->protection_domain()), - SignatureStream::NCDFError, CHECK_(empty)); - type = Handle(THREAD, mirror); - ss.next(); - if (!ss.is_done()) type = Handle(); // error! - } + MethodHandles::resolve_MemberName(mname, caller, CHECK_(empty)); } - if (type.is_null()) { - THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty); - } + + // After method/field resolution succeeded, it's safe to resolve MH signature as well. + Handle type = MethodHandles::resolve_MemberName_type(mname, caller, CHECK_(empty)); // call java.lang.invoke.MethodHandleNatives::linkMethodHandleConstant(Class caller, int refKind, Class callee, String name, Object type) -> MethodHandle JavaCallArguments args; args.push_oop(Handle(THREAD, caller->java_mirror())); // the referring class args.push_int(ref_kind); args.push_oop(Handle(THREAD, callee->java_mirror())); // the target class - args.push_oop(name); + args.push_oop(name_str); args.push_oop(type); JavaValue result(T_OBJECT); JavaCalls::call_static(&result,
--- a/src/hotspot/share/classfile/systemDictionary.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/classfile/systemDictionary.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -533,6 +533,11 @@ Klass* accessing_klass, TRAPS); + // find a java.lang.Class object for a given signature + static Handle find_field_handle_type(Symbol* signature, + Klass* accessing_klass, + TRAPS); + // ask Java to compute a java.lang.invoke.MethodHandle object for a given CP entry static Handle link_method_handle_constant(Klass* caller, int ref_kind, //e.g., JVM_REF_invokeVirtual
--- a/src/hotspot/share/classfile/vmSymbols.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/classfile/vmSymbols.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -302,6 +302,7 @@ /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \ template(findMethodHandleType_name, "findMethodHandleType") \ template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \ + template(invokeExact_name, "invokeExact") \ template(linkMethodHandleConstant_name, "linkMethodHandleConstant") \ template(linkMethodHandleConstant_signature, "(Ljava/lang/Class;ILjava/lang/Class;Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/invoke/MethodHandle;") \ template(linkMethod_name, "linkMethod") \
--- a/src/hotspot/share/code/compiledIC.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/code/compiledIC.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -230,10 +230,13 @@ #ifdef ASSERT int index = call_info->resolved_method()->itable_index(); assert(index == itable_index, "CallInfo pre-computes this"); -#endif //ASSERT InstanceKlass* k = call_info->resolved_method()->method_holder(); assert(k->verify_itable_index(itable_index), "sanity check"); - InlineCacheBuffer::create_transition_stub(this, k, entry); +#endif //ASSERT + CompiledICHolder* holder = new CompiledICHolder(call_info->resolved_method()->method_holder(), + call_info->resolved_klass()); + holder->claim(); + InlineCacheBuffer::create_transition_stub(this, holder, entry); } else { assert(call_info->call_kind() == CallInfo::vtable_call, "either itable or vtable"); // Can be different than selected_method->vtable_index(), due to package-private etc. @@ -517,7 +520,14 @@ bool CompiledIC::is_icholder_entry(address entry) { CodeBlob* cb = CodeCache::find_blob_unsafe(entry); - return (cb != NULL && cb->is_adapter_blob()); + if (cb != NULL && cb->is_adapter_blob()) { + return true; + } + // itable stubs also use CompiledICHolder + if (VtableStubs::is_entry_point(entry) && VtableStubs::stub_containing(entry)->is_itable_stub()) { + return true; + } + return false; } bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site, const CompiledMethod* cm) {
--- a/src/hotspot/share/code/compiledIC.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/code/compiledIC.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -45,11 +45,11 @@ // \ / \ / // [4] \ / [4] \->-/ // \->- Megamorphic -<-/ -// (Method*) +// (CompiledICHolder*) // -// The text in paranteses () refere to the value of the inline cache receiver (mov instruction) +// The text in parentheses () refers to the value of the inline cache receiver (mov instruction) // -// The numbers in square brackets refere to the kind of transition: +// The numbers in square brackets refer to the kind of transition: // [1]: Initial fixup. Receiver it found from debug information // [2]: Compilation of a method // [3]: Recompilation of a method (note: only entry is changed. The Klass* must stay the same)
--- a/src/hotspot/share/code/compiledMethod.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/code/compiledMethod.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -404,8 +404,7 @@ // yet be marked below. (We check this further below). CompiledICHolder* cichk_oop = ic->cached_icholder(); - if (cichk_oop->holder_method()->method_holder()->is_loader_alive(is_alive) && - cichk_oop->holder_klass()->is_loader_alive(is_alive)) { + if (cichk_oop->is_loader_alive(is_alive)) { return; } } else {
--- a/src/hotspot/share/code/dependencies.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/code/dependencies.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -241,8 +241,18 @@ bool is_object() const { assert(is_valid(), "oops"); return _id < 0; } Metadata* as_metadata(OopRecorder* rec) const { assert(is_metadata(), "oops"); return rec->metadata_at(index()); } - Klass* as_klass(OopRecorder* rec) const { assert(as_metadata(rec)->is_klass(), "oops"); return (Klass*) as_metadata(rec); } - Method* as_method(OopRecorder* rec) const { assert(as_metadata(rec)->is_method(), "oops"); return (Method*) as_metadata(rec); } + Klass* as_klass(OopRecorder* rec) const { + Metadata* m = as_metadata(rec); + assert(m != NULL, "as_metadata returned NULL"); + assert(m->is_klass(), "oops"); + return (Klass*) m; + } + Method* as_method(OopRecorder* rec) const { + Metadata* m = as_metadata(rec); + assert(m != NULL, "as_metadata returned NULL"); + assert(m->is_method(), "oops"); + return (Method*) m; + } jobject as_object(OopRecorder* rec) const { assert(is_object(), "oops"); return rec->oop_at(index()); } }; #endif // INCLUDE_JVMCI
--- a/src/hotspot/share/code/nmethod.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/code/nmethod.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1547,7 +1547,7 @@ CompiledIC *ic = CompiledIC_at(&iter); if (ic->is_icholder_call()) { CompiledICHolder* cichk = ic->cached_icholder(); - f(cichk->holder_method()); + f(cichk->holder_metadata()); f(cichk->holder_klass()); } else { Metadata* ic_oop = ic->cached_metadata();
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -4722,7 +4722,7 @@ timer->record_time_secs(G1GCPhaseTimes::YoungFreeCSet, worker_id, young_time); } if (has_non_young_time) { - timer->record_time_secs(G1GCPhaseTimes::NonYoungFreeCSet, worker_id, young_time); + timer->record_time_secs(G1GCPhaseTimes::NonYoungFreeCSet, worker_id, non_young_time); } } };
--- a/src/hotspot/share/gc/g1/vm_operations_g1.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/gc/g1/vm_operations_g1.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -139,13 +139,17 @@ // An allocation had been requested. Do it, eventually trying a stronger // kind of GC. _result = g1h->satisfy_failed_allocation(_word_size, _allocation_context, &_pause_succeeded); - } else if (!g1h->has_regions_left_for_allocation()) { - // There has been a request to perform a GC to free some space. We have no - // information on how much memory has been asked for. In case there are - // absolutely no regions left to allocate into, do a maximally compacting full GC. - log_info(gc, ergo)("Attempting maximally compacting collection"); - _pause_succeeded = g1h->do_full_collection(false, /* explicit gc */ - true /* clear_all_soft_refs */); + } else { + bool should_upgrade_to_full = !g1h->should_do_concurrent_full_gc(_gc_cause) && + !g1h->has_regions_left_for_allocation(); + if (should_upgrade_to_full) { + // There has been a request to perform a GC to free some space. We have no + // information on how much memory has been asked for. In case there are + // absolutely no regions left to allocate into, do a maximally compacting full GC. + log_info(gc, ergo)("Attempting maximally compacting collection"); + _pause_succeeded = g1h->do_full_collection(false, /* explicit gc */ + true /* clear_all_soft_refs */); + } } guarantee(_pause_succeeded, "Elevated collections during the safepoint must always succeed."); } else {
--- a/src/hotspot/share/interpreter/interpreterRuntime.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/interpreter/interpreterRuntime.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -804,7 +804,7 @@ // 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; + sender = sender->has_host_klass() ? sender->host_klass() : sender; switch (info.call_kind()) { case CallInfo::direct_call: @@ -822,6 +822,7 @@ case CallInfo::itable_call: cp_cache_entry->set_itable_call( bytecode, + info.resolved_klass(), info.resolved_method(), info.itable_index()); break;
--- a/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/jvmci/jvmciCompilerToVM.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2018, 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 @@ -1433,6 +1433,7 @@ Deoptimization::reassign_fields(fst.current(), fst.register_map(), scope->objects(), realloc_failures, false); GrowableArray<ScopeValue*>* local_values = scope->locals(); + assert(local_values != NULL, "NULL locals"); typeArrayOop array_oop = oopFactory::new_boolArray(local_values->length(), CHECK_NULL); typeArrayHandle array(THREAD, array_oop); for (int i = 0; i < local_values->length(); i++) {
--- a/src/hotspot/share/memory/allocation.inline.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/memory/allocation.inline.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -163,7 +163,7 @@ return NULL; } - if (os::commit_memory(addr, size, !ExecMem, "Allocator (commit)")) { + if (os::commit_memory(addr, size, !ExecMem)) { return (E*)addr; } else { os::release_memory(addr, size);
--- a/src/hotspot/share/oops/compiledICHolder.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/compiledICHolder.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -32,8 +32,8 @@ volatile int CompiledICHolder::_live_not_claimed_count; -CompiledICHolder::CompiledICHolder(Method* method, Klass* klass) - : _holder_method(method), _holder_klass(klass) { +CompiledICHolder::CompiledICHolder(Metadata* metadata, Klass* klass) + : _holder_metadata(metadata), _holder_klass(klass) { #ifdef ASSERT Atomic::inc(&_live_count); Atomic::inc(&_live_not_claimed_count); @@ -47,12 +47,28 @@ } #endif // ASSERT +bool CompiledICHolder::is_loader_alive(BoolObjectClosure* is_alive) { + if (_holder_metadata->is_method()) { + if (!((Method*)_holder_metadata)->method_holder()->is_loader_alive(is_alive)) { + return false; + } + } else if (_holder_metadata->is_klass()) { + if (!((Klass*)_holder_metadata)->is_loader_alive(is_alive)) { + return false; + } + } + if (!_holder_klass->is_loader_alive(is_alive)) { + return false; + } + return true; +} + // Printing void CompiledICHolder::print_on(outputStream* st) const { st->print("%s", internal_name()); - st->print(" - method: "); holder_method()->print_value_on(st); st->cr(); - st->print(" - klass: "); holder_klass()->print_value_on(st); st->cr(); + st->print(" - metadata: "); holder_metadata()->print_value_on(st); st->cr(); + st->print(" - klass: "); holder_klass()->print_value_on(st); st->cr(); } void CompiledICHolder::print_value_on(outputStream* st) const { @@ -63,7 +79,7 @@ // Verification void CompiledICHolder::verify_on(outputStream* st) { - guarantee(holder_method()->is_method(), "should be method"); + guarantee(holder_metadata()->is_method() || holder_metadata()->is_klass(), "should be method or klass"); guarantee(holder_klass()->is_klass(), "should be klass"); }
--- a/src/hotspot/share/oops/compiledICHolder.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/compiledICHolder.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -29,8 +29,9 @@ #include "utilities/macros.hpp" // A CompiledICHolder* is a helper object for the inline cache implementation. -// It holds an intermediate value (method+klass pair) used when converting from -// compiled to an interpreted call. +// It holds: +// (1) (method+klass pair) when converting from compiled to an interpreted call +// (2) (klass+klass pair) when calling itable stub from megamorphic compiled call // // These are always allocated in the C heap and are freed during a // safepoint by the ICBuffer logic. It's unsafe to free them earlier @@ -45,32 +46,33 @@ static volatile int _live_not_claimed_count; // allocated but not yet in use so not // reachable by iterating over nmethods - Method* _holder_method; + Metadata* _holder_metadata; Klass* _holder_klass; // to avoid name conflict with oopDesc::_klass CompiledICHolder* _next; public: // Constructor - CompiledICHolder(Method* method, Klass* klass); + CompiledICHolder(Metadata* metadata, Klass* klass); ~CompiledICHolder() NOT_DEBUG_RETURN; static int live_count() { return _live_count; } static int live_not_claimed_count() { return _live_not_claimed_count; } // accessors - Method* holder_method() const { return _holder_method; } Klass* holder_klass() const { return _holder_klass; } + Metadata* holder_metadata() const { return _holder_metadata; } - void set_holder_method(Method* m) { _holder_method = m; } - void set_holder_klass(Klass* k) { _holder_klass = k; } + void set_holder_metadata(Metadata* m) { _holder_metadata = m; } + void set_holder_klass(Klass* k) { _holder_klass = k; } - // interpreter support (offsets in bytes) - static int holder_method_offset() { return offset_of(CompiledICHolder, _holder_method); } + static int holder_metadata_offset() { return offset_of(CompiledICHolder, _holder_metadata); } static int holder_klass_offset() { return offset_of(CompiledICHolder, _holder_klass); } CompiledICHolder* next() { return _next; } void set_next(CompiledICHolder* n) { _next = n; } + bool is_loader_alive(BoolObjectClosure* is_alive); + // Verify void verify_on(outputStream* st);
--- a/src/hotspot/share/oops/constantPool.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/constantPool.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -25,6 +25,7 @@ #ifndef SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP #define SHARE_VM_OOPS_CONSTANTPOOLOOP_HPP +#include "memory/allocation.inline.hpp" #include "oops/arrayOop.hpp" #include "oops/cpCache.hpp" #include "oops/objArrayOop.hpp" @@ -1021,7 +1022,7 @@ delete(cur); } } - delete _buckets; + FREE_C_HEAP_ARRAY(SymbolHashMapBucket, _buckets); } }; // End SymbolHashMap class
--- a/src/hotspot/share/oops/cpCache.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/cpCache.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -279,14 +279,16 @@ 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, + Klass* referenced_klass, + const methodHandle& method, int index) { assert(method->method_holder()->verify_itable_index(index), ""); assert(invoke_code == Bytecodes::_invokeinterface, ""); InstanceKlass* interf = method->method_holder(); assert(interf->is_interface(), "must be an interface"); assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here"); - set_f1(interf); - set_f2(index); + set_f1(referenced_klass); + set_f2((intx)method()); set_method_flags(as_TosState(method->result_type()), 0, // no option bits method()->size_of_parameters()); @@ -515,10 +517,23 @@ #if INCLUDE_JVMTI + +void log_adjust(const char* entry_type, Method* old_method, Method* new_method, bool* trace_name_printed) { + if (log_is_enabled(Info, redefine, class, update)) { + ResourceMark rm; + if (!(*trace_name_printed)) { + log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); + *trace_name_printed = true; + } + log_debug(redefine, class, update, constantpool) + ("cpc %s entry update: %s(%s)", entry_type, new_method->name()->as_C_string(), new_method->signature()->as_C_string()); + } +} + // RedefineClasses() API support: // If this ConstantPoolCacheEntry refers to old_method then update it // to refer to new_method. -bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, +void ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, Method* new_method, bool * trace_name_printed) { if (is_vfinal()) { @@ -527,63 +542,35 @@ // match old_method so need an update // NOTE: can't use set_f2_as_vfinal_method as it asserts on different values _f2 = (intptr_t)new_method; - if (log_is_enabled(Info, redefine, class, update)) { - ResourceMark rm; - if (!(*trace_name_printed)) { - log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); - *trace_name_printed = true; - } - log_debug(redefine, class, update, constantpool) - ("cpc vf-entry update: %s(%s)", new_method->name()->as_C_string(), new_method->signature()->as_C_string()); - } - return true; + log_adjust("vfinal", old_method, new_method, trace_name_printed); } - - // f1() is not used with virtual entries so bail out - return false; + return; } - if (_f1 == NULL) { - // NULL f1() means this is a virtual entry so bail out - // We are assuming that the vtable index does not need change. - return false; + assert (_f1 != NULL, "should not call with uninteresting entry"); + + if (!(_f1->is_method())) { + // _f1 is a Klass* for an interface, _f2 is the method + if (f2_as_interface_method() == old_method) { + _f2 = (intptr_t)new_method; + log_adjust("interface", old_method, new_method, trace_name_printed); + } + } else if (_f1 == old_method) { + _f1 = new_method; + log_adjust("special, static or dynamic", old_method, new_method, trace_name_printed); } - - if (_f1 == old_method) { - _f1 = new_method; - if (log_is_enabled(Info, redefine, class, update)) { - ResourceMark rm; - if (!(*trace_name_printed)) { - log_info(redefine, class, update)("adjust: name=%s", old_method->method_holder()->external_name()); - *trace_name_printed = true; - } - log_debug(redefine, class, update, constantpool) - ("cpc entry update: %s(%s)", new_method->name()->as_C_string(), new_method->signature()->as_C_string()); - } - return true; - } - - return false; } // a constant pool cache entry should never contain old or obsolete methods bool ConstantPoolCacheEntry::check_no_old_or_obsolete_entries() { - if (is_vfinal()) { - // virtual and final so _f2 contains method ptr instead of vtable index - Metadata* f2 = (Metadata*)_f2; - // Return false if _f2 refers to an old or an obsolete method. - // _f2 == NULL || !_f2->is_method() are just as unexpected here. - return (f2 != NULL NOT_PRODUCT(&& f2->is_valid()) && f2->is_method() && - !((Method*)f2)->is_old() && !((Method*)f2)->is_obsolete()); - } else if (_f1 == NULL || - (NOT_PRODUCT(_f1->is_valid() &&) !_f1->is_method())) { - // _f1 == NULL || !_f1->is_method() are OK here + Method* m = get_interesting_method_entry(NULL); + // return false if m refers to a non-deleted old or obsolete method + if (m != NULL) { + assert(m->is_valid() && m->is_method(), "m is a valid method"); + return !m->is_old() && !m->is_obsolete(); // old is always set for old and obsolete + } else { return true; } - // return false if _f1 refers to a non-deleted old or obsolete method - return (NOT_PRODUCT(_f1->is_valid() &&) _f1->is_method() && - (f1_as_method()->is_deleted() || - (!f1_as_method()->is_old() && !f1_as_method()->is_obsolete()))); } Method* ConstantPoolCacheEntry::get_interesting_method_entry(Klass* k) { @@ -600,10 +587,11 @@ return NULL; } else { if (!(_f1->is_method())) { - // _f1 can also contain a Klass* for an interface - return NULL; + // _f1 is a Klass* for an interface + m = f2_as_interface_method(); + } else { + m = f1_as_method(); } - m = f1_as_method(); } assert(m != NULL && m->is_method(), "sanity check"); if (m == NULL || !m->is_method() || (k != NULL && m->method_holder() != k)) {
--- a/src/hotspot/share/oops/cpCache.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/cpCache.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -249,6 +249,7 @@ void set_itable_call( Bytecodes::Code invoke_code, // the bytecode used; must be invokeinterface + Klass* referenced_klass, // the referenced klass in the InterfaceMethodref const methodHandle& method, // the resolved interface method int itable_index // index into itable for the method ); @@ -352,6 +353,7 @@ bool is_f1_null() const { Metadata* f1 = f1_ord(); return f1 == NULL; } // classifies a CPC entry as unbound int f2_as_index() const { assert(!is_vfinal(), ""); return (int) _f2; } Method* f2_as_vfinal_method() const { assert(is_vfinal(), ""); return (Method*)_f2; } + Method* f2_as_interface_method() const { assert(bytecode_1() == Bytecodes::_invokeinterface, ""); return (Method*)_f2; } intx flags_ord() const { return (intx)OrderAccess::load_acquire(&_flags); } int field_index() const { assert(is_field_entry(), ""); return (_flags & field_index_mask); } int parameter_size() const { assert(is_method_entry(), ""); return (_flags & parameter_size_mask); } @@ -387,7 +389,7 @@ // trace_name_printed is set to true if the current call has // printed the klass name so that other routines in the adjust_* // group don't print the klass name. - bool adjust_method_entry(Method* old_method, Method* new_method, + void adjust_method_entry(Method* old_method, Method* new_method, bool* trace_name_printed); bool check_no_old_or_obsolete_entries(); Method* get_interesting_method_entry(Klass* k);
--- a/src/hotspot/share/oops/instanceKlass.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/instanceKlass.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -609,9 +609,11 @@ InstanceKlass* host_klass() const { InstanceKlass** hk = adr_host_klass(); if (hk == NULL) { + assert(!is_anonymous(), "Anonymous classes have host klasses"); return NULL; } else { assert(*hk != NULL, "host klass should always be set if the address is not null"); + assert(is_anonymous(), "Only anonymous classes have host klasses"); return *hk; } } @@ -623,6 +625,9 @@ *addr = host; } } + bool has_host_klass() const { + return adr_host_klass() != NULL; + } bool is_anonymous() const { return (_misc_flags & _misc_is_anonymous) != 0; }
--- a/src/hotspot/share/oops/klassVtable.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/klassVtable.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1200,7 +1200,6 @@ Array<Method*>* methods = InstanceKlass::cast(interf)->methods(); int nof_methods = methods->length(); HandleMark hm; - assert(nof_methods > 0, "at least one method must exist for interface to be in vtable"); Handle interface_loader (THREAD, InstanceKlass::cast(interf)->class_loader()); int ime_count = method_count_for_interface(interf); @@ -1369,8 +1368,10 @@ } } - // Only count interfaces with at least one method - if (method_count > 0) { + // Visit all interfaces which either have any methods or can participate in receiver type check. + // We do not bother to count methods in transitive interfaces, although that would allow us to skip + // this step in the rare case of a zero-method interface extending another zero-method interface. + if (method_count > 0 || InstanceKlass::cast(intf)->transitive_interfaces()->length() > 0) { blk->doit(intf, method_count); } }
--- a/src/hotspot/share/oops/method.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/oops/method.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -698,6 +698,7 @@ static ByteSize from_interpreted_offset() { return byte_offset_of(Method, _from_interpreted_entry ); } static ByteSize interpreter_entry_offset() { return byte_offset_of(Method, _i2i_entry ); } static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(Method) + wordSize); } + static ByteSize itable_index_offset() { return byte_offset_of(Method, _vtable_index ); } // for code generation static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); }
--- a/src/hotspot/share/opto/callnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/callnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -772,7 +772,7 @@ ciKlass* boxing_klass = t_oop->klass(); if (is_CallStaticJava() && as_CallStaticJava()->is_boxing_method()) { // Skip unrelated boxing methods. - Node* proj = proj_out(TypeFunc::Parms); + Node* proj = proj_out_or_null(TypeFunc::Parms); if ((proj == NULL) || (phase->type(proj)->is_instptr()->klass() != boxing_klass)) { return false; } @@ -784,7 +784,7 @@ } // May modify (by reflection) if an boxing object is passed // as argument or returned. - Node* proj = returns_pointer() ? proj_out(TypeFunc::Parms) : NULL; + Node* proj = returns_pointer() ? proj_out_or_null(TypeFunc::Parms) : NULL; if (proj != NULL) { const TypeInstPtr* inst_t = phase->type(proj)->isa_instptr(); if ((inst_t != NULL) && (!inst_t->klass_is_exact() || @@ -824,7 +824,7 @@ Node *CallNode::result_cast() { Node *cast = NULL; - Node *p = proj_out(TypeFunc::Parms); + Node *p = proj_out_or_null(TypeFunc::Parms); if (p == NULL) return NULL; @@ -1378,13 +1378,13 @@ PhaseIterGVN *igvn = phase->is_IterGVN(); // Unreachable fall through path (negative array length), // the allocation can only throw so disconnect it. - Node* proj = proj_out(TypeFunc::Control); + Node* proj = proj_out_or_null(TypeFunc::Control); Node* catchproj = NULL; if (proj != NULL) { for (DUIterator_Fast imax, i = proj->fast_outs(imax); i < imax; i++) { Node *cn = proj->fast_out(i); if (cn->is_Catch()) { - catchproj = cn->as_Multi()->proj_out(CatchProjNode::fall_through_index); + catchproj = cn->as_Multi()->proj_out_or_null(CatchProjNode::fall_through_index); break; } } @@ -1442,7 +1442,7 @@ // Create a cast which is control dependent on the initialization to // propagate the fact that the array length must be positive. length = new CastIINode(length, narrow_length_type); - length->set_req(0, initialization()->proj_out(0)); + length->set_req(0, initialization()->proj_out_or_null(0)); } }
--- a/src/hotspot/share/opto/cfgnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/cfgnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -2373,7 +2373,7 @@ if (can_reshape && !in(0)->is_Loop()) { // Dead code elimination can sometimes delete this projection so // if it's not there, there's nothing to do. - Node* fallthru = proj_out(0); + Node* fallthru = proj_out_or_null(0); if (fallthru != NULL) { phase->is_IterGVN()->replace_node(fallthru, in(0)); }
--- a/src/hotspot/share/opto/divnode.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/divnode.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -154,8 +154,8 @@ virtual bool is_CFG() const { return false; } virtual uint ideal_reg() const { return NotAMachineReg; } - ProjNode* div_proj() { return proj_out(div_proj_num); } - ProjNode* mod_proj() { return proj_out(mod_proj_num); } + ProjNode* div_proj() { return proj_out_or_null(div_proj_num); } + ProjNode* mod_proj() { return proj_out_or_null(mod_proj_num); } }; //------------------------------DivModINode---------------------------------------
--- a/src/hotspot/share/opto/escape.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/escape.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -366,7 +366,7 @@ delayed_worklist->push(n); // Check if a call returns an object. if ((n->as_Call()->returns_pointer() && - n->as_Call()->proj_out(TypeFunc::Parms) != NULL) || + n->as_Call()->proj_out_or_null(TypeFunc::Parms) != NULL) || (n->is_CallStaticJava() && n->as_CallStaticJava()->is_boxing_method())) { add_call_node(n->as_Call()); @@ -2674,7 +2674,7 @@ PhaseGVN* igvn = _igvn; const TypeOopPtr *toop = C->get_adr_type(alias_idx)->isa_oopptr(); bool is_instance = (toop != NULL) && toop->is_known_instance(); - Node *start_mem = C->start()->proj_out(TypeFunc::Memory); + Node *start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); Node *prev = NULL; Node *result = orig_mem; while (prev != result) { @@ -3028,7 +3028,7 @@ // An allocation may have an Initialize which has raw stores. Scan // the users of the raw allocation result and push AddP users // on alloc_worklist. - Node *raw_result = alloc->proj_out(TypeFunc::Parms); + Node *raw_result = alloc->proj_out_or_null(TypeFunc::Parms); assert (raw_result != NULL, "must have an allocation result"); for (DUIterator_Fast imax, i = raw_result->fast_outs(imax); i < imax; i++) { Node *use = raw_result->fast_out(i); @@ -3219,7 +3219,7 @@ // we don't need to do anything, but the users must be pushed } else if (n->is_MemBar()) { // Initialize, MemBar nodes // we don't need to do anything, but the users must be pushed - n = n->as_MemBar()->proj_out(TypeFunc::Memory); + n = n->as_MemBar()->proj_out_or_null(TypeFunc::Memory); if (n == NULL) continue; } else if (n->Opcode() == Op_StrCompressedCopy ||
--- a/src/hotspot/share/opto/graphKit.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/graphKit.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2018, 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 @@ -3754,7 +3754,7 @@ // Trace Allocate -> Proj[Parm] -> Initialize InitializeNode* AllocateNode::initialization() { - ProjNode* rawoop = proj_out(AllocateNode::RawAddress); + ProjNode* rawoop = proj_out_or_null(AllocateNode::RawAddress); if (rawoop == NULL) return NULL; for (DUIterator_Fast imax, i = rawoop->fast_outs(imax); i < imax; i++) { Node* init = rawoop->fast_out(i);
--- a/src/hotspot/share/opto/ifnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/ifnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -505,7 +505,7 @@ // Flip 1: If (Bool[<] CmpU(l, LoadRange)) ... // Flip 2: If (Bool[<=] CmpU(LoadRange, l)) ... - ProjNode* iftrap = proj_out(flip_test == 2 ? true : false); + ProjNode* iftrap = proj_out_or_null(flip_test == 2 ? true : false); return iftrap; } @@ -1195,14 +1195,17 @@ // Check that the If that is in between the 2 integer comparisons has // no side effect bool IfNode::is_side_effect_free_test(ProjNode* proj, PhaseIterGVN* igvn) { - if (proj != NULL && - proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none) && - proj->outcnt() <= 2) { + if (proj == NULL) { + return false; + } + CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); + if (unc != NULL && proj->outcnt() <= 2) { if (proj->outcnt() == 1 || // Allow simple null check from LoadRange (is_cmp_with_loadrange(proj) && is_null_check(proj, igvn))) { CallStaticJavaNode* unc = proj->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); CallStaticJavaNode* dom_unc = proj->in(0)->in(0)->as_Proj()->is_uncommon_trap_if_pattern(Deoptimization::Reason_none); + assert(dom_unc != NULL, "is_uncommon_trap_if_pattern returned NULL"); // reroute_side_effect_free_unc changes the state of this // uncommon trap to restart execution at the previous @@ -1471,7 +1474,7 @@ // be skipped. For example, range check predicate has two checks // for lower and upper bounds. ProjNode* unc_proj = proj_out(1 - prev_dom->as_Proj()->_con)->as_Proj(); - if ((unc_proj != NULL) && (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) != NULL)) { + if (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) != NULL) { prev_dom = idom; }
--- a/src/hotspot/share/opto/library_call.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/library_call.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, 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 @@ -1495,7 +1495,7 @@ // escape analysis can go from the MemBarStoreStoreNode to the // AllocateNode and eliminate the MemBarStoreStoreNode if possible // based on the escape status of the AllocateNode. - insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out(AllocateNode::RawAddress)); + insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress)); } if (compress) { set_result(_gvn.transform(count)); @@ -1589,7 +1589,7 @@ // escape analysis can go from the MemBarStoreStoreNode to the // AllocateNode and eliminate the MemBarStoreStoreNode if possible // based on the escape status of the AllocateNode. - insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out(AllocateNode::RawAddress)); + insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress)); } else { insert_mem_bar(Op_MemBarCPUOrder); } @@ -1675,7 +1675,7 @@ // escape analysis can go from the MemBarStoreStoreNode to the // AllocateNode and eliminate the MemBarStoreStoreNode if possible // based on the escape status of the AllocateNode. - insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out(AllocateNode::RawAddress)); + insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress)); } else { insert_mem_bar(Op_MemBarCPUOrder); } @@ -4722,7 +4722,7 @@ // escape analysis can go from the MemBarStoreStoreNode to the // AllocateNode and eliminate the MemBarStoreStoreNode if possible // based on the escape status of the AllocateNode. - insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out(AllocateNode::RawAddress)); + insert_mem_bar(Op_MemBarStoreStore, alloc->proj_out_or_null(AllocateNode::RawAddress)); } else { insert_mem_bar(Op_MemBarCPUOrder); } @@ -5031,7 +5031,7 @@ Node *mem = reset_memory(); set_all_memory(mem); alloc->set_req(TypeFunc::Memory, mem); - set_control(init->proj_out(TypeFunc::Control)); + set_control(init->proj_out_or_null(TypeFunc::Control)); set_i_o(callprojs.fallthrough_ioproj); // Update memory as done in GraphKit::set_output_for_allocation() @@ -5042,8 +5042,8 @@ } const TypePtr* telemref = ary_type->add_offset(Type::OffsetBot); int elemidx = C->get_alias_index(telemref); - set_memory(init->proj_out(TypeFunc::Memory), Compile::AliasIdxRaw); - set_memory(init->proj_out(TypeFunc::Memory), elemidx); + set_memory(init->proj_out_or_null(TypeFunc::Memory), Compile::AliasIdxRaw); + set_memory(init->proj_out_or_null(TypeFunc::Memory), elemidx); Node* allocx = _gvn.transform(alloc); assert(allocx == alloc, "where has the allocation gone?"); @@ -5360,7 +5360,7 @@ // to finish initializing the allocated object. if ((ctl->is_IfFalse() || ctl->is_IfTrue()) && ctl->in(0)->is_If()) { IfNode* iff = ctl->in(0)->as_If(); - Node* not_ctl = iff->proj_out(1 - ctl->as_Proj()->_con); + Node* not_ctl = iff->proj_out_or_null(1 - ctl->as_Proj()->_con); assert(not_ctl != NULL && not_ctl != ctl, "found alternate"); if (slow_region != NULL && slow_region->find_edge(not_ctl) >= 1) { ctl = iff->in(0); // This test feeds the known slow_region.
--- a/src/hotspot/share/opto/loopTransform.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/loopTransform.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2018, 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 @@ -1017,7 +1017,6 @@ CountedLoopNode *main_head = loop->_head->as_CountedLoop(); assert( main_head->is_normal_loop(), "" ); CountedLoopEndNode *main_end = main_head->loopexit(); - guarantee(main_end != NULL, "no loop exit node"); assert( main_end->outcnt() == 2, "1 true, 1 false path only" ); Node *pre_header= main_head->in(LoopNode::EntryControl); @@ -1243,7 +1242,6 @@ // Find common pieces of the loop being guarded with pre & post loops CountedLoopNode *main_head = loop->_head->as_CountedLoop(); CountedLoopEndNode *main_end = main_head->loopexit(); - guarantee(main_end != NULL, "no loop exit node"); // diagnostic to show loop end is not properly formed assert(main_end->outcnt() == 2, "1 true, 1 false path only"); @@ -1293,7 +1291,6 @@ // Find common pieces of the loop being guarded with pre & post loops CountedLoopNode *main_head = loop->_head->as_CountedLoop(); CountedLoopEndNode *main_end = main_head->loopexit(); - guarantee(main_end != NULL, "no loop exit node"); // diagnostic to show loop end is not properly formed assert(main_end->outcnt() == 2, "1 true, 1 false path only"); @@ -1427,7 +1424,6 @@ assert(LoopUnrollLimit, ""); CountedLoopNode *loop_head = loop->_head->as_CountedLoop(); CountedLoopEndNode *loop_end = loop_head->loopexit(); - assert(loop_end, ""); #ifndef PRODUCT if (PrintOpto && VerifyLoopOptimizations) { tty->print("Unrolling "); @@ -2972,7 +2968,7 @@ } store = n; store_value = value; - } else if (n->is_If() && n != head->loopexit()) { + } else if (n->is_If() && n != head->loopexit_or_null()) { msg = "extra control flow"; msg_node = n; } @@ -3114,7 +3110,6 @@ ok.set(store->in(MemNode::Memory)->_idx); CountedLoopEndNode* loop_exit = head->loopexit(); - guarantee(loop_exit != NULL, "no loop exit node"); // Loop structure is ok ok.set(head->_idx); @@ -3204,7 +3199,7 @@ return false; } - Node* exit = head->loopexit()->proj_out(0); + Node* exit = head->loopexit()->proj_out_or_null(0); if (exit == NULL) { return false; } @@ -3280,8 +3275,8 @@ call->init_req(TypeFunc::Control, head->init_control()); call->init_req(TypeFunc::I_O, C->top()); // Does no I/O. call->init_req(TypeFunc::Memory, mem_phi->in(LoopNode::EntryControl)); - call->init_req(TypeFunc::ReturnAdr, C->start()->proj_out(TypeFunc::ReturnAdr)); - call->init_req(TypeFunc::FramePtr, C->start()->proj_out(TypeFunc::FramePtr)); + call->init_req(TypeFunc::ReturnAdr, C->start()->proj_out_or_null(TypeFunc::ReturnAdr)); + call->init_req(TypeFunc::FramePtr, C->start()->proj_out_or_null(TypeFunc::FramePtr)); _igvn.register_new_node_with_optimizer(call); result_ctrl = new ProjNode(call,TypeFunc::Control); _igvn.register_new_node_with_optimizer(result_ctrl);
--- a/src/hotspot/share/opto/loopnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/loopnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2018, 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 @@ -68,11 +68,11 @@ bool LoopNode::is_valid_counted_loop() const { if (is_CountedLoop()) { CountedLoopNode* l = as_CountedLoop(); - CountedLoopEndNode* le = l->loopexit(); + CountedLoopEndNode* le = l->loopexit_or_null(); if (le != NULL && - le->proj_out(1 /* true */) == l->in(LoopNode::LoopBackControl)) { + le->proj_out_or_null(1 /* true */) == l->in(LoopNode::LoopBackControl)) { Node* phi = l->phi(); - Node* exit = le->proj_out(0 /* false */); + Node* exit = le->proj_out_or_null(0 /* false */); if (exit != NULL && exit->Opcode() == Op_IfFalse && phi != NULL && phi->is_Phi() && phi->in(LoopNode::LoopBackControl) == l->incr() && @@ -793,7 +793,7 @@ #ifdef ASSERT assert(l->is_valid_counted_loop(), "counted loop shape is messed up"); - assert(l == loop->_head && l->phi() == phi && l->loopexit() == lex, "" ); + assert(l == loop->_head && l->phi() == phi && l->loopexit_or_null() == lex, "" ); #endif #ifndef PRODUCT if (TraceLoopOpts) { @@ -917,7 +917,7 @@ } } CountedLoopEndNode* cle = inner_out->in(0)->as_CountedLoopEnd(); - assert(cle == inner->loopexit(), "mismatch"); + assert(cle == inner->loopexit_or_null(), "mismatch"); bool has_skeleton = outer_le->in(1)->bottom_type()->singleton() && outer_le->in(1)->bottom_type()->is_int()->get_con() == 0; if (has_skeleton) { assert(expect_skeleton == 1 || expect_skeleton == -1, "unexpected skeleton node"); @@ -1216,7 +1216,7 @@ if (le == NULL) { return NULL; } - Node* c = le->proj_out(false); + Node* c = le->proj_out_or_null(false); if (c == NULL) { return NULL; } @@ -1331,8 +1331,7 @@ n->set_req(i, old_new[n->in(i)->_idx]); } } - if (n->in(0) != NULL) { - assert(n->in(0) == cle_tail, "node not on backedge?"); + if (n->in(0) != NULL && n->in(0) == cle_tail) { n->set_req(0, le_tail); } igvn->register_new_node_with_optimizer(n); @@ -1394,9 +1393,14 @@ Node* uu = fast_out(j); if (uu->is_Phi()) { Node* be = uu->in(LoopNode::LoopBackControl); - while (be->is_Store() && old_new[be->_idx] != NULL) { - ShouldNotReachHere(); - be = be->in(MemNode::Memory); + if (be->is_Store() && old_new[be->_idx] != NULL) { + assert(false, "store on the backedge + sunk stores: unsupported"); + // drop outer loop + IfNode* outer_le = outer_loop_end(); + Node* iff = igvn->transform(new IfNode(outer_le->in(0), outer_le->in(1), outer_le->_prob, outer_le->_fcnt)); + igvn->replace_node(outer_le, iff); + inner_cl->clear_strip_mined(); + return; } if (be == last || be == first->in(MemNode::Memory)) { assert(phi == NULL, "only one phi"); @@ -1449,10 +1453,7 @@ // Or fix the outer loop fix to include // that chain of stores. Node* be = phi->in(LoopNode::LoopBackControl); - while (be->is_Store() && old_new[be->_idx] != NULL) { - ShouldNotReachHere(); - be = be->in(MemNode::Memory); - } + assert(!(be->is_Store() && old_new[be->_idx] != NULL), "store on the backedge + sunk stores: unsupported"); if (be == first->in(MemNode::Memory)) { if (be == phi->in(LoopNode::LoopBackControl)) { igvn->replace_input_of(phi, LoopNode::LoopBackControl, last); @@ -1489,8 +1490,8 @@ } else { new_limit = igvn->transform(new SubINode(iv_phi, min)); } - igvn->replace_input_of(inner_cle->cmp_node(), 2, new_limit); Node* cmp = inner_cle->cmp_node()->clone(); + igvn->replace_input_of(cmp, 2, new_limit); Node* bol = inner_cle->in(CountedLoopEndNode::TestValue)->clone(); cmp->set_req(2, limit); bol->set_req(1, igvn->transform(cmp));
--- a/src/hotspot/share/opto/loopnode.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/loopnode.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2018, 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 @@ -215,6 +215,7 @@ Node *init_control() const { return in(EntryControl); } Node *back_control() const { return in(LoopBackControl); } + CountedLoopEndNode *loopexit_or_null() const; CountedLoopEndNode *loopexit() const; Node *init_trip() const; Node *stride() const; @@ -342,7 +343,7 @@ return NULL; } Node *ln = iv_phi->in(0); - if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit() == this) { + if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit_or_null() == this) { return (CountedLoopNode*)ln; } return NULL; @@ -354,7 +355,7 @@ }; -inline CountedLoopEndNode *CountedLoopNode::loopexit() const { +inline CountedLoopEndNode *CountedLoopNode::loopexit_or_null() const { Node *bc = back_control(); if( bc == NULL ) return NULL; Node *le = bc->in(0); @@ -362,13 +363,18 @@ return NULL; return (CountedLoopEndNode*)le; } -inline Node *CountedLoopNode::init_trip() const { return loopexit() ? loopexit()->init_trip() : NULL; } -inline Node *CountedLoopNode::stride() const { return loopexit() ? loopexit()->stride() : NULL; } -inline int CountedLoopNode::stride_con() const { return loopexit() ? loopexit()->stride_con() : 0; } -inline bool CountedLoopNode::stride_is_con() const { return loopexit() && loopexit()->stride_is_con(); } -inline Node *CountedLoopNode::limit() const { return loopexit() ? loopexit()->limit() : NULL; } -inline Node *CountedLoopNode::incr() const { return loopexit() ? loopexit()->incr() : NULL; } -inline Node *CountedLoopNode::phi() const { return loopexit() ? loopexit()->phi() : NULL; } +inline CountedLoopEndNode *CountedLoopNode::loopexit() const { + CountedLoopEndNode* cle = loopexit_or_null(); + assert(cle != NULL, "loopexit is NULL"); + return cle; +} +inline Node *CountedLoopNode::init_trip() const { return loopexit_or_null() ? loopexit()->init_trip() : NULL; } +inline Node *CountedLoopNode::stride() const { return loopexit_or_null() ? loopexit()->stride() : NULL; } +inline int CountedLoopNode::stride_con() const { return loopexit_or_null() ? loopexit()->stride_con() : 0; } +inline bool CountedLoopNode::stride_is_con() const { return loopexit_or_null() && loopexit()->stride_is_con(); } +inline Node *CountedLoopNode::limit() const { return loopexit_or_null() ? loopexit()->limit() : NULL; } +inline Node *CountedLoopNode::incr() const { return loopexit_or_null() ? loopexit()->incr() : NULL; } +inline Node *CountedLoopNode::phi() const { return loopexit_or_null() ? loopexit()->phi() : NULL; } //------------------------------LoopLimitNode----------------------------- // Counted Loop limit node which represents exact final iterator value:
--- a/src/hotspot/share/opto/loopopts.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/loopopts.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -239,7 +239,7 @@ // Make control-dependent data Nodes on the live path (path that will remain // once the dominated IF is removed) become control-dependent on the // dominating projection. - Node* dp = iff->as_If()->proj_out(pop == Op_IfTrue); + Node* dp = iff->as_If()->proj_out_or_null(pop == Op_IfTrue); // Loop predicates may have depending checks which should not // be skipped. For example, range check predicate has two checks @@ -1731,7 +1731,7 @@ Node* sfpt = cl->outer_safepoint(); CountedLoopEndNode* cle = cl->loopexit(); CountedLoopNode* new_cl = old_new[cl->_idx]->as_CountedLoop(); - CountedLoopEndNode* new_cle = new_cl->as_CountedLoop()->loopexit(); + CountedLoopEndNode* new_cle = new_cl->as_CountedLoop()->loopexit_or_null(); Node* cle_out = cle->proj_out(false); Node* new_sfpt = NULL; @@ -1956,7 +1956,7 @@ if (head->is_strip_mined() && mode != IgnoreStripMined) { CountedLoopNode* cl = head->as_CountedLoop(); CountedLoopEndNode* cle = cl->loopexit(); - Node* cle_out = cle->proj_out(false); + Node* cle_out = cle->proj_out_or_null(false); if (use == cle_out) { IfNode* le = cl->outer_loop_end(); use = le->proj_out(false);
--- a/src/hotspot/share/opto/macro.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/macro.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, 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 @@ -496,7 +496,7 @@ if (level <= 0) { return NULL; // Give up: phi tree too deep } - Node *start_mem = C->start()->proj_out(TypeFunc::Memory); + Node *start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); Node *alloc_mem = alloc->in(TypeFunc::Memory); uint length = mem->req(); @@ -576,7 +576,7 @@ int alias_idx = C->get_alias_index(adr_t); int offset = adr_t->offset(); - Node *start_mem = C->start()->proj_out(TypeFunc::Memory); + Node *start_mem = C->start()->proj_out_or_null(TypeFunc::Memory); Node *alloc_ctrl = alloc->in(TypeFunc::Control); Node *alloc_mem = alloc->in(TypeFunc::Memory); Arena *a = Thread::current()->resource_area(); @@ -974,8 +974,8 @@ } static void disconnect_projections(MultiNode* n, PhaseIterGVN& igvn) { - Node* ctl_proj = n->proj_out(TypeFunc::Control); - Node* mem_proj = n->proj_out(TypeFunc::Memory); + Node* ctl_proj = n->proj_out_or_null(TypeFunc::Control); + Node* mem_proj = n->proj_out_or_null(TypeFunc::Memory); if (ctl_proj != NULL) { igvn.replace_node(ctl_proj, n->in(0)); } @@ -1086,12 +1086,12 @@ // Eliminate Initialize node. InitializeNode *init = use->as_Initialize(); assert(init->outcnt() <= 2, "only a control and memory projection expected"); - Node *ctrl_proj = init->proj_out(TypeFunc::Control); + Node *ctrl_proj = init->proj_out_or_null(TypeFunc::Control); if (ctrl_proj != NULL) { assert(init->in(TypeFunc::Control) == _fallthroughcatchproj, "allocation control projection"); _igvn.replace_node(ctrl_proj, _fallthroughcatchproj); } - Node *mem_proj = init->proj_out(TypeFunc::Memory); + Node *mem_proj = init->proj_out_or_null(TypeFunc::Memory); if (mem_proj != NULL) { Node *mem = init->in(TypeFunc::Memory); #ifdef ASSERT @@ -1198,7 +1198,7 @@ bool PhaseMacroExpand::eliminate_boxing_node(CallStaticJavaNode *boxing) { // EA should remove all uses of non-escaping boxing node. - if (!C->eliminate_boxing() || boxing->proj_out(TypeFunc::Parms) != NULL) { + if (!C->eliminate_boxing() || boxing->proj_out_or_null(TypeFunc::Parms) != NULL) { return false; } @@ -1580,8 +1580,8 @@ // before the InitializeNode happen before the storestore // barrier. - Node* init_ctrl = init->proj_out(TypeFunc::Control); - Node* init_mem = init->proj_out(TypeFunc::Memory); + Node* init_ctrl = init->proj_out_or_null(TypeFunc::Control); + Node* init_mem = init->proj_out_or_null(TypeFunc::Memory); MemBarNode* mb = MemBarNode::make(C, Op_MemBarStoreStore, Compile::AliasIdxBot); transform_later(mb);
--- a/src/hotspot/share/opto/memnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/memnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -136,7 +136,7 @@ if (!(is_instance || is_boxed_value_load)) return mchain; // don't try to optimize non-instance types uint instance_id = t_oop->instance_id(); - Node *start_mem = phase->C->start()->proj_out(TypeFunc::Memory); + Node *start_mem = phase->C->start()->proj_out_or_null(TypeFunc::Memory); Node *prev = NULL; Node *result = mchain; while (prev != result) {
--- a/src/hotspot/share/opto/multnode.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/multnode.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -43,8 +43,8 @@ Node *MultiNode::match( const ProjNode *proj, const Matcher *m ) { return proj->clone(); } //------------------------------proj_out--------------------------------------- -// Get a named projection -ProjNode* MultiNode::proj_out(uint which_proj) const { +// Get a named projection or null if not found +ProjNode* MultiNode::proj_out_or_null(uint which_proj) const { assert((Opcode() != Op_If && Opcode() != Op_RangeCheck) || which_proj == (uint)true || which_proj == (uint)false, "must be 1 or 0"); assert((Opcode() != Op_If && Opcode() != Op_RangeCheck) || outcnt() == 2, "bad if #1"); for( DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++ ) { @@ -63,6 +63,13 @@ return NULL; } +// Get a named projection +ProjNode* MultiNode::proj_out(uint which_proj) const { + ProjNode* p = proj_out_or_null(which_proj); + assert(p != NULL, "named projection %u not found", which_proj); + return p; +} + //============================================================================= //------------------------------ProjNode--------------------------------------- uint ProjNode::hash() const { @@ -214,8 +221,6 @@ } ProjNode* other_proj = iff->proj_out(1-_con); - if (other_proj == NULL) // Should never happen, but make Parfait happy. - return NULL; CallStaticJavaNode* call = other_proj->is_uncommon_trap_proj(reason); if (call != NULL) { assert(reason == Deoptimization::Reason_none ||
--- a/src/hotspot/share/opto/multnode.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/multnode.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -47,6 +47,7 @@ virtual Node *match( const ProjNode *proj, const Matcher *m ); virtual uint ideal_reg() const { return NotAMachineReg; } ProjNode* proj_out(uint which_proj) const; // Get a named projection + ProjNode* proj_out_or_null(uint which_proj) const; };
--- a/src/hotspot/share/opto/phaseX.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/phaseX.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2018, 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 @@ -1524,7 +1524,7 @@ // receiver to know when to enable the regular fall-through path // in addition to the NullPtrException path. if (use->is_CallDynamicJava() && n == use->in(TypeFunc::Parms)) { - Node* p = use->as_CallDynamicJava()->proj_out(TypeFunc::Control); + Node* p = use->as_CallDynamicJava()->proj_out_or_null(TypeFunc::Control); if (p != NULL) { add_users_to_worklist0(p); } @@ -1617,12 +1617,12 @@ if (use_op == Op_Allocate || use_op == Op_AllocateArray) { InitializeNode* init = use->as_Allocate()->initialization(); if (init != NULL) { - Node* imem = init->proj_out(TypeFunc::Memory); + Node* imem = init->proj_out_or_null(TypeFunc::Memory); if (imem != NULL) add_users_to_worklist0(imem); } } if (use_op == Op_Initialize) { - Node* imem = use->as_Initialize()->proj_out(TypeFunc::Memory); + Node* imem = use->as_Initialize()->proj_out_or_null(TypeFunc::Memory); if (imem != NULL) add_users_to_worklist0(imem); } // Loading the java mirror from a klass oop requires two loads and the type
--- a/src/hotspot/share/opto/stringopts.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/stringopts.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2018, 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 @@ -362,11 +362,11 @@ // Eliminate Initialize node. assert(init->outcnt() <= 2, "only a control and memory projection expected"); assert(init->req() <= InitializeNode::RawStores, "no pending inits"); - Node *ctrl_proj = init->proj_out(TypeFunc::Control); + Node *ctrl_proj = init->proj_out_or_null(TypeFunc::Control); if (ctrl_proj != NULL) { C->gvn_replace_by(ctrl_proj, init->in(TypeFunc::Control)); } - Node *mem_proj = init->proj_out(TypeFunc::Memory); + Node *mem_proj = init->proj_out_or_null(TypeFunc::Memory); if (mem_proj != NULL) { Node *mem = init->in(TypeFunc::Memory); C->gvn_replace_by(mem_proj, mem); @@ -891,7 +891,7 @@ ctrl_path.push(cn); ctrl_path.push(cn->proj_out(0)); ctrl_path.push(cn->proj_out(0)->unique_out()); - Node* catchproj = cn->proj_out(0)->unique_out()->as_Catch()->proj_out(0); + Node* catchproj = cn->proj_out(0)->unique_out()->as_Catch()->proj_out_or_null(0); if (catchproj != NULL) { ctrl_path.push(catchproj); } @@ -1035,13 +1035,13 @@ // by calls in the region. _stringopts->_visited.Clear(); Node_List worklist; - Node* final_result = _end->proj_out(TypeFunc::Parms); + Node* final_result = _end->proj_out_or_null(TypeFunc::Parms); for (uint i = 0; i < _control.size(); i++) { CallNode* cnode = _control.at(i)->isa_Call(); if (cnode != NULL) { _stringopts->_visited.test_set(cnode->_idx); } - Node* result = cnode != NULL ? cnode->proj_out(TypeFunc::Parms) : NULL; + Node* result = cnode != NULL ? cnode->proj_out_or_null(TypeFunc::Parms) : NULL; if (result != NULL && result != final_result) { worklist.push(result); }
--- a/src/hotspot/share/opto/superword.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/opto/superword.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2018, 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 @@ -190,7 +190,7 @@ int *ignored_loop_nodes = NEW_RESOURCE_ARRAY(int, ignored_size); Node_Stack nstack((int)ignored_size); CountedLoopNode *cl = lpt()->_head->as_CountedLoop(); - Node *cl_exit = cl->loopexit(); + Node *cl_exit = cl->loopexit_or_null(); int rpo_idx = _post_block.length(); assert(rpo_idx == 0, "post loop block is empty");
--- a/src/hotspot/share/prims/jni.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/prims/jni.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -2814,7 +2814,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Get##Result##ArrayRegion); \ typeArrayOop src = typeArrayOop(JNIHandles::resolve_non_null(array)); \ - if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)src->length())) { \ + if (start < 0 || len < 0 || (start > src->length() - len)) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ @@ -2864,7 +2864,7 @@ EntryProbe; \ DT_VOID_RETURN_MARK(Set##Result##ArrayRegion); \ typeArrayOop dst = typeArrayOop(JNIHandles::resolve_non_null(array)); \ - if (start < 0 || len < 0 || ((unsigned int)start + (unsigned int)len > (unsigned int)dst->length())) { \ + if (start < 0 || len < 0 || (start > dst->length() - len)) { \ THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); \ } else { \ if (len > 0) { \ @@ -3100,7 +3100,7 @@ DT_VOID_RETURN_MARK(GetStringRegion); oop s = JNIHandles::resolve_non_null(string); int s_len = java_lang_String::length(s); - if (start < 0 || len < 0 || start + len > s_len) { + if (start < 0 || len < 0 || start > s_len - len) { THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); } else { if (len > 0) { @@ -3126,7 +3126,7 @@ DT_VOID_RETURN_MARK(GetStringUTFRegion); oop s = JNIHandles::resolve_non_null(string); int s_len = java_lang_String::length(s); - if (start < 0 || len < 0 || start + len > s_len) { + if (start < 0 || len < 0 || start > s_len - len) { THROW(vmSymbols::java_lang_StringIndexOutOfBoundsException()); } else { //%note jni_7
--- a/src/hotspot/share/prims/methodHandles.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/prims/methodHandles.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -122,6 +122,48 @@ ALL_KINDS = IS_METHOD | IS_CONSTRUCTOR | IS_FIELD | IS_TYPE }; +int MethodHandles::ref_kind_to_flags(int ref_kind) { + assert(ref_kind_is_valid(ref_kind), "%d", ref_kind); + int flags = (ref_kind << REFERENCE_KIND_SHIFT); + if (ref_kind_is_field(ref_kind)) { + flags |= IS_FIELD; + } else if (ref_kind_is_method(ref_kind)) { + flags |= IS_METHOD; + } else if (ref_kind == JVM_REF_newInvokeSpecial) { + flags |= IS_CONSTRUCTOR; + } + return flags; +} + +Handle MethodHandles::resolve_MemberName_type(Handle mname, Klass* caller, TRAPS) { + Handle empty; + Handle type(THREAD, java_lang_invoke_MemberName::type(mname())); + if (!java_lang_String::is_instance_inlined(type())) { + return type; // already resolved + } + Symbol* signature = java_lang_String::as_symbol_or_null(type()); + if (signature == NULL) { + return empty; // no such signature exists in the VM + } + Handle resolved; + int flags = java_lang_invoke_MemberName::flags(mname()); + switch (flags & ALL_KINDS) { + case IS_METHOD: + case IS_CONSTRUCTOR: + resolved = SystemDictionary::find_method_handle_type(signature, caller, CHECK_(empty)); + break; + case IS_FIELD: + resolved = SystemDictionary::find_field_handle_type(signature, caller, CHECK_(empty)); + break; + default: + THROW_MSG_(vmSymbols::java_lang_InternalError(), "unrecognized MemberName format", empty); + } + if (resolved.is_null()) { + THROW_MSG_(vmSymbols::java_lang_InternalError(), "bad MemberName type", empty); + } + return resolved; +} + oop MethodHandles::init_MemberName(Handle mname, Handle target, TRAPS) { // This method is used from java.lang.invoke.MemberName constructors. // It fills in the new MemberName from a java.lang.reflect.Member.
--- a/src/hotspot/share/prims/methodHandles.hpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/prims/methodHandles.hpp Tue Jan 30 16:41:40 2018 +0100 @@ -70,6 +70,8 @@ static int find_MemberNames(Klass* k, Symbol* name, Symbol* sig, int mflags, Klass* caller, int skip, objArrayHandle results, TRAPS); + static Handle resolve_MemberName_type(Handle mname, Klass* caller, TRAPS); + // bit values for suppress argument to expand_MemberName: enum { _suppress_defc = 1, _suppress_name = 2, _suppress_type = 4 }; @@ -191,6 +193,8 @@ ref_kind == JVM_REF_invokeInterface); } + static int ref_kind_to_flags(int ref_kind); + #include CPU_HEADER(methodHandles) // Tracing
--- a/src/hotspot/share/runtime/arguments.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/runtime/arguments.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -63,7 +63,11 @@ #endif // Note: This is a special bug reporting site for the JVM -#define DEFAULT_VENDOR_URL_BUG "http://bugreport.java.com/bugreport/crash.jsp" +#ifdef VENDOR_URL_VM_BUG +# define DEFAULT_VENDOR_URL_BUG VENDOR_URL_VM_BUG +#else +# define DEFAULT_VENDOR_URL_BUG "http://bugreport.java.com/bugreport/crash.jsp" +#endif #define DEFAULT_JAVA_LAUNCHER "generic" char* Arguments::_jvm_flags_file = NULL;
--- a/src/hotspot/share/runtime/safepointMechanism.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/runtime/safepointMechanism.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -36,23 +36,39 @@ void SafepointMechanism::default_initialize() { if (ThreadLocalHandshakes) { set_uses_thread_local_poll(); - const size_t page_size = os::vm_page_size(); - const size_t allocation_size = 2 * page_size; - char* polling_page = os::reserve_memory(allocation_size, NULL, page_size); - os::commit_memory_or_exit(polling_page, allocation_size, false, "Unable to commit Safepoint polling page"); - char* bad_page = polling_page; - char* good_page = polling_page + page_size; + // Poll bit values + intptr_t poll_armed_value = poll_bit(); + intptr_t poll_disarmed_value = 0; - os::protect_memory(bad_page, page_size, os::MEM_PROT_NONE); - os::protect_memory(good_page, page_size, os::MEM_PROT_READ); +#ifdef USE_POLL_BIT_ONLY + if (!USE_POLL_BIT_ONLY) +#endif + { + // Polling page + const size_t page_size = os::vm_page_size(); + const size_t allocation_size = 2 * page_size; + char* polling_page = os::reserve_memory(allocation_size, NULL, page_size); + os::commit_memory_or_exit(polling_page, allocation_size, false, "Unable to commit Safepoint polling page"); - log_info(os)("SafePoint Polling address, bad (protected) page:" INTPTR_FORMAT ", good (unprotected) page:" INTPTR_FORMAT, p2i(bad_page), p2i(good_page)); - os::set_polling_page((address)(bad_page)); + char* bad_page = polling_page; + char* good_page = polling_page + page_size; - intptr_t poll_page_val = reinterpret_cast<intptr_t>(bad_page); - _poll_armed_value = reinterpret_cast<void*>(poll_page_val | poll_bit()); - _poll_disarmed_value = good_page; + os::protect_memory(bad_page, page_size, os::MEM_PROT_NONE); + os::protect_memory(good_page, page_size, os::MEM_PROT_READ); + + log_info(os)("SafePoint Polling address, bad (protected) page:" INTPTR_FORMAT ", good (unprotected) page:" INTPTR_FORMAT, p2i(bad_page), p2i(good_page)); + os::set_polling_page((address)(bad_page)); + + // Poll address values + intptr_t bad_page_val = reinterpret_cast<intptr_t>(bad_page), + good_page_val = reinterpret_cast<intptr_t>(good_page); + poll_armed_value |= bad_page_val; + poll_disarmed_value |= good_page_val; + } + + _poll_armed_value = reinterpret_cast<void*>(poll_armed_value); + _poll_disarmed_value = reinterpret_cast<void*>(poll_disarmed_value); } else { const size_t page_size = os::vm_page_size(); char* polling_page = os::reserve_memory(page_size, NULL, page_size);
--- a/src/hotspot/share/runtime/vmStructs.cpp Tue Jan 30 16:26:40 2018 +0100 +++ b/src/hotspot/share/runtime/vmStructs.cpp Tue Jan 30 16:41:40 2018 +0100 @@ -234,7 +234,7 @@ nonstatic_field(ArrayKlass, _dimension, int) \ volatile_nonstatic_field(ArrayKlass, _higher_dimension, Klass*) \ volatile_nonstatic_field(ArrayKlass, _lower_dimension, Klass*) \ - nonstatic_field(CompiledICHolder, _holder_method, Method*) \ + nonstatic_field(CompiledICHolder, _holder_metadata, Metadata*) \ nonstatic_field(CompiledICHolder, _holder_klass, Klass*) \ nonstatic_field(ConstantPool, _tags, Array<u1>*) \ nonstatic_field(ConstantPool, _cache, ConstantPoolCache*) \
--- a/src/java.base/macosx/native/libosxsecurity/KeystoreImpl.m Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/macosx/native/libosxsecurity/KeystoreImpl.m Tue Jan 30 16:41:40 2018 +0100 @@ -439,6 +439,11 @@ goto errOut; } passwordStrRef = CFStringCreateWithCharacters(kCFAllocatorDefault, passwordChars, passwordLen); + + // clear the password and release + memset(passwordChars, 0, passwordLen); + (*env)->ReleaseCharArrayElements(env, passwordObj, passwordChars, + JNI_ABORT); } } @@ -527,8 +532,19 @@ if (passwordObj) { passwordLen = (*env)->GetArrayLength(env, passwordObj); - passwordChars = (*env)->GetCharArrayElements(env, passwordObj, NULL); - passwordStrRef = CFStringCreateWithCharacters(kCFAllocatorDefault, passwordChars, passwordLen); + + if (passwordLen > 0) { + passwordChars = (*env)->GetCharArrayElements(env, passwordObj, NULL); + if (passwordChars == NULL) { + goto errOut; + } + passwordStrRef = CFStringCreateWithCharacters(kCFAllocatorDefault, passwordChars, passwordLen); + + // clear the password and release + memset(passwordChars, 0, passwordLen); + (*env)->ReleaseCharArrayElements(env, passwordObj, passwordChars, + JNI_ABORT); + } } paramBlock.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESKey.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESKey.java Tue Jan 30 16:41:40 2018 +0100 @@ -25,6 +25,7 @@ package com.sun.crypto.provider; +import java.lang.ref.Reference; import java.security.MessageDigest; import java.security.KeyRep; import java.security.InvalidKeyException; @@ -86,7 +87,12 @@ public byte[] getEncoded() { // Return a copy of the key, rather than a reference, // so that the key data cannot be modified from outside - return this.key.clone(); + + // The key is zeroized by finalize() + // The reachability fence ensures finalize() isn't called early + byte[] result = key.clone(); + Reference.reachabilityFence(this); + return result; } public String getAlgorithm() {
--- a/src/java.base/share/classes/com/sun/crypto/provider/DESedeKey.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/crypto/provider/DESedeKey.java Tue Jan 30 16:41:40 2018 +0100 @@ -25,6 +25,7 @@ package com.sun.crypto.provider; +import java.lang.ref.Reference; import java.security.MessageDigest; import java.security.KeyRep; import java.security.InvalidKeyException; @@ -86,7 +87,11 @@ } public byte[] getEncoded() { - return this.key.clone(); + // The key is zeroized by finalize() + // The reachability fence ensures finalize() isn't called early + byte[] result = key.clone(); + Reference.reachabilityFence(this); + return result; } public String getAlgorithm() {
--- a/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/crypto/provider/DHKeyAgreement.java Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, 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. * * This code is free software; you can redistribute it and/or modify it @@ -28,11 +28,13 @@ import java.util.*; import java.lang.*; import java.math.BigInteger; +import java.security.AccessController; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import java.security.PrivilegedAction; import java.security.ProviderException; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidKeySpecException; @@ -60,6 +62,17 @@ private BigInteger x = BigInteger.ZERO; // the private value private BigInteger y = BigInteger.ZERO; + private static class AllowKDF { + + private static final boolean VALUE = getValue(); + + private static boolean getValue() { + return AccessController.doPrivileged( + (PrivilegedAction<Boolean>) + () -> Boolean.getBoolean("jdk.crypto.KeyAgreement.legacyKDF")); + } + } + /** * Empty constructor */ @@ -367,6 +380,14 @@ if (algorithm == null) { throw new NoSuchAlgorithmException("null algorithm"); } + + if (!algorithm.equalsIgnoreCase("TlsPremasterSecret") && + !AllowKDF.VALUE) { + + throw new NoSuchAlgorithmException("Unsupported secret key " + + "algorithm: " + algorithm); + } + byte[] secret = engineGenerateSecret(); if (algorithm.equalsIgnoreCase("DES")) { // DES
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBEKey.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBEKey.java Tue Jan 30 16:41:40 2018 +0100 @@ -25,6 +25,7 @@ package com.sun.crypto.provider; +import java.lang.ref.Reference; import java.security.MessageDigest; import java.security.KeyRep; import java.security.spec.InvalidKeySpecException; @@ -80,7 +81,11 @@ } public byte[] getEncoded() { - return this.key.clone(); + // The key is zeroized by finalize() + // The reachability fence ensures finalize() isn't called early + byte[] result = key.clone(); + Reference.reachabilityFence(this); + return result; } public String getAlgorithm() {
--- a/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/crypto/provider/PBKDF2KeyImpl.java Tue Jan 30 16:41:40 2018 +0100 @@ -26,6 +26,7 @@ package com.sun.crypto.provider; import java.io.ObjectStreamException; +import java.lang.ref.Reference; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.Charset; @@ -208,7 +209,11 @@ } public byte[] getEncoded() { - return key.clone(); + // The key is zeroized by finalize() + // The reachability fence ensures finalize() isn't called early + byte[] result = key.clone(); + Reference.reachabilityFence(this); + return result; } public String getAlgorithm() { @@ -220,7 +225,11 @@ } public char[] getPassword() { - return passwd.clone(); + // The password is zeroized by finalize() + // The reachability fence ensures finalize() isn't called early + char[] result = passwd.clone(); + Reference.reachabilityFence(this); + return result; } public byte[] getSalt() {
--- a/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/Driver.java Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, 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 @@ -162,11 +162,12 @@ engProps.put((String) me.getKey(), (String) me.getValue()); } } else if ("--version".equals(state)) { - System.out.println(MessageFormat.format(RESOURCE.getString(DriverResource.VERSION), Driver.class.getName(), "1.31, 07/05/05")); + System.out.println(MessageFormat.format(RESOURCE.getString(DriverResource.VERSION), + Driver.class.getName(), "1.31, 07/05/05")); return; } else if ("--help".equals(state)) { printUsage(doPack, true, System.out); - System.exit(1); + System.exit(0); return; } else { break;
--- a/src/java.base/share/classes/com/sun/java/util/jar/pack/DriverResource.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/com/sun/java/util/jar/pack/DriverResource.java Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2018, 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 @@ -89,7 +89,7 @@ " -q, --quiet set verbosity to lowest level", " -l{F}, --log-file={F} output to the given log file, ", " or '-' for System.out", - " -?, -h, --help print this message", + " -?, -h, --help print this help message", " -V, --version print program version", " -J{X} pass option X to underlying Java VM", "", @@ -118,7 +118,7 @@ " -q, --quiet set verbosity to lowest level", " -l{F}, --log-file={F} output to the given log file, or", " '-' for System.out", - " -?, -h, --help print this message", + " -?, -h, --help print this help message", " -V, --version print program version", " -J{X} pass option X to underlying Java VM" }
--- a/src/java.base/share/classes/java/lang/ClassLoader.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/java/lang/ClassLoader.java Tue Jan 30 16:41:40 2018 +0100 @@ -1876,14 +1876,15 @@ * value until the system is fully initialized. * * <p> The name of the built-in system class loader is {@code "app"}. - * The class path used by the built-in system class loader is determined - * by the system property "{@code java.class.path}" during early - * initialization of the VM. If the system property is not defined, - * or its value is an empty string, then there is no class path - * when the initial module is a module on the application module path, - * i.e. <em>a named module</em>. If the initial module is not on - * the application module path then the class path defaults to - * the current working directory. + * The system property "{@code java.class.path}" is read during early + * initialization of the VM to determine the class path. + * An empty value of "{@code java.class.path}" property is interpreted + * differently depending on whether the initial module (the module + * containing the main class) is named or unnamed: + * If named, the built-in system class loader will have no class path and + * will search for classes and resources using the application module path; + * otherwise, if unnamed, it will set the class path to the current + * working directory. * * @return The system {@code ClassLoader} *
--- a/src/java.base/share/classes/java/lang/Runtime.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/java/lang/Runtime.java Tue Jan 30 16:41:40 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2018, 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 @@ -1099,16 +1099,23 @@ m.group(VersionPattern.OPT_GROUP)); // empty '+' - if ((m.group(VersionPattern.PLUS_GROUP) != null) - && !build.isPresent()) { - if (optional.isPresent()) { - if (pre.isPresent()) - throw new IllegalArgumentException("'+' found with" - + " pre-release and optional components:'" + s - + "'"); + if (!build.isPresent()) { + if (m.group(VersionPattern.PLUS_GROUP) != null) { + if (optional.isPresent()) { + if (pre.isPresent()) + throw new IllegalArgumentException("'+' found with" + + " pre-release and optional components:'" + s + + "'"); + } else { + throw new IllegalArgumentException("'+' found with neither" + + " build or optional components: '" + s + "'"); + } } else { - throw new IllegalArgumentException("'+' found with neither" - + " build or optional components: '" + s + "'"); + if (optional.isPresent() && !pre.isPresent()) { + throw new IllegalArgumentException("optional component" + + " must be preceeded by a pre-release component" + + " or '+': '" + s + "'"); + } } } return new Version(List.of(version), pre, build, optional);
--- a/src/java.base/share/classes/java/lang/System.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/java/lang/System.java Tue Jan 30 16:41:40 2018 +0100 @@ -631,7 +631,8 @@ * <tr><th scope="row"><code>java.class.version</code></th> * <td>Java class format version number</td></tr> * <tr><th scope="row"><code>java.class.path</code></th> - * <td>Java class path</td></tr> + * <td>Java class path (refer to + * {@link ClassLoader#getSystemClassLoader()} for details)</td></tr> * <tr><th scope="row"><code>java.library.path</code></th> * <td>List of paths to search when loading libraries</td></tr> * <tr><th scope="row"><code>java.io.tmpdir</code></th>
--- a/src/java.base/share/classes/java/lang/VersionProps.java.template Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/java/lang/VersionProps.java.template Tue Jan 30 16:41:40 2018 +0100 @@ -166,15 +166,8 @@ * Print version info. */ private static void print(boolean err, boolean newln) { - boolean isHeadless = false; PrintStream ps = err ? System.err : System.out; - /* Report that we're running headless if the property is true */ - String headless = System.getProperty("java.awt.headless"); - if ( (headless != null) && (headless.equalsIgnoreCase("true")) ) { - isHeadless = true; - } - /* First line: platform version. */ if (err) { ps.println(launcher_name + " version \"" + java_version + "\""
--- a/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java Tue Jan 30 16:26:40 2018 +0100 +++ b/src/java.base/share/classes/java/lang/invoke/DirectMethodHandle.java Tue Jan 30 16:41:40 2018 +0100 @@ -80,13 +80,20 @@ mtype = mtype.insertParameterTypes(0, receiver); } if (!member.isField()) { - if (refKind == REF_invokeSpecial) { - member = member.asSpecial(); - LambdaForm lform = preparedLambdaForm(member); - return new Special(mtype, lform, member); - } else { - LambdaForm lform = preparedLambdaForm(member); - return new DirectMethodHandle(mtype, lform, member); + switch (refKind) { + case REF_invokeSpecial: { + member = member.asSpecial(); + LambdaForm lform = preparedLambdaForm(member); + return new Special(mtype, lform, member); + } + case REF_invokeInterface: { + LambdaForm lform = preparedLambdaForm(member); + return new Interface(mtype, lform, member, receiver); + } + default: { + LambdaForm lform = preparedLambdaForm(member); + return new DirectMethodHandle(mtype, lform, member); + } } } else { LambdaForm lform = preparedFieldLambdaForm(member); @@ -190,6 +197,7 @@ static LambdaForm makePreparedLambdaForm(MethodType mtype, int which) { boolean needsInit = (which == LF_INVSTATIC_INIT); boolean doesAlloc = (which == LF_NEWINVSPECIAL); + boolean needsReceiverCheck = (which == LF_INVINTERFACE); String linkerName; LambdaForm.Kind kind; switch (which) { @@ -219,6 +227,7 @@ int nameCursor = ARG_LIMIT; final int NEW_OBJ = (doesAlloc ? nameCursor++ : -1); final int GET_MEMBER = nameCursor++; + final int CHECK_RECEIVER = (needsReceiverCheck ? nameCursor++ : -1); final int LINKER_CALL = nameCursor++; Name[] names = arguments(nameCursor - ARG_LIMIT, mtype.invokerType()); assert(names.length == nameCursor); @@ -233,6 +242,10 @@ } assert(findDirectMethodHandle(names[GET_MEMBER]) == names[DMH_THIS]); Object[] outArgs = Arrays.copyOfRange(names, ARG_BASE, GET_MEMBER+1, Object[].class); + if (needsReceiverCheck) { + names[CHECK_RECEIVER] = new Name(getFunction(NF_checkReceiver), names[DMH_THIS], names[ARG_BASE]); + outArgs[0] = names[CHECK_RECEIVER]; + } assert(outArgs[outArgs.length-1] == names[GET_MEMBER]); // look, shifted args! int result = LAST_RESULT; if (doesAlloc) { @@ -376,6 +389,29 @@ } } + /** This subclass represents invokeinterface instructions. */ + static class Interface extends DirectMethodHandle { + private final Class<?> refc; + private Interface(MethodType mtype, LambdaForm form, MemberName member, Class<?> refc) { + super(mtype, form, member); + assert refc.isInterface() : refc; + this.refc = refc; + } + @Override + MethodHandle copyWith(MethodType mt, LambdaForm lf) { + return new Interface(mt, lf, member, refc); + }