Merge
This commit is contained in:
commit
d679703c0b
.hgtags
bin
make
autoconf
data/currency
devkit
gensrc
hotspot/lib
idea
mapfiles/libjava
src/hotspot
cpu
aarch64
arm
macroAssembler_arm.cppmacroAssembler_arm.hppsharedRuntime_arm.cpptemplateTable_arm.cppvtableStubs_arm.cpp
ppc
globalDefinitions_ppc.hppmacroAssembler_ppc.cppmacroAssembler_ppc.hppmacroAssembler_ppc.inline.hppnativeInst_ppc.hppsharedRuntime_ppc.cpptemplateTable_ppc_64.cppvtableStubs_ppc_64.cpp
s390
macroAssembler_s390.cppmacroAssembler_s390.hppmethodHandles_s390.cppsharedRuntime_s390.cpptemplateTable_s390.cppvtableStubs_s390.cpp
sparc
macroAssembler_sparc.cppmacroAssembler_sparc.hppsharedRuntime_sparc.cpptemplateTable_sparc.cppvtableStubs_sparc.cpp
x86
os/aix
os_cpu
share
aot
ci
classfile
code
gc/g1
interpreter
jvmci
memory
oops
compiledICHolder.cppcompiledICHolder.hppconstantPool.hppcpCache.cppcpCache.hppinstanceKlass.hppklassVtable.cppmethod.hpp
opto
callnode.cppcfgnode.cppdivnode.hppescape.cppgraphKit.cppifnode.cpplibrary_call.cpploopTransform.cpploopnode.cpploopnode.hpploopopts.cppmacro.cppmemnode.cppmultnode.cppmultnode.hppphaseX.cppstringopts.cppsuperword.cpp
prims
2
.hgtags
2
.hgtags
@ -464,3 +464,5 @@ d8c634b016c628622c9abbdc6bf50509e5dedbec jdk-10+35
|
||||
959f2f7cbaa6d2ee45d50029744efb219721576c jdk-10+36
|
||||
4f830b447edf04fb4a52151a5ad44d9bb60723cd jdk-10+37
|
||||
e569e83139fdfbecfeb3cd9014d560917787f158 jdk-10+38
|
||||
5b834ec962366e00d4445352a999a3ac14e26f64 jdk-10+39
|
||||
860326263d1f6a83996d7da0f4c66806ae4aa1eb jdk-10+40
|
||||
|
48
bin/idea.sh
48
bin/idea.sh
@ -30,9 +30,10 @@ usage() {
|
||||
}
|
||||
|
||||
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 @@ done
|
||||
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 @@ addSourceFolder() {
|
||||
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 @@ do
|
||||
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=\"####\" />"
|
||||
|
@ -586,69 +586,71 @@ AC_DEFUN([BASIC_EVAL_DEVKIT_VARIABLE],
|
||||
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.
|
||||
|
@ -902,6 +902,9 @@ VERSION_PATCH
|
||||
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_major
|
||||
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 @@ Optional Packages:
|
||||
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 @@ TOOLCHAIN_MINIMUM_VERSION_xlc=""
|
||||
|
||||
################################################################################
|
||||
# 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_SDK_INSTALLDIR_2013=
|
||||
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 @@ VS_SDK_PLATFORM_NAME_2013=
|
||||
#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 @@ $as_echo "$as_me: Unknown variant(s) specified: $INVALID_VARIANTS" >&6;}
|
||||
# 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 @@ $as_echo "$as_me: The path of with_devkit, which resolves as \"$path\", is inval
|
||||
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
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for devkit" >&5
|
||||
{ $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 @@ $as_echo "$DEVKIT_ROOT" >&6; }
|
||||
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 @@ $as_echo "$DEVKIT_ROOT" >&6; }
|
||||
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 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 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 @@ fi
|
||||
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 @@ $as_echo "$as_me: The following toolchain versions are valid on this platform:"
|
||||
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 @@ $as_echo "$as_me: Valid Visual Studio versions: $VALID_VS_VERSIONS." >&6;}
|
||||
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 @@ $as_echo "$as_me: Valid Visual Studio versions: $VALID_VS_VERSIONS." >&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 @@ $as_echo "$as_me: Valid Visual Studio versions: $VALID_VS_VERSIONS." >&6;}
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32352,12 +32467,6 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32399,7 +32531,6 @@ $as_echo "$as_me: directory within the Visual Studio installation" >&6;}
|
||||
fi
|
||||
|
||||
VS_ENV_CMD=""
|
||||
VS_ENV_ARGS=""
|
||||
|
||||
if test "x$VS_COMNTOOLS" != x; then
|
||||
|
||||
@ -32408,12 +32539,6 @@ $as_echo "$as_me: directory within the Visual Studio installation" >&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 @@ $as_echo "$as_me: directory within the Visual Studio installation" >&6;}
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32449,12 +32597,6 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32492,12 +32657,6 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32532,12 +32714,6 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32571,12 +32770,6 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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 @@ $as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studi
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then
|
||||
VCVARSFILES="vc/bin/vcvars32.bat vc/auxiliary/build/vcvars32.bat"
|
||||
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;}
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -32852,6 +33068,11 @@ $as_echo "$as_me: Found $VS_DESCRIPTION" >&6;}
|
||||
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 @@ $as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;}
|
||||
# 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 @@ $as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run c
|
||||
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 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
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 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
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"
|
||||
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"
|
||||
# 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 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
fi
|
||||
fi
|
||||
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -57172,7 +57408,6 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
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 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
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"
|
||||
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"
|
||||
# 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 @@ $as_echo "$as_me: The file type of the located $DLL_NAME is $MSVC_DLL_FILETYPE"
|
||||
fi
|
||||
fi
|
||||
|
||||
done
|
||||
fi
|
||||
fi
|
||||
|
||||
@ -70158,10 +70406,7 @@ fi
|
||||
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 @@ fi
|
||||
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.
|
||||
|
@ -242,10 +242,7 @@ AC_DEFUN_ONCE([HELP_PRINT_SUMMARY_AND_WARNINGS],
|
||||
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 @@ AC_DEFUN_ONCE([HELP_PRINT_SUMMARY_AND_WARNINGS],
|
||||
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],
|
||||
|
@ -80,16 +80,55 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
|
||||
# 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
|
||||
|
@ -142,6 +142,20 @@ IMPORT_MODULES_MAKE:=@IMPORT_MODULES_MAKE@
|
||||
|
||||
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 @@ VERSION_CFLAGS := \
|
||||
-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)
|
||||
|
@ -286,7 +286,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_PRE_DETECTION],
|
||||
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=
|
||||
|
@ -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_SDK_INSTALLDIR_2013=
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT],
|
||||
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
|
||||
eval PLATFORM_TOOLSET="\${VS_VS_PLATFORM_NAME_${VS_VERSION}}"
|
||||
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
|
||||
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])
|
||||
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}}"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@ -133,7 +175,9 @@ AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE],
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE],
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO],
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO],
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
TOOLCHAIN_DESCRIPTION="$VS_DESCRIPTION"
|
||||
if test "$TOOLCHAIN_VERSION" -gt 2013; then
|
||||
UNSUPPORTED_TOOLCHAIN_VERSION=yes
|
||||
fi
|
||||
])
|
||||
|
||||
################################################################################
|
||||
@ -320,6 +372,9 @@ AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV],
|
||||
# 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 @@ AC_DEFUN([TOOLCHAIN_SETUP_MSVC_DLL],
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_SETUP_VS_RUNTIME_DLLS],
|
||||
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 @@ AC_DEFUN([TOOLCHAIN_SETUP_VS_RUNTIME_DLLS],
|
||||
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}])
|
||||
|
@ -32,7 +32,7 @@ formatVersion=3
|
||||
# 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 @@ all=ADP020-AED784-AFA004-AFN971-ALL008-AMD051-ANG532-AOA973-ARS032-ATS040-AUD036
|
||||
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 @@ CU=CUP
|
||||
CW=ANG
|
||||
# CYPRUS
|
||||
CY=EUR
|
||||
# CZECH REPUBLIC (THE)
|
||||
# CZECHIA
|
||||
CZ=CZK
|
||||
# DENMARK
|
||||
DK=DKK
|
||||
@ -470,7 +470,7 @@ SM=EUR
|
||||
# SOUTH SUDAN
|
||||
SS=SSP
|
||||
# SAO TOME AND PRINCIPE
|
||||
ST=STD
|
||||
ST=STN
|
||||
# SAUDI ARABIA
|
||||
SA=SAR
|
||||
# SENEGAL
|
||||
|
142
make/devkit/createWindowsDevkit2015.sh
Normal file
142
make/devkit/createWindowsDevkit2015.sh
Normal file
@ -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" .)
|
172
make/devkit/createWindowsDevkit2017.sh
Normal file
172
make/devkit/createWindowsDevkit2017.sh
Normal file
@ -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" .)
|
@ -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 @@ PROP_SRC_DIRS := \
|
||||
$(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 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
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), )
|
||||
|
@ -222,6 +222,7 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
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, \
|
||||
|
@ -20,16 +20,9 @@ else #with SPEC
|
||||
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)
|
||||
|
@ -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 -->
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 @@ SUNWprivate_1.1 {
|
||||
JNU_ThrowStringIndexOutOfBoundsException;
|
||||
JNU_ToString;
|
||||
|
||||
Java_java_io_FileDescriptor_cleanupClose0;
|
||||
Java_java_io_FileDescriptor_close0;
|
||||
Java_java_io_FileDescriptor_initIDs;
|
||||
Java_java_io_FileDescriptor_sync;
|
||||
|
@ -1049,7 +1049,8 @@ void MacroAssembler::lookup_virtual_method(Register recv_klass,
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -774,7 +774,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
__ 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()));
|
||||
|
||||
|
@ -63,8 +63,8 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
|
||||
#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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
|
||||
// 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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
}
|
||||
#endif // PRODUCT
|
||||
|
||||
__ lookup_virtual_method(r19, vtable_index, rmethod);
|
||||
__ lookup_virtual_method(r16, vtable_index, rmethod);
|
||||
|
||||
if (DebugVtables) {
|
||||
Label L;
|
||||
@ -145,9 +145,9 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
// 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;
|
||||
|
@ -2475,49 +2475,65 @@ void MacroAssembler::store_sized_value(Register src, Address dst, size_t size_in
|
||||
// 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);
|
||||
assert_different_registers(Rklass, Rintf, Rscan, Rtmp);
|
||||
|
||||
Register Ritable = temp_reg1;
|
||||
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));
|
||||
ldr_s32(Rtmp, Address(Rklass, Klass::vtable_length_offset())); // Get length of vtable
|
||||
add(Rscan, Rklass, base);
|
||||
add(Rscan, Rscan, AsmOperand(Rtmp, lsl, scale));
|
||||
|
||||
Label entry, search;
|
||||
// Search through the itable for an interface equal to incoming Rintf
|
||||
// itable looks like [intface][offset][intface][offset][intface][offset]
|
||||
|
||||
b(entry);
|
||||
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
|
||||
|
||||
bind(search);
|
||||
add(Ritable, Ritable, itableOffsetEntry::size() * HeapWordSize);
|
||||
#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
|
||||
|
||||
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));
|
||||
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
|
||||
|
@ -1316,7 +1316,7 @@ public:
|
||||
|
||||
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,
|
||||
|
@ -984,7 +984,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
|
||||
__ 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
|
||||
|
@ -4198,7 +4198,7 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
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));
|
||||
// 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()));
|
||||
|
||||
Label entry, search, interface_ok;
|
||||
// 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);
|
||||
|
||||
__ 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));
|
||||
__ 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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
|
||||
// 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) {
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
|
||||
// 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 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||
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
|
||||
|
@ -55,5 +55,9 @@ const bool CCallingConventionRequiresIntsAsLongs = true;
|
||||
#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
|
||||
|
@ -1788,11 +1788,10 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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
|
||||
|
@ -519,7 +519,8 @@ class MacroAssembler: public Assembler {
|
||||
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,
|
||||
|
@ -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 @@ inline address MacroAssembler::last_calls_return_pc() {
|
||||
|
||||
// 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.
|
||||
|
@ -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 @@ class NativeInstruction VALUE_OBJ_CLASS_SPEC {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -1188,7 +1188,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
// 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));
|
||||
|
@ -3486,11 +3486,11 @@ void TemplateTable::invokestatic(int byte_no) {
|
||||
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 @@ void TemplateTable::invokeinterface_object_method(Register Rrecv_klass,
|
||||
// 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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
|
||||
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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
// 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) {
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
// 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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
__ 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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
|
||||
#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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
// 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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
// 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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
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() {
|
||||
|
@ -2806,8 +2806,8 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
z_brne(search);
|
||||
|
||||
// Entry found and itable_entry_addr points to it, get offset of vtable for interface.
|
||||
if (return_method) {
|
||||
const int vtable_offset_offset = (itableOffsetEntry::offset_offset_in_bytes() -
|
||||
itableOffsetEntry::interface_offset_in_bytes()) -
|
||||
itable_offset_search_inc;
|
||||
|
||||
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).
|
||||
|
||||
// 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.
|
||||
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();
|
||||
|
||||
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();
|
||||
// Load index from itable.
|
||||
z_llgf(itable_offset, vtable_offset_offset, itable_entry_addr);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
// Finally load the method's oop.
|
||||
z_lg(method_result, method_offset, itable_offset, recv_klass);
|
||||
BLOCK_COMMENT("} lookup_interface_method");
|
||||
}
|
||||
|
||||
|
@ -671,8 +671,8 @@ class MacroAssembler: public Assembler {
|
||||
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,
|
||||
|
@ -498,7 +498,7 @@ void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm,
|
||||
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);
|
||||
|
||||
|
@ -2660,9 +2660,9 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
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 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
// 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.
|
||||
|
||||
|
@ -3557,66 +3557,67 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
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*/);
|
||||
__ profile_virtual_call(klass, Z_ARG1/*mdp*/, flags/*scratch*/);
|
||||
|
||||
NearLabel no_such_interface, no_such_method;
|
||||
Register method = Z_tmp_2;
|
||||
// Find entry point to call.
|
||||
|
||||
// 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);
|
||||
// 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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
// 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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
// 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();
|
||||
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
// 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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
__ 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 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
|
||||
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 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||
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;
|
||||
}
|
||||
|
@ -2058,9 +2058,10 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
|
||||
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;
|
||||
|
@ -1277,7 +1277,8 @@ public:
|
||||
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,
|
||||
|
@ -904,7 +904,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
|
||||
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();
|
||||
|
||||
|
@ -3081,15 +3081,15 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
|
||||
__ 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;
|
||||
// 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);
|
||||
|
||||
__ 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);
|
||||
// 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);
|
||||
|
||||
__ 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);
|
||||
__ 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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
__ 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) {
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
}
|
||||
#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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
__ 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 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||
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);
|
||||
|
@ -5809,8 +5809,13 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
// %%% 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 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -544,7 +544,8 @@ class MacroAssembler: public Assembler {
|
||||
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,
|
||||
|
@ -957,7 +957,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
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
|
||||
|
@ -949,7 +949,7 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
{
|
||||
__ 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()));
|
||||
|
||||
|
@ -3712,11 +3712,11 @@ void TemplateTable::fast_invokevfinal(int byte_no) {
|
||||
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 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
__ 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,
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
MacroAssembler* masm = new MacroAssembler(&cb);
|
||||
|
||||
// Entry arguments:
|
||||
// rax,: Interface
|
||||
// rax: CompiledICHolder
|
||||
// rcx: Receiver
|
||||
|
||||
#ifndef PRODUCT
|
||||
@ -155,25 +156,42 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
__ 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");
|
||||
|
||||
// get receiver klass (also an implicit null-check)
|
||||
address npe_addr = __ pc();
|
||||
__ movptr(rsi, Address(rcx, oopDesc::klass_offset_in_bytes()));
|
||||
|
||||
// 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 method = rbx;
|
||||
Label throw_icce;
|
||||
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;
|
||||
|
||||
// Get Method* and entrypoint for compiler
|
||||
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();
|
||||
assert(VtableStub::receiver_location() == rcx->as_VMReg(), "receiver expected in rcx");
|
||||
__ load_klass(recv_klass_reg, rcx);
|
||||
|
||||
// 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, 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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
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 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||
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
|
||||
|
@ -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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
#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 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
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 @@ int VtableStub::pd_code_size_limit(bool is_vtable_stub) {
|
||||
(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
|
||||
|
@ -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 @@ void SafepointMechanism::pd_initialize() {
|
||||
// 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 @@ void SafepointMechanism::pd_initialize() {
|
||||
}
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
|
@ -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 @@ JVM_handle_aix_signal(int sig, siginfo_t* info, void* ucVoid, int abort_if_unrec
|
||||
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;
|
||||
|
@ -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 @@ JVM_handle_linux_signal(int sig,
|
||||
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 @@ JVM_handle_linux_signal(int sig,
|
||||
((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);
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ void AOTCompiledMethod::metadata_do(void f(Metadata*)) {
|
||||
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.
|
||||
|
@ -1164,28 +1164,30 @@ ciInstance* ciEnv::unloaded_ciinstance() {
|
||||
|
||||
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) {
|
||||
|
@ -280,11 +280,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
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 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
|
||||
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;
|
||||
|
||||
|
@ -2734,43 +2734,68 @@ Handle SystemDictionary::find_method_handle_type(Symbol* signature,
|
||||
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!
|
||||
}
|
||||
}
|
||||
if (type.is_null()) {
|
||||
THROW_MSG_(vmSymbols::java_lang_LinkageError(), "bad signature", empty);
|
||||
MethodHandles::resolve_MemberName(mname, caller, CHECK_(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,
|
||||
|
@ -533,6 +533,11 @@ public:
|
||||
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
|
||||
|
@ -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") \
|
||||
|
@ -230,10 +230,13 @@ bool CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecod
|
||||
#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 @@ void CompiledIC::compute_monomorphic_entry(const methodHandle& method,
|
||||
|
||||
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) {
|
||||
|
@ -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)
|
||||
|
@ -404,8 +404,7 @@ void CompiledMethod::clean_ic_if_metadata_is_dead(CompiledIC *ic, BoolObjectClos
|
||||
// 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 {
|
||||
|
@ -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 @@ class Dependencies: public ResourceObj {
|
||||
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
|
||||
|
@ -1547,7 +1547,7 @@ void nmethod::metadata_do(void f(Metadata*)) {
|
||||
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();
|
||||
|
@ -4722,7 +4722,7 @@ public:
|
||||
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);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -139,13 +139,17 @@ void VM_G1CollectForAllocation::doit() {
|
||||
// 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 {
|
||||
|
@ -804,7 +804,7 @@ void InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code byte
|
||||
// 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 @@ void InterpreterRuntime::resolve_invoke(JavaThread* thread, Bytecodes::Code byte
|
||||
case CallInfo::itable_call:
|
||||
cp_cache_entry->set_itable_call(
|
||||
bytecode,
|
||||
info.resolved_klass(),
|
||||
info.resolved_method(),
|
||||
info.itable_index());
|
||||
break;
|
||||
|
@ -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 @@ C2V_VMENTRY(jobject, getNextStackFrame, (JNIEnv*, jobject compilerToVM, jobject
|
||||
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++) {
|
||||
|
@ -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 @@ E* MmapArrayAllocator<E>::allocate_or_null(size_t length, MEMFLAGS flags) {
|
||||
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);
|
||||
|
@ -32,8 +32,8 @@ volatile int CompiledICHolder::_live_count;
|
||||
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 @@ CompiledICHolder::~CompiledICHolder() {
|
||||
}
|
||||
#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 @@ void CompiledICHolder::print_value_on(outputStream* st) const {
|
||||
// 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");
|
||||
}
|
||||
|
||||
|
@ -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 @@ class CompiledICHolder : public CHeapObj<mtCompiler> {
|
||||
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);
|
||||
|
||||
|
@ -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 @@ class SymbolHashMap: public CHeapObj<mtSymbol> {
|
||||
delete(cur);
|
||||
}
|
||||
}
|
||||
delete _buckets;
|
||||
FREE_C_HEAP_ARRAY(SymbolHashMapBucket, _buckets);
|
||||
}
|
||||
}; // End SymbolHashMap class
|
||||
|
||||
|
@ -279,14 +279,16 @@ void ConstantPoolCacheEntry::set_vtable_call(Bytecodes::Code invoke_code, const
|
||||
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 @@ oop ConstantPoolCacheEntry::method_type_if_resolved(const constantPoolHandle& cp
|
||||
|
||||
|
||||
#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 @@ bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method,
|
||||
// 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 == old_method) {
|
||||
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;
|
||||
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;
|
||||
log_adjust("special, static or dynamic", old_method, new_method, trace_name_printed);
|
||||
}
|
||||
|
||||
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 @@ Method* ConstantPoolCacheEntry::get_interesting_method_entry(Klass* k) {
|
||||
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)) {
|
||||
|
@ -249,6 +249,7 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
|
||||
|
||||
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 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
|
||||
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 @@ class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
|
||||
// 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);
|
||||
|
@ -609,9 +609,11 @@ class InstanceKlass: public Klass {
|
||||
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 @@ class InstanceKlass: public Klass {
|
||||
*addr = host;
|
||||
}
|
||||
}
|
||||
bool has_host_klass() const {
|
||||
return adr_host_klass() != NULL;
|
||||
}
|
||||
bool is_anonymous() const {
|
||||
return (_misc_flags & _misc_is_anonymous) != 0;
|
||||
}
|
||||
|
@ -1200,7 +1200,6 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass
|
||||
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 @@ void visit_all_interfaces(Array<Klass*>* transitive_intf, InterfaceVisiterClosur
|
||||
}
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
@ -698,6 +698,7 @@ class Method : public Metadata {
|
||||
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); }
|
||||
|
@ -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 @@ bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
|
||||
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 @@ bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
|
||||
}
|
||||
// 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 @@ bool CallNode::has_non_debug_use(Node *n) {
|
||||
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 @@ Node* AllocateArrayNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
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 @@ Node *AllocateArrayNode::make_ideal_length(const TypeOopPtr* oop_type, PhaseTran
|
||||
// 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));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 @@ Node *NeverBranchNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
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));
|
||||
}
|
||||
|
@ -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 @@ public:
|
||||
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---------------------------------------
|
||||
|
@ -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 @@ void ConnectionGraph::add_node_to_connection_graph(Node *n, Unique_Node_List *de
|
||||
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 @@ Node* ConnectionGraph::find_inst_mem(Node *orig_mem, int alias_idx, GrowableArra
|
||||
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 @@ void ConnectionGraph::split_unique_types(GrowableArray<Node *> &alloc_worklist,
|
||||
// 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 @@ void ConnectionGraph::split_unique_types(GrowableArray<Node *> &alloc_worklist,
|
||||
// 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 ||
|
||||
|
@ -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 @@ AllocateNode* InitializeNode::allocation() {
|
||||
|
||||
// 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);
|
||||
|
@ -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 @@ ProjNode* IfNode::range_check_trap_proj(int& flip_test, Node*& l, Node*& r) {
|
||||
// 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 @@ bool IfNode::is_null_check(ProjNode* proj, PhaseIterGVN* igvn) {
|
||||
// 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 @@ Node* IfNode::dominated_by(Node* prev_dom, PhaseIterGVN *igvn) {
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
@ -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 @@ bool LibraryCallKit::inline_string_copy(bool compress) {
|
||||
// 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 @@ bool LibraryCallKit::inline_string_toBytesU() {
|
||||
// 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 @@ bool LibraryCallKit::inline_string_getCharsU() {
|
||||
// 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 @@ void LibraryCallKit::copy_to_clone(Node* obj, Node* alloc_obj, Node* obj_size, b
|
||||
// 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 @@ void LibraryCallKit::arraycopy_move_allocation_here(AllocateArrayNode* alloc, No
|
||||
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 @@ void LibraryCallKit::arraycopy_move_allocation_here(AllocateArrayNode* alloc, No
|
||||
}
|
||||
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 @@ LibraryCallKit::tightly_coupled_allocation(Node* ptr,
|
||||
// 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.
|
||||
|
@ -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 @@ void PhaseIdealLoop::insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_
|
||||
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 @@ void PhaseIdealLoop::insert_vector_post_loop(IdealLoopTree *loop, Node_List &old
|
||||
// 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 @@ void PhaseIdealLoop::insert_scalar_rced_post_loop(IdealLoopTree *loop, Node_List
|
||||
// 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 @@ void PhaseIdealLoop::do_unroll( IdealLoopTree *loop, Node_List &old_new, bool ad
|
||||
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 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
||||
}
|
||||
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 @@ bool PhaseIdealLoop::match_fill_loop(IdealLoopTree* lpt, Node*& store, Node*& st
|
||||
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 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
|
||||
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 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
|
||||
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);
|
||||
|
@ -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 @@ void LoopNode::dump_spec(outputStream *st) const {
|
||||
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 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*& loop) {
|
||||
|
||||
#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 @@ void LoopNode::verify_strip_mined(int expect_skeleton) const {
|
||||
}
|
||||
}
|
||||
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 @@ IfFalseNode* OuterStripMinedLoopNode::outer_loop_exit() const {
|
||||
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 @@ void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) {
|
||||
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 @@ void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) {
|
||||
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 @@ void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) {
|
||||
// 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 @@ void OuterStripMinedLoopNode::adjust_strip_mined_loop(PhaseIterGVN* igvn) {
|
||||
} 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));
|
||||
|
@ -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 @@ public:
|
||||
|
||||
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 @@ public:
|
||||
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 @@ public:
|
||||
};
|
||||
|
||||
|
||||
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 @@ inline CountedLoopEndNode *CountedLoopNode::loopexit() const {
|
||||
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:
|
||||
|
@ -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 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc
|
||||
// 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 @@ void PhaseIdealLoop::clone_outer_loop(LoopNode* head, CloneLoopMode mode, IdealL
|
||||
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 @@ void PhaseIdealLoop::clone_loop( IdealLoopTree *loop, Node_List &old_new, int dd
|
||||
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);
|
||||
|
@ -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 @@ Node *PhaseMacroExpand::value_from_mem_phi(Node *mem, BasicType ft, const Type *
|
||||
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 @@ Node *PhaseMacroExpand::value_from_mem(Node *sfpt_mem, Node *sfpt_ctl, BasicType
|
||||
|
||||
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 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray <Sa
|
||||
}
|
||||
|
||||
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 @@ void PhaseMacroExpand::process_users_of_allocation(CallNode *alloc) {
|
||||
// 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_allocate_node(AllocateNode *alloc) {
|
||||
|
||||
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 @@ void PhaseMacroExpand::expand_allocate_common(
|
||||
// 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);
|
||||
|
@ -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 @@ Node *MemNode::optimize_simple_memory_chain(Node *mchain, const TypeOopPtr *t_oo
|
||||
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) {
|
||||
|
@ -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 @@ const RegMask &MultiNode::out_RegMask() const {
|
||||
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 @@ ProjNode* MultiNode::proj_out(uint which_proj) const {
|
||||
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 @@ CallStaticJavaNode* ProjNode::is_uncommon_trap_if_pattern(Deoptimization::DeoptR
|
||||
}
|
||||
|
||||
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 ||
|
||||
|
@ -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 @@ public:
|
||||
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;
|
||||
|
||||
};
|
||||
|
||||
|
@ -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 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
|
||||
// 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 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
|
||||
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
|
||||
|
@ -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 @@ void StringConcat::eliminate_initialize(InitializeNode* init) {
|
||||
// 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 @@ bool StringConcat::validate_control_flow() {
|
||||
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 @@ bool StringConcat::validate_control_flow() {
|
||||
// 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);
|
||||
}
|
||||
|
@ -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 @@ void SuperWord::unrolling_analysis(int &local_loop_unroll_factor) {
|
||||
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");
|
||||
|
@ -2814,7 +2814,7 @@ jni_Get##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
|
||||
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 @@ jni_Set##Result##ArrayRegion(JNIEnv *env, ElementType##Array array, jsize start,
|
||||
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 @@ JNI_ENTRY(void, jni_GetStringRegion(JNIEnv *env, jstring string, jsize start, js
|
||||
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 @@ JNI_ENTRY(void, jni_GetStringUTFRegion(JNIEnv *env, jstring string, jsize start,
|
||||
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
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user