Merge
This commit is contained in:
commit
c532946b18
23
.hgtags
23
.hgtags
@ -1,3 +1,17 @@
|
||||
898cbe31fbdae2d25d141384fac746cc244a730c jdk-9+170
|
||||
c7efde2b60fc1ec04630be769d9ad60efb39c39c jdk-9+169
|
||||
8fd0a4569191f33c98ee90c2709174a342fefb0d jdk-9+167
|
||||
fcabc74bd44e56c7419d111d59b95669ecb33c55 jdk-9+168
|
||||
d3e973f1809606c67412361041ad197e50fe8cec jdk-9+166
|
||||
3965b747cfe1e6cbd66b8739da5a1ea6ec6985e9 jdk-9+165
|
||||
d16aebbb56d37f12e0c0b0a4fb427db65e1fb1a8 jdk-9+162
|
||||
18c41483a082e097ac2f5f983c1226ed94aa4215 jdk-9+163
|
||||
32db52c675e7d5bc413605d2e89b68b608b19be0 jdk-9+164
|
||||
fd1497902bbe3aa24b21f270ecdcb8de5f7aa9ac jdk-9+159
|
||||
6aa8be0c4e054fe8b3ab016ae00d16d680f92145 jdk-9+160
|
||||
f6883b1a5a6478437cd4181c4bd45328ab24feaf jdk-9+161
|
||||
fa3e76b477829afc4476f0b725cfaa440a6fd917 jdk-9+157
|
||||
b5015f742ba648184bb7fc547197bd33ebfde30d jdk-9+158
|
||||
1cc8dd79fd1cd13d36b385196271a29632c67c3b jdk7-b24
|
||||
bf2517e15f0c0f950e5b3143c4ca11e2df73dcc1 jdk7-b25
|
||||
5ae7db536e3fcf6be78e45b240a9058095e0ed38 jdk7-b26
|
||||
@ -399,3 +413,12 @@ d7034ff7f8e257e81c9f95c7785dd4eaaa3c2afc jdk-9+153
|
||||
8c70d170e62c0c58b5bc3ba666bd140399b98c9c jdk-10+0
|
||||
45b751afd11e6c05991cf4913c5a0ac3304fcc4e jdk-9+154
|
||||
f4aff695ffe05cfdb69d8af25a4ddc6a029754ea jdk-9+155
|
||||
06bce0388880b5ff8e040e4a9d72a3ea11dac321 jdk-9+156
|
||||
74116beae88a8f17a80301aa6c83865c82f10ece jdk-10+1
|
||||
4a79ad46e578112fce68f1af9dd931025cc235cb jdk-10+2
|
||||
d1cab6c7e608479be4ebfad48a25b0ed48600f62 jdk-10+3
|
||||
02253db2ace1422f576f58502fc7831ead77424b jdk-10+4
|
||||
f113ce12fe24fbd24acf02711372d9f1e1c12426 jdk-10+5
|
||||
1407b19a2ddf6baae162f5a1a5b96af473f4d7d1 jdk-10+6
|
||||
30e75693ae99fd8e47fd2f5116527aff1b59aff9 jdk-10+7
|
||||
c42dc7b58b4d4301ea676a76326fd9bbd403d595 jdk-10+8
|
||||
|
@ -396,9 +396,11 @@ b119012d1c2ab2570fe8718633840d0c1f1f441d jdk-9+149
|
||||
71a766d4c18041a7f833ee22823125b02e1a7f1e jdk-9+151
|
||||
ef056360ddf3977d7d2ddbeb456a4d612d19ea05 jdk-9+152
|
||||
816a6d03a7c44edfbd8780110529f1bdc3964fb9 jdk-9+153
|
||||
8d22611ffb6540bc1ace64a00c048c8b82d8c69a jdk-10+0
|
||||
8d26916eaa21b689835ffc1c0dbf12470aa9be61 jdk-9+154
|
||||
688a3863c00ebc089ab17ee1fc46272cbbd96815 jdk-9+155
|
||||
783ec7542cf7154e5d2b87f55bb97d28f81e9ada jdk-9+156
|
||||
4df5f619c9ead4604d2f97ed231b3a35ec688c41 jdk-10+1
|
||||
4eb77fb98952dc477a4229575c81d2263a9ce711 jdk-9+157
|
||||
a4087bc10a88a43ea3ad0919b5b4af1c86977221 jdk-9+158
|
||||
fe8466adaef8178dba94be53c789a0aaa87d13bb jdk-9+159
|
||||
@ -411,6 +413,14 @@ aff4f339acd40942d3dab499846b52acd87b3af1 jdk-9+165
|
||||
ba5b16c9c6d80632b61959a33d424b1c3398ce62 jdk-9+166
|
||||
35017c286513ddcbcc6b63b99679c604993fc639 jdk-9+167
|
||||
143d4c87bc1ef1ed6dadd613cd9dd4488fdefc29 jdk-9+168
|
||||
9c7248b787c39b034d4f48d4aa48df903836cca7 jdk-10+2
|
||||
06373236a30801f72e2a31ee5c691c2a1e500f57 jdk-10+3
|
||||
8ec175c61fc3f58328a3324f07d7ded00e060be3 jdk-10+4
|
||||
111e2e7d00f45c983cdbc9c59ae40552152fcc23 jdk-10+5
|
||||
03fe61bb7670644cf6e46b5cfafb6b27c0e0157e jdk-10+6
|
||||
b25838a28195f4b6dab34668411eedd2d366a16c jdk-9+169
|
||||
4d163ec59d989a9261ed7f848bc6303f90869af5 jdk-9+170
|
||||
aa3c97810d7c484c93a2fd75d3c76ff574deb6d8 jdk-10+7
|
||||
df33ef1dc163f994177fd97d4d0e73a1e3cb5d85 jdk-10+8
|
||||
b94be69cbb1d2943b886bf2d458745756df146e4 jdk-10+9
|
||||
4c12464a907db4656c1033f56fa49cba643ac629 jdk-9+171
|
||||
|
@ -1 +1 @@
|
||||
project=jdk9
|
||||
project=jdk10
|
||||
|
@ -1099,6 +1099,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
|
||||
BASIC_PATH_PROGS(HG, hg)
|
||||
BASIC_PATH_PROGS(STAT, stat)
|
||||
BASIC_PATH_PROGS(TIME, time)
|
||||
BASIC_PATH_PROGS(FLOCK, flock)
|
||||
# Dtrace is usually found in /usr/sbin on Solaris, but that directory may not
|
||||
# be in the user path.
|
||||
BASIC_PATH_PROGS(DTRACE, dtrace, $PATH:/usr/sbin)
|
||||
|
@ -318,7 +318,7 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK],
|
||||
AC_SUBST(JAVAC_FLAGS)
|
||||
|
||||
# Check if the boot jdk is 32 or 64 bit
|
||||
if "$JAVA" -d64 -version > /dev/null 2>&1; then
|
||||
if "$JAVA" -version 2>&1 | $GREP -q "64-Bit"; then
|
||||
BOOT_JDK_BITS="64"
|
||||
else
|
||||
BOOT_JDK_BITS="32"
|
||||
|
@ -417,10 +417,8 @@ AC_DEFUN_ONCE([BPERF_SETUP_SMART_JAVAC],
|
||||
AC_SUBST(SJAVAC_SERVER_JAVA)
|
||||
|
||||
if test "$MEMORY_SIZE" -gt "3000"; then
|
||||
ADD_JVM_ARG_IF_OK([-d64],SJAVAC_SERVER_JAVA_FLAGS,[$SJAVAC_SERVER_JAVA])
|
||||
if test "$JVM_ARG_OK" = true; then
|
||||
if "$JAVA" -version 2>&1 | $GREP -q "64-Bit"; then
|
||||
JVM_64BIT=true
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -933,6 +933,7 @@ DSYMUTIL
|
||||
IS_GNU_TIME
|
||||
PATCH
|
||||
DTRACE
|
||||
FLOCK
|
||||
TIME
|
||||
STAT
|
||||
HG
|
||||
@ -1297,6 +1298,7 @@ DOT
|
||||
HG
|
||||
STAT
|
||||
TIME
|
||||
FLOCK
|
||||
DTRACE
|
||||
PATCH
|
||||
DSYMUTIL
|
||||
@ -2264,6 +2266,7 @@ Some influential environment variables:
|
||||
HG Override default value for HG
|
||||
STAT Override default value for STAT
|
||||
TIME Override default value for TIME
|
||||
FLOCK Override default value for FLOCK
|
||||
DTRACE Override default value for DTRACE
|
||||
PATCH Override default value for PATCH
|
||||
DSYMUTIL Override default value for DSYMUTIL
|
||||
@ -23271,6 +23274,203 @@ $as_echo "$tool_specified" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
|
||||
|
||||
# Publish this variable in the help.
|
||||
|
||||
|
||||
if [ -z "${FLOCK+x}" ]; then
|
||||
# The variable is not set by user, try to locate tool using the code snippet
|
||||
for ac_prog in flock
|
||||
do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_FLOCK+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
case $FLOCK in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_FLOCK="$FLOCK" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_FLOCK="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
FLOCK=$ac_cv_path_FLOCK
|
||||
if test -n "$FLOCK"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5
|
||||
$as_echo "$FLOCK" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
test -n "$FLOCK" && break
|
||||
done
|
||||
|
||||
else
|
||||
# The variable is set, but is it from the command line or the environment?
|
||||
|
||||
# Try to remove the string !FLOCK! from our list.
|
||||
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!FLOCK!/}
|
||||
if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then
|
||||
# If it failed, the variable was not from the command line. Ignore it,
|
||||
# but warn the user (except for BASH, which is always set by the calling BASH).
|
||||
if test "xFLOCK" != xBASH; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of FLOCK from the environment. Use command line variables instead." >&5
|
||||
$as_echo "$as_me: WARNING: Ignoring value of FLOCK from the environment. Use command line variables instead." >&2;}
|
||||
fi
|
||||
# Try to locate tool using the code snippet
|
||||
for ac_prog in flock
|
||||
do
|
||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||
set dummy $ac_prog; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_FLOCK+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
case $FLOCK in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_FLOCK="$FLOCK" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_FLOCK="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
FLOCK=$ac_cv_path_FLOCK
|
||||
if test -n "$FLOCK"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5
|
||||
$as_echo "$FLOCK" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
test -n "$FLOCK" && break
|
||||
done
|
||||
|
||||
else
|
||||
# If it succeeded, then it was overridden by the user. We will use it
|
||||
# for the tool.
|
||||
|
||||
# First remove it from the list of overridden variables, so we can test
|
||||
# for unknown variables in the end.
|
||||
CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
|
||||
|
||||
# Check if we try to supply an empty value
|
||||
if test "x$FLOCK" = x; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Setting user supplied tool FLOCK= (no value)" >&5
|
||||
$as_echo "$as_me: Setting user supplied tool FLOCK= (no value)" >&6;}
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLOCK" >&5
|
||||
$as_echo_n "checking for FLOCK... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5
|
||||
$as_echo "disabled" >&6; }
|
||||
else
|
||||
# Check if the provided tool contains a complete path.
|
||||
tool_specified="$FLOCK"
|
||||
tool_basename="${tool_specified##*/}"
|
||||
if test "x$tool_basename" = "x$tool_specified"; then
|
||||
# A command without a complete path is provided, search $PATH.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool FLOCK=$tool_basename" >&5
|
||||
$as_echo "$as_me: Will search for user supplied tool FLOCK=$tool_basename" >&6;}
|
||||
# Extract the first word of "$tool_basename", so it can be a program name with args.
|
||||
set dummy $tool_basename; ac_word=$2
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||
$as_echo_n "checking for $ac_word... " >&6; }
|
||||
if ${ac_cv_path_FLOCK+:} false; then :
|
||||
$as_echo_n "(cached) " >&6
|
||||
else
|
||||
case $FLOCK in
|
||||
[\\/]* | ?:[\\/]*)
|
||||
ac_cv_path_FLOCK="$FLOCK" # Let the user override the test with a path.
|
||||
;;
|
||||
*)
|
||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||
for as_dir in $PATH
|
||||
do
|
||||
IFS=$as_save_IFS
|
||||
test -z "$as_dir" && as_dir=.
|
||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||
ac_cv_path_FLOCK="$as_dir/$ac_word$ac_exec_ext"
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||
break 2
|
||||
fi
|
||||
done
|
||||
done
|
||||
IFS=$as_save_IFS
|
||||
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
FLOCK=$ac_cv_path_FLOCK
|
||||
if test -n "$FLOCK"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLOCK" >&5
|
||||
$as_echo "$FLOCK" >&6; }
|
||||
else
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
$as_echo "no" >&6; }
|
||||
fi
|
||||
|
||||
|
||||
if test "x$FLOCK" = x; then
|
||||
as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5
|
||||
fi
|
||||
else
|
||||
# Otherwise we believe it is a complete path. Use it as it is.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool FLOCK=$tool_specified" >&5
|
||||
$as_echo "$as_me: Will use user supplied tool FLOCK=$tool_specified" >&6;}
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLOCK" >&5
|
||||
$as_echo_n "checking for FLOCK... " >&6; }
|
||||
if test ! -x "$tool_specified"; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
|
||||
$as_echo "not found" >&6; }
|
||||
as_fn_error $? "User supplied tool FLOCK=$tool_specified does not exist or is not executable" "$LINENO" 5
|
||||
fi
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5
|
||||
$as_echo "$tool_specified" >&6; }
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# Dtrace is usually found in /usr/sbin on Solaris, but that directory may not
|
||||
# be in the user path.
|
||||
|
||||
@ -31216,7 +31416,7 @@ $as_echo "no" >&6; }
|
||||
|
||||
|
||||
# Check if the boot jdk is 32 or 64 bit
|
||||
if "$JAVA" -d64 -version > /dev/null 2>&1; then
|
||||
if "$JAVA" -version 2>&1 | $GREP -q "64-Bit"; then
|
||||
BOOT_JDK_BITS="64"
|
||||
else
|
||||
BOOT_JDK_BITS="32"
|
||||
@ -66062,24 +66262,8 @@ fi
|
||||
|
||||
|
||||
if test "$MEMORY_SIZE" -gt "3000"; then
|
||||
|
||||
$ECHO "Check if jvm arg is ok: -d64" >&5
|
||||
$ECHO "Command: $SJAVAC_SERVER_JAVA -d64 -version" >&5
|
||||
OUTPUT=`$SJAVAC_SERVER_JAVA -d64 -version 2>&1`
|
||||
FOUND_WARN=`$ECHO "$OUTPUT" | $GREP -i warn`
|
||||
FOUND_VERSION=`$ECHO $OUTPUT | $GREP " version \""`
|
||||
if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
|
||||
SJAVAC_SERVER_JAVA_FLAGS="$SJAVAC_SERVER_JAVA_FLAGS -d64"
|
||||
JVM_ARG_OK=true
|
||||
else
|
||||
$ECHO "Arg failed:" >&5
|
||||
$ECHO "$OUTPUT" >&5
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
|
||||
if test "$JVM_ARG_OK" = true; then
|
||||
if "$JAVA" -version 2>&1 | $GREP -q "64-Bit"; then
|
||||
JVM_64BIT=true
|
||||
JVM_ARG_OK=false
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -48,7 +48,7 @@ MAKE := @MAKE@
|
||||
|
||||
# The default make arguments
|
||||
MAKE_ARGS = $(MAKE_LOG_FLAGS) -r -R -I $(TOPDIR)/make/common SPEC=$(SPEC) \
|
||||
MAKE_LOG_FLAGS="$(MAKE_LOG_FLAGS)" LOG_LEVEL=$(LOG_LEVEL)
|
||||
MAKE_LOG_FLAGS="$(MAKE_LOG_FLAGS)" $(MAKE_LOG_VARS)
|
||||
|
||||
OUTPUT_SYNC_SUPPORTED:=@OUTPUT_SYNC_SUPPORTED@
|
||||
OUTPUT_SYNC:=@OUTPUT_SYNC@
|
||||
@ -638,6 +638,7 @@ DIRNAME:=@DIRNAME@
|
||||
DSYMUTIL:=@DSYMUTIL@
|
||||
FIND:=@FIND@
|
||||
FIND_DELETE:=@FIND_DELETE@
|
||||
FLOCK:=@FLOCK@
|
||||
ECHO:=@ECHO@
|
||||
EGREP:=@EGREP@
|
||||
FGREP:=@FGREP@
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
# Default version numbers to use unless overridden by configure
|
||||
|
||||
DEFAULT_VERSION_MAJOR=9
|
||||
DEFAULT_VERSION_MAJOR=10
|
||||
DEFAULT_VERSION_MINOR=0
|
||||
DEFAULT_VERSION_SECURITY=0
|
||||
DEFAULT_VERSION_PATCH=0
|
||||
|
@ -22,26 +22,48 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
# Usage: sh shell-tracer.sh <TIME_CMD> <OUTPUT_FILE> <OLD_SHELL> <shell command line>
|
||||
# Usage: sh shell-tracer.sh <TIME_CMD_TYPE> <TIME_CMD> <OUTPUT_FILE> <shell command line>
|
||||
#
|
||||
# This shell script is supposed to be set as a replacement for SHELL in make,
|
||||
# causing it to be called whenever make wants to execute shell commands.
|
||||
# The <shell command line> is suitable for passing on to the old shell,
|
||||
# typically beginning with -c.
|
||||
#
|
||||
# This script will make sure the shell command line is executed with
|
||||
# OLD_SHELL -x, and it will also store a simple log of the the time it takes to
|
||||
# execute the command in the OUTPUT_FILE, using the "time" utility as pointed
|
||||
# to by TIME_CMD. If TIME_CMD is "-", no timestamp will be stored.
|
||||
# This script will run the shell command line and it will also store a simple
|
||||
# log of the the time it takes to execute the command in the OUTPUT_FILE, using
|
||||
# utility for time measure specified with TIME_CMD option.
|
||||
#
|
||||
# Type of time measure utility is specified with TIME_CMD_TYPE option.
|
||||
# Recognized options values of TIME_CMD_TYPE option: "gnutime", "flock".
|
||||
|
||||
TIME_CMD="$1"
|
||||
OUTPUT_FILE="$2"
|
||||
OLD_SHELL="$3"
|
||||
TIME_CMD_TYPE="$1"
|
||||
TIME_CMD="$2"
|
||||
OUTPUT_FILE="$3"
|
||||
shift
|
||||
shift
|
||||
shift
|
||||
if [ "$TIME_CMD" != "-" ]; then
|
||||
"$TIME_CMD" -f "[TIME:%E] $*" -a -o "$OUTPUT_FILE" "$OLD_SHELL" -x "$@"
|
||||
if [ "$TIME_CMD_TYPE" = "gnutime" ]; then
|
||||
# Escape backslashes (\) and percent chars (%). See man for GNU 'time'.
|
||||
msg=${@//\\/\\\\}
|
||||
msg=${msg//%/%%}
|
||||
"$TIME_CMD" -f "[TIME:%E] $msg" -a -o "$OUTPUT_FILE" "$@"
|
||||
elif [ "$TIME_CMD_TYPE" = "flock" ]; then
|
||||
# Emulated GNU 'time' with 'flock' and 'date'.
|
||||
ts=`date +%s%3N`
|
||||
"$@"
|
||||
status=$?
|
||||
ts2=`date +%s%3N`
|
||||
millis=$((ts2 - ts))
|
||||
ms=$(($millis % 1000))
|
||||
seconds=$((millis / 1000))
|
||||
ss=$(($seconds % 60))
|
||||
minutes=$(($seconds / 60))
|
||||
mm=$(($minutes % 60))
|
||||
hh=$(($minutes / 60)):
|
||||
[ $hh != "0:" ] || hh=
|
||||
# Synchronize on this script.
|
||||
flock -w 10 "$0" printf "[TIME:${hh}${mm}:${ss}.%.2s] %s\n" $ms "$*" >> "$OUTPUT_FILE" || true
|
||||
exit $status
|
||||
else
|
||||
"$OLD_SHELL" -x "$@"
|
||||
"$@"
|
||||
fi
|
@ -32,13 +32,15 @@
|
||||
</nav>
|
||||
<h2 id="using-the-run-test-framework">Using the run-test framework</h2>
|
||||
<p>This new way of running tests is developer-centric. It assumes that you have built a jdk locally and want to test it. Running common test targets is simple, and more complex ad-hoc combination of tests is possible. The user interface is forgiving, and clearly report errors it cannot resolve.</p>
|
||||
<p>The main target "run-test" uses the jdk-image as the tested product. There is also an alternate target "exploded-run-test" that uses the exploded image instead. Not all tests will run successfully on the exploded image, but using this target can greatly improve rebuild times for certain workflows.</p>
|
||||
<p>Some example command-lines:</p>
|
||||
<pre><code>$ make run-test-tier1
|
||||
$ make run-test-jdk_lang JTREG="JOBS=8"
|
||||
$ make run-test TEST=jdk_lang
|
||||
$ make run-test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
||||
$ make run-test TEST="hotspot/test:hotspot_gc" JTREG="JOBS=1;TIMEOUT=8;VM_OTIONS=-XshowSettings -Xlog:gc+ref=debug"
|
||||
$ make run-test TEST="jtreg:hotspot/test:hotspot_gc hotspot/test/native_sanity/JniVersion.java"</code></pre>
|
||||
$ make run-test TEST="jtreg:hotspot/test:hotspot_gc hotspot/test/native_sanity/JniVersion.java"
|
||||
$ make exploded-run-test TEST=hotspot_tier1</code></pre>
|
||||
<h2 id="test-selection">Test selection</h2>
|
||||
<p>All functionality is available using the run-test make target. In this use case, the test or tests to be executed is controlled using the <code>TEST</code> variable. To speed up subsequent test runs with no source code changes, run-test-only can be used instead, which do not depend on the source and test image build.</p>
|
||||
<p>For some common top-level tests, direct make targets have been generated. This includes all JTreg test groups, the hotspot gtest, and custom tests (if present). This means that <code>make run-test-tier1</code> is equivalent to <code>make run-test TEST="tier1"</code>, but the latter is more tab-completion friendly. For more complex test runs, the <code>run-test TEST="x"</code> solution needs to be used.</p>
|
||||
|
@ -7,6 +7,11 @@ built a jdk locally and want to test it. Running common test targets is simple,
|
||||
and more complex ad-hoc combination of tests is possible. The user interface is
|
||||
forgiving, and clearly report errors it cannot resolve.
|
||||
|
||||
The main target "run-test" uses the jdk-image as the tested product. There is
|
||||
also an alternate target "exploded-run-test" that uses the exploded image
|
||||
instead. Not all tests will run successfully on the exploded image, but using
|
||||
this target can greatly improve rebuild times for certain workflows.
|
||||
|
||||
Some example command-lines:
|
||||
|
||||
$ make run-test-tier1
|
||||
@ -15,6 +20,7 @@ Some example command-lines:
|
||||
$ make run-test-only TEST="gtest:LogTagSet gtest:LogTagSetDescriptions" GTEST="REPEAT=-1"
|
||||
$ make run-test TEST="hotspot/test:hotspot_gc" JTREG="JOBS=1;TIMEOUT=8;VM_OTIONS=-XshowSettings -Xlog:gc+ref=debug"
|
||||
$ make run-test TEST="jtreg:hotspot/test:hotspot_gc hotspot/test/native_sanity/JniVersion.java"
|
||||
$ make exploded-run-test TEST=hotspot_tier1
|
||||
|
||||
## Test selection
|
||||
|
||||
|
@ -396,5 +396,29 @@ f95cc86b6ac22ec1ade5d4f825dc7782adeea228 jdk-9+148
|
||||
77f827f5bbad3ef795664bc675f72d98d156b9f8 jdk-9+151
|
||||
ff8cb43c07c069b1debdee44cb88ca22db1ec757 jdk-9+152
|
||||
68a8e8658511093b322a46ed04b2a321e1da2a43 jdk-9+153
|
||||
d66f97a610a6beac987740edc2bf6a70f46ba574 jdk-10+0
|
||||
078ebe23b584466dc8346e620d7821d91751e5a9 jdk-9+154
|
||||
a545f54babfa31aa7eb611f36031609acd617cbc jdk-9+155
|
||||
907c26240cd481579e919bfd23740797ff8ce1c8 jdk-9+156
|
||||
37c9962586a4d3498fa673d93eab1a336acd7652 jdk-10+1
|
||||
9383da04b385cca46b7ca67f3a39ac1b673e09fe jdk-9+157
|
||||
de6bdf38935fa753183ca288bed5c06a23c0bb12 jdk-9+158
|
||||
6feea77d2083c99e44aa3e272d07b7fb3b801683 jdk-9+159
|
||||
c7688f2fa07936b089ca0e9a0a0eff68ff37a542 jdk-9+160
|
||||
18f02bc43fe96aef36791d0df7aca748485210cc jdk-9+161
|
||||
18ffcf99a3b4a10457853d94190e825bdf07e39b jdk-9+162
|
||||
493011dee80e51c2a2b064d049183c047df36d80 jdk-9+163
|
||||
965bbae3072702f7c0d95c240523b65e6bb19261 jdk-9+164
|
||||
a510b2201154abdd12ede42788086b5283bfb9a6 jdk-9+165
|
||||
934c18145915b06d3fcc0de1a30f91f5aab8a192 jdk-9+166
|
||||
56a8bf5322684e9a31cda64c336c32bcdb592211 jdk-10+2
|
||||
3813c94c8585dd7507887916c6943f45051f1b55 jdk-10+3
|
||||
5d6d891bb36dbeeacaffa06b5a3e3b4e44b35fbd jdk-10+4
|
||||
7c5328012799923d45d1cf87e8725e725b3d298b jdk-10+5
|
||||
c7358d703e1282af3dcd8af6c037dc4342de9054 jdk-10+6
|
||||
43de67f51801b9e16507865fcb7e8344f4ca4aa9 jdk-9+167
|
||||
03a2cc9c8a1e8f87924c9863e917bc8b91770d5f jdk-9+168
|
||||
b2218d41edef02ee8f94bb438f885b2ba79bfa08 jdk-9+169
|
||||
8a4ab3b0ab9a86df73d9a1e337134f2dbe006725 jdk-9+170
|
||||
aed5a4edc8275c1c50195503756ff92bfe0197f5 jdk-10+7
|
||||
648b0a00824eb29e71936bc3258d309a25e3b8c0 jdk-10+8
|
||||
|
@ -1 +1 @@
|
||||
project=jdk9
|
||||
project=jdk10
|
||||
|
14
corba/README
14
corba/README
@ -1,14 +0,0 @@
|
||||
README:
|
||||
This file should be located at the top of the corba Mercurial repository.
|
||||
|
||||
See http://openjdk.java.net/ for more information about the OpenJDK.
|
||||
|
||||
See ../README-builds.html for complete details on build machine requirements.
|
||||
|
||||
Simple Build Instructions:
|
||||
|
||||
cd make && gnumake
|
||||
|
||||
The files that will be imported into the jdk build will be in the "dist"
|
||||
directory.
|
||||
|
@ -1,4 +1,4 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
@ -6,7 +6,7 @@
|
||||
<title>package</title>
|
||||
<!--
|
||||
|
||||
Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -25,6 +25,9 @@
|
||||
|
||||
/**
|
||||
* Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API.
|
||||
*
|
||||
* @moduleGraph
|
||||
* @since 9
|
||||
*/
|
||||
@Deprecated(since="9", forRemoval=true)
|
||||
module java.corba {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -52,7 +52,7 @@ import org.omg.CORBA.portable.IDLEntity;
|
||||
* </OL>
|
||||
*
|
||||
* <P>
|
||||
* <a name="anyOps"></a>
|
||||
* <a id="anyOps"></a>
|
||||
* A large part of the <code>Any</code> class consists of pairs of methods
|
||||
* for inserting values into and extracting values from an
|
||||
* <code>Any</code> object.
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -85,13 +85,17 @@ import java.security.PrivilegedAction;
|
||||
* three {@code init} methods. Two of the three methods use the properties
|
||||
* (associations of a name with a value) shown in the
|
||||
* table below.<BR>
|
||||
* <TABLE BORDER=1 SUMMARY="Standard Java CORBA Properties">
|
||||
* <TR><TH>Property Name</TH> <TH>Property Value</TH></TR>
|
||||
* <TABLE class="plain">
|
||||
* <CAPTION>Standard Java CORBA Properties:</CAPTION>
|
||||
* <thead>
|
||||
* <TR><TH>Property Name</TH> <TH>Property Value</TH></TR>
|
||||
* </thead>
|
||||
* <tbody>
|
||||
* <TR><TD>org.omg.CORBA.ORBClass</TD>
|
||||
* <TD>class name of an ORB implementation</TD></TR>
|
||||
* <TR><TD>org.omg.CORBA.ORBSingletonClass</TD>
|
||||
* <TD>class name of the ORB returned by {@code init()}</TD></TR>
|
||||
* </tbody>
|
||||
* </TABLE>
|
||||
* <P>
|
||||
* These properties allow a different vendor's {@code ORB}
|
||||
@ -106,13 +110,13 @@ import java.security.PrivilegedAction;
|
||||
*
|
||||
* <LI>check in properties parameter, if any
|
||||
*
|
||||
* <LI>check in the System properties
|
||||
* <LI>check in the System properties, if any
|
||||
*
|
||||
* <LI>check in the orb.properties file located in the user.home
|
||||
* directory (if any)
|
||||
* directory, if any
|
||||
*
|
||||
* <LI>check in the orb.properties file located in the java.home/lib
|
||||
* directory (if any)
|
||||
* <LI>check in the orb.properties file located in the run-time image,
|
||||
* if any
|
||||
*
|
||||
* <LI>fall back on a hardcoded default behavior (use the Java IDL
|
||||
* implementation)
|
||||
@ -170,9 +174,15 @@ import java.security.PrivilegedAction;
|
||||
* Thus, where appropriate, it is necessary that
|
||||
* the classes for this alternative ORBSingleton are available on the application's class path.
|
||||
* It should be noted that the singleton ORB is system wide.
|
||||
*
|
||||
* <P>
|
||||
* When a per-application ORB is created via the 2-arg init methods,
|
||||
* then it will be located using the thread context class loader.
|
||||
* <P>
|
||||
* The IDL to Java Language OMG specification documents the ${java.home}/lib directory as the location,
|
||||
* in the Java run-time image, to search for orb.properties.
|
||||
* This location is not intended for user editable configuration files.
|
||||
* Therefore, the implementation first checks the ${java.home}/conf directory for orb.properties,
|
||||
* and thereafter the ${java.home}/lib directory.
|
||||
*
|
||||
* @since JDK1.2
|
||||
*/
|
||||
@ -271,14 +281,25 @@ abstract public class ORB {
|
||||
}
|
||||
|
||||
String javaHome = System.getProperty("java.home");
|
||||
fileName = javaHome + File.separator
|
||||
+ "lib" + File.separator + "orb.properties";
|
||||
props = getFileProperties( fileName ) ;
|
||||
|
||||
fileName = javaHome + File.separator + "conf"
|
||||
+ File.separator + "orb.properties";
|
||||
props = getFileProperties(fileName);
|
||||
|
||||
if (props != null) {
|
||||
String value = props.getProperty(name);
|
||||
if (value != null)
|
||||
return value;
|
||||
}
|
||||
|
||||
fileName = javaHome + File.separator + "lib"
|
||||
+ File.separator + "orb.properties";
|
||||
props = getFileProperties(fileName);
|
||||
|
||||
if (props == null)
|
||||
return null ;
|
||||
return null;
|
||||
else
|
||||
return props.getProperty( name ) ;
|
||||
return props.getProperty(name);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -1,4 +1,4 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
|
@ -1,4 +1,4 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html">
|
||||
|
@ -1,3 +1,4 @@
|
||||
<!doctype html>
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
|
||||
@ -6,7 +7,7 @@
|
||||
<TITLE>package</TITLE>
|
||||
<!--
|
||||
/*
|
||||
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,9 +32,8 @@
|
||||
*/
|
||||
-->
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#FFFFFF">
|
||||
Provides the mapping of the OMG CORBA APIs to the Java<SUP><FONT
|
||||
SIZE=-2>TM</FONT></SUP>
|
||||
<BODY>
|
||||
Provides the mapping of the OMG CORBA APIs to the Java™
|
||||
programming language, including the class <code>ORB</code>, which is implemented
|
||||
so that a programmer can use it as a fully-functional Object Request Broker
|
||||
(ORB).
|
||||
@ -427,7 +427,7 @@ will contain the static methods needed for manipulating instances of the type,
|
||||
in this case, <code>Account</code> objects.
|
||||
|
||||
|
||||
<a name="narrow"></a>
|
||||
<a id="narrow"></a>
|
||||
<h3>The <code>narrow</code> Method</h3>
|
||||
When an object is the return value for a method, it is returned in the
|
||||
form of a generic object, either an <code>org.omg.CORBA.Object</code> object
|
||||
@ -465,7 +465,7 @@ tutorial uses a <code>narrow</code> method that looks like this:
|
||||
helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
|
||||
</PRE>
|
||||
|
||||
<a name="basic"></a>
|
||||
<a id="basic"></a>
|
||||
<h3>Example of a Basic Helper Class</h3>
|
||||
A basic helper class, for purposes of this explanation, is one with
|
||||
the methods that are provided by every helper class, plus a <code>narrow</code>
|
||||
@ -671,7 +671,7 @@ abstract public class AddressHelper
|
||||
WStringSeqHelper
|
||||
WStringValueHelper
|
||||
</code></PRE>
|
||||
<a name="adv"></a>
|
||||
<a id="adv"></a>
|
||||
<H1>
|
||||
Other Classes</H1>
|
||||
The other classes and interfaces in the <code>CORBA</code> package, which are
|
||||
@ -868,17 +868,17 @@ For overviews, guides, and a tutorial, please see:
|
||||
|
||||
|
||||
|
||||
<P><A NAME="unimpl"></A>
|
||||
<P><A id="unimpl"></A>
|
||||
<H1>
|
||||
CORBA Features Not Implemented in Java IDL</H1>
|
||||
|
||||
<P>Some of the API included in <code>org.omg</code> subpackages is provided for
|
||||
conformance with the current OMG CORBA specification but is not implemented
|
||||
in Sun's release of the JDK<SUP><FONT SIZE=-2>TM</FONT></SUP>. This enables
|
||||
in Sun's release of the JDK™. This enables
|
||||
other JDK licensees to provide implementations of this API in standard
|
||||
extensions and products.
|
||||
|
||||
<P><A NAME="NO_IMPLEMENT"></A>
|
||||
<P><A id="NO_IMPLEMENT"></A>
|
||||
<h2>Features That Throw NO_IMPLEMENT</h2>
|
||||
|
||||
<P>Some of the API included in <code>org.omg</code> subpackages throw
|
||||
|
@ -1,8 +1,8 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,7 +26,7 @@ or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
<body>
|
||||
|
||||
Provides a portability layer, that is, a set of ORB APIs
|
||||
that makes it possible for code generated
|
||||
@ -38,7 +38,7 @@ can call into these ORB APIs.
|
||||
|
||||
|
||||
<p>
|
||||
<a name="unimpl"></a>
|
||||
<a id="unimpl"></a>
|
||||
<hr>
|
||||
<h1>CORBA Features Throwing NO_IMPLEMENT() Exceptions</h1>
|
||||
<hr>
|
||||
|
@ -1,4 +1,4 @@
|
||||
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
@ -6,7 +6,7 @@
|
||||
<title>package</title>
|
||||
<!--
|
||||
/*
|
||||
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -31,7 +31,7 @@
|
||||
*/
|
||||
-->
|
||||
</head>
|
||||
<body bgcolor="#FFFFFF">
|
||||
<body>
|
||||
The CORBA_2_3 package defines additions to existing CORBA interfaces
|
||||
in the Java[tm] Standard Edition 6. These changes occurred in recent
|
||||
revisions to the CORBA API defined by the OMG. The new methods were
|
||||
@ -46,7 +46,7 @@ the Java[tm] Platform, Standard Edition 6, ORB complies, see <A
|
||||
HREF="../CORBA/doc-files/compliance.html">Official Specifications for CORBA
|
||||
support in Java[tm] SE 6</A>.
|
||||
<P>
|
||||
<a name="unimpl"></a>
|
||||
<a id="unimpl"></a>
|
||||
The following methods in the abstract class
|
||||
<code>org.omg.CORBA_2_3.ORB</code> are unimplemented:
|
||||
<UL>
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -425,7 +425,7 @@ module IOP {
|
||||
* encoded using GIOP 1.2 with a TCS-W of UTF-16. This service context
|
||||
* may be sent on Reply messages with a reply_status of SYSTEM_EXCEPTION
|
||||
* or USER_EXCEPTION. The usage of this service context is defined
|
||||
* by language mappings. <br/> <br/>
|
||||
* by language mappings. <br> <br>
|
||||
*
|
||||
* IDL/Java: ptc/02-01-22: 1.15.2:
|
||||
* When a System Exception is marshaled, its GIOP Reply message shall
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -580,7 +580,8 @@ module PortableInterceptor {
|
||||
* to access it will result in a <code>BAD_INV_ORDER</code> being thrown
|
||||
* with a standard minor code of 14.
|
||||
*
|
||||
* <table border=1 summary="Shows the validity of each attribute or operation">
|
||||
* <table class="plain">
|
||||
* <caption style="display:none">Shows the validity of each attribute or operation</caption>
|
||||
* <thead>
|
||||
* <tr>
|
||||
* <th> </th>
|
||||
@ -597,42 +598,42 @@ module PortableInterceptor {
|
||||
* <td id="ri" colspan=6><i>Inherited from RequestInfo:</i></td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="req_id"><p align="left">request_id</p></th>
|
||||
* <tr><th id="req_id"><p style="text-align:left">request_id</p></th>
|
||||
* <td headers="ri req_id send_req">yes</td>
|
||||
* <td headers="ri req_id send_poll">yes</td>
|
||||
* <td headers="ri req_id rec_reply">yes</td>
|
||||
* <td headers="ri req_id rec_ex">yes</td>
|
||||
* <td headers="ri req_id rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="op"><p align="left">operation</p></th>
|
||||
* <tr><th id="op"><p style="text-align:left">operation</p></th>
|
||||
* <td headers="ri op send_req">yes</td>
|
||||
* <td headers="ri op send_poll">yes</td>
|
||||
* <td headers="ri op rec_reply">yes</td>
|
||||
* <td headers="ri op rec_ex">yes</td>
|
||||
* <td headers="ri op rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="arg"><p align="left">arguments</p></th>
|
||||
* <tr><th id="arg"><p style="text-align:left">arguments</p></th>
|
||||
* <td headers="ri arg send_req">yes<sub>1</sub></td>
|
||||
* <td headers="ri arg send_poll">no </td>
|
||||
* <td headers="ri arg rec_reply">yes</td>
|
||||
* <td headers="ri arg rec_ex">no </td>
|
||||
* <td headers="ri arg rec_oth">no </td></tr>
|
||||
*
|
||||
* <tr><th id="exc"><p align="left">exceptions</p></th>
|
||||
* <tr><th id="exc"><p style="text-align:left">exceptions</p></th>
|
||||
* <td headers="ri exc send_req">yes</td>
|
||||
* <td headers="ri exc send_poll">no </td>
|
||||
* <td headers="ri exc rec_reply">yes</td>
|
||||
* <td headers="ri exc rec_ex">yes</td>
|
||||
* <td headers="ri exc rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="con"><p align="left">contexts</p></th>
|
||||
* <tr><th id="con"><p style="text-align:left">contexts</p></th>
|
||||
* <td headers="ri con send_req">yes</td>
|
||||
* <td headers="ri con send_poll">no </td>
|
||||
* <td headers="ri con rec_reply">yes</td>
|
||||
* <td headers="ri con rec_ex">yes</td>
|
||||
* <td headers="ri con rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="op_con"><p align="left">operation_context</p></th>
|
||||
* <tr><th id="op_con"><p style="text-align:left">operation_context</p></th>
|
||||
* <td headers="ri op_con send_req">yes</td>
|
||||
* <td headers="ri op_con send_poll">no </td>
|
||||
* <td headers="ri op_con rec_reply">yes</td>
|
||||
@ -640,7 +641,7 @@ module PortableInterceptor {
|
||||
* <td headers="ri op_con rec_oth">yes</td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="result"><p align="left">result</p></th>
|
||||
* <tr><th id="result"><p style="text-align:left">result</p></th>
|
||||
* <td headers="ri result send_req">no </td>
|
||||
* <td headers="ri result send_poll">no </td>
|
||||
* <td headers="ri result rec_reply">yes</td>
|
||||
@ -648,14 +649,14 @@ module PortableInterceptor {
|
||||
* <td headers="ri result rec_oth">no </td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="res_exp"><p align="left">response_expected</p></th>
|
||||
* <tr><th id="res_exp"><p style="text-align:left">response_expected</p></th>
|
||||
* <td headers="ri res_exp send_req">yes</td>
|
||||
* <td headers="ri res_exp send_poll">yes</td>
|
||||
* <td headers="ri res_exp rec_reply">yes</td>
|
||||
* <td headers="ri res_exp rec_ex">yes</td>
|
||||
* <td headers="ri res_exp rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="sync_sco"><p align="left">sync_scope</p></th>
|
||||
* <tr><th id="sync_sco"><p style="text-align:left">sync_scope</p></th>
|
||||
* <td headers="ri sync_sco send_req">yes</td>
|
||||
* <td headers="ri sync_sco send_poll">no </td>
|
||||
* <td headers="ri sync_sco rec_reply">yes</td>
|
||||
@ -663,14 +664,14 @@ module PortableInterceptor {
|
||||
* <td headers="ri sync_sco rec_oth">yes</td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="rep_stat"><p align="left">reply_status</p></th>
|
||||
* <tr><th id="rep_stat"><p style="text-align:left">reply_status</p></th>
|
||||
* <td headers="ri rep_stat send_req">no </td>
|
||||
* <td headers="ri rep_stat send_poll">no </td>
|
||||
* <td headers="ri rep_stat rec_reply">yes</td>
|
||||
* <td headers="ri rep_stat rec_ex">yes</td>
|
||||
* <td headers="ri rep_stat rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="for_ref"><p align="left">forward_reference</p></th>
|
||||
* <tr><th id="for_ref"><p style="text-align:left">forward_reference</p></th>
|
||||
* <td headers="ri for_ref send_req">no </td>
|
||||
* <td headers="ri for_ref send_poll">no </td>
|
||||
* <td headers="ri for_ref rec_reply">no </td>
|
||||
@ -678,21 +679,21 @@ module PortableInterceptor {
|
||||
* <td headers="ri for_ref rec_oth">yes<sub>2</sub>
|
||||
* </td></tr>
|
||||
*
|
||||
* <tr><th id="get_slot"><p align="left">get_slot</p></th>
|
||||
* <tr><th id="get_slot"><p style="text-align:left">get_slot</p></th>
|
||||
* <td headers="ri get_slot send_req">yes</td>
|
||||
* <td headers="ri get_slot send_poll">yes</td>
|
||||
* <td headers="ri get_slot rec_reply">yes</td>
|
||||
* <td headers="ri get_slot rec_ex">yes</td>
|
||||
* <td headers="ri get_slot rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="grsc"><p align="left">get_request_service_context</p></th>
|
||||
* <tr><th id="grsc"><p style="text-align:left">get_request_service_context</p></th>
|
||||
* <td headers="ri grsc send_req">yes</td>
|
||||
* <td headers="ri grsc send_poll">no </td>
|
||||
* <td headers="ri grsc rec_reply">yes</td>
|
||||
* <td headers="ri grsc rec_ex">yes</td>
|
||||
* <td headers="ri grsc rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="gpsc"><p align="left">get_reply_service_context</p></th>
|
||||
* <tr><th id="gpsc"><p style="text-align:left">get_reply_service_context</p></th>
|
||||
* <td headers="ri gpsc send_req">no </td>
|
||||
* <td headers="ri gpsc send_poll">no </td>
|
||||
* <td headers="ri gpsc rec_reply">yes</td>
|
||||
@ -704,14 +705,14 @@ module PortableInterceptor {
|
||||
* <td id="cri" colspan=6><i>ClientRequestInfo-specific:</i></td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="target"><p align="left">target</p></th>
|
||||
* <tr><th id="target"><p style="text-align:left">target</p></th>
|
||||
* <td headers="cri target send_req">yes</td>
|
||||
* <td headers="cri target send_poll">yes</td>
|
||||
* <td headers="cri target rec_reply">yes</td>
|
||||
* <td headers="cri target rec_ex">yes</td>
|
||||
* <td headers="cri target rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="eftarget"><p align="left">effective_target</p></th>
|
||||
* <tr><th id="eftarget"><p style="text-align:left">effective_target</p></th>
|
||||
* <td headers="cri eftarget send_req">yes</td>
|
||||
* <td headers="cri eftarget send_poll">yes</td>
|
||||
* <td headers="cri eftarget rec_reply">yes</td>
|
||||
@ -719,49 +720,49 @@ module PortableInterceptor {
|
||||
* <td headers="cri eftarget rec_oth">yes</td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="efprof"><p align="left">effective_profile</p></th>
|
||||
* <tr><th id="efprof"><p style="text-align:left">effective_profile</p></th>
|
||||
* <td headers="cri efprof send_req">yes</td>
|
||||
* <td headers="cri efprof send_poll">yes</td>
|
||||
* <td headers="cri efprof rec_reply">yes</td>
|
||||
* <td headers="cri efprof rec_ex">yes</td>
|
||||
* <td headers="cri efprof rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="rxp"><p align="left">received_exception</p></th>
|
||||
* <tr><th id="rxp"><p style="text-align:left">received_exception</p></th>
|
||||
* <td headers="cri rxp send_req">no </td>
|
||||
* <td headers="cri rxp send_poll">no </td>
|
||||
* <td headers="cri rxp rec_reply">no </td>
|
||||
* <td headers="cri rxp rec_ex">yes</td>
|
||||
* <td headers="cri rxp rec_oth">no </td></tr>
|
||||
*
|
||||
* <tr><th id="rei"><p align="left">received_exception_id</p></th>
|
||||
* <tr><th id="rei"><p style="text-align:left">received_exception_id</p></th>
|
||||
* <td headers="cri rei send_req">no </td>
|
||||
* <td headers="cri rei send_poll">no </td>
|
||||
* <td headers="cri rei rec_reply">no </td>
|
||||
* <td headers="cri rei rec_ex">yes</td>
|
||||
* <td headers="cri rei rec_oth">no </td></tr>
|
||||
*
|
||||
* <tr><th id="gec"><p align="left">get_effective_component</p></th>
|
||||
* <tr><th id="gec"><p style="text-align:left">get_effective_component</p></th>
|
||||
* <td headers="cri gec send_req">yes</td>
|
||||
* <td headers="cri gec send_poll">no </td>
|
||||
* <td headers="cri gec rec_reply">yes</td>
|
||||
* <td headers="cri gec rec_ex">yes</td>
|
||||
* <td headers="cri gec rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="gecs"><p align="left">get_effective_components</p></th>
|
||||
* <tr><th id="gecs"><p style="text-align:left">get_effective_components</p></th>
|
||||
* <td headers="cri gecs send_req">yes</td>
|
||||
* <td headers="cri gecs send_poll">no </td>
|
||||
* <td headers="cri gecs rec_reply">yes</td>
|
||||
* <td headers="cri gecs rec_ex">yes</td>
|
||||
* <td headers="cri gecs rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="grpcy"><p align="left">get_request_policy</p></th>
|
||||
* <tr><th id="grpcy"><p style="text-align:left">get_request_policy</p></th>
|
||||
* <td headers="cri grpcy send_req">yes</td>
|
||||
* <td headers="cri grpcy send_poll">no </td>
|
||||
* <td headers="cri grpcy rec_reply">yes</td>
|
||||
* <td headers="cri grpcy rec_ex">yes</td>
|
||||
* <td headers="cri grpcy rec_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="arsc"><p align="left">add_request_service_context</p></th>
|
||||
* <tr><th id="arsc"><p style="text-align:left">add_request_service_context</p></th>
|
||||
* <td headers="cri arsc send_req">yes</td>
|
||||
* <td headers="cri arsc send_poll">no </td>
|
||||
* <td headers="cri arsc rec_reply">no </td>
|
||||
@ -935,7 +936,8 @@ module PortableInterceptor {
|
||||
* standard minor code of 14.
|
||||
*
|
||||
*
|
||||
* <table border=1 summary="Shows the validity of each attribute or operation">
|
||||
* <table class="plain">
|
||||
* <caption style="display:none">Shows the validity of each attribute or operation</caption>
|
||||
* <thead>
|
||||
* <tr>
|
||||
* <th> </th>
|
||||
@ -953,21 +955,21 @@ module PortableInterceptor {
|
||||
* <td id="ri" colspan=6><i>Inherited from RequestInfo:</i></td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="req_id"><p align="left">request_id</p></th>
|
||||
* <tr><th id="req_id"><p style="text-align:left">request_id</p></th>
|
||||
* <td headers="ri req_id rec_req_ser_con">yes</td>
|
||||
* <td headers="ri req_id rec_req">yes</td>
|
||||
* <td headers="ri req_id send_rep">yes</td>
|
||||
* <td headers="ri req_id send_exc">yes</td>
|
||||
* <td headers="ri req_id send_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="op"><p align="left">operation</p></th>
|
||||
* <tr><th id="op"><p style="text-align:left">operation</p></th>
|
||||
* <td headers="ri op rec_req_ser_con">yes</td>
|
||||
* <td headers="ri op rec_req">yes</td>
|
||||
* <td headers="ri op send_rep">yes</td>
|
||||
* <td headers="ri op send_exc">yes</td>
|
||||
* <td headers="ri op send_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="args"><p align="left">arguments</p></th>
|
||||
* <tr><th id="args"><p style="text-align:left">arguments</p></th>
|
||||
* <td headers="ri args rec_req_ser_con">no </td>
|
||||
* <td headers="ri args rec_req">yes<sub>1</sub></td>
|
||||
* <td headers="ri args send_rep">yes</td>
|
||||
@ -975,21 +977,21 @@ module PortableInterceptor {
|
||||
* <td headers="ri args send_oth">no<sub>2</sub>
|
||||
* </td></tr>
|
||||
*
|
||||
* <tr><th id="exps"><p align="left">exceptions</p></th>
|
||||
* <tr><th id="exps"><p style="text-align:left">exceptions</p></th>
|
||||
* <td headers="ri exps rec_req_ser_con">no </td>
|
||||
* <td headers="ri exps rec_req">yes</td>
|
||||
* <td headers="ri exps send_rep">yes</td>
|
||||
* <td headers="ri exps send_exc">yes</td>
|
||||
* <td headers="ri exps send_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="contexts"><p align="left">contexts</p></th>
|
||||
* <tr><th id="contexts"><p style="text-align:left">contexts</p></th>
|
||||
* <td headers="ri contexts rec_req_ser_con">no </td>
|
||||
* <td headers="ri contexts rec_req">yes</td>
|
||||
* <td headers="ri contexts send_rep">yes</td>
|
||||
* <td headers="ri contexts send_exc">yes</td>
|
||||
* <td headers="ri contexts send_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="op_con"><p align="left">operation_context</p></th>
|
||||
* <tr><th id="op_con"><p style="text-align:left">operation_context</p></th>
|
||||
* <td headers="ri op_con rec_req_ser_con">no </td>
|
||||
* <td headers="ri op_con rec_req">yes</td>
|
||||
* <td headers="ri op_con send_rep">yes</td>
|
||||
@ -997,7 +999,7 @@ module PortableInterceptor {
|
||||
* <td headers="ri op_con send_oth">no </td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="result"><p align="left">result</p></th>
|
||||
* <tr><th id="result"><p style="text-align:left">result</p></th>
|
||||
* <td headers="ri result rec_req_ser_con">no </td>
|
||||
* <td headers="ri result rec_req">no </td>
|
||||
* <td headers="ri result send_rep">yes</td>
|
||||
@ -1005,14 +1007,14 @@ module PortableInterceptor {
|
||||
* <td headers="ri result send_oth">no </td>
|
||||
* </tr>
|
||||
*
|
||||
* <tr><th id="res_ex"><p align="left">response_expected</p></th>
|
||||
* <tr><th id="res_ex"><p style="text-align:left">response_expected</p></th>
|
||||
* <td headers="ri res_ex rec_req_ser_con">yes</td>
|
||||
* <td headers="ri res_ex rec_req">yes</td>
|
||||
* <td headers="ri res_ex send_rep">yes</td>
|
||||
* <td headers="ri res_ex send_exc">yes</td>
|
||||
* <td headers="ri res_ex send_oth">yes</td></tr>
|
||||
*
|
||||
* <tr><th id="syn_scp"><p align="left">sync_scope</p></th>
|
||||
* <tr><th id="syn_scp"><p style="text-align:left">sync_scope</p></th>
|
||||
* <td headers="ri syn_scp rec_req_ser_con">yes</td>
|
||||
* <td headers="ri syn_scp rec_req">yes</td>
|
||||
* <td headers="ri syn_scp send_rep">yes</td>
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -29,7 +29,7 @@ questions.
|
||||
-->
|
||||
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
<body>
|
||||
|
||||
Provides a mechanism to register ORB hooks through which ORB services
|
||||
can intercept the normal flow of execution of the ORB.
|
||||
@ -52,7 +52,7 @@ See the javadocs for class <code>
|
||||
{@link org.omg.PortableInterceptor.ORBInitializer ORBInitializer}</code>
|
||||
for how to go about registering interceptors.
|
||||
|
||||
<a name="unimpl"></a>
|
||||
<a id="unimpl"></a>
|
||||
<h2>Known limitations / unimplemented methods in package
|
||||
<code>org.omg.PortableInterceptor</code></h2>
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<!--
|
||||
|
||||
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
@ -30,7 +30,7 @@
|
||||
-->
|
||||
|
||||
</head>
|
||||
<body bgcolor="white">
|
||||
<body>
|
||||
Provides classes and interfaces for making the server side of your applications
|
||||
portable across multivendor ORBs.
|
||||
|
||||
@ -160,7 +160,7 @@ follows exactly the same pattern as the other holder classes for basic types.
|
||||
<A HREF="../../../../technotes/guides/idl/index.html">Java IDL home page</A>.
|
||||
|
||||
<H2>Example Code</H2>
|
||||
<a name="sampleserver"></a>
|
||||
<a id="sampleserver"></a>
|
||||
<H3>Example Server Code</H3>
|
||||
<PRE>
|
||||
import javax.naming.InitialContext;
|
||||
|
@ -59,10 +59,10 @@ import sun.reflect.ReflectionFactory;
|
||||
* </ul>
|
||||
* The code that calls Bridge.get() must have the following Permissions:
|
||||
* <ul>
|
||||
* <li>RuntimePermission "reflectionFactoryAccess"</li>
|
||||
* <li>BridgePermission "getBridge"</li>
|
||||
* <li>ReflectPermission "suppressAccessChecks"</li>
|
||||
* <li>StackFramePermission "retainClassReference"</li>
|
||||
* <li>RuntimePermission "getStackWalkerWithClassReference"</li>
|
||||
* <li>RuntimePermission "reflectionFactoryAccess"</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* All of these permissions are required to obtain and correctly initialize
|
||||
@ -105,10 +105,10 @@ public final class Bridge
|
||||
/** Fetch the Bridge singleton. This requires the following
|
||||
* permissions:
|
||||
* <ul>
|
||||
* <li>RuntimePermission "reflectionFactoryAccess"</li>
|
||||
* <li>BridgePermission "getBridge"</li>
|
||||
* <li>ReflectPermission "suppressAccessChecks"</li>
|
||||
* <li>StackFramePermission "retainClassReference"</li>
|
||||
* <li>RuntimePermission "getStackWalkerWithClassReference"</li>
|
||||
* <li>RuntimePermission "reflectionFactoryAccess"</li>
|
||||
* </ul>
|
||||
* @return The singleton instance of the Bridge class
|
||||
* @throws SecurityException if the caller does not have the
|
||||
|
@ -15,10 +15,10 @@
|
||||
^\.mx.jvmci/hotspot/eclipse/.*
|
||||
^\.idea/
|
||||
^workingsets.xml
|
||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/.*\.xml
|
||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/.*\.iml
|
||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/nbproject
|
||||
^src/jdk.vm.ci/share/classes/\w[\w\.]*/\..*
|
||||
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/.*\.xml
|
||||
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/.*\.iml
|
||||
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/nbproject
|
||||
^src/jdk.internal.vm.ci/share/classes/\w[\w\.]*/\..*
|
||||
^test/compiler/jvmci/\w[\w\.]*/.*\.xml
|
||||
^test/compiler/jvmci/\w[\w\.]*/.*\.iml
|
||||
^test/compiler/jvmci/\w[\w\.]*/nbproject
|
||||
@ -27,15 +27,15 @@
|
||||
^test/compiler/aot/\w[\w\.]*/.*\.iml
|
||||
^test/compiler/aot/\w[\w\.]*/nbproject
|
||||
^test/compiler/aot/\w[\w\.]*/\..*
|
||||
^src/jdk.vm.compiler/\.mx.graal/env
|
||||
^src/jdk.vm.compiler/\.mx.graal/.*\.pyc
|
||||
^src/jdk.vm.compiler/\.mx.graal/eclipse-launches/.*
|
||||
^src/jdk.internal.vm.compiler/\.mx.graal/env
|
||||
^src/jdk.internal.vm.compiler/\.mx.graal/.*\.pyc
|
||||
^src/jdk.internal.vm.compiler/\.mx.graal/eclipse-launches/.*
|
||||
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.xml
|
||||
^src/jdk.aot/share/classes/\w[\w\.]*/.*\.iml
|
||||
^src/jdk.aot/share/classes/\w[\w\.]*/nbproject
|
||||
^src/jdk.aot/share/classes/\w[\w\.]*/\..*
|
||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/.*\.xml
|
||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/.*\.iml
|
||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/nbproject
|
||||
^src/jdk.vm.compiler/share/classes/\w[\w\.]*/\..*
|
||||
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/.*\.xml
|
||||
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/.*\.iml
|
||||
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/nbproject
|
||||
^src/jdk.internal.vm.compiler/share/classes/\w[\w\.]*/\..*
|
||||
|
||||
|
@ -556,5 +556,29 @@ a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146
|
||||
2a2ac7d9f52c8cb2b80077e515b5840b947e640c jdk-9+151
|
||||
31f1d26c60df7b2e516a4f84160d76ba017d4e09 jdk-9+152
|
||||
217ba81b9a4ce8698200370175aa2db86a39f66c jdk-9+153
|
||||
fc7e94cb748507366b839e859f865f724467446a jdk-10+0
|
||||
a9fdfd55835ef9dccb7f317b07249bd66653b874 jdk-9+154
|
||||
f3b3d77a1751897413aae43ac340a130b6fa2ae1 jdk-9+155
|
||||
43139c588ea48b6504e52b6c3dec530b17b1fdb4 jdk-9+156
|
||||
1ea217626ba0995dd03127f8322ba3687926a085 jdk-10+1
|
||||
b2d0a906afd73dcf27f572217eb1be0f196ec16c jdk-9+157
|
||||
4e78f30935229f13ce7c43089621cf7169f5abac jdk-9+158
|
||||
9211c2e89c1cd11ec2d5752b0f97131a7d7525c7 jdk-9+159
|
||||
94b4e2e5331d38eab6a3639c3511b2e0715df0e9 jdk-9+160
|
||||
191ffbdb3d7b734288daa7fb76b37a0a85dfe7eb jdk-9+161
|
||||
b01c519b715ef6f785d0631adee0a6537cf6c12e jdk-9+162
|
||||
983fe207555724d98f4876991e1cbafbcf2733e8 jdk-9+163
|
||||
0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164
|
||||
c92c6416ca03b1464d5ed99cf6201e52b5ba0a70 jdk-9+165
|
||||
560d7aa083a24b6a56443feb8de0f40435d33aa9 jdk-9+166
|
||||
48809c513ed5ebb4d4dbf2f454afcce2780db6db jdk-10+2
|
||||
6c3b6b3438c4a63e619f00bd5732d1260ffd5600 jdk-10+3
|
||||
8295ca08f5cb09c090eb048bbdd338d7e270c8bf jdk-10+4
|
||||
7b5ca2ff1f78873ca3ee99b6589d3cb4dde2e454 jdk-10+5
|
||||
762465099d938fd96cd1efda193bc1fa23d070d3 jdk-10+6
|
||||
1ca7ed1b17b5776930d641d1379834f3140a74e4 jdk-9+167
|
||||
fbb9c802649585d19f6d7e81b4a519d44806225a jdk-9+168
|
||||
16d692be099c5c38eb48cc9aca78b0c900910d5b jdk-9+169
|
||||
38a240fd58a287acb1963920b92ed4d9c2fd39e3 jdk-9+170
|
||||
9d4746eca95aec3e5a344bf2520745dcc1d17eed jdk-10+7
|
||||
f5ded0cf954c770deeecb80f2ba1ba6a05cd979b jdk-10+8
|
||||
|
@ -1 +1 @@
|
||||
project=jdk9
|
||||
project=jdk10
|
||||
|
@ -3,7 +3,7 @@
|
||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
|
||||
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
|
||||
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
|
||||
<path>/.mx.jvmci</path>
|
||||
<path>/mx.jvmci</path>
|
||||
</pydev_pathproperty>
|
||||
<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
|
||||
<path>/mx</path>
|
||||
|
@ -158,8 +158,8 @@ To build hotspot and import it into the JDK: "mx make hotspot import-hotspot"
|
||||
# JDK9 must be bootstrapped with a JDK8
|
||||
compliance = mx.JavaCompliance('8')
|
||||
jdk8 = mx.get_jdk(compliance.exactMatch, versionDescription=compliance.value)
|
||||
cmd = ['sh', 'configure', '--with-debug-level=' + _vm.debugLevel, '--with-native-debug-symbols=external', '--disable-precompiled-headers',
|
||||
'--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk8.home]
|
||||
cmd = ['sh', 'configure', '--with-debug-level=' + _vm.debugLevel, '--with-native-debug-symbols=external', '--disable-precompiled-headers', '--with-jvm-features=graal',
|
||||
'--with-jvm-variants=' + _vm.jvmVariant, '--disable-warnings-as-errors', '--with-boot-jdk=' + jdk8.home, '--with-jvm-features=graal']
|
||||
mx.run(cmd, cwd=_jdkSourceRoot)
|
||||
cmd = [mx.gmake_cmd(), 'CONF=' + _vm.debugLevel]
|
||||
if mx.get_opts().verbose:
|
||||
@ -176,66 +176,6 @@ To build hotspot and import it into the JDK: "mx make hotspot import-hotspot"
|
||||
|
||||
mx.run(cmd, cwd=_jdkSourceRoot)
|
||||
|
||||
if 'images' in cmd:
|
||||
jdkImageDir = join(jdkBuildDir, 'images', 'jdk')
|
||||
|
||||
# The OpenJDK build creates an empty cacerts file so copy one from
|
||||
# the default JDK (which is assumed to be an OracleJDK)
|
||||
srcCerts = join(mx.get_jdk(tag='default').home, 'lib', 'security', 'cacerts')
|
||||
if not exists(srcCerts):
|
||||
# Might be building with JDK8 which has cacerts under jre/
|
||||
srcCerts = join(mx.get_jdk(tag='default').home, 'jre', 'lib', 'security', 'cacerts')
|
||||
dstCerts = join(jdkImageDir, 'lib', 'security', 'cacerts')
|
||||
if srcCerts != dstCerts:
|
||||
shutil.copyfile(srcCerts, dstCerts)
|
||||
|
||||
_create_jdk_bundle(jdkBuildDir, _vm.debugLevel, jdkImageDir)
|
||||
|
||||
def _get_jdk_bundle_arches():
|
||||
"""
|
||||
Gets a list of names that will be the part of a JDK bundle's file name denoting the architecture.
|
||||
The first element in the list is the canonical name. Symlinks should be created for the
|
||||
remaining names.
|
||||
"""
|
||||
cpu = mx.get_arch()
|
||||
if cpu == 'amd64':
|
||||
return ['x64', 'x86_64', 'amd64']
|
||||
elif cpu == 'sparcv9':
|
||||
return ['sparcv9']
|
||||
mx.abort('Unsupported JDK bundle arch: ' + cpu)
|
||||
|
||||
def _create_jdk_bundle(jdkBuildDir, debugLevel, jdkImageDir):
|
||||
"""
|
||||
Creates a tar.gz JDK archive, an accompanying tar.gz.sha1 file with its
|
||||
SHA1 signature plus symlinks to the archive for non-canonical architecture names.
|
||||
"""
|
||||
|
||||
arches = _get_jdk_bundle_arches()
|
||||
jdkTgzPath = join(_suite.get_output_root(), 'jdk-bundles', 'jdk9-{}-{}-{}.tar.gz'.format(debugLevel, _get_openjdk_os(), arches[0]))
|
||||
with mx.Archiver(jdkTgzPath, kind='tgz') as arc:
|
||||
mx.log('Creating ' + jdkTgzPath)
|
||||
for root, _, filenames in os.walk(jdkImageDir):
|
||||
for name in filenames:
|
||||
f = join(root, name)
|
||||
arcname = 'jdk1.9.0/' + os.path.relpath(f, jdkImageDir)
|
||||
arc.zf.add(name=f, arcname=arcname, recursive=False)
|
||||
|
||||
with open(jdkTgzPath + '.sha1', 'w') as fp:
|
||||
mx.log('Creating ' + jdkTgzPath + '.sha1')
|
||||
fp.write(mx.sha1OfFile(jdkTgzPath))
|
||||
|
||||
def _create_link(source, link_name):
|
||||
if exists(link_name):
|
||||
os.remove(link_name)
|
||||
mx.log('Creating ' + link_name + ' -> ' + source)
|
||||
os.symlink(source, link_name)
|
||||
|
||||
for arch in arches[1:]:
|
||||
link_name = join(_suite.get_output_root(), 'jdk-bundles', 'jdk9-{}-{}-{}.tar.gz'.format(debugLevel, _get_openjdk_os(), arch))
|
||||
jdkTgzName = os.path.basename(jdkTgzPath)
|
||||
_create_link(jdkTgzName, link_name)
|
||||
_create_link(jdkTgzName + '.sha1', link_name + '.sha1')
|
||||
|
||||
def _runmultimake(args):
|
||||
"""run the JDK make process for one or more configurations"""
|
||||
|
||||
|
@ -43,7 +43,7 @@ suite = {
|
||||
# ------------- JVMCI:Service -------------
|
||||
|
||||
"jdk.vm.ci.services" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"javaCompliance" : "9",
|
||||
"workingSets" : "API,JVMCI",
|
||||
@ -52,7 +52,7 @@ suite = {
|
||||
# ------------- JVMCI:API -------------
|
||||
|
||||
"jdk.vm.ci.common" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
"javaCompliance" : "9",
|
||||
@ -60,7 +60,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.meta" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
"javaCompliance" : "9",
|
||||
@ -68,7 +68,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.code" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : ["jdk.vm.ci.meta"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
@ -92,7 +92,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.runtime" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.code",
|
||||
@ -119,7 +119,7 @@ suite = {
|
||||
# ------------- JVMCI:HotSpot -------------
|
||||
|
||||
"jdk.vm.ci.aarch64" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : ["jdk.vm.ci.code"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
@ -128,7 +128,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.amd64" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : ["jdk.vm.ci.code"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
@ -137,7 +137,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.sparc" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : ["jdk.vm.ci.code"],
|
||||
"checkstyle" : "jdk.vm.ci.services",
|
||||
@ -146,7 +146,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.hotspot" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.common",
|
||||
@ -175,7 +175,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.hotspot.aarch64" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.aarch64",
|
||||
@ -187,7 +187,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.hotspot.amd64" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.amd64",
|
||||
@ -199,7 +199,7 @@ suite = {
|
||||
},
|
||||
|
||||
"jdk.vm.ci.hotspot.sparc" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"sourceDirs" : ["src"],
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.sparc",
|
||||
@ -221,12 +221,12 @@ suite = {
|
||||
# ------------- Distributions -------------
|
||||
|
||||
"JVMCI_SERVICES" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"dependencies" : ["jdk.vm.ci.services"],
|
||||
},
|
||||
|
||||
"JVMCI_API" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.runtime",
|
||||
"jdk.vm.ci.common",
|
||||
@ -240,7 +240,7 @@ suite = {
|
||||
},
|
||||
|
||||
"JVMCI_HOTSPOT" : {
|
||||
"subDir" : "src/jdk.vm.ci/share/classes",
|
||||
"subDir" : "src/jdk.internal.vm.ci/share/classes",
|
||||
"dependencies" : [
|
||||
"jdk.vm.ci.hotspot.aarch64",
|
||||
"jdk.vm.ci.hotspot.amd64",
|
||||
|
@ -1,14 +0,0 @@
|
||||
README:
|
||||
This file should be located at the top of the hotspot Mercurial repository.
|
||||
|
||||
See http://openjdk.java.net/ for more information about the OpenJDK.
|
||||
|
||||
See ../README-builds.html for complete details on build machine requirements.
|
||||
|
||||
Simple Build Instructions:
|
||||
|
||||
cd make && gnumake
|
||||
|
||||
The files that will be imported into the jdk build will be in the "build"
|
||||
directory.
|
||||
|
@ -38,9 +38,9 @@ TARGETS :=
|
||||
$(eval $(call IncludeCustomExtension, hotspot, CompileTools.gmk))
|
||||
|
||||
ifeq ($(INCLUDE_GRAAL), true)
|
||||
VM_CI_SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.vm.ci/share/classes
|
||||
VM_CI_SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.internal.vm.ci/share/classes
|
||||
|
||||
SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.vm.compiler/share/classes
|
||||
SRC_DIR := $(HOTSPOT_TOPDIR)/src/jdk.internal.vm.compiler/share/classes
|
||||
|
||||
##############################################################################
|
||||
# Compile the annotation processors
|
||||
|
@ -28,7 +28,7 @@ default: all
|
||||
include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
|
||||
$(eval $(call IncludeCustomExtension, hotspot, gensrc/Gensrc-jdk.vm.compiler.gmk))
|
||||
$(eval $(call IncludeCustomExtension, hotspot, gensrc/Gensrc-jdk.internal.vm.compiler.gmk))
|
||||
|
||||
GENSRC_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)
|
||||
SRC_DIR := $(HOTSPOT_TOPDIR)/src/$(MODULE)/share/classes
|
||||
@ -81,23 +81,24 @@ PROCESSOR_JARS := \
|
||||
PROCESSOR_PATH := $(call PathList, $(PROCESSOR_JARS))
|
||||
|
||||
ADD_EXPORTS := \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.aarch64=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.amd64=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.events=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspot.sparc=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.hotspotvmconfig=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.inittimer=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
|
||||
--add-exports jdk.vm.ci/jdk.vm.ci.sparc=ALL-UNNAMED \
|
||||
--add-modules jdk.internal.vm.ci \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.aarch64=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.amd64=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code.site=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.code.stack=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.common=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.amd64=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.events=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspot.sparc=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.hotspotvmconfig=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.inittimer=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.meta=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.runtime=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.services=ALL-UNNAMED \
|
||||
--add-exports jdk.internal.vm.ci/jdk.vm.ci.sparc=ALL-UNNAMED \
|
||||
#
|
||||
|
||||
$(GENSRC_DIR)/_gensrc_proc_done: $(PROC_SRCS) $(PROCESSOR_JARS)
|
||||
@ -138,7 +139,7 @@ $(GENSRC_DIR)/module-info.java.extra: $(GENSRC_DIR)/_gensrc_proc_done
|
||||
$(ECHO) "uses org.graalvm.compiler.options.OptionDescriptors;" >> $@; \
|
||||
$(ECHO) "provides org.graalvm.compiler.options.OptionDescriptors with" >> $@; \
|
||||
for i in $$($(FIND) $(GENSRC_DIR) -name '*_OptionDescriptors.java'); do \
|
||||
c=$$($(ECHO) $$i | $(SED) 's:.*/jdk\.vm\.compiler/\(.*\)\.java:\1:' | $(TR) '/' '.'); \
|
||||
c=$$($(ECHO) $$i | $(SED) 's:.*/jdk\.internal\.vm\.compiler/\(.*\)\.java:\1:' | $(TR) '/' '.'); \
|
||||
$(ECHO) " $$c," >> $@; \
|
||||
done; \
|
||||
$(ECHO) " ;" >> $@;
|
@ -112,8 +112,10 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
-relativeSrcInclude src \
|
||||
-hidePath .hg \
|
||||
-hidePath .jcheck \
|
||||
-hidePath jdk.aot \
|
||||
-hidePath jdk.hotspot.agent \
|
||||
-hidePath jdk.vm.ci \
|
||||
-hidePath jdk.internal.vm.ci \
|
||||
-hidePath jdk.internal.vm.compiler \
|
||||
-hidePath jdk.jfr \
|
||||
-compiler VC10 \
|
||||
-jdkTargetRoot $(call FixPath, $(JDK_OUTPUTDIR)) \
|
||||
|
@ -118,6 +118,12 @@ ifeq ($(OPENJDK_TARGET_CPU), x86_64)
|
||||
OPENJDK_TARGET_CPU_VM_VERSION := amd64
|
||||
else ifeq ($(OPENJDK_TARGET_CPU), sparcv9)
|
||||
OPENJDK_TARGET_CPU_VM_VERSION := sparc
|
||||
else ifeq ($(HOTSPOT_TARGET_CPU_ARCH), arm)
|
||||
ifeq ($(OPENJDK_TARGET_CPU), aarch64)
|
||||
# This sets the Oracle Aarch64 port to use arm64
|
||||
# while the original Aarch64 port uses aarch64
|
||||
OPENJDK_TARGET_CPU_VM_VERSION := arm64
|
||||
endif
|
||||
else
|
||||
OPENJDK_TARGET_CPU_VM_VERSION := $(OPENJDK_TARGET_CPU)
|
||||
endif
|
||||
|
@ -1,22 +0,0 @@
|
||||
Copyright (c) %YEARS%, 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.
|
@ -1,20 +0,0 @@
|
||||
Copyright (c) %YEARS%, Oracle and/or its affiliates. All rights reserved.
|
||||
DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
|
||||
This code is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License version 2 only, as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
version 2 for more details (a copy is included in the LICENSE file that
|
||||
accompanied this code).
|
||||
|
||||
You should have received a copy of the GNU General Public License version
|
||||
2 along with this work; if not, write to the Free Software Foundation,
|
||||
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
or visit www.oracle.com if you need additional information or have any
|
||||
questions.
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -48,6 +48,8 @@ BUILD_HOTSPOT_JTREG_NATIVE_SRC := \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/jni/PrivateInterfaceMethods \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/jni/ToStringInInterfaceTest \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/jni/CalleeSavedRegisters \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/jni/CallWithJNIWeak \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/jni/ReturnJNIWeak \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/modules/getModuleJNI \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/SameObject \
|
||||
$(HOTSPOT_TOPDIR)/test/runtime/BoolReturn \
|
||||
|
@ -577,7 +577,7 @@ reg_class no_special_reg32_with_fp(
|
||||
R26
|
||||
/* R27, */ // heapbase
|
||||
/* R28, */ // thread
|
||||
/* R29, */ // fp
|
||||
R29, // fp
|
||||
/* R30, */ // lr
|
||||
/* R31 */ // sp
|
||||
);
|
||||
@ -646,7 +646,7 @@ reg_class no_special_reg_with_fp(
|
||||
R26, R26_H,
|
||||
/* R27, R27_H, */ // heapbase
|
||||
/* R28, R28_H, */ // thread
|
||||
/* R29, R29_H, */ // fp
|
||||
R29, R29_H, // fp
|
||||
/* R30, R30_H, */ // lr
|
||||
/* R31, R31_H */ // sp
|
||||
);
|
||||
@ -14021,10 +14021,12 @@ instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlag
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
|
||||
instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, iRegL_R11 tmp, Universe dummy, rFlagsReg cr)
|
||||
instruct clearArray_imm_reg(immL cnt, iRegP_R10 base, Universe dummy, rFlagsReg cr)
|
||||
%{
|
||||
predicate((u_int64_t)n->in(2)->get_long()
|
||||
< (u_int64_t)(BlockZeroingLowLimit >> LogBytesPerWord));
|
||||
match(Set dummy (ClearArray cnt base));
|
||||
effect(USE_KILL base, TEMP tmp);
|
||||
effect(USE_KILL base);
|
||||
|
||||
ins_cost(4 * INSN_COST);
|
||||
format %{ "ClearArray $cnt, $base" %}
|
||||
@ -15501,7 +15503,7 @@ instruct string_compareLU(iRegP_R1 str1, iRegI_R2 cnt1, iRegP_R3 str2, iRegI_R4
|
||||
%}
|
||||
|
||||
instruct string_indexofUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
|
||||
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
|
||||
@ -15520,7 +15522,7 @@ instruct string_indexofUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2
|
||||
%}
|
||||
|
||||
instruct string_indexofLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
|
||||
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
|
||||
@ -15539,7 +15541,7 @@ instruct string_indexofLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2
|
||||
%}
|
||||
|
||||
instruct string_indexofUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
|
||||
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
|
||||
@ -15558,7 +15560,7 @@ instruct string_indexofUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2
|
||||
%}
|
||||
|
||||
instruct string_indexofLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2 cnt2,
|
||||
iRegI_R0 result, iRegI tmp1, iRegI tmp2, iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2, iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 cnt2)));
|
||||
@ -15577,8 +15579,8 @@ instruct string_indexofLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2, iRegI_R2
|
||||
%}
|
||||
|
||||
instruct string_indexof_conUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
|
||||
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
immI_le_4 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2,
|
||||
iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UU);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
|
||||
@ -15598,8 +15600,8 @@ instruct string_indexof_conUU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
%}
|
||||
|
||||
instruct string_indexof_conLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
immI_le_4 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
|
||||
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
immI_le_4 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2,
|
||||
iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LL);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
|
||||
@ -15619,8 +15621,8 @@ instruct string_indexof_conLL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
%}
|
||||
|
||||
instruct string_indexof_conUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
|
||||
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
immI_1 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2,
|
||||
iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::UL);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
|
||||
@ -15640,8 +15642,8 @@ instruct string_indexof_conUL(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
%}
|
||||
|
||||
instruct string_indexof_conLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
immI_1 int_cnt2, iRegI_R0 result, iRegI tmp1, iRegI tmp2,
|
||||
iRegI tmp3, iRegI tmp4, rFlagsReg cr)
|
||||
immI_1 int_cnt2, iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2,
|
||||
iRegINoSp tmp3, iRegINoSp tmp4, rFlagsReg cr)
|
||||
%{
|
||||
predicate(((StrIndexOfNode*)n)->encoding() == StrIntrinsicNode::LU);
|
||||
match(Set result (StrIndexOf (Binary str1 cnt1) (Binary str2 int_cnt2)));
|
||||
@ -15661,8 +15663,8 @@ instruct string_indexof_conLU(iRegP_R1 str1, iRegI_R4 cnt1, iRegP_R3 str2,
|
||||
%}
|
||||
|
||||
instruct string_indexofU_char(iRegP_R1 str1, iRegI_R2 cnt1, iRegI_R3 ch,
|
||||
iRegI_R0 result, iRegI tmp1, iRegI tmp2,
|
||||
iRegI tmp3, rFlagsReg cr)
|
||||
iRegI_R0 result, iRegINoSp tmp1, iRegINoSp tmp2,
|
||||
iRegINoSp tmp3, rFlagsReg cr)
|
||||
%{
|
||||
match(Set result (StrIndexOfChar (Binary str1 cnt1) ch));
|
||||
effect(USE_KILL str1, USE_KILL cnt1, USE_KILL ch,
|
||||
@ -16101,7 +16103,7 @@ instruct replicate2D(vecX dst, vRegD src)
|
||||
|
||||
// ====================REDUCTION ARITHMETIC====================================
|
||||
|
||||
instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp, iRegI tmp2)
|
||||
instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegINoSp tmp, iRegINoSp tmp2)
|
||||
%{
|
||||
match(Set dst (AddReductionVI src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
@ -16120,7 +16122,7 @@ instruct reduce_add2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp, iReg
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2)
|
||||
instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegINoSp tmp2)
|
||||
%{
|
||||
match(Set dst (AddReductionVI src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
@ -16138,7 +16140,7 @@ instruct reduce_add4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp)
|
||||
instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegINoSp tmp)
|
||||
%{
|
||||
match(Set dst (MulReductionVI src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
@ -16157,7 +16159,7 @@ instruct reduce_mul2I(iRegINoSp dst, iRegIorL2I src1, vecD src2, iRegI tmp)
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegI tmp2)
|
||||
instruct reduce_mul4I(iRegINoSp dst, iRegIorL2I src1, vecX src2, vecX tmp, iRegINoSp tmp2)
|
||||
%{
|
||||
match(Set dst (MulReductionVI src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
|
@ -1,8 +1,7 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights All rights reserved.
|
||||
* Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* reserved. DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE
|
||||
* HEADER.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
@ -21,7 +20,6 @@
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -1922,12 +1922,17 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
|
||||
}
|
||||
|
||||
if (opr2->is_constant()) {
|
||||
bool is_32bit = false; // width of register operand
|
||||
jlong imm;
|
||||
|
||||
switch(opr2->type()) {
|
||||
case T_INT:
|
||||
imm = opr2->as_constant_ptr()->as_jint();
|
||||
is_32bit = true;
|
||||
break;
|
||||
case T_LONG:
|
||||
imm = opr2->as_constant_ptr()->as_jlong();
|
||||
break;
|
||||
case T_INT:
|
||||
case T_ADDRESS:
|
||||
imm = opr2->as_constant_ptr()->as_jint();
|
||||
break;
|
||||
@ -1942,14 +1947,14 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
|
||||
}
|
||||
|
||||
if (Assembler::operand_valid_for_add_sub_immediate(imm)) {
|
||||
if (type2aelembytes(opr1->type()) <= 4)
|
||||
if (is_32bit)
|
||||
__ cmpw(reg1, imm);
|
||||
else
|
||||
__ cmp(reg1, imm);
|
||||
return;
|
||||
} else {
|
||||
__ mov(rscratch1, imm);
|
||||
if (type2aelembytes(opr1->type()) <= 4)
|
||||
if (is_32bit)
|
||||
__ cmpw(reg1, rscratch1);
|
||||
else
|
||||
__ cmp(reg1, rscratch1);
|
||||
|
@ -1221,12 +1221,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
obj.load_item();
|
||||
|
||||
// info for exceptions
|
||||
CodeEmitInfo* info_for_exception = state_for(x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
CodeStub* stub;
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception,
|
||||
Deoptimization::Reason_class_check,
|
||||
Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
@ -1340,6 +1347,16 @@ void LIRGenerator::volatile_field_store(LIR_Opr value, LIR_Address* address,
|
||||
|
||||
void LIRGenerator::volatile_field_load(LIR_Address* address, LIR_Opr result,
|
||||
CodeEmitInfo* info) {
|
||||
// 8179954: We need to make sure that the code generated for
|
||||
// volatile accesses forms a sequentially-consistent set of
|
||||
// operations when combined with STLR and LDAR. Without a leading
|
||||
// membar it's possible for a simple Dekker test to fail if loads
|
||||
// use LD;DMB but stores use STLR. This can happen if C2 compiles
|
||||
// the stores in one method and C1 compiles the loads in another.
|
||||
if (! UseBarriersForVolatile) {
|
||||
__ membar();
|
||||
}
|
||||
|
||||
__ volatile_load_mem_reg(address, result, info);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -45,10 +45,8 @@ define_pd_global(bool, TieredCompilation, false);
|
||||
// We compile very aggressively with the builtin simulator because
|
||||
// doing so greatly reduces run times and tests more code.
|
||||
define_pd_global(intx, CompileThreshold, 150 );
|
||||
define_pd_global(intx, BackEdgeThreshold, 500);
|
||||
#else
|
||||
define_pd_global(intx, CompileThreshold, 1500 );
|
||||
define_pd_global(intx, BackEdgeThreshold, 100000);
|
||||
#endif
|
||||
|
||||
define_pd_global(intx, OnStackReplacePercentage, 933 );
|
||||
@ -76,6 +74,4 @@ define_pd_global(bool, OptimizeSinglePrecision, true );
|
||||
define_pd_global(bool, CSEArrayLength, false);
|
||||
define_pd_global(bool, TwoOperandLIRForm, false );
|
||||
|
||||
define_pd_global(intx, SafepointPollOffset, 0 );
|
||||
|
||||
#endif // CPU_AARCH64_VM_C1_GLOBALS_AARCH64_HPP
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -43,7 +43,6 @@ define_pd_global(bool, UseOnStackReplacement, true);
|
||||
define_pd_global(bool, ProfileInterpreter, true);
|
||||
define_pd_global(bool, TieredCompilation, trueInTiered);
|
||||
define_pd_global(intx, CompileThreshold, 10000);
|
||||
define_pd_global(intx, BackEdgeThreshold, 100000);
|
||||
|
||||
define_pd_global(intx, OnStackReplacePercentage, 140);
|
||||
define_pd_global(intx, ConditionalMoveLimit, 3);
|
||||
|
@ -34,10 +34,6 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
|
||||
|
||||
#define SUPPORTS_NATIVE_CX8
|
||||
|
||||
// The maximum B/BL offset range on AArch64 is 128MB.
|
||||
#undef CODE_CACHE_DEFAULT_LIMIT
|
||||
#define CODE_CACHE_DEFAULT_LIMIT (128*M)
|
||||
|
||||
// According to the ARMv8 ARM, "Concurrent modification and execution
|
||||
// of instructions can lead to the resulting instruction performing
|
||||
// any behavior that can be achieved by executing any sequence of
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -82,6 +82,11 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
|
||||
__ eor(robj, robj, rcounter); // obj, since
|
||||
// robj ^ rcounter ^ rcounter == robj
|
||||
// robj is address dependent on rcounter.
|
||||
|
||||
// If mask changes we need to ensure that the inverse is still encodable as an immediate
|
||||
STATIC_ASSERT(JNIHandles::weak_tag_mask == 1);
|
||||
__ andr(robj, robj, ~JNIHandles::weak_tag_mask);
|
||||
|
||||
__ ldr(robj, Address(robj, 0)); // *obj
|
||||
__ lsr(roffset, c_rarg2, 2); // offset
|
||||
|
||||
|
@ -698,6 +698,7 @@ void MacroAssembler::call_VM_helper(Register oop_result, address entry_point, in
|
||||
// trampolines won't be emitted.
|
||||
|
||||
address MacroAssembler::trampoline_call(Address entry, CodeBuffer *cbuf) {
|
||||
assert(JavaThread::current()->is_Compiler_thread(), "just checking");
|
||||
assert(entry.rspec().type() == relocInfo::runtime_call_type
|
||||
|| entry.rspec().type() == relocInfo::opt_virtual_call_type
|
||||
|| entry.rspec().type() == relocInfo::static_call_type
|
||||
@ -4944,34 +4945,67 @@ void MacroAssembler::arrays_equals(Register a1, Register a2,
|
||||
}
|
||||
|
||||
|
||||
// base: Address of a buffer to be zeroed, 8 bytes aligned.
|
||||
// cnt: Count in HeapWords.
|
||||
// is_large: True when 'cnt' is known to be >= BlockZeroingLowLimit.
|
||||
void MacroAssembler::zero_words(Register base, Register cnt)
|
||||
// The size of the blocks erased by the zero_blocks stub. We must
|
||||
// handle anything smaller than this ourselves in zero_words().
|
||||
const int MacroAssembler::zero_words_block_size = 8;
|
||||
|
||||
// zero_words() is used by C2 ClearArray patterns. It is as small as
|
||||
// possible, handling small word counts locally and delegating
|
||||
// anything larger to the zero_blocks stub. It is expanded many times
|
||||
// in compiled code, so it is important to keep it short.
|
||||
|
||||
// ptr: Address of a buffer to be zeroed.
|
||||
// cnt: Count in HeapWords.
|
||||
//
|
||||
// ptr, cnt, rscratch1, and rscratch2 are clobbered.
|
||||
void MacroAssembler::zero_words(Register ptr, Register cnt)
|
||||
{
|
||||
if (UseBlockZeroing) {
|
||||
block_zero(base, cnt);
|
||||
} else {
|
||||
fill_words(base, cnt, zr);
|
||||
assert(is_power_of_2(zero_words_block_size), "adjust this");
|
||||
assert(ptr == r10 && cnt == r11, "mismatch in register usage");
|
||||
|
||||
BLOCK_COMMENT("zero_words {");
|
||||
cmp(cnt, zero_words_block_size);
|
||||
Label around, done, done16;
|
||||
br(LO, around);
|
||||
{
|
||||
RuntimeAddress zero_blocks = RuntimeAddress(StubRoutines::aarch64::zero_blocks());
|
||||
assert(zero_blocks.target() != NULL, "zero_blocks stub has not been generated");
|
||||
if (StubRoutines::aarch64::complete()) {
|
||||
trampoline_call(zero_blocks);
|
||||
} else {
|
||||
bl(zero_blocks);
|
||||
}
|
||||
}
|
||||
bind(around);
|
||||
for (int i = zero_words_block_size >> 1; i > 1; i >>= 1) {
|
||||
Label l;
|
||||
tbz(cnt, exact_log2(i), l);
|
||||
for (int j = 0; j < i; j += 2) {
|
||||
stp(zr, zr, post(ptr, 16));
|
||||
}
|
||||
bind(l);
|
||||
}
|
||||
{
|
||||
Label l;
|
||||
tbz(cnt, 0, l);
|
||||
str(zr, Address(ptr));
|
||||
bind(l);
|
||||
}
|
||||
BLOCK_COMMENT("} zero_words");
|
||||
}
|
||||
|
||||
// r10 = base: Address of a buffer to be zeroed, 8 bytes aligned.
|
||||
// base: Address of a buffer to be zeroed, 8 bytes aligned.
|
||||
// cnt: Immediate count in HeapWords.
|
||||
// r11 = tmp: For use as cnt if we need to call out
|
||||
#define ShortArraySize (18 * BytesPerLong)
|
||||
#define SmallArraySize (18 * BytesPerLong)
|
||||
void MacroAssembler::zero_words(Register base, u_int64_t cnt)
|
||||
{
|
||||
Register tmp = r11;
|
||||
BLOCK_COMMENT("zero_words {");
|
||||
int i = cnt & 1; // store any odd word to start
|
||||
if (i) str(zr, Address(base));
|
||||
|
||||
if (cnt <= ShortArraySize / BytesPerLong) {
|
||||
if (cnt <= SmallArraySize / BytesPerLong) {
|
||||
for (; i < (int)cnt; i += 2)
|
||||
stp(zr, zr, Address(base, i * wordSize));
|
||||
} else if (UseBlockZeroing && cnt >= (u_int64_t)(BlockZeroingLowLimit >> LogBytesPerWord)) {
|
||||
mov(tmp, cnt);
|
||||
block_zero(base, tmp, true);
|
||||
} else {
|
||||
const int unroll = 4; // Number of stp(zr, zr) instructions we'll unroll
|
||||
int remainder = cnt % (2 * unroll);
|
||||
@ -4992,6 +5026,51 @@ void MacroAssembler::zero_words(Register base, u_int64_t cnt)
|
||||
stp(zr, zr, Address(pre(loop_base, 2 * unroll * wordSize)));
|
||||
cbnz(cnt_reg, loop);
|
||||
}
|
||||
BLOCK_COMMENT("} zero_words");
|
||||
}
|
||||
|
||||
// Zero blocks of memory by using DC ZVA.
|
||||
//
|
||||
// Aligns the base address first sufficently for DC ZVA, then uses
|
||||
// DC ZVA repeatedly for every full block. cnt is the size to be
|
||||
// zeroed in HeapWords. Returns the count of words left to be zeroed
|
||||
// in cnt.
|
||||
//
|
||||
// NOTE: This is intended to be used in the zero_blocks() stub. If
|
||||
// you want to use it elsewhere, note that cnt must be >= 2*zva_length.
|
||||
void MacroAssembler::zero_dcache_blocks(Register base, Register cnt) {
|
||||
Register tmp = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
int zva_length = VM_Version::zva_length();
|
||||
Label initial_table_end, loop_zva;
|
||||
Label fini;
|
||||
|
||||
// Base must be 16 byte aligned. If not just return and let caller handle it
|
||||
tst(base, 0x0f);
|
||||
br(Assembler::NE, fini);
|
||||
// Align base with ZVA length.
|
||||
neg(tmp, base);
|
||||
andr(tmp, tmp, zva_length - 1);
|
||||
|
||||
// tmp: the number of bytes to be filled to align the base with ZVA length.
|
||||
add(base, base, tmp);
|
||||
sub(cnt, cnt, tmp, Assembler::ASR, 3);
|
||||
adr(tmp2, initial_table_end);
|
||||
sub(tmp2, tmp2, tmp, Assembler::LSR, 2);
|
||||
br(tmp2);
|
||||
|
||||
for (int i = -zva_length + 16; i < 0; i += 16)
|
||||
stp(zr, zr, Address(base, i));
|
||||
bind(initial_table_end);
|
||||
|
||||
sub(cnt, cnt, zva_length >> 3);
|
||||
bind(loop_zva);
|
||||
dc(Assembler::ZVA, base);
|
||||
subs(cnt, cnt, zva_length >> 3);
|
||||
add(base, base, zva_length);
|
||||
br(Assembler::GE, loop_zva);
|
||||
add(cnt, cnt, zva_length >> 3); // count not zeroed by DC ZVA
|
||||
bind(fini);
|
||||
}
|
||||
|
||||
// base: Address of a buffer to be filled, 8 bytes aligned.
|
||||
@ -5052,69 +5131,6 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value)
|
||||
bind(fini);
|
||||
}
|
||||
|
||||
// Use DC ZVA to do fast zeroing.
|
||||
// base: Address of a buffer to be zeroed, 8 bytes aligned.
|
||||
// cnt: Count in HeapWords.
|
||||
// is_large: True when 'cnt' is known to be >= BlockZeroingLowLimit.
|
||||
void MacroAssembler::block_zero(Register base, Register cnt, bool is_large)
|
||||
{
|
||||
Label small;
|
||||
Label store_pair, loop_store_pair, done;
|
||||
Label base_aligned;
|
||||
|
||||
assert_different_registers(base, cnt, rscratch1);
|
||||
guarantee(base == r10 && cnt == r11, "fix register usage");
|
||||
|
||||
Register tmp = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
int zva_length = VM_Version::zva_length();
|
||||
|
||||
// Ensure ZVA length can be divided by 16. This is required by
|
||||
// the subsequent operations.
|
||||
assert (zva_length % 16 == 0, "Unexpected ZVA Length");
|
||||
|
||||
if (!is_large) cbz(cnt, done);
|
||||
tbz(base, 3, base_aligned);
|
||||
str(zr, Address(post(base, 8)));
|
||||
sub(cnt, cnt, 1);
|
||||
bind(base_aligned);
|
||||
|
||||
// Ensure count >= zva_length * 2 so that it still deserves a zva after
|
||||
// alignment.
|
||||
if (!is_large || !(BlockZeroingLowLimit >= zva_length * 2)) {
|
||||
int low_limit = MAX2(zva_length * 2, (int)BlockZeroingLowLimit);
|
||||
subs(tmp, cnt, low_limit >> 3);
|
||||
br(Assembler::LT, small);
|
||||
}
|
||||
|
||||
far_call(StubRoutines::aarch64::get_zero_longs());
|
||||
|
||||
bind(small);
|
||||
|
||||
const int unroll = 8; // Number of stp instructions we'll unroll
|
||||
Label small_loop, small_table_end;
|
||||
|
||||
andr(tmp, cnt, (unroll-1) * 2);
|
||||
sub(cnt, cnt, tmp);
|
||||
add(base, base, tmp, Assembler::LSL, 3);
|
||||
adr(tmp2, small_table_end);
|
||||
sub(tmp2, tmp2, tmp, Assembler::LSL, 1);
|
||||
br(tmp2);
|
||||
|
||||
bind(small_loop);
|
||||
add(base, base, unroll * 16);
|
||||
for (int i = -unroll; i < 0; i++)
|
||||
stp(zr, zr, Address(base, i * 16));
|
||||
bind(small_table_end);
|
||||
subs(cnt, cnt, unroll * 2);
|
||||
br(Assembler::GE, small_loop);
|
||||
|
||||
tbz(cnt, 0, done);
|
||||
str(zr, Address(post(base, 8)));
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
// Intrinsic for sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray and
|
||||
// java/lang/StringUTF16.compress.
|
||||
void MacroAssembler::encode_iso_array(Register src, Register dst,
|
||||
|
@ -1213,8 +1213,10 @@ public:
|
||||
|
||||
void fill_words(Register base, Register cnt, Register value);
|
||||
void zero_words(Register base, u_int64_t cnt);
|
||||
void zero_words(Register base, Register cnt);
|
||||
void block_zero(Register base, Register cnt, bool is_large = false);
|
||||
void zero_words(Register ptr, Register cnt);
|
||||
void zero_dcache_blocks(Register base, Register cnt);
|
||||
|
||||
static const int zero_words_block_size;
|
||||
|
||||
void byte_array_inflate(Register src, Register dst, Register len,
|
||||
FloatRegister vtmp1, FloatRegister vtmp2,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, 2015, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -2052,13 +2052,31 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
// Unpack oop result
|
||||
// Unbox oop result, e.g. JNIHandles::resolve result.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
Label L;
|
||||
__ cbz(r0, L);
|
||||
__ ldr(r0, Address(r0, 0));
|
||||
__ bind(L);
|
||||
__ verify_oop(r0);
|
||||
Label done, not_weak;
|
||||
__ cbz(r0, done); // Use NULL as-is.
|
||||
STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u);
|
||||
__ tbz(r0, 0, not_weak); // Test for jweak tag.
|
||||
// Resolve jweak.
|
||||
__ ldr(r0, Address(r0, -JNIHandles::weak_tag_value));
|
||||
__ verify_oop(r0);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
__ g1_write_barrier_pre(noreg /* obj */,
|
||||
r0 /* pre_val */,
|
||||
rthread /* thread */,
|
||||
rscratch1 /* tmp */,
|
||||
true /* tosca_live */,
|
||||
true /* expand_call */);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
__ b(done);
|
||||
__ bind(not_weak);
|
||||
// Resolve (untagged) jobject.
|
||||
__ ldr(r0, Address(r0, 0));
|
||||
__ verify_oop(r0);
|
||||
__ bind(done);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -719,48 +719,74 @@ class StubGenerator: public StubCodeGenerator {
|
||||
}
|
||||
}
|
||||
|
||||
address generate_zero_longs(Register base, Register cnt) {
|
||||
Register tmp = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
int zva_length = VM_Version::zva_length();
|
||||
Label initial_table_end, loop_zva;
|
||||
Label fini;
|
||||
// The inner part of zero_words(). This is the bulk operation,
|
||||
// zeroing words in blocks, possibly using DC ZVA to do it. The
|
||||
// caller is responsible for zeroing the last few words.
|
||||
//
|
||||
// Inputs:
|
||||
// r10: the HeapWord-aligned base address of an array to zero.
|
||||
// r11: the count in HeapWords, r11 > 0.
|
||||
//
|
||||
// Returns r10 and r11, adjusted for the caller to clear.
|
||||
// r10: the base address of the tail of words left to clear.
|
||||
// r11: the number of words in the tail.
|
||||
// r11 < MacroAssembler::zero_words_block_size.
|
||||
|
||||
address generate_zero_blocks() {
|
||||
Label store_pair, loop_store_pair, done;
|
||||
Label base_aligned;
|
||||
|
||||
Register base = r10, cnt = r11;
|
||||
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "zero_longs");
|
||||
StubCodeMark mark(this, "StubRoutines", "zero_blocks");
|
||||
address start = __ pc();
|
||||
|
||||
// Base must be 16 byte aligned. If not just return and let caller handle it
|
||||
__ tst(base, 0x0f);
|
||||
__ br(Assembler::NE, fini);
|
||||
// Align base with ZVA length.
|
||||
__ neg(tmp, base);
|
||||
__ andr(tmp, tmp, zva_length - 1);
|
||||
if (UseBlockZeroing) {
|
||||
int zva_length = VM_Version::zva_length();
|
||||
|
||||
// tmp: the number of bytes to be filled to align the base with ZVA length.
|
||||
__ add(base, base, tmp);
|
||||
__ sub(cnt, cnt, tmp, Assembler::ASR, 3);
|
||||
__ adr(tmp2, initial_table_end);
|
||||
__ sub(tmp2, tmp2, tmp, Assembler::LSR, 2);
|
||||
__ br(tmp2);
|
||||
// Ensure ZVA length can be divided by 16. This is required by
|
||||
// the subsequent operations.
|
||||
assert (zva_length % 16 == 0, "Unexpected ZVA Length");
|
||||
|
||||
for (int i = -zva_length + 16; i < 0; i += 16)
|
||||
__ stp(zr, zr, Address(base, i));
|
||||
__ bind(initial_table_end);
|
||||
__ tbz(base, 3, base_aligned);
|
||||
__ str(zr, Address(__ post(base, 8)));
|
||||
__ sub(cnt, cnt, 1);
|
||||
__ bind(base_aligned);
|
||||
|
||||
// Ensure count >= zva_length * 2 so that it still deserves a zva after
|
||||
// alignment.
|
||||
Label small;
|
||||
int low_limit = MAX2(zva_length * 2, (int)BlockZeroingLowLimit);
|
||||
__ cmp(cnt, low_limit >> 3);
|
||||
__ br(Assembler::LT, small);
|
||||
__ zero_dcache_blocks(base, cnt);
|
||||
__ bind(small);
|
||||
}
|
||||
|
||||
{
|
||||
// Number of stp instructions we'll unroll
|
||||
const int unroll =
|
||||
MacroAssembler::zero_words_block_size / 2;
|
||||
// Clear the remaining blocks.
|
||||
Label loop;
|
||||
__ subs(cnt, cnt, unroll * 2);
|
||||
__ br(Assembler::LT, done);
|
||||
__ bind(loop);
|
||||
for (int i = 0; i < unroll; i++)
|
||||
__ stp(zr, zr, __ post(base, 16));
|
||||
__ subs(cnt, cnt, unroll * 2);
|
||||
__ br(Assembler::GE, loop);
|
||||
__ bind(done);
|
||||
__ add(cnt, cnt, unroll * 2);
|
||||
}
|
||||
|
||||
__ sub(cnt, cnt, zva_length >> 3);
|
||||
__ bind(loop_zva);
|
||||
__ dc(Assembler::ZVA, base);
|
||||
__ subs(cnt, cnt, zva_length >> 3);
|
||||
__ add(base, base, zva_length);
|
||||
__ br(Assembler::GE, loop_zva);
|
||||
__ add(cnt, cnt, zva_length >> 3); // count not zeroed by DC ZVA
|
||||
__ bind(fini);
|
||||
__ ret(lr);
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
|
||||
typedef enum {
|
||||
copy_forwards = 1,
|
||||
copy_backwards = -1
|
||||
@ -2346,20 +2372,16 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ subw(count, count, cnt_words, Assembler::LSL, 3 - shift);
|
||||
if (UseBlockZeroing) {
|
||||
Label non_block_zeroing, rest;
|
||||
Register tmp = rscratch1;
|
||||
// count >= BlockZeroingLowLimit && value == 0
|
||||
__ subs(tmp, cnt_words, BlockZeroingLowLimit >> 3);
|
||||
__ ccmp(value, 0 /* comparing value */, 0 /* NZCV */, Assembler::GE);
|
||||
__ br(Assembler::NE, non_block_zeroing);
|
||||
// If the fill value is zero we can use the fast zero_words().
|
||||
__ cbnz(value, non_block_zeroing);
|
||||
__ mov(bz_base, to);
|
||||
__ block_zero(bz_base, cnt_words, true);
|
||||
__ mov(to, bz_base);
|
||||
__ add(to, to, cnt_words, Assembler::LSL, LogBytesPerWord);
|
||||
__ zero_words(bz_base, cnt_words);
|
||||
__ b(rest);
|
||||
__ bind(non_block_zeroing);
|
||||
__ fill_words(to, cnt_words, value);
|
||||
__ bind(rest);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
__ fill_words(to, cnt_words, value);
|
||||
}
|
||||
|
||||
@ -2420,7 +2442,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
generate_copy_longs(copy_f, r0, r1, rscratch2, copy_forwards);
|
||||
generate_copy_longs(copy_b, r0, r1, rscratch2, copy_backwards);
|
||||
|
||||
StubRoutines::aarch64::_zero_longs = generate_zero_longs(r10, r11);
|
||||
StubRoutines::aarch64::_zero_blocks = generate_zero_blocks();
|
||||
|
||||
//*** jbyte
|
||||
// Always need aligned and unaligned versions
|
||||
@ -4769,6 +4791,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
&StubRoutines::_safefetchN_fault_pc,
|
||||
&StubRoutines::_safefetchN_continuation_pc);
|
||||
#endif
|
||||
StubRoutines::aarch64::set_completed();
|
||||
}
|
||||
|
||||
public:
|
||||
|
@ -43,7 +43,8 @@ address StubRoutines::aarch64::_float_sign_mask = NULL;
|
||||
address StubRoutines::aarch64::_float_sign_flip = NULL;
|
||||
address StubRoutines::aarch64::_double_sign_mask = NULL;
|
||||
address StubRoutines::aarch64::_double_sign_flip = NULL;
|
||||
address StubRoutines::aarch64::_zero_longs = NULL;
|
||||
address StubRoutines::aarch64::_zero_blocks = NULL;
|
||||
bool StubRoutines::aarch64::_completed = false;
|
||||
|
||||
/**
|
||||
* crc_table[] from jdk/src/share/native/java/util/zip/zlib-1.2.5/crc32.h
|
||||
|
@ -61,7 +61,8 @@ class aarch64 {
|
||||
static address _double_sign_mask;
|
||||
static address _double_sign_flip;
|
||||
|
||||
static address _zero_longs;
|
||||
static address _zero_blocks;
|
||||
static bool _completed;
|
||||
|
||||
public:
|
||||
|
||||
@ -115,12 +116,19 @@ class aarch64 {
|
||||
return _double_sign_flip;
|
||||
}
|
||||
|
||||
static address get_zero_longs()
|
||||
{
|
||||
return _zero_longs;
|
||||
static address zero_blocks() {
|
||||
return _zero_blocks;
|
||||
}
|
||||
|
||||
private:
|
||||
static bool complete() {
|
||||
return _completed;
|
||||
}
|
||||
|
||||
static void set_completed() {
|
||||
_completed = true;
|
||||
}
|
||||
|
||||
private:
|
||||
static juint _crc_table[];
|
||||
|
||||
};
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -1399,13 +1399,32 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
// and result handler will pick it up
|
||||
|
||||
{
|
||||
Label no_oop, store_result;
|
||||
Label no_oop, not_weak, store_result;
|
||||
__ adr(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
|
||||
__ cmp(t, result_handler);
|
||||
__ br(Assembler::NE, no_oop);
|
||||
// retrieve result
|
||||
// Unbox oop result, e.g. JNIHandles::resolve result.
|
||||
__ pop(ltos);
|
||||
__ cbz(r0, store_result);
|
||||
__ cbz(r0, store_result); // Use NULL as-is.
|
||||
STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u);
|
||||
__ tbz(r0, 0, not_weak); // Test for jweak tag.
|
||||
// Resolve jweak.
|
||||
__ ldr(r0, Address(r0, -JNIHandles::weak_tag_value));
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
__ enter(); // Barrier may call runtime.
|
||||
__ g1_write_barrier_pre(noreg /* obj */,
|
||||
r0 /* pre_val */,
|
||||
rthread /* thread */,
|
||||
t /* tmp */,
|
||||
true /* tosca_live */,
|
||||
true /* expand_call */);
|
||||
__ leave();
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
__ b(store_result);
|
||||
__ bind(not_weak);
|
||||
// Resolve (untagged) jobject.
|
||||
__ ldr(r0, Address(r0, 0));
|
||||
__ bind(store_result);
|
||||
__ str(r0, Address(rfp, frame::interpreter_frame_oop_temp_offset*wordSize));
|
||||
|
@ -2389,17 +2389,31 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
|
||||
const Register obj = r4;
|
||||
const Register off = r19;
|
||||
const Register flags = r0;
|
||||
const Register raw_flags = r6;
|
||||
const Register bc = r4; // uses same reg as obj, so don't mix them
|
||||
|
||||
resolve_cache_and_index(byte_no, cache, index, sizeof(u2));
|
||||
jvmti_post_field_access(cache, index, is_static, false);
|
||||
load_field_cp_cache_entry(obj, cache, index, off, flags, is_static);
|
||||
load_field_cp_cache_entry(obj, cache, index, off, raw_flags, is_static);
|
||||
|
||||
if (!is_static) {
|
||||
// obj is on the stack
|
||||
pop_and_check_object(obj);
|
||||
}
|
||||
|
||||
// 8179954: We need to make sure that the code generated for
|
||||
// volatile accesses forms a sequentially-consistent set of
|
||||
// operations when combined with STLR and LDAR. Without a leading
|
||||
// membar it's possible for a simple Dekker test to fail if loads
|
||||
// use LDR;DMB but stores use STLR. This can happen if C2 compiles
|
||||
// the stores in one method and we interpret the loads in another.
|
||||
if (! UseBarriersForVolatile) {
|
||||
Label notVolatile;
|
||||
__ tbz(raw_flags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ bind(notVolatile);
|
||||
}
|
||||
|
||||
const Address field(obj, off);
|
||||
|
||||
Label Done, notByte, notBool, notInt, notShort, notChar,
|
||||
@ -2407,7 +2421,8 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
|
||||
|
||||
// x86 uses a shift and mask or wings it with a shift plus assert
|
||||
// the mask is not needed. aarch64 just uses bitfield extract
|
||||
__ ubfxw(flags, flags, ConstantPoolCacheEntry::tos_state_shift, ConstantPoolCacheEntry::tos_state_bits);
|
||||
__ ubfxw(flags, raw_flags, ConstantPoolCacheEntry::tos_state_shift,
|
||||
ConstantPoolCacheEntry::tos_state_bits);
|
||||
|
||||
assert(btos == 0, "change code, btos != 0");
|
||||
__ cbnz(flags, notByte);
|
||||
@ -2529,9 +2544,11 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
|
||||
#endif
|
||||
|
||||
__ bind(Done);
|
||||
// It's really not worth bothering to check whether this field
|
||||
// really is volatile in the slow case.
|
||||
|
||||
Label notVolatile;
|
||||
__ tbz(raw_flags, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
|
||||
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
|
||||
__ bind(notVolatile);
|
||||
}
|
||||
|
||||
|
||||
@ -2979,6 +2996,19 @@ void TemplateTable::fast_accessfield(TosState state)
|
||||
__ null_check(r0);
|
||||
const Address field(r0, r1);
|
||||
|
||||
// 8179954: We need to make sure that the code generated for
|
||||
// volatile accesses forms a sequentially-consistent set of
|
||||
// operations when combined with STLR and LDAR. Without a leading
|
||||
// membar it's possible for a simple Dekker test to fail if loads
|
||||
// use LDR;DMB but stores use STLR. This can happen if C2 compiles
|
||||
// the stores in one method and we interpret the loads in another.
|
||||
if (! UseBarriersForVolatile) {
|
||||
Label notVolatile;
|
||||
__ tbz(r3, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ bind(notVolatile);
|
||||
}
|
||||
|
||||
// access field
|
||||
switch (bytecode()) {
|
||||
case Bytecodes::_fast_agetfield:
|
||||
@ -3027,6 +3057,22 @@ void TemplateTable::fast_xaccess(TosState state)
|
||||
__ get_cache_and_index_at_bcp(r2, r3, 2);
|
||||
__ ldr(r1, Address(r2, in_bytes(ConstantPoolCache::base_offset() +
|
||||
ConstantPoolCacheEntry::f2_offset())));
|
||||
|
||||
// 8179954: We need to make sure that the code generated for
|
||||
// volatile accesses forms a sequentially-consistent set of
|
||||
// operations when combined with STLR and LDAR. Without a leading
|
||||
// membar it's possible for a simple Dekker test to fail if loads
|
||||
// use LDR;DMB but stores use STLR. This can happen if C2 compiles
|
||||
// the stores in one method and we interpret the loads in another.
|
||||
if (! UseBarriersForVolatile) {
|
||||
Label notVolatile;
|
||||
__ ldrw(r3, Address(r2, in_bytes(ConstantPoolCache::base_offset() +
|
||||
ConstantPoolCacheEntry::flags_offset())));
|
||||
__ tbz(r3, ConstantPoolCacheEntry::is_volatile_shift, notVolatile);
|
||||
__ membar(MacroAssembler::AnyAny);
|
||||
__ bind(notVolatile);
|
||||
}
|
||||
|
||||
// make sure exception is reported in correct bcp range (getfield is
|
||||
// next instruction)
|
||||
__ increment(rbcp);
|
||||
|
@ -1453,10 +1453,11 @@ void LIR_Assembler::emit_opTypeCheck(LIR_OpTypeCheck* op) {
|
||||
ciKlass* k = op->klass();
|
||||
assert_different_registers(res, k_RInfo, klass_RInfo, Rtemp);
|
||||
|
||||
if (stub->is_simple_exception_stub()) {
|
||||
// TODO: ARM - Late binding is used to prevent confusion of register allocator
|
||||
assert(stub->is_exception_throw_stub(), "must be");
|
||||
((SimpleExceptionStub*)stub)->set_obj(op->result_opr());
|
||||
|
||||
}
|
||||
ciMethodData* md;
|
||||
ciProfileData* data;
|
||||
int mdo_offset_bias = 0;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1412,12 +1412,20 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
|
||||
obj.load_item();
|
||||
|
||||
CodeEmitInfo* info_for_exception = state_for(x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
CodeStub* stub;
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id,
|
||||
LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception,
|
||||
Deoptimization::Reason_class_check,
|
||||
Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id,
|
||||
LIR_OprFact::illegalOpr, info_for_exception);
|
||||
|
@ -618,7 +618,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
Address buffer(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() +
|
||||
DirtyCardQueue::byte_offset_of_buf()));
|
||||
|
||||
AddressLiteral cardtable((address)ct->byte_map_base);
|
||||
AddressLiteral cardtable((address)ct->byte_map_base, relocInfo::none);
|
||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||
|
||||
// save at least the registers that need saving if the runtime is called
|
||||
@ -645,7 +645,7 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
|
||||
// Note: there is a comment in x86 code about not using
|
||||
// ExternalAddress / lea, due to relocation not working
|
||||
// properly for that address. Should be OK for arm, where we
|
||||
// explicitly specify that 'cartable' has a relocInfo::none
|
||||
// explicitly specify that 'cardtable' has a relocInfo::none
|
||||
// type.
|
||||
__ lea(r_card_base_1, cardtable);
|
||||
__ add(r_card_addr_0, r_card_base_1, AsmOperand(r_obj_0, lsr, CardTableModRefBS::card_shift));
|
||||
|
@ -85,17 +85,17 @@ address CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf, address mark)
|
||||
}
|
||||
#undef __
|
||||
|
||||
// size of C2 call stub, compiled java to interpretor
|
||||
int CompiledStaticCall::to_interp_stub_size() {
|
||||
return 8 * NativeInstruction::instruction_size;
|
||||
}
|
||||
|
||||
// Relocation entries for call stub, compiled java to interpreter.
|
||||
int CompiledStaticCall::reloc_to_interp_stub() {
|
||||
return 10; // 4 in emit_to_interp_stub + 1 in Java_Static_Call
|
||||
}
|
||||
#endif // COMPILER2 || JVMCI
|
||||
|
||||
// size of C2 call stub, compiled java to interpretor
|
||||
int CompiledStaticCall::to_interp_stub_size() {
|
||||
return 8 * NativeInstruction::instruction_size;
|
||||
}
|
||||
|
||||
void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, address entry) {
|
||||
address stub = find_stub(/*is_aot*/ false);
|
||||
guarantee(stub != NULL, "stub not found");
|
||||
@ -125,6 +125,8 @@ void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, ad
|
||||
method_holder->set_data((intptr_t)callee());
|
||||
jump->set_jump_destination(entry);
|
||||
|
||||
ICache::invalidate_range(stub, to_interp_stub_size());
|
||||
|
||||
// Update jump to call.
|
||||
set_destination_mt_safe(stub);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -476,185 +476,6 @@ void InterpreterMacroAssembler::set_card(Register card_table_base, Address card_
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
// G1 pre-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
// If store_addr != noreg, then previous value is loaded from [store_addr];
|
||||
// in such case store_addr and new_val registers are preserved;
|
||||
// otherwise pre_val register is preserved.
|
||||
void InterpreterMacroAssembler::g1_write_barrier_pre(Register store_addr,
|
||||
Register new_val,
|
||||
Register pre_val,
|
||||
Register tmp1,
|
||||
Register tmp2) {
|
||||
Label done;
|
||||
Label runtime;
|
||||
|
||||
if (store_addr != noreg) {
|
||||
assert_different_registers(store_addr, new_val, pre_val, tmp1, tmp2, noreg);
|
||||
} else {
|
||||
assert (new_val == noreg, "should be");
|
||||
assert_different_registers(pre_val, tmp1, tmp2, noreg);
|
||||
}
|
||||
|
||||
Address in_progress(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_active()));
|
||||
Address index(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_index()));
|
||||
Address buffer(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_buf()));
|
||||
|
||||
// Is marking active?
|
||||
assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "adjust this code");
|
||||
ldrb(tmp1, in_progress);
|
||||
cbz(tmp1, done);
|
||||
|
||||
// Do we need to load the previous value?
|
||||
if (store_addr != noreg) {
|
||||
load_heap_oop(pre_val, Address(store_addr, 0));
|
||||
}
|
||||
|
||||
// Is the previous value null?
|
||||
cbz(pre_val, done);
|
||||
|
||||
// Can we store original value in the thread's buffer?
|
||||
// Is index == 0?
|
||||
// (The index field is typed as size_t.)
|
||||
|
||||
ldr(tmp1, index); // tmp1 := *index_adr
|
||||
ldr(tmp2, buffer);
|
||||
|
||||
subs(tmp1, tmp1, wordSize); // tmp1 := tmp1 - wordSize
|
||||
b(runtime, lt); // If negative, goto runtime
|
||||
|
||||
str(tmp1, index); // *index_adr := tmp1
|
||||
|
||||
// Record the previous value
|
||||
str(pre_val, Address(tmp2, tmp1));
|
||||
b(done);
|
||||
|
||||
bind(runtime);
|
||||
|
||||
// save the live input values
|
||||
#ifdef AARCH64
|
||||
if (store_addr != noreg) {
|
||||
raw_push(store_addr, new_val);
|
||||
} else {
|
||||
raw_push(pre_val, ZR);
|
||||
}
|
||||
#else
|
||||
if (store_addr != noreg) {
|
||||
// avoid raw_push to support any ordering of store_addr and new_val
|
||||
push(RegisterSet(store_addr) | RegisterSet(new_val));
|
||||
} else {
|
||||
push(pre_val);
|
||||
}
|
||||
#endif // AARCH64
|
||||
|
||||
if (pre_val != R0) {
|
||||
mov(R0, pre_val);
|
||||
}
|
||||
mov(R1, Rthread);
|
||||
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), R0, R1);
|
||||
|
||||
#ifdef AARCH64
|
||||
if (store_addr != noreg) {
|
||||
raw_pop(store_addr, new_val);
|
||||
} else {
|
||||
raw_pop(pre_val, ZR);
|
||||
}
|
||||
#else
|
||||
if (store_addr != noreg) {
|
||||
pop(RegisterSet(store_addr) | RegisterSet(new_val));
|
||||
} else {
|
||||
pop(pre_val);
|
||||
}
|
||||
#endif // AARCH64
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
// G1 post-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
void InterpreterMacroAssembler::g1_write_barrier_post(Register store_addr,
|
||||
Register new_val,
|
||||
Register tmp1,
|
||||
Register tmp2,
|
||||
Register tmp3) {
|
||||
|
||||
Address queue_index(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() +
|
||||
DirtyCardQueue::byte_offset_of_index()));
|
||||
Address buffer(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() +
|
||||
DirtyCardQueue::byte_offset_of_buf()));
|
||||
|
||||
BarrierSet* bs = Universe::heap()->barrier_set();
|
||||
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
||||
Label done;
|
||||
Label runtime;
|
||||
|
||||
// Does store cross heap regions?
|
||||
|
||||
eor(tmp1, store_addr, new_val);
|
||||
#ifdef AARCH64
|
||||
logical_shift_right(tmp1, tmp1, HeapRegion::LogOfHRGrainBytes);
|
||||
cbz(tmp1, done);
|
||||
#else
|
||||
movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes));
|
||||
b(done, eq);
|
||||
#endif
|
||||
|
||||
// crosses regions, storing NULL?
|
||||
|
||||
cbz(new_val, done);
|
||||
|
||||
// storing region crossing non-NULL, is card already dirty?
|
||||
const Register card_addr = tmp1;
|
||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||
|
||||
mov_address(tmp2, (address)ct->byte_map_base, symbolic_Relocation::card_table_reference);
|
||||
add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTableModRefBS::card_shift));
|
||||
|
||||
ldrb(tmp2, Address(card_addr));
|
||||
cmp(tmp2, (int)G1SATBCardTableModRefBS::g1_young_card_val());
|
||||
b(done, eq);
|
||||
|
||||
membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2);
|
||||
|
||||
assert(CardTableModRefBS::dirty_card_val() == 0, "adjust this code");
|
||||
ldrb(tmp2, Address(card_addr));
|
||||
cbz(tmp2, done);
|
||||
|
||||
// storing a region crossing, non-NULL oop, card is clean.
|
||||
// dirty card and log.
|
||||
|
||||
strb(zero_register(tmp2), Address(card_addr));
|
||||
|
||||
ldr(tmp2, queue_index);
|
||||
ldr(tmp3, buffer);
|
||||
|
||||
subs(tmp2, tmp2, wordSize);
|
||||
b(runtime, lt); // go to runtime if now negative
|
||||
|
||||
str(tmp2, queue_index);
|
||||
|
||||
str(card_addr, Address(tmp3, tmp2));
|
||||
b(done);
|
||||
|
||||
bind(runtime);
|
||||
|
||||
if (card_addr != R0) {
|
||||
mov(R0, card_addr);
|
||||
}
|
||||
mov(R1, Rthread);
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), R0, R1);
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// Java Expression Stack
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -146,27 +146,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
|
||||
void set_card(Register card_table_base, Address card_table_addr, Register tmp);
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
// G1 pre-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
// If store_addr != noreg, then previous value is loaded from [store_addr];
|
||||
// in such case store_addr and new_val registers are preserved;
|
||||
// otherwise pre_val register is preserved.
|
||||
void g1_write_barrier_pre(Register store_addr,
|
||||
Register new_val,
|
||||
Register pre_val,
|
||||
Register tmp1,
|
||||
Register tmp2);
|
||||
|
||||
// G1 post-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
void g1_write_barrier_post(Register store_addr,
|
||||
Register new_val,
|
||||
Register tmp1,
|
||||
Register tmp2,
|
||||
Register tmp3);
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
|
||||
void pop_ptr(Register r);
|
||||
void pop_i(Register r = R0_tos);
|
||||
#ifdef AARCH64
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -119,6 +119,14 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
|
||||
__ ldr_s32(Rsafept_cnt, Address(Rsafepoint_counter_addr));
|
||||
__ tbnz(Rsafept_cnt, 0, slow_case);
|
||||
|
||||
#ifdef AARCH64
|
||||
// If mask changes we need to ensure that the inverse is still encodable as an immediate
|
||||
STATIC_ASSERT(JNIHandles::weak_tag_mask == 1);
|
||||
__ andr(R1, R1, ~JNIHandles::weak_tag_mask);
|
||||
#else
|
||||
__ bic(R1, R1, JNIHandles::weak_tag_mask);
|
||||
#endif
|
||||
|
||||
if (os::is_MP()) {
|
||||
// Address dependency restricts memory access ordering. It's cheaper than explicit LoadLoad barrier
|
||||
__ andr(Rtmp1, Rsafept_cnt, (unsigned)1);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2211,6 +2211,219 @@ void MacroAssembler::biased_locking_exit(Register obj_reg, Register tmp_reg, Lab
|
||||
b(done, eq);
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::resolve_jobject(Register value,
|
||||
Register tmp1,
|
||||
Register tmp2) {
|
||||
assert_different_registers(value, tmp1, tmp2);
|
||||
Label done, not_weak;
|
||||
cbz(value, done); // Use NULL as-is.
|
||||
STATIC_ASSERT(JNIHandles::weak_tag_mask == 1u);
|
||||
tbz(value, 0, not_weak); // Test for jweak tag.
|
||||
// Resolve jweak.
|
||||
ldr(value, Address(value, -JNIHandles::weak_tag_value));
|
||||
verify_oop(value);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
g1_write_barrier_pre(noreg, // store_addr
|
||||
noreg, // new_val
|
||||
value, // pre_val
|
||||
tmp1, // tmp1
|
||||
tmp2); // tmp2
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
b(done);
|
||||
bind(not_weak);
|
||||
// Resolve (untagged) jobject.
|
||||
ldr(value, Address(value));
|
||||
verify_oop(value);
|
||||
bind(done);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
// G1 pre-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
// If store_addr != noreg, then previous value is loaded from [store_addr];
|
||||
// in such case store_addr and new_val registers are preserved;
|
||||
// otherwise pre_val register is preserved.
|
||||
void MacroAssembler::g1_write_barrier_pre(Register store_addr,
|
||||
Register new_val,
|
||||
Register pre_val,
|
||||
Register tmp1,
|
||||
Register tmp2) {
|
||||
Label done;
|
||||
Label runtime;
|
||||
|
||||
if (store_addr != noreg) {
|
||||
assert_different_registers(store_addr, new_val, pre_val, tmp1, tmp2, noreg);
|
||||
} else {
|
||||
assert (new_val == noreg, "should be");
|
||||
assert_different_registers(pre_val, tmp1, tmp2, noreg);
|
||||
}
|
||||
|
||||
Address in_progress(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_active()));
|
||||
Address index(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_index()));
|
||||
Address buffer(Rthread, in_bytes(JavaThread::satb_mark_queue_offset() +
|
||||
SATBMarkQueue::byte_offset_of_buf()));
|
||||
|
||||
// Is marking active?
|
||||
assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "adjust this code");
|
||||
ldrb(tmp1, in_progress);
|
||||
cbz(tmp1, done);
|
||||
|
||||
// Do we need to load the previous value?
|
||||
if (store_addr != noreg) {
|
||||
load_heap_oop(pre_val, Address(store_addr, 0));
|
||||
}
|
||||
|
||||
// Is the previous value null?
|
||||
cbz(pre_val, done);
|
||||
|
||||
// Can we store original value in the thread's buffer?
|
||||
// Is index == 0?
|
||||
// (The index field is typed as size_t.)
|
||||
|
||||
ldr(tmp1, index); // tmp1 := *index_adr
|
||||
ldr(tmp2, buffer);
|
||||
|
||||
subs(tmp1, tmp1, wordSize); // tmp1 := tmp1 - wordSize
|
||||
b(runtime, lt); // If negative, goto runtime
|
||||
|
||||
str(tmp1, index); // *index_adr := tmp1
|
||||
|
||||
// Record the previous value
|
||||
str(pre_val, Address(tmp2, tmp1));
|
||||
b(done);
|
||||
|
||||
bind(runtime);
|
||||
|
||||
// save the live input values
|
||||
#ifdef AARCH64
|
||||
if (store_addr != noreg) {
|
||||
raw_push(store_addr, new_val);
|
||||
} else {
|
||||
raw_push(pre_val, ZR);
|
||||
}
|
||||
#else
|
||||
if (store_addr != noreg) {
|
||||
// avoid raw_push to support any ordering of store_addr and new_val
|
||||
push(RegisterSet(store_addr) | RegisterSet(new_val));
|
||||
} else {
|
||||
push(pre_val);
|
||||
}
|
||||
#endif // AARCH64
|
||||
|
||||
if (pre_val != R0) {
|
||||
mov(R0, pre_val);
|
||||
}
|
||||
mov(R1, Rthread);
|
||||
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_pre), R0, R1);
|
||||
|
||||
#ifdef AARCH64
|
||||
if (store_addr != noreg) {
|
||||
raw_pop(store_addr, new_val);
|
||||
} else {
|
||||
raw_pop(pre_val, ZR);
|
||||
}
|
||||
#else
|
||||
if (store_addr != noreg) {
|
||||
pop(RegisterSet(store_addr) | RegisterSet(new_val));
|
||||
} else {
|
||||
pop(pre_val);
|
||||
}
|
||||
#endif // AARCH64
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
// G1 post-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
void MacroAssembler::g1_write_barrier_post(Register store_addr,
|
||||
Register new_val,
|
||||
Register tmp1,
|
||||
Register tmp2,
|
||||
Register tmp3) {
|
||||
|
||||
Address queue_index(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() +
|
||||
DirtyCardQueue::byte_offset_of_index()));
|
||||
Address buffer(Rthread, in_bytes(JavaThread::dirty_card_queue_offset() +
|
||||
DirtyCardQueue::byte_offset_of_buf()));
|
||||
|
||||
BarrierSet* bs = Universe::heap()->barrier_set();
|
||||
CardTableModRefBS* ct = (CardTableModRefBS*)bs;
|
||||
Label done;
|
||||
Label runtime;
|
||||
|
||||
// Does store cross heap regions?
|
||||
|
||||
eor(tmp1, store_addr, new_val);
|
||||
#ifdef AARCH64
|
||||
logical_shift_right(tmp1, tmp1, HeapRegion::LogOfHRGrainBytes);
|
||||
cbz(tmp1, done);
|
||||
#else
|
||||
movs(tmp1, AsmOperand(tmp1, lsr, HeapRegion::LogOfHRGrainBytes));
|
||||
b(done, eq);
|
||||
#endif
|
||||
|
||||
// crosses regions, storing NULL?
|
||||
|
||||
cbz(new_val, done);
|
||||
|
||||
// storing region crossing non-NULL, is card already dirty?
|
||||
const Register card_addr = tmp1;
|
||||
assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
|
||||
|
||||
mov_address(tmp2, (address)ct->byte_map_base, symbolic_Relocation::card_table_reference);
|
||||
add(card_addr, tmp2, AsmOperand(store_addr, lsr, CardTableModRefBS::card_shift));
|
||||
|
||||
ldrb(tmp2, Address(card_addr));
|
||||
cmp(tmp2, (int)G1SATBCardTableModRefBS::g1_young_card_val());
|
||||
b(done, eq);
|
||||
|
||||
membar(MacroAssembler::Membar_mask_bits(MacroAssembler::StoreLoad), tmp2);
|
||||
|
||||
assert(CardTableModRefBS::dirty_card_val() == 0, "adjust this code");
|
||||
ldrb(tmp2, Address(card_addr));
|
||||
cbz(tmp2, done);
|
||||
|
||||
// storing a region crossing, non-NULL oop, card is clean.
|
||||
// dirty card and log.
|
||||
|
||||
strb(zero_register(tmp2), Address(card_addr));
|
||||
|
||||
ldr(tmp2, queue_index);
|
||||
ldr(tmp3, buffer);
|
||||
|
||||
subs(tmp2, tmp2, wordSize);
|
||||
b(runtime, lt); // go to runtime if now negative
|
||||
|
||||
str(tmp2, queue_index);
|
||||
|
||||
str(card_addr, Address(tmp3, tmp2));
|
||||
b(done);
|
||||
|
||||
bind(runtime);
|
||||
|
||||
if (card_addr != R0) {
|
||||
mov(R0, card_addr);
|
||||
}
|
||||
mov(R1, Rthread);
|
||||
call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::g1_wb_post), R0, R1);
|
||||
|
||||
bind(done);
|
||||
}
|
||||
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef AARCH64
|
||||
|
||||
void MacroAssembler::load_sized_value(Register dst, Address src, size_t size_in_bytes, bool is_signed) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -402,6 +402,29 @@ public:
|
||||
void biased_locking_enter_with_cas(Register obj_reg, Register old_mark_reg, Register new_mark_reg,
|
||||
Register tmp, Label& slow_case, int* counter_addr);
|
||||
|
||||
void resolve_jobject(Register value, Register tmp1, Register tmp2);
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
// G1 pre-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
// If store_addr != noreg, then previous value is loaded from [store_addr];
|
||||
// in such case store_addr and new_val registers are preserved;
|
||||
// otherwise pre_val register is preserved.
|
||||
void g1_write_barrier_pre(Register store_addr,
|
||||
Register new_val,
|
||||
Register pre_val,
|
||||
Register tmp1,
|
||||
Register tmp2);
|
||||
|
||||
// G1 post-barrier.
|
||||
// Blows all volatile registers (R0-R3 on 32-bit ARM, R0-R18 on AArch64, Rtemp, LR).
|
||||
void g1_write_barrier_post(Register store_addr,
|
||||
Register new_val,
|
||||
Register tmp1,
|
||||
Register tmp2,
|
||||
Register tmp3);
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
|
||||
#ifndef AARCH64
|
||||
void nop() {
|
||||
mov(R0, R0);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1732,14 +1732,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
case T_FLOAT : // fall through
|
||||
case T_DOUBLE : /* nothing to do */ break;
|
||||
case T_OBJECT : // fall through
|
||||
case T_ARRAY : {
|
||||
Label L;
|
||||
__ cbz(R0, L);
|
||||
__ ldr(R0, Address(R0));
|
||||
__ verify_oop(R0);
|
||||
__ bind(L);
|
||||
break;
|
||||
}
|
||||
case T_ARRAY : break; // See JNIHandles::resolve below
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
@ -1748,14 +1741,15 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
if (CheckJNICalls) {
|
||||
__ str(__ zero_register(Rtemp), Address(Rthread, JavaThread::pending_jni_exception_check_fn_offset()));
|
||||
}
|
||||
|
||||
// Unhandle the result
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
__ cmp(R0, 0);
|
||||
__ ldr(R0, Address(R0), ne);
|
||||
}
|
||||
#endif // AARCH64
|
||||
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value in R0.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
__ resolve_jobject(R0, // value
|
||||
Rtemp, // tmp1
|
||||
R1_tmp); // tmp2
|
||||
}
|
||||
|
||||
// Any exception pending?
|
||||
__ ldr(Rtemp, Address(Rthread, Thread::pending_exception_offset()));
|
||||
__ mov(SP, FP);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1240,28 +1240,25 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
__ str(__ zero_register(Rtemp), Address(Rthread, JavaThread::pending_jni_exception_check_fn_offset()));
|
||||
}
|
||||
|
||||
// Unbox if the result is non-zero object
|
||||
#ifdef AARCH64
|
||||
// Unbox oop result, e.g. JNIHandles::resolve result if it's an oop.
|
||||
{
|
||||
Label L, Lnull;
|
||||
Label Lnot_oop;
|
||||
#ifdef AARCH64
|
||||
__ mov_slow(Rtemp, AbstractInterpreter::result_handler(T_OBJECT));
|
||||
__ cmp(Rresult_handler, Rtemp);
|
||||
__ b(L, ne);
|
||||
__ cbz(Rsaved_result, Lnull);
|
||||
__ ldr(Rsaved_result, Address(Rsaved_result));
|
||||
__ bind(Lnull);
|
||||
// Store oop on the stack for GC
|
||||
__ str(Rsaved_result, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
|
||||
__ bind(L);
|
||||
__ b(Lnot_oop, ne);
|
||||
#else // !AARCH64
|
||||
// For ARM32, Rresult_handler is -1 for oop result, 0 otherwise.
|
||||
__ cbz(Rresult_handler, Lnot_oop);
|
||||
#endif // !AARCH64
|
||||
Register value = AARCH64_ONLY(Rsaved_result) NOT_AARCH64(Rsaved_result_lo);
|
||||
__ resolve_jobject(value, // value
|
||||
Rtemp, // tmp1
|
||||
R1_tmp); // tmp2
|
||||
// Store resolved result in frame for GC visibility.
|
||||
__ str(value, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize));
|
||||
__ bind(Lnot_oop);
|
||||
}
|
||||
#else
|
||||
__ tst(Rsaved_result_lo, Rresult_handler);
|
||||
__ ldr(Rsaved_result_lo, Address(Rsaved_result_lo), ne);
|
||||
|
||||
// Store oop on the stack for GC
|
||||
__ cmp(Rresult_handler, 0);
|
||||
__ str(Rsaved_result_lo, Address(FP, frame::interpreter_frame_oop_temp_offset * wordSize), ne);
|
||||
#endif // AARCH64
|
||||
|
||||
#ifdef AARCH64
|
||||
// Restore SP (drop native parameters area), to keep SP in sync with extended_sp in frame
|
||||
|
@ -1131,12 +1131,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
obj.load_item();
|
||||
LIR_Opr out_reg = rlock_result(x);
|
||||
CodeStub* stub;
|
||||
CodeEmitInfo* info_for_exception = state_for(x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id,
|
||||
LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception,
|
||||
Deoptimization::Reason_class_check,
|
||||
Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2015 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2000, 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
|
||||
@ -171,10 +171,7 @@ BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result)
|
||||
switch (method->result_type()) {
|
||||
case T_OBJECT:
|
||||
case T_ARRAY: {
|
||||
oop* obj_p = *(oop**)lresult;
|
||||
oop obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
|
||||
assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
|
||||
*oop_result = obj;
|
||||
*oop_result = JNIHandles::resolve(*(jobject*)lresult);
|
||||
break;
|
||||
}
|
||||
// We use std/stfd to store the values.
|
||||
|
@ -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
|
||||
@ -3033,6 +3033,34 @@ void MacroAssembler::card_table_write(jbyte* byte_map_base, Register Rtmp, Regis
|
||||
stbx(R0, Rtmp, Robj);
|
||||
}
|
||||
|
||||
// Kills R31 if value is a volatile register.
|
||||
void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp2, bool needs_frame) {
|
||||
Label done;
|
||||
cmpdi(CCR0, value, 0);
|
||||
beq(CCR0, done); // Use NULL as-is.
|
||||
|
||||
clrrdi(tmp1, value, JNIHandles::weak_tag_size);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) { andi_(tmp2, value, JNIHandles::weak_tag_mask); }
|
||||
#endif
|
||||
ld(value, 0, tmp1); // Resolve (untagged) jobject.
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
Label not_weak;
|
||||
beq(CCR0, not_weak); // Test for jweak tag.
|
||||
verify_oop(value);
|
||||
g1_write_barrier_pre(noreg, // obj
|
||||
noreg, // offset
|
||||
value, // pre_val
|
||||
tmp1, tmp2, needs_frame);
|
||||
bind(not_weak);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
verify_oop(value);
|
||||
bind(done);
|
||||
}
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
// General G1 pre-barrier generator.
|
||||
// Goal: record the previous value if it is not null.
|
||||
@ -3094,7 +3122,7 @@ void MacroAssembler::g1_write_barrier_pre(Register Robj, RegisterOrConstant offs
|
||||
|
||||
bind(runtime);
|
||||
|
||||
// VM call need frame to access(write) O register.
|
||||
// May need to preserve LR. Also needed if current frame is not compatible with C calling convention.
|
||||
if (needs_frame) {
|
||||
save_LR_CR(Rtmp1);
|
||||
push_frame_reg_args(0, Rtmp2);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2016 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2002, 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
|
||||
@ -649,6 +649,8 @@ class MacroAssembler: public Assembler {
|
||||
void card_write_barrier_post(Register Rstore_addr, Register Rnew_val, Register Rtmp);
|
||||
void card_table_write(jbyte* byte_map_base, Register Rtmp, Register Robj);
|
||||
|
||||
void resolve_jobject(Register value, Register tmp1, Register tmp2, bool needs_frame);
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
// General G1 pre-barrier generator.
|
||||
void g1_write_barrier_pre(Register Robj, RegisterOrConstant offset, Register Rpre_val,
|
||||
|
@ -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
|
||||
@ -2477,16 +2477,11 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
||||
|
||||
__ reset_last_Java_frame();
|
||||
|
||||
// Unpack oop result.
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value.
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
Label skip_unboxing;
|
||||
__ cmpdi(CCR0, R3_RET, 0);
|
||||
__ beq(CCR0, skip_unboxing);
|
||||
__ ld(R3_RET, 0, R3_RET);
|
||||
__ bind(skip_unboxing);
|
||||
__ verify_oop(R3_RET);
|
||||
__ resolve_jobject(R3_RET, r_temp_1, r_temp_2, /* needs_frame */ false); // kills R31
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 2016 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2015, 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
|
||||
@ -401,11 +401,8 @@ address TemplateInterpreterGenerator::generate_result_handler_for(BasicType type
|
||||
case T_LONG:
|
||||
break;
|
||||
case T_OBJECT:
|
||||
// unbox result if not null
|
||||
__ cmpdi(CCR0, R3_RET, 0);
|
||||
__ beq(CCR0, done);
|
||||
__ ld(R3_RET, 0, R3_RET);
|
||||
__ verify_oop(R3_RET);
|
||||
// JNIHandles::resolve result.
|
||||
__ resolve_jobject(R3_RET, R11_scratch1, R12_scratch2, /* needs_frame */ true); // kills R31
|
||||
break;
|
||||
case T_FLOAT:
|
||||
break;
|
||||
|
@ -993,12 +993,19 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
obj.load_item();
|
||||
|
||||
// info for exceptions
|
||||
CodeEmitInfo* info_for_exception = state_for (x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
CodeStub* stub;
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception,
|
||||
Deoptimization::Reason_class_check,
|
||||
Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016 SAP SE. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
|
@ -3439,6 +3439,34 @@ void MacroAssembler::card_write_barrier_post(Register store_addr, Register tmp)
|
||||
z_mvi(0, store_addr, 0); // Store byte 0.
|
||||
}
|
||||
|
||||
void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp2) {
|
||||
NearLabel Ldone;
|
||||
z_ltgr(tmp1, value);
|
||||
z_bre(Ldone); // Use NULL result as-is.
|
||||
|
||||
z_nill(value, ~JNIHandles::weak_tag_mask);
|
||||
z_lg(value, 0, value); // Resolve (untagged) jobject.
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
NearLabel Lnot_weak;
|
||||
z_tmll(tmp1, JNIHandles::weak_tag_mask); // Test for jweak tag.
|
||||
z_braz(Lnot_weak);
|
||||
verify_oop(value);
|
||||
g1_write_barrier_pre(noreg /* obj */,
|
||||
noreg /* offset */,
|
||||
value /* pre_val */,
|
||||
noreg /* val */,
|
||||
tmp1 /* tmp1 */,
|
||||
tmp2 /* tmp2 */,
|
||||
true /* pre_val_needed */);
|
||||
bind(Lnot_weak);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
verify_oop(value);
|
||||
bind(Ldone);
|
||||
}
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
//------------------------------------------------------
|
||||
|
@ -726,6 +726,8 @@ class MacroAssembler: public Assembler {
|
||||
// Write to card table for modification at store_addr - register is destroyed afterwards.
|
||||
void card_write_barrier_post(Register store_addr, Register tmp);
|
||||
|
||||
void resolve_jobject(Register value, Register tmp1, Register tmp2);
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
// General G1 pre-barrier generator.
|
||||
// Purpose: record the previous value if it is not null.
|
||||
|
@ -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
|
||||
@ -2272,13 +2272,9 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
||||
|
||||
__ reset_last_Java_frame();
|
||||
|
||||
// Unpack oop result
|
||||
// Unpack oop result, e.g. JNIHandles::resolve result.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
NearLabel L;
|
||||
__ compare64_and_branch(Z_RET, (RegisterOrConstant)0L, Assembler::bcondEqual, L);
|
||||
__ z_lg(Z_RET, 0, Z_RET);
|
||||
__ bind(L);
|
||||
__ verify_oop(Z_RET);
|
||||
__ resolve_jobject(Z_RET, /* tmp1 */ Z_R13, /* tmp2 */ Z_R7);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -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
|
||||
@ -1695,14 +1695,11 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
// from the jni handle to z_ijava_state.oop_temp. This is
|
||||
// necessary, because we reset the jni handle block below.
|
||||
// NOTE: frame::interpreter_frame_result() depends on this, too.
|
||||
{ NearLabel no_oop_result, store_oop_result;
|
||||
{ NearLabel no_oop_result;
|
||||
__ load_absolute_address(Z_R1, AbstractInterpreter::result_handler(T_OBJECT));
|
||||
__ compareU64_and_branch(Z_R1, Rresult_handler, Assembler::bcondNotEqual, no_oop_result);
|
||||
__ compareU64_and_branch(Rlresult, (intptr_t)0L, Assembler::bcondEqual, store_oop_result);
|
||||
__ z_lg(Rlresult, 0, Rlresult); // unbox
|
||||
__ bind(store_oop_result);
|
||||
__ resolve_jobject(Rlresult, /* tmp1 */ Rmethod, /* tmp2 */ Z_R1);
|
||||
__ z_stg(Rlresult, oop_tmp_offset, Z_fp);
|
||||
__ verify_oop(Rlresult);
|
||||
__ bind(no_oop_result);
|
||||
}
|
||||
|
||||
|
@ -1196,11 +1196,18 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
obj.load_item();
|
||||
LIR_Opr out_reg = rlock_result(x);
|
||||
CodeStub* stub;
|
||||
CodeEmitInfo* info_for_exception = state_for(x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception,
|
||||
Deoptimization::Reason_class_check,
|
||||
Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -68,6 +68,7 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
|
||||
__ andcc (G4, 1, G0);
|
||||
__ br (Assembler::notZero, false, Assembler::pn, label1);
|
||||
__ delayed()->srl (O2, 2, O4);
|
||||
__ andn (O1, JNIHandles::weak_tag_mask, O1);
|
||||
__ ld_ptr (O1, 0, O5);
|
||||
|
||||
assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
|
||||
@ -147,6 +148,7 @@ address JNI_FastGetField::generate_fast_get_long_field() {
|
||||
__ andcc (G4, 1, G0);
|
||||
__ br (Assembler::notZero, false, Assembler::pn, label1);
|
||||
__ delayed()->srl (O2, 2, O4);
|
||||
__ andn (O1, JNIHandles::weak_tag_mask, O1);
|
||||
__ ld_ptr (O1, 0, O5);
|
||||
__ add (O5, O4, O5);
|
||||
|
||||
@ -219,6 +221,7 @@ address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) {
|
||||
__ andcc (G4, 1, G0);
|
||||
__ br (Assembler::notZero, false, Assembler::pn, label1);
|
||||
__ delayed()->srl (O2, 2, O4);
|
||||
__ andn (O1, JNIHandles::weak_tag_mask, O1);
|
||||
__ ld_ptr (O1, 0, O5);
|
||||
|
||||
assert(count < LIST_CAPACITY, "LIST_CAPACITY too small");
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2754,15 +2754,30 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
__ verify_thread(); // G2_thread must be correct
|
||||
__ reset_last_Java_frame();
|
||||
|
||||
// Unpack oop result
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value in I0.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
Label L;
|
||||
__ addcc(G0, I0, G0);
|
||||
__ brx(Assembler::notZero, true, Assembler::pt, L);
|
||||
__ delayed()->ld_ptr(I0, 0, I0);
|
||||
__ mov(G0, I0);
|
||||
__ bind(L);
|
||||
__ verify_oop(I0);
|
||||
Label done, not_weak;
|
||||
__ br_null(I0, false, Assembler::pn, done); // Use NULL as-is.
|
||||
__ delayed()->andcc(I0, JNIHandles::weak_tag_mask, G0); // Test for jweak
|
||||
__ brx(Assembler::zero, true, Assembler::pt, not_weak);
|
||||
__ delayed()->ld_ptr(I0, 0, I0); // Maybe resolve (untagged) jobject.
|
||||
// Resolve jweak.
|
||||
__ ld_ptr(I0, -JNIHandles::weak_tag_value, I0);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
// Copy to O0 because macro doesn't allow pre_val in input reg.
|
||||
__ mov(I0, O0);
|
||||
__ g1_write_barrier_pre(noreg /* obj */,
|
||||
noreg /* index */,
|
||||
0 /* offset */,
|
||||
O0 /* pre_val */,
|
||||
G3_scratch /* tmp */,
|
||||
true /* preserve_o_regs */);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
__ bind(not_weak);
|
||||
__ verify_oop(I0);
|
||||
__ bind(done);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1516,11 +1516,23 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
|
||||
__ set((intptr_t)AbstractInterpreter::result_handler(T_OBJECT), G3_scratch);
|
||||
__ cmp_and_brx_short(G3_scratch, Lscratch, Assembler::notEqual, Assembler::pt, no_oop);
|
||||
__ addcc(G0, O0, O0);
|
||||
__ brx(Assembler::notZero, true, Assembler::pt, store_result); // if result is not NULL:
|
||||
__ delayed()->ld_ptr(O0, 0, O0); // unbox it
|
||||
__ mov(G0, O0);
|
||||
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value in O0.
|
||||
__ br_null(O0, false, Assembler::pn, store_result); // Use NULL as-is.
|
||||
__ delayed()->andcc(O0, JNIHandles::weak_tag_mask, G0); // Test for jweak
|
||||
__ brx(Assembler::zero, true, Assembler::pt, store_result);
|
||||
__ delayed()->ld_ptr(O0, 0, O0); // Maybe resolve (untagged) jobject.
|
||||
// Resolve jweak.
|
||||
__ ld_ptr(O0, -JNIHandles::weak_tag_value, O0);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
__ g1_write_barrier_pre(noreg /* obj */,
|
||||
noreg /* index */,
|
||||
0 /* offset */,
|
||||
O0 /* pre_val */,
|
||||
G3_scratch /* tmp */,
|
||||
true /* preserve_o_regs */);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
__ bind(store_result);
|
||||
// Store it where gc will look for it and result handler expects it.
|
||||
__ st_ptr(O0, FP, (frame::interpreter_frame_oop_temp_offset*wordSize) + STACK_BIAS);
|
||||
|
@ -917,7 +917,7 @@ address Assembler::locate_operand(address inst, WhichOperand which) {
|
||||
break;
|
||||
|
||||
case 0x62: // EVEX_4bytes
|
||||
assert((UseAVX > 0), "shouldn't have EVEX prefix");
|
||||
assert(VM_Version::supports_evex(), "shouldn't have EVEX prefix");
|
||||
assert(ip == inst+1, "no prefixes allowed");
|
||||
// no EVEX collisions, all instructions that have 0x62 opcodes
|
||||
// have EVEX versions and are subopcodes of 0x66
|
||||
|
@ -1429,12 +1429,17 @@ void LIRGenerator::do_CheckCast(CheckCast* x) {
|
||||
obj.load_item();
|
||||
|
||||
// info for exceptions
|
||||
CodeEmitInfo* info_for_exception = state_for(x);
|
||||
CodeEmitInfo* info_for_exception =
|
||||
(x->needs_exception_state() ? state_for(x) :
|
||||
state_for(x, x->state_before(), true /*ignore_xhandler*/));
|
||||
|
||||
CodeStub* stub;
|
||||
if (x->is_incompatible_class_change_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_incompatible_class_change_error_id, LIR_OprFact::illegalOpr, info_for_exception);
|
||||
} else if (x->is_invokespecial_receiver_check()) {
|
||||
assert(patching_info == NULL, "can't patch this");
|
||||
stub = new DeoptimizeStub(info_for_exception, Deoptimization::Reason_class_check, Deoptimization::Action_none);
|
||||
} else {
|
||||
stub = new SimpleExceptionStub(Runtime1::throw_class_cast_exception_id, obj.result(), info_for_exception);
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -85,6 +85,9 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
|
||||
__ movptr (rdx, Address(rsp, 2*wordSize)); // obj
|
||||
}
|
||||
__ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID
|
||||
|
||||
__ clear_jweak_tag(rdx);
|
||||
|
||||
__ movptr(rdx, Address(rdx, 0)); // *obj
|
||||
__ shrptr (rax, 2); // offset
|
||||
|
||||
@ -202,6 +205,9 @@ address JNI_FastGetField::generate_fast_get_long_field() {
|
||||
__ movptr(rdx, Address(rsp, 3*wordSize)); // obj
|
||||
}
|
||||
__ movptr(rsi, Address(rsp, 4*wordSize)); // jfieldID
|
||||
|
||||
__ clear_jweak_tag(rdx);
|
||||
|
||||
__ movptr(rdx, Address(rdx, 0)); // *obj
|
||||
__ shrptr(rsi, 2); // offset
|
||||
|
||||
@ -291,6 +297,9 @@ address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) {
|
||||
__ movptr(rdx, Address(rsp, 2*wordSize)); // obj
|
||||
}
|
||||
__ movptr(rax, Address(rsp, 3*wordSize)); // jfieldID
|
||||
|
||||
__ clear_jweak_tag(rdx);
|
||||
|
||||
__ movptr(rdx, Address(rdx, 0)); // *obj
|
||||
__ shrptr(rax, 2); // offset
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -80,6 +80,9 @@ address JNI_FastGetField::generate_fast_get_int_field0(BasicType type) {
|
||||
// robj ^ rcounter ^ rcounter == robj
|
||||
// robj is data dependent on rcounter.
|
||||
}
|
||||
|
||||
__ clear_jweak_tag(robj);
|
||||
|
||||
__ movptr(robj, Address(robj, 0)); // *obj
|
||||
__ mov (roffset, c_rarg2);
|
||||
__ shrptr(roffset, 2); // offset
|
||||
@ -178,6 +181,9 @@ address JNI_FastGetField::generate_fast_get_float_field0(BasicType type) {
|
||||
// robj ^ rcounter ^ rcounter == robj
|
||||
// robj is data dependent on rcounter.
|
||||
}
|
||||
|
||||
__ clear_jweak_tag(robj);
|
||||
|
||||
__ movptr(robj, Address(robj, 0)); // *obj
|
||||
__ mov (roffset, c_rarg2);
|
||||
__ shrptr(roffset, 2); // offset
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -5129,6 +5129,43 @@ void MacroAssembler::vxorps(XMMRegister dst, XMMRegister nds, AddressLiteral src
|
||||
}
|
||||
|
||||
|
||||
void MacroAssembler::resolve_jobject(Register value,
|
||||
Register thread,
|
||||
Register tmp) {
|
||||
assert_different_registers(value, thread, tmp);
|
||||
Label done, not_weak;
|
||||
testptr(value, value);
|
||||
jcc(Assembler::zero, done); // Use NULL as-is.
|
||||
testptr(value, JNIHandles::weak_tag_mask); // Test for jweak tag.
|
||||
jcc(Assembler::zero, not_weak);
|
||||
// Resolve jweak.
|
||||
movptr(value, Address(value, -JNIHandles::weak_tag_value));
|
||||
verify_oop(value);
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (UseG1GC) {
|
||||
g1_write_barrier_pre(noreg /* obj */,
|
||||
value /* pre_val */,
|
||||
thread /* thread */,
|
||||
tmp /* tmp */,
|
||||
true /* tosca_live */,
|
||||
true /* expand_call */);
|
||||
}
|
||||
#endif // INCLUDE_ALL_GCS
|
||||
jmp(done);
|
||||
bind(not_weak);
|
||||
// Resolve (untagged) jobject.
|
||||
movptr(value, Address(value, 0));
|
||||
verify_oop(value);
|
||||
bind(done);
|
||||
}
|
||||
|
||||
void MacroAssembler::clear_jweak_tag(Register possibly_jweak) {
|
||||
const int32_t inverted_jweak_mask = ~static_cast<int32_t>(JNIHandles::weak_tag_mask);
|
||||
STATIC_ASSERT(inverted_jweak_mask == -2); // otherwise check this code
|
||||
// The inverted mask is sign-extended
|
||||
andptr(possibly_jweak, inverted_jweak_mask);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -297,6 +297,9 @@ class MacroAssembler: public Assembler {
|
||||
void store_check(Register obj); // store check for obj - register is destroyed afterwards
|
||||
void store_check(Register obj, Address dst); // same as above, dst is exact store location (reg. is destroyed)
|
||||
|
||||
void resolve_jobject(Register value, Register thread, Register tmp);
|
||||
void clear_jweak_tag(Register possibly_jweak);
|
||||
|
||||
#if INCLUDE_ALL_GCS
|
||||
|
||||
void g1_write_barrier_pre(Register obj,
|
||||
|
@ -365,6 +365,10 @@ int NativeMovRegMem::instruction_start() const {
|
||||
NOT_LP64(assert((0xC0 & ubyte_at(1)) == 0xC0, "shouldn't have LDS and LES instructions"));
|
||||
return 3;
|
||||
}
|
||||
if (instr_0 == instruction_EVEX_prefix_4bytes) {
|
||||
assert(VM_Version::supports_evex(), "shouldn't have EVEX prefix");
|
||||
return 4;
|
||||
}
|
||||
|
||||
// First check to see if we have a (prefixed or not) xor
|
||||
if (instr_0 >= instruction_prefix_wide_lo && // 0x40
|
||||
|
@ -356,6 +356,7 @@ class NativeMovRegMem: public NativeInstruction {
|
||||
|
||||
instruction_VEX_prefix_2bytes = Assembler::VEX_2bytes,
|
||||
instruction_VEX_prefix_3bytes = Assembler::VEX_3bytes,
|
||||
instruction_EVEX_prefix_4bytes = Assembler::EVEX_4bytes,
|
||||
|
||||
instruction_size = 4,
|
||||
instruction_offset = 0,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2226,14 +2226,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
|
||||
__ reset_last_Java_frame(thread, false);
|
||||
|
||||
// Unpack oop result
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
Label L;
|
||||
__ cmpptr(rax, (int32_t)NULL_WORD);
|
||||
__ jcc(Assembler::equal, L);
|
||||
__ movptr(rax, Address(rax, 0));
|
||||
__ bind(L);
|
||||
__ verify_oop(rax);
|
||||
__ resolve_jobject(rax /* value */,
|
||||
thread /* thread */,
|
||||
rcx /* tmp */);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2579,14 +2579,11 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
|
||||
__ reset_last_Java_frame(false);
|
||||
|
||||
// Unpack oop result
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value.
|
||||
if (ret_type == T_OBJECT || ret_type == T_ARRAY) {
|
||||
Label L;
|
||||
__ testptr(rax, rax);
|
||||
__ jcc(Assembler::zero, L);
|
||||
__ movptr(rax, Address(rax, 0));
|
||||
__ bind(L);
|
||||
__ verify_oop(rax);
|
||||
__ resolve_jobject(rax /* value */,
|
||||
r15_thread /* thread */,
|
||||
rcx /* tmp */);
|
||||
}
|
||||
|
||||
if (CheckJNICalls) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -1193,16 +1193,16 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
// and result handler will pick it up
|
||||
|
||||
{
|
||||
Label no_oop, store_result;
|
||||
Label no_oop, not_weak, store_result;
|
||||
__ lea(t, ExternalAddress(AbstractInterpreter::result_handler(T_OBJECT)));
|
||||
__ cmpptr(t, Address(rbp, frame::interpreter_frame_result_handler_offset*wordSize));
|
||||
__ jcc(Assembler::notEqual, no_oop);
|
||||
// retrieve result
|
||||
__ pop(ltos);
|
||||
__ testptr(rax, rax);
|
||||
__ jcc(Assembler::zero, store_result);
|
||||
__ movptr(rax, Address(rax, 0));
|
||||
__ bind(store_result);
|
||||
// Unbox oop result, e.g. JNIHandles::resolve value.
|
||||
__ resolve_jobject(rax /* value */,
|
||||
thread /* thread */,
|
||||
t /* tmp */);
|
||||
__ movptr(Address(rbp, frame::interpreter_frame_oop_temp_offset*wordSize), rax);
|
||||
// keep stack depth as expected by pushing oop which will eventually be discarded
|
||||
__ push(ltos);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -2210,7 +2210,6 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
// Out-of-line code to allocate method data oop.
|
||||
__ bind(profile_method);
|
||||
__ call_VM(noreg, CAST_FROM_FN_PTR(address, InterpreterRuntime::profile_method));
|
||||
__ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode
|
||||
__ set_method_data_pointer_for_bcp();
|
||||
__ jmp(dispatch);
|
||||
}
|
||||
@ -2225,10 +2224,8 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
CAST_FROM_FN_PTR(address,
|
||||
InterpreterRuntime::frequency_counter_overflow),
|
||||
rdx);
|
||||
__ load_unsigned_byte(rbx, Address(rbcp, 0)); // restore target bytecode
|
||||
|
||||
// rax: osr nmethod (osr ok) or NULL (osr not possible)
|
||||
// rbx: target bytecode
|
||||
// rdx: scratch
|
||||
// r14: locals pointer
|
||||
// r13: bcp
|
||||
@ -2238,12 +2235,13 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
__ cmpb(Address(rax, nmethod::state_offset()), nmethod::in_use);
|
||||
__ jcc(Assembler::notEqual, dispatch);
|
||||
|
||||
// We have the address of an on stack replacement routine in rax
|
||||
// We need to prepare to execute the OSR method. First we must
|
||||
// migrate the locals and monitors off of the stack.
|
||||
// We have the address of an on stack replacement routine in rax.
|
||||
// In preparation of invoking it, first we must migrate the locals
|
||||
// and monitors from off the interpreter frame on the stack.
|
||||
// Ensure to save the osr nmethod over the migration call,
|
||||
// it will be preserved in rbx.
|
||||
__ mov(rbx, rax);
|
||||
|
||||
LP64_ONLY(__ mov(r13, rax)); // save the nmethod
|
||||
NOT_LP64(__ mov(rbx, rax)); // save the nmethod
|
||||
NOT_LP64(__ get_thread(rcx));
|
||||
|
||||
call_VM(noreg, CAST_FROM_FN_PTR(address, SharedRuntime::OSR_migration_begin));
|
||||
@ -2258,7 +2256,6 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
const Register retaddr = LP64_ONLY(j_rarg2) NOT_LP64(rdi);
|
||||
const Register sender_sp = LP64_ONLY(j_rarg1) NOT_LP64(rdx);
|
||||
|
||||
|
||||
// pop the interpreter frame
|
||||
__ movptr(sender_sp, Address(rbp, frame::interpreter_frame_sender_sp_offset * wordSize)); // get sender sp
|
||||
__ leave(); // remove frame anchor
|
||||
@ -2274,8 +2271,7 @@ void TemplateTable::branch(bool is_jsr, bool is_wide) {
|
||||
__ push(retaddr);
|
||||
|
||||
// and begin the OSR nmethod
|
||||
LP64_ONLY(__ jmp(Address(r13, nmethod::osr_entry_point_offset())));
|
||||
NOT_LP64(__ jmp(Address(rbx, nmethod::osr_entry_point_offset())));
|
||||
__ jmp(Address(rbx, nmethod::osr_entry_point_offset()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -763,12 +763,11 @@ void VM_Version::get_processor_features() {
|
||||
FLAG_SET_DEFAULT(UseCRC32Intrinsics, false);
|
||||
}
|
||||
|
||||
if (supports_sse4_2()) {
|
||||
if (supports_sse4_2() && supports_clmul()) {
|
||||
if (FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
|
||||
UseCRC32CIntrinsics = true;
|
||||
}
|
||||
}
|
||||
else if (UseCRC32CIntrinsics) {
|
||||
} else if (UseCRC32CIntrinsics) {
|
||||
if (!FLAG_IS_DEFAULT(UseCRC32CIntrinsics)) {
|
||||
warning("CRC32C intrinsics are not available on this CPU");
|
||||
}
|
||||
@ -850,6 +849,12 @@ void VM_Version::get_processor_features() {
|
||||
|
||||
#if INCLUDE_RTM_OPT
|
||||
if (UseRTMLocking) {
|
||||
if (is_client_compilation_mode_vm()) {
|
||||
// Only C2 does RTM locking optimization.
|
||||
// Can't continue because UseRTMLocking affects UseBiasedLocking flag
|
||||
// setting during arguments processing. See use_biased_locking().
|
||||
vm_exit_during_initialization("RTM locking optimization is not supported in emulated client VM");
|
||||
}
|
||||
if (is_intel_family_core()) {
|
||||
if ((_model == CPU_MODEL_HASWELL_E3) ||
|
||||
(_model == CPU_MODEL_HASWELL_E7 && _stepping < 3) ||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -406,10 +406,12 @@ int CppInterpreter::native_entry(Method* method, intptr_t UNUSED, TRAPS) {
|
||||
// oop_temp where the garbage collector can see it before
|
||||
// we release the handle it might be protected by.
|
||||
if (handler->result_type() == &ffi_type_pointer) {
|
||||
if (result[0])
|
||||
istate->set_oop_temp(*(oop *) result[0]);
|
||||
else
|
||||
if (result[0] == 0) {
|
||||
istate->set_oop_temp(NULL);
|
||||
} else {
|
||||
jobject handle = reinterpret_cast<jobject>(result[0]);
|
||||
istate->set_oop_temp(JNIHandles::resolve(handle));
|
||||
}
|
||||
}
|
||||
|
||||
// Reset handle block
|
||||
|
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