Merge
This commit is contained in:
commit
9a06f23e99
2
.hgtags
2
.hgtags
@ -310,3 +310,5 @@ e7dbbef69d12b6a74dfad331b7188e7f893e8d29 jdk9-b62
|
|||||||
4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65
|
4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65
|
||||||
ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
|
ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
|
||||||
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
|
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
|
||||||
|
5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68
|
||||||
|
d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69
|
||||||
|
@ -310,3 +310,5 @@ ea38728b4f4bdd8fd0d7a89b18069f521cf05013 jdk9-b61
|
|||||||
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
|
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
|
||||||
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
|
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
|
||||||
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
|
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
|
||||||
|
70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
|
||||||
|
1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69
|
||||||
|
@ -436,7 +436,6 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
|
|||||||
BASIC_PATH_PROGS(CYGPATH, cygpath)
|
BASIC_PATH_PROGS(CYGPATH, cygpath)
|
||||||
BASIC_PATH_PROGS(READLINK, [greadlink readlink])
|
BASIC_PATH_PROGS(READLINK, [greadlink readlink])
|
||||||
BASIC_PATH_PROGS(DF, df)
|
BASIC_PATH_PROGS(DF, df)
|
||||||
BASIC_PATH_PROGS(SETFILE, SetFile)
|
|
||||||
BASIC_PATH_PROGS(CPIO, [cpio bsdcpio])
|
BASIC_PATH_PROGS(CPIO, [cpio bsdcpio])
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -574,10 +573,11 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT],
|
|||||||
)
|
)
|
||||||
|
|
||||||
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
||||||
# detect if Xcode is installed by running xcodebuild -version
|
# If a devkit has been supplied, find xcodebuild in the toolchain_path.
|
||||||
|
# If not, detect if Xcode is installed by running xcodebuild -version
|
||||||
# if no Xcode installed, xcodebuild exits with 1
|
# if no Xcode installed, xcodebuild exits with 1
|
||||||
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
|
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
|
||||||
if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
|
if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then
|
||||||
# We need to use xcodebuild in the toolchain dir provided by the user, this will
|
# We need to use xcodebuild in the toolchain dir provided by the user, this will
|
||||||
# fall back on the stub binary in /usr/bin/xcodebuild
|
# fall back on the stub binary in /usr/bin/xcodebuild
|
||||||
AC_PATH_PROG([XCODEBUILD], [xcodebuild], [/usr/bin/xcodebuild], [$TOOLCHAIN_PATH])
|
AC_PATH_PROG([XCODEBUILD], [xcodebuild], [/usr/bin/xcodebuild], [$TOOLCHAIN_PATH])
|
||||||
@ -961,6 +961,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS],
|
|||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
BASIC_REQUIRE_PROGS(SETFILE, SetFile)
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
|
|
||||||
|
7
common/autoconf/build-aux/config.guess
vendored
7
common/autoconf/build-aux/config.guess
vendored
@ -86,4 +86,11 @@ if [ "x$OUT" = x ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Test and fix cpu on Macosx when C preprocessor is not on the path
|
||||||
|
echo $OUT | grep i386-apple-darwin > /dev/null 2> /dev/null
|
||||||
|
if test $? = 0; then
|
||||||
|
REAL_CPU=`uname -m`
|
||||||
|
OUT=$REAL_CPU`echo $OUT | sed -e 's/[^-]*//'`
|
||||||
|
fi
|
||||||
|
|
||||||
echo $OUT
|
echo $OUT
|
||||||
|
@ -855,6 +855,7 @@ OS_VERSION_MINOR
|
|||||||
OS_VERSION_MAJOR
|
OS_VERSION_MAJOR
|
||||||
PKG_CONFIG
|
PKG_CONFIG
|
||||||
BASH_ARGS
|
BASH_ARGS
|
||||||
|
SETFILE
|
||||||
CODESIGN
|
CODESIGN
|
||||||
XATTR
|
XATTR
|
||||||
DSYMUTIL
|
DSYMUTIL
|
||||||
@ -946,7 +947,6 @@ build_vendor
|
|||||||
build_cpu
|
build_cpu
|
||||||
build
|
build
|
||||||
CPIO
|
CPIO
|
||||||
SETFILE
|
|
||||||
DF
|
DF
|
||||||
READLINK
|
READLINK
|
||||||
CYGPATH
|
CYGPATH
|
||||||
@ -1167,7 +1167,6 @@ SED
|
|||||||
CYGPATH
|
CYGPATH
|
||||||
READLINK
|
READLINK
|
||||||
DF
|
DF
|
||||||
SETFILE
|
|
||||||
CPIO
|
CPIO
|
||||||
UNZIP
|
UNZIP
|
||||||
ZIP
|
ZIP
|
||||||
@ -1180,6 +1179,7 @@ TIME
|
|||||||
DSYMUTIL
|
DSYMUTIL
|
||||||
XATTR
|
XATTR
|
||||||
CODESIGN
|
CODESIGN
|
||||||
|
SETFILE
|
||||||
PKG_CONFIG
|
PKG_CONFIG
|
||||||
JAVA
|
JAVA
|
||||||
JAVAC
|
JAVAC
|
||||||
@ -2049,7 +2049,6 @@ Some influential environment variables:
|
|||||||
CYGPATH Override default value for CYGPATH
|
CYGPATH Override default value for CYGPATH
|
||||||
READLINK Override default value for READLINK
|
READLINK Override default value for READLINK
|
||||||
DF Override default value for DF
|
DF Override default value for DF
|
||||||
SETFILE Override default value for SETFILE
|
|
||||||
CPIO Override default value for CPIO
|
CPIO Override default value for CPIO
|
||||||
UNZIP Override default value for UNZIP
|
UNZIP Override default value for UNZIP
|
||||||
ZIP Override default value for ZIP
|
ZIP Override default value for ZIP
|
||||||
@ -2062,6 +2061,7 @@ Some influential environment variables:
|
|||||||
DSYMUTIL Override default value for DSYMUTIL
|
DSYMUTIL Override default value for DSYMUTIL
|
||||||
XATTR Override default value for XATTR
|
XATTR Override default value for XATTR
|
||||||
CODESIGN Override default value for CODESIGN
|
CODESIGN Override default value for CODESIGN
|
||||||
|
SETFILE Override default value for SETFILE
|
||||||
PKG_CONFIG path to pkg-config utility
|
PKG_CONFIG path to pkg-config utility
|
||||||
JAVA Override default value for JAVA
|
JAVA Override default value for JAVA
|
||||||
JAVAC Override default value for JAVAC
|
JAVAC Override default value for JAVAC
|
||||||
@ -4364,7 +4364,7 @@ VS_SDK_PLATFORM_NAME_2013=
|
|||||||
#CUSTOM_AUTOCONF_INCLUDE
|
#CUSTOM_AUTOCONF_INCLUDE
|
||||||
|
|
||||||
# Do not change or remove the following line, it is needed for consistency checks:
|
# Do not change or remove the following line, it is needed for consistency checks:
|
||||||
DATE_WHEN_GENERATED=1433337614
|
DATE_WHEN_GENERATED=1434614912
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
@ -13055,192 +13055,6 @@ $as_echo "$tool_specified" >&6; }
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Publish this variable in the help.
|
|
||||||
|
|
||||||
|
|
||||||
if test "x$SETFILE" = x; then
|
|
||||||
# The variable is not set by user, try to locate tool using the code snippet
|
|
||||||
for ac_prog in SetFile
|
|
||||||
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_SETFILE+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
case $SETFILE in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
|
||||||
SETFILE=$ac_cv_path_SETFILE
|
|
||||||
if test -n "$SETFILE"; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
|
||||||
$as_echo "$SETFILE" >&6; }
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
test -n "$SETFILE" && break
|
|
||||||
done
|
|
||||||
|
|
||||||
else
|
|
||||||
# The variable is set, but is it from the command line or the environment?
|
|
||||||
|
|
||||||
# Try to remove the string !SETFILE! from our list.
|
|
||||||
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/}
|
|
||||||
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 "xSETFILE" != xBASH; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5
|
|
||||||
$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;}
|
|
||||||
fi
|
|
||||||
# Try to locate tool using the code snippet
|
|
||||||
for ac_prog in SetFile
|
|
||||||
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_SETFILE+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
case $SETFILE in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
|
||||||
SETFILE=$ac_cv_path_SETFILE
|
|
||||||
if test -n "$SETFILE"; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
|
||||||
$as_echo "$SETFILE" >&6; }
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
test -n "$SETFILE" && 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 the provided tool contains a complete path.
|
|
||||||
tool_specified="$SETFILE"
|
|
||||||
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 SETFILE=$tool_basename" >&5
|
|
||||||
$as_echo "$as_me: Will search for user supplied tool SETFILE=$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_SETFILE+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
case $SETFILE in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
|
||||||
SETFILE=$ac_cv_path_SETFILE
|
|
||||||
if test -n "$SETFILE"; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
|
||||||
$as_echo "$SETFILE" >&6; }
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if test "x$SETFILE" = 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 SETFILE=$tool_specified" >&5
|
|
||||||
$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;}
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5
|
|
||||||
$as_echo_n "checking for SETFILE... " >&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 SETFILE=$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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Publish this variable in the help.
|
# Publish this variable in the help.
|
||||||
|
|
||||||
|
|
||||||
@ -15140,10 +14954,11 @@ fi
|
|||||||
|
|
||||||
|
|
||||||
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
||||||
# detect if Xcode is installed by running xcodebuild -version
|
# If a devkit has been supplied, find xcodebuild in the toolchain_path.
|
||||||
|
# If not, detect if Xcode is installed by running xcodebuild -version
|
||||||
# if no Xcode installed, xcodebuild exits with 1
|
# if no Xcode installed, xcodebuild exits with 1
|
||||||
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
|
# if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0
|
||||||
if /usr/bin/xcodebuild -version >/dev/null 2>&1; then
|
if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then
|
||||||
# We need to use xcodebuild in the toolchain dir provided by the user, this will
|
# We need to use xcodebuild in the toolchain dir provided by the user, this will
|
||||||
# fall back on the stub binary in /usr/bin/xcodebuild
|
# fall back on the stub binary in /usr/bin/xcodebuild
|
||||||
# Extract the first word of "xcodebuild", so it can be a program name with args.
|
# Extract the first word of "xcodebuild", so it can be a program name with args.
|
||||||
@ -19653,6 +19468,199 @@ $as_echo "no" >&6; }
|
|||||||
$as_echo "yes" >&6; }
|
$as_echo "yes" >&6; }
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Publish this variable in the help.
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$SETFILE" = x; then
|
||||||
|
# The variable is not set by user, try to locate tool using the code snippet
|
||||||
|
for ac_prog in SetFile
|
||||||
|
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_SETFILE+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
case $SETFILE in
|
||||||
|
[\\/]* | ?:[\\/]*)
|
||||||
|
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
||||||
|
SETFILE=$ac_cv_path_SETFILE
|
||||||
|
if test -n "$SETFILE"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
||||||
|
$as_echo "$SETFILE" >&6; }
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
test -n "$SETFILE" && break
|
||||||
|
done
|
||||||
|
|
||||||
|
else
|
||||||
|
# The variable is set, but is it from the command line or the environment?
|
||||||
|
|
||||||
|
# Try to remove the string !SETFILE! from our list.
|
||||||
|
try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/}
|
||||||
|
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 "xSETFILE" != xBASH; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5
|
||||||
|
$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;}
|
||||||
|
fi
|
||||||
|
# Try to locate tool using the code snippet
|
||||||
|
for ac_prog in SetFile
|
||||||
|
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_SETFILE+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
case $SETFILE in
|
||||||
|
[\\/]* | ?:[\\/]*)
|
||||||
|
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
||||||
|
SETFILE=$ac_cv_path_SETFILE
|
||||||
|
if test -n "$SETFILE"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
||||||
|
$as_echo "$SETFILE" >&6; }
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
test -n "$SETFILE" && 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 the provided tool contains a complete path.
|
||||||
|
tool_specified="$SETFILE"
|
||||||
|
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 SETFILE=$tool_basename" >&5
|
||||||
|
$as_echo "$as_me: Will search for user supplied tool SETFILE=$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_SETFILE+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
case $SETFILE in
|
||||||
|
[\\/]* | ?:[\\/]*)
|
||||||
|
ac_cv_path_SETFILE="$SETFILE" # 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_SETFILE="$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
|
||||||
|
SETFILE=$ac_cv_path_SETFILE
|
||||||
|
if test -n "$SETFILE"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5
|
||||||
|
$as_echo "$SETFILE" >&6; }
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$SETFILE" = 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 SETFILE=$tool_specified" >&5
|
||||||
|
$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;}
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5
|
||||||
|
$as_echo_n "checking for SETFILE... " >&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 SETFILE=$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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if test "x$SETFILE" = x; then
|
||||||
|
as_fn_error $? "Could not find required tool for SETFILE" "$LINENO" 5
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
@ -310,3 +310,5 @@ d27f7e0a7aca129969de23e9934408a31b4abf4c jdk9-b62
|
|||||||
afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
|
afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
|
||||||
44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66
|
44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66
|
||||||
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
|
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
|
||||||
|
8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68
|
||||||
|
de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.omg.CORBA;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This Helper class is used to facilitate the marshalling of <tt>Bounds</tt>.
|
||||||
|
* For more information on Helper files, see
|
||||||
|
* <a href="doc-files/generatedfiles.html#helper">
|
||||||
|
* "Generated Files: Helper Files"</a>.<P>
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract public class BoundsHelper
|
||||||
|
{
|
||||||
|
private static String _id = "IDL:omg.org/CORBA/Bounds:1.0";
|
||||||
|
|
||||||
|
public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.Bounds that)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
|
||||||
|
a.type (type ());
|
||||||
|
write (out, that);
|
||||||
|
a.read_value (out.create_input_stream (), type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.Bounds extract (org.omg.CORBA.Any a)
|
||||||
|
{
|
||||||
|
return read (a.create_input_stream ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static org.omg.CORBA.TypeCode __typeCode = null;
|
||||||
|
private static boolean __active = false;
|
||||||
|
synchronized public static org.omg.CORBA.TypeCode type ()
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
synchronized (org.omg.CORBA.TypeCode.class)
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
if (__active)
|
||||||
|
{
|
||||||
|
return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
|
||||||
|
}
|
||||||
|
__active = true;
|
||||||
|
org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
|
||||||
|
org.omg.CORBA.TypeCode _tcOf_members0 = null;
|
||||||
|
__typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.BoundsHelper.id (), "Bounds", _members0);
|
||||||
|
__active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return __typeCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String id ()
|
||||||
|
{
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.Bounds read (org.omg.CORBA.portable.InputStream istream)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.Bounds value = new org.omg.CORBA.Bounds ();
|
||||||
|
// read and discard the repository ID
|
||||||
|
istream.read_string ();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.Bounds value)
|
||||||
|
{
|
||||||
|
// write the repository ID
|
||||||
|
ostream.write_string (id ());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -52,8 +52,8 @@ public interface DynAny extends org.omg.CORBA.Object
|
|||||||
*
|
*
|
||||||
* @param dyn_any the <code>DynAny</code> object whose contents
|
* @param dyn_any the <code>DynAny</code> object whose contents
|
||||||
* are assigned to this <code>DynAny</code>.
|
* are assigned to this <code>DynAny</code>.
|
||||||
* @throws Invalid if the source <code>DynAny</code> is
|
* @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
|
||||||
* invalid
|
* <code>DynAny</code> is invalid
|
||||||
*/
|
*/
|
||||||
public void assign(org.omg.CORBA.DynAny dyn_any)
|
public void assign(org.omg.CORBA.DynAny dyn_any)
|
||||||
throws org.omg.CORBA.DynAnyPackage.Invalid;
|
throws org.omg.CORBA.DynAnyPackage.Invalid;
|
||||||
@ -63,8 +63,8 @@ public interface DynAny extends org.omg.CORBA.Object
|
|||||||
* object.
|
* object.
|
||||||
*
|
*
|
||||||
* @param value the <code>Any</code> object.
|
* @param value the <code>Any</code> object.
|
||||||
* @throws Invalid if the source <code>Any</code> object is
|
* @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
|
||||||
* empty or bad
|
* <code>Any</code> object is empty or bad
|
||||||
*/
|
*/
|
||||||
public void from_any(org.omg.CORBA.Any value)
|
public void from_any(org.omg.CORBA.Any value)
|
||||||
throws org.omg.CORBA.DynAnyPackage.Invalid;
|
throws org.omg.CORBA.DynAnyPackage.Invalid;
|
||||||
@ -74,8 +74,8 @@ public interface DynAny extends org.omg.CORBA.Object
|
|||||||
* object.
|
* object.
|
||||||
*
|
*
|
||||||
* @return the <code>Any</code> object.
|
* @return the <code>Any</code> object.
|
||||||
* @throws Invalid if this <code>DynAny</code> is empty or
|
* @throws org.omg.CORBA.DynAnyPackage.Invalid if this
|
||||||
* bad.
|
* <code>DynAny</code> is empty or bad.
|
||||||
* created or does not contain a meaningful value
|
* created or does not contain a meaningful value
|
||||||
*/
|
*/
|
||||||
public org.omg.CORBA.Any to_any()
|
public org.omg.CORBA.Any to_any()
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -48,7 +48,8 @@ public interface DynArray extends org.omg.CORBA.Object, org.omg.CORBA.DynAny
|
|||||||
* <code>DynArray</code> object to the given array.
|
* <code>DynArray</code> object to the given array.
|
||||||
*
|
*
|
||||||
* @param value the array of <code>Any</code> objects
|
* @param value the array of <code>Any</code> objects
|
||||||
* @exception InvalidSeq if the sequence is bad
|
* @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the
|
||||||
|
* sequence is bad
|
||||||
* @see #get_elements
|
* @see #get_elements
|
||||||
*/
|
*/
|
||||||
public void set_elements(org.omg.CORBA.Any[] value)
|
public void set_elements(org.omg.CORBA.Any[] value)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -65,7 +65,8 @@ public interface DynSequence extends org.omg.CORBA.Object, org.omg.CORBA.DynAny
|
|||||||
* array.
|
* array.
|
||||||
*
|
*
|
||||||
* @param value the array of <code>Any</code> objects to be set
|
* @param value the array of <code>Any</code> objects to be set
|
||||||
* @exception InvalidSeq if the array of values is bad
|
* @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the array
|
||||||
|
* of values is bad
|
||||||
* @see #get_elements
|
* @see #get_elements
|
||||||
*/
|
*/
|
||||||
public void set_elements(org.omg.CORBA.Any[] value)
|
public void set_elements(org.omg.CORBA.Any[] value)
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.omg.CORBA.ORBPackage;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This Helper class is used to facilitate the marshalling of
|
||||||
|
* <tt>ORBPackage/InvalidName</tt>.
|
||||||
|
* For more information on Helper files, see
|
||||||
|
* <a href="doc-files/generatedfiles.html#helper">
|
||||||
|
* "Generated Files: Helper Files"</a>.<P>
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract public class InvalidNameHelper
|
||||||
|
{
|
||||||
|
private static String _id = "IDL:omg.org.CORBA/ORB/InvalidName:1.0";
|
||||||
|
|
||||||
|
public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.ORBPackage.InvalidName that)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
|
||||||
|
a.type (type ());
|
||||||
|
write (out, that);
|
||||||
|
a.read_value (out.create_input_stream (), type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.ORBPackage.InvalidName extract (org.omg.CORBA.Any a)
|
||||||
|
{
|
||||||
|
return read (a.create_input_stream ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static org.omg.CORBA.TypeCode __typeCode = null;
|
||||||
|
private static boolean __active = false;
|
||||||
|
synchronized public static org.omg.CORBA.TypeCode type ()
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
synchronized (org.omg.CORBA.TypeCode.class)
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
if (__active)
|
||||||
|
{
|
||||||
|
return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
|
||||||
|
}
|
||||||
|
__active = true;
|
||||||
|
org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
|
||||||
|
org.omg.CORBA.TypeCode _tcOf_members0 = null;
|
||||||
|
__typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.ORBPackage.InvalidNameHelper.id (), "InvalidName", _members0);
|
||||||
|
__active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return __typeCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String id ()
|
||||||
|
{
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.ORBPackage.InvalidName read (org.omg.CORBA.portable.InputStream istream)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.ORBPackage.InvalidName value = new org.omg.CORBA.ORBPackage.InvalidName ();
|
||||||
|
// read and discard the repository ID
|
||||||
|
istream.read_string ();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.ORBPackage.InvalidName value)
|
||||||
|
{
|
||||||
|
// write the repository ID
|
||||||
|
ostream.write_string (id ());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -248,7 +248,7 @@ public abstract class ServerRequest {
|
|||||||
* contain an exception will result in a BAD_PARAM system exception. Passing
|
* contain an exception will result in a BAD_PARAM system exception. Passing
|
||||||
* in an unlisted user exception will result in either the DIR receiving a
|
* in an unlisted user exception will result in either the DIR receiving a
|
||||||
* BAD_PARAM system exception or in the client receiving an
|
* BAD_PARAM system exception or in the client receiving an
|
||||||
* UNKNOWN_EXCEPTION system exception.
|
* UNKNOWN system exception.
|
||||||
*
|
*
|
||||||
* @param any the <code>Any</code> object containing the exception
|
* @param any the <code>Any</code> object containing the exception
|
||||||
* @deprecated use set_exception()
|
* @deprecated use set_exception()
|
||||||
@ -272,13 +272,13 @@ public abstract class ServerRequest {
|
|||||||
* will cause a BAD_PARAM system exception to be thrown. Passing
|
* will cause a BAD_PARAM system exception to be thrown. Passing
|
||||||
* in an unlisted user exception will result in either the DIR receiving a
|
* in an unlisted user exception will result in either the DIR receiving a
|
||||||
* BAD_PARAM system exception or in the client receiving an
|
* BAD_PARAM system exception or in the client receiving an
|
||||||
* UNKNOWN_EXCEPTION system exception.
|
* UNKNOWN system exception.
|
||||||
*
|
*
|
||||||
* @param any the <code>Any</code> object containing the exception
|
* @param any the <code>Any</code> object containing the exception
|
||||||
* @exception BAD_PARAM if the given <code>Any</code> object does not
|
* @exception BAD_PARAM if the given <code>Any</code> object does not
|
||||||
* contain an exception or the exception is an
|
* contain an exception or the exception is an
|
||||||
* unlisted user exception
|
* unlisted user exception
|
||||||
* @exception UNKNOWN_EXCEPTION if the given exception is an unlisted
|
* @exception UNKNOWN if the given exception is an unlisted
|
||||||
* user exception and the DIR did not
|
* user exception and the DIR did not
|
||||||
* receive a BAD_PARAM exception
|
* receive a BAD_PARAM exception
|
||||||
* @see <a href="package-summary.html#unimpl"><code>CORBA</code>
|
* @see <a href="package-summary.html#unimpl"><code>CORBA</code>
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.omg.CORBA.TypeCodePackage;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This Helper class is used to facilitate the marshalling of
|
||||||
|
* <tt>TypeCodePackage/BadKind</tt>.
|
||||||
|
* For more information on Helper files, see
|
||||||
|
* <a href="doc-files/generatedfiles.html#helper">
|
||||||
|
* "Generated Files: Helper Files"</a>.<P>
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract public class BadKindHelper
|
||||||
|
{
|
||||||
|
private static String _id = "IDL:omg.org.CORBA/TypeCode/BadKind:1.0";
|
||||||
|
|
||||||
|
public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.BadKind that)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
|
||||||
|
a.type (type ());
|
||||||
|
write (out, that);
|
||||||
|
a.read_value (out.create_input_stream (), type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.TypeCodePackage.BadKind extract (org.omg.CORBA.Any a)
|
||||||
|
{
|
||||||
|
return read (a.create_input_stream ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static org.omg.CORBA.TypeCode __typeCode = null;
|
||||||
|
private static boolean __active = false;
|
||||||
|
synchronized public static org.omg.CORBA.TypeCode type ()
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
synchronized (org.omg.CORBA.TypeCode.class)
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
if (__active)
|
||||||
|
{
|
||||||
|
return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
|
||||||
|
}
|
||||||
|
__active = true;
|
||||||
|
org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
|
||||||
|
org.omg.CORBA.TypeCode _tcOf_members0 = null;
|
||||||
|
__typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BadKindHelper.id (), "BadKind", _members0);
|
||||||
|
__active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return __typeCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String id ()
|
||||||
|
{
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.TypeCodePackage.BadKind read (org.omg.CORBA.portable.InputStream istream)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.TypeCodePackage.BadKind value = new org.omg.CORBA.TypeCodePackage.BadKind ();
|
||||||
|
// read and discard the repository ID
|
||||||
|
istream.read_string ();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.BadKind value)
|
||||||
|
{
|
||||||
|
// write the repository ID
|
||||||
|
ostream.write_string (id ());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.omg.CORBA.TypeCodePackage;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This Helper class is used to facilitate the marshalling of
|
||||||
|
* <tt>TypeCodePackage/Bounds</tt>.
|
||||||
|
* For more information on Helper files, see
|
||||||
|
* <a href="doc-files/generatedfiles.html#helper">
|
||||||
|
* "Generated Files: Helper Files"</a>.<P>
|
||||||
|
*/
|
||||||
|
|
||||||
|
abstract public class BoundsHelper
|
||||||
|
{
|
||||||
|
private static String _id = "IDL:omg.org.CORBA/TypeCode/Bounds:1.0";
|
||||||
|
|
||||||
|
public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.Bounds that)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.portable.OutputStream out = a.create_output_stream ();
|
||||||
|
a.type (type ());
|
||||||
|
write (out, that);
|
||||||
|
a.read_value (out.create_input_stream (), type ());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.TypeCodePackage.Bounds extract (org.omg.CORBA.Any a)
|
||||||
|
{
|
||||||
|
return read (a.create_input_stream ());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static org.omg.CORBA.TypeCode __typeCode = null;
|
||||||
|
private static boolean __active = false;
|
||||||
|
synchronized public static org.omg.CORBA.TypeCode type ()
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
synchronized (org.omg.CORBA.TypeCode.class)
|
||||||
|
{
|
||||||
|
if (__typeCode == null)
|
||||||
|
{
|
||||||
|
if (__active)
|
||||||
|
{
|
||||||
|
return org.omg.CORBA.ORB.init().create_recursive_tc ( _id );
|
||||||
|
}
|
||||||
|
__active = true;
|
||||||
|
org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0];
|
||||||
|
org.omg.CORBA.TypeCode _tcOf_members0 = null;
|
||||||
|
__typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BoundsHelper.id (), "Bounds", _members0);
|
||||||
|
__active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return __typeCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String id ()
|
||||||
|
{
|
||||||
|
return _id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static org.omg.CORBA.TypeCodePackage.Bounds read (org.omg.CORBA.portable.InputStream istream)
|
||||||
|
{
|
||||||
|
org.omg.CORBA.TypeCodePackage.Bounds value = new org.omg.CORBA.TypeCodePackage.Bounds ();
|
||||||
|
// read and discard the repository ID
|
||||||
|
istream.read_string ();
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.Bounds value)
|
||||||
|
{
|
||||||
|
// write the repository ID
|
||||||
|
ostream.write_string (id ());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -470,3 +470,5 @@ bf92b8db249cdfa5651ef954b6c0743a7e0ea4cd jdk9-b64
|
|||||||
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
|
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
|
||||||
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
|
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
|
||||||
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
|
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
|
||||||
|
11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
|
||||||
|
ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69
|
||||||
|
@ -58,6 +58,7 @@ sun.jvm.hotspot.debugger.cdbg.basic.x86 \
|
|||||||
sun.jvm.hotspot.debugger.dummy \
|
sun.jvm.hotspot.debugger.dummy \
|
||||||
sun.jvm.hotspot.debugger.linux \
|
sun.jvm.hotspot.debugger.linux \
|
||||||
sun.jvm.hotspot.debugger.linux.amd64 \
|
sun.jvm.hotspot.debugger.linux.amd64 \
|
||||||
|
sun.jvm.hotspot.debugger.linux.aarch64 \
|
||||||
sun.jvm.hotspot.debugger.linux.ppc64 \
|
sun.jvm.hotspot.debugger.linux.ppc64 \
|
||||||
sun.jvm.hotspot.debugger.linux.x86 \
|
sun.jvm.hotspot.debugger.linux.x86 \
|
||||||
sun.jvm.hotspot.debugger.posix \
|
sun.jvm.hotspot.debugger.posix \
|
||||||
@ -65,6 +66,7 @@ sun.jvm.hotspot.debugger.posix.elf \
|
|||||||
sun.jvm.hotspot.debugger.ppc64 \
|
sun.jvm.hotspot.debugger.ppc64 \
|
||||||
sun.jvm.hotspot.debugger.proc \
|
sun.jvm.hotspot.debugger.proc \
|
||||||
sun.jvm.hotspot.debugger.proc.amd64 \
|
sun.jvm.hotspot.debugger.proc.amd64 \
|
||||||
|
sun.jvm.hotspot.debugger.proc.aarch64 \
|
||||||
sun.jvm.hotspot.debugger.proc.ppc64 \
|
sun.jvm.hotspot.debugger.proc.ppc64 \
|
||||||
sun.jvm.hotspot.debugger.proc.sparc \
|
sun.jvm.hotspot.debugger.proc.sparc \
|
||||||
sun.jvm.hotspot.debugger.proc.x86 \
|
sun.jvm.hotspot.debugger.proc.x86 \
|
||||||
@ -91,11 +93,13 @@ sun.jvm.hotspot.oops \
|
|||||||
sun.jvm.hotspot.prims \
|
sun.jvm.hotspot.prims \
|
||||||
sun.jvm.hotspot.runtime \
|
sun.jvm.hotspot.runtime \
|
||||||
sun.jvm.hotspot.runtime.amd64 \
|
sun.jvm.hotspot.runtime.amd64 \
|
||||||
|
sun.jvm.hotspot.runtime.aarch64 \
|
||||||
sun.jvm.hotspot.runtime.bsd \
|
sun.jvm.hotspot.runtime.bsd \
|
||||||
sun.jvm.hotspot.runtime.bsd_amd64 \
|
sun.jvm.hotspot.runtime.bsd_amd64 \
|
||||||
sun.jvm.hotspot.runtime.bsd_x86 \
|
sun.jvm.hotspot.runtime.bsd_x86 \
|
||||||
sun.jvm.hotspot.runtime.linux \
|
sun.jvm.hotspot.runtime.linux \
|
||||||
sun.jvm.hotspot.runtime.linux_amd64 \
|
sun.jvm.hotspot.runtime.linux_amd64 \
|
||||||
|
sun.jvm.hotspot.runtime.linux_aarch64 \
|
||||||
sun.jvm.hotspot.runtime.linux_ppc64 \
|
sun.jvm.hotspot.runtime.linux_ppc64 \
|
||||||
sun.jvm.hotspot.runtime.linux_sparc \
|
sun.jvm.hotspot.runtime.linux_sparc \
|
||||||
sun.jvm.hotspot.runtime.linux_x86 \
|
sun.jvm.hotspot.runtime.linux_x86 \
|
||||||
@ -149,16 +153,19 @@ sun/jvm/hotspot/debugger/dummy/*.java \
|
|||||||
sun/jvm/hotspot/debugger/linux/*.java \
|
sun/jvm/hotspot/debugger/linux/*.java \
|
||||||
sun/jvm/hotspot/debugger/linux/ppc64/*.java \
|
sun/jvm/hotspot/debugger/linux/ppc64/*.java \
|
||||||
sun/jvm/hotspot/debugger/linux/x86/*.java \
|
sun/jvm/hotspot/debugger/linux/x86/*.java \
|
||||||
|
sun/jvm/hotspot/debugger/linux/aarch64/*.java \
|
||||||
sun/jvm/hotspot/debugger/posix/*.java \
|
sun/jvm/hotspot/debugger/posix/*.java \
|
||||||
sun/jvm/hotspot/debugger/posix/elf/*.java \
|
sun/jvm/hotspot/debugger/posix/elf/*.java \
|
||||||
sun/jvm/hotspot/debugger/ppc64/*.java \
|
sun/jvm/hotspot/debugger/ppc64/*.java \
|
||||||
sun/jvm/hotspot/debugger/proc/*.java \
|
sun/jvm/hotspot/debugger/proc/*.java \
|
||||||
sun/jvm/hotspot/debugger/proc/amd64/*.java \
|
sun/jvm/hotspot/debugger/proc/amd64/*.java \
|
||||||
|
sun/jvm/hotspot/debugger/proc/aarch64/*.java \
|
||||||
sun/jvm/hotspot/debugger/proc/ppc64/*.java \
|
sun/jvm/hotspot/debugger/proc/ppc64/*.java \
|
||||||
sun/jvm/hotspot/debugger/proc/sparc/*.java \
|
sun/jvm/hotspot/debugger/proc/sparc/*.java \
|
||||||
sun/jvm/hotspot/debugger/proc/x86/*.java \
|
sun/jvm/hotspot/debugger/proc/x86/*.java \
|
||||||
sun/jvm/hotspot/debugger/remote/*.java \
|
sun/jvm/hotspot/debugger/remote/*.java \
|
||||||
sun/jvm/hotspot/debugger/remote/amd64/*.java \
|
sun/jvm/hotspot/debugger/remote/amd64/*.java \
|
||||||
|
sun/jvm/hotspot/debugger/remote/aarch64/*.java \
|
||||||
sun/jvm/hotspot/debugger/remote/ppc64/*.java \
|
sun/jvm/hotspot/debugger/remote/ppc64/*.java \
|
||||||
sun/jvm/hotspot/debugger/remote/sparc/*.java \
|
sun/jvm/hotspot/debugger/remote/sparc/*.java \
|
||||||
sun/jvm/hotspot/debugger/remote/x86/*.java \
|
sun/jvm/hotspot/debugger/remote/x86/*.java \
|
||||||
@ -178,11 +185,13 @@ sun/jvm/hotspot/opto/*.java \
|
|||||||
sun/jvm/hotspot/prims/*.java \
|
sun/jvm/hotspot/prims/*.java \
|
||||||
sun/jvm/hotspot/runtime/*.java \
|
sun/jvm/hotspot/runtime/*.java \
|
||||||
sun/jvm/hotspot/runtime/amd64/*.java \
|
sun/jvm/hotspot/runtime/amd64/*.java \
|
||||||
|
sun/jvm/hotspot/runtime/aarch64/*.java \
|
||||||
sun/jvm/hotspot/runtime/bsd/*.java \
|
sun/jvm/hotspot/runtime/bsd/*.java \
|
||||||
sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
||||||
sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
||||||
sun/jvm/hotspot/runtime/linux/*.java \
|
sun/jvm/hotspot/runtime/linux/*.java \
|
||||||
sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
||||||
|
sun/jvm/hotspot/runtime/linux_aarch64/*.java \
|
||||||
sun/jvm/hotspot/runtime/linux_ppc64/*.java \
|
sun/jvm/hotspot/runtime/linux_ppc64/*.java \
|
||||||
sun/jvm/hotspot/runtime/linux_sparc/*.java \
|
sun/jvm/hotspot/runtime/linux_sparc/*.java \
|
||||||
sun/jvm/hotspot/runtime/linux_x86/*.java \
|
sun/jvm/hotspot/runtime/linux_x86/*.java \
|
||||||
|
@ -53,6 +53,10 @@
|
|||||||
#include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
|
#include "sun_jvm_hotspot_debugger_ppc64_PPC64ThreadContext.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef aarch64
|
||||||
|
#include "sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
static jfieldID p_ps_prochandle_ID = 0;
|
static jfieldID p_ps_prochandle_ID = 0;
|
||||||
static jfieldID threadList_ID = 0;
|
static jfieldID threadList_ID = 0;
|
||||||
static jfieldID loadObjectList_ID = 0;
|
static jfieldID loadObjectList_ID = 0;
|
||||||
@ -368,7 +372,7 @@ JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLo
|
|||||||
#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
|
#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG
|
||||||
#endif
|
#endif
|
||||||
#ifdef aarch64
|
#ifdef aarch64
|
||||||
#define NPRGREG 32
|
#define NPRGREG sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_NPRGREG
|
||||||
#endif
|
#endif
|
||||||
#if defined(sparc) || defined(sparcv9)
|
#if defined(sparc) || defined(sparcv9)
|
||||||
#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
|
#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG
|
||||||
@ -473,6 +477,13 @@ JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_linux_LinuxDebuggerLo
|
|||||||
|
|
||||||
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
|
#define REG_INDEX(reg) sun_jvm_hotspot_debugger_aarch64_AARCH64ThreadContext_##reg
|
||||||
|
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < 31; i++)
|
||||||
|
regs[i] = gregs.regs[i];
|
||||||
|
regs[REG_INDEX(SP)] = gregs.sp;
|
||||||
|
regs[REG_INDEX(PC)] = gregs.pc;
|
||||||
|
}
|
||||||
#endif /* aarch64 */
|
#endif /* aarch64 */
|
||||||
|
|
||||||
#ifdef ppc64
|
#ifdef ppc64
|
||||||
|
@ -53,14 +53,15 @@ $(ARCH)/LinuxDebuggerLocal.o: LinuxDebuggerLocal.c
|
|||||||
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
|
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
|
||||||
sun.jvm.hotspot.debugger.x86.X86ThreadContext \
|
sun.jvm.hotspot.debugger.x86.X86ThreadContext \
|
||||||
sun.jvm.hotspot.debugger.sparc.SPARCThreadContext \
|
sun.jvm.hotspot.debugger.sparc.SPARCThreadContext \
|
||||||
sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext
|
sun.jvm.hotspot.debugger.amd64.AMD64ThreadContext \
|
||||||
|
sun.jvm.hotspot.debugger.aarch64.AARCH64ThreadContext
|
||||||
$(GCC) $(CFLAGS) $< -o $@
|
$(GCC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
$(ARCH)/sadis.o: ../../share/native/sadis.c
|
$(ARCH)/sadis.o: ../../share/native/sadis.c
|
||||||
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
|
$(JAVAH) -jni -classpath ../../../build/classes -d $(ARCH) \
|
||||||
sun.jvm.hotspot.asm.Disassembler
|
sun.jvm.hotspot.asm.Disassembler
|
||||||
$(GCC) $(CFLAGS) $< -o $@
|
$(GCC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
$(ARCH)/%.o: %.c
|
$(ARCH)/%.o: %.c
|
||||||
$(GCC) $(CFLAGS) $< -o $@
|
$(GCC) $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
@ -983,19 +983,15 @@ public class HSDB implements ObjectHistogramPanel.Listener, SAListener {
|
|||||||
curFrame.getFP(),
|
curFrame.getFP(),
|
||||||
anno));
|
anno));
|
||||||
} else {
|
} else {
|
||||||
if (VM.getVM().getCPU().equals("x86") || VM.getVM().getCPU().equals("amd64")) {
|
// For C2, which has null frame pointers on x86/amd64/aarch64
|
||||||
// For C2, which has null frame pointers on x86/amd64
|
CodeBlob cb = VM.getVM().getCodeCache().findBlob(curFrame.getPC());
|
||||||
CodeBlob cb = VM.getVM().getCodeCache().findBlob(curFrame.getPC());
|
Address sp = curFrame.getSP();
|
||||||
Address sp = curFrame.getSP();
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
if (Assert.ASSERTS_ENABLED) {
|
Assert.that(cb.getFrameSize() > 0, "CodeBlob must have non-zero frame size");
|
||||||
Assert.that(cb.getFrameSize() > 0, "CodeBlob must have non-zero frame size");
|
|
||||||
}
|
|
||||||
annoPanel.addAnnotation(new Annotation(sp,
|
|
||||||
sp.addOffsetTo(cb.getFrameSize()),
|
|
||||||
anno));
|
|
||||||
} else {
|
|
||||||
Assert.that(VM.getVM().getCPU().equals("ia64"), "only ia64 should reach here");
|
|
||||||
}
|
}
|
||||||
|
annoPanel.addAnnotation(new Annotation(sp,
|
||||||
|
sp.addOffsetTo(cb.getFrameSize()),
|
||||||
|
anno));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add interpreter frame annotations
|
// Add interpreter frame annotations
|
||||||
|
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.aarch64;
|
||||||
|
|
||||||
|
import java.lang.annotation.Native;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||||
|
|
||||||
|
/** Specifies the thread context on aarch64 platforms; only a sub-portion
|
||||||
|
* of the context is guaranteed to be present on all operating
|
||||||
|
* systems. */
|
||||||
|
|
||||||
|
public abstract class AARCH64ThreadContext implements ThreadContext {
|
||||||
|
// Taken from /usr/include/asm/sigcontext.h on Linux/AARCH64.
|
||||||
|
|
||||||
|
// NOTE: the indices for the various registers must be maintained as
|
||||||
|
// listed across various operating systems. However, only a small
|
||||||
|
// subset of the registers' values are guaranteed to be present (and
|
||||||
|
// must be present for the SA's stack walking to work)
|
||||||
|
|
||||||
|
// One instance of the Native annotation is enough to trigger header generation
|
||||||
|
// for this file.
|
||||||
|
@Native
|
||||||
|
public static final int R0 = 0;
|
||||||
|
public static final int R1 = 1;
|
||||||
|
public static final int R2 = 2;
|
||||||
|
public static final int R3 = 3;
|
||||||
|
public static final int R4 = 4;
|
||||||
|
public static final int R5 = 5;
|
||||||
|
public static final int R6 = 6;
|
||||||
|
public static final int R7 = 7;
|
||||||
|
public static final int R8 = 8;
|
||||||
|
public static final int R9 = 9;
|
||||||
|
public static final int R10 = 10;
|
||||||
|
public static final int R11 = 11;
|
||||||
|
public static final int R12 = 12;
|
||||||
|
public static final int R13 = 13;
|
||||||
|
public static final int R14 = 14;
|
||||||
|
public static final int R15 = 15;
|
||||||
|
public static final int R16 = 16;
|
||||||
|
public static final int R17 = 17;
|
||||||
|
public static final int R18 = 18;
|
||||||
|
public static final int R19 = 19;
|
||||||
|
public static final int R20 = 20;
|
||||||
|
public static final int R21 = 21;
|
||||||
|
public static final int R22 = 22;
|
||||||
|
public static final int R23 = 23;
|
||||||
|
public static final int R24 = 24;
|
||||||
|
public static final int R25 = 25;
|
||||||
|
public static final int R26 = 26;
|
||||||
|
public static final int R27 = 27;
|
||||||
|
public static final int R28 = 28;
|
||||||
|
public static final int FP = 29;
|
||||||
|
public static final int LR = 30;
|
||||||
|
public static final int SP = 31;
|
||||||
|
public static final int PC = 32;
|
||||||
|
|
||||||
|
public static final int NPRGREG = 33;
|
||||||
|
|
||||||
|
private long[] data;
|
||||||
|
|
||||||
|
public AARCH64ThreadContext() {
|
||||||
|
data = new long[NPRGREG];
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNumRegisters() {
|
||||||
|
return NPRGREG;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegisterName(int index) {
|
||||||
|
switch (index) {
|
||||||
|
case LR: return "lr";
|
||||||
|
case SP: return "sp";
|
||||||
|
case PC: return "pc";
|
||||||
|
default:
|
||||||
|
return "r" + index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegister(int index, long value) {
|
||||||
|
data[index] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getRegister(int index) {
|
||||||
|
return data[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
public CFrame getTopFrame(Debugger dbg) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This can't be implemented in this class since we would have to
|
||||||
|
* tie the implementation to, for example, the debugging system */
|
||||||
|
public abstract void setRegisterAsAddress(int index, Address value);
|
||||||
|
|
||||||
|
/** This can't be implemented in this class since we would have to
|
||||||
|
* tie the implementation to, for example, the debugging system */
|
||||||
|
public abstract Address getRegisterAsAddress(int index);
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -31,12 +32,14 @@ import sun.jvm.hotspot.debugger.*;
|
|||||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||||
import sun.jvm.hotspot.debugger.x86.*;
|
import sun.jvm.hotspot.debugger.x86.*;
|
||||||
import sun.jvm.hotspot.debugger.amd64.*;
|
import sun.jvm.hotspot.debugger.amd64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
import sun.jvm.hotspot.debugger.sparc.*;
|
import sun.jvm.hotspot.debugger.sparc.*;
|
||||||
import sun.jvm.hotspot.debugger.ppc64.*;
|
import sun.jvm.hotspot.debugger.ppc64.*;
|
||||||
import sun.jvm.hotspot.debugger.linux.x86.*;
|
import sun.jvm.hotspot.debugger.linux.x86.*;
|
||||||
import sun.jvm.hotspot.debugger.linux.amd64.*;
|
import sun.jvm.hotspot.debugger.linux.amd64.*;
|
||||||
import sun.jvm.hotspot.debugger.linux.sparc.*;
|
import sun.jvm.hotspot.debugger.linux.sparc.*;
|
||||||
import sun.jvm.hotspot.debugger.linux.ppc64.*;
|
import sun.jvm.hotspot.debugger.linux.ppc64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.linux.aarch64.*;
|
||||||
import sun.jvm.hotspot.utilities.*;
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
class LinuxCDebugger implements CDebugger {
|
class LinuxCDebugger implements CDebugger {
|
||||||
@ -106,6 +109,13 @@ class LinuxCDebugger implements CDebugger {
|
|||||||
Address pc = context.getRegisterAsAddress(PPC64ThreadContext.PC);
|
Address pc = context.getRegisterAsAddress(PPC64ThreadContext.PC);
|
||||||
if (pc == null) return null;
|
if (pc == null) return null;
|
||||||
return new LinuxPPC64CFrame(dbg, sp, pc, LinuxDebuggerLocal.getAddressSize());
|
return new LinuxPPC64CFrame(dbg, sp, pc, LinuxDebuggerLocal.getAddressSize());
|
||||||
|
} else if (cpu.equals("aarch64")) {
|
||||||
|
AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
|
||||||
|
Address fp = context.getRegisterAsAddress(AARCH64ThreadContext.FP);
|
||||||
|
if (fp == null) return null;
|
||||||
|
Address pc = context.getRegisterAsAddress(AARCH64ThreadContext.PC);
|
||||||
|
if (pc == null) return null;
|
||||||
|
return new LinuxAARCH64CFrame(dbg, fp, pc);
|
||||||
} else {
|
} else {
|
||||||
// Runtime exception thrown by LinuxThreadContextFactory if unknown cpu
|
// Runtime exception thrown by LinuxThreadContextFactory if unknown cpu
|
||||||
ThreadContext context = (ThreadContext) thread.getContext();
|
ThreadContext context = (ThreadContext) thread.getContext();
|
||||||
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.linux.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.linux.*;
|
||||||
|
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||||
|
import sun.jvm.hotspot.debugger.cdbg.basic.*;
|
||||||
|
|
||||||
|
final public class LinuxAARCH64CFrame extends BasicCFrame {
|
||||||
|
public LinuxAARCH64CFrame(LinuxDebugger dbg, Address fp, Address pc) {
|
||||||
|
super(dbg.getCDebugger());
|
||||||
|
this.fp = fp;
|
||||||
|
this.pc = pc;
|
||||||
|
this.dbg = dbg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// override base class impl to avoid ELF parsing
|
||||||
|
public ClosestSymbol closestSymbolToPC() {
|
||||||
|
// try native lookup in debugger.
|
||||||
|
return dbg.lookup(dbg.getAddressValue(pc()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address pc() {
|
||||||
|
return pc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address localVariableBase() {
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CFrame sender(ThreadProxy thread) {
|
||||||
|
AARCH64ThreadContext context = (AARCH64ThreadContext) thread.getContext();
|
||||||
|
Address rsp = context.getRegisterAsAddress(AARCH64ThreadContext.SP);
|
||||||
|
|
||||||
|
if ((fp == null) || fp.lessThan(rsp)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check alignment of fp
|
||||||
|
if (dbg.getAddressValue(fp) % (2 * ADDRESS_SIZE) != 0) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Address nextFP = fp.getAddressAt(0 * ADDRESS_SIZE);
|
||||||
|
if (nextFP == null || nextFP.lessThanOrEqual(fp)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
Address nextPC = fp.getAddressAt(1 * ADDRESS_SIZE);
|
||||||
|
if (nextPC == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new LinuxAARCH64CFrame(dbg, nextFP, nextPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
// package/class internals only
|
||||||
|
private static final int ADDRESS_SIZE = 8;
|
||||||
|
private Address pc;
|
||||||
|
private Address sp;
|
||||||
|
private Address fp;
|
||||||
|
private LinuxDebugger dbg;
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.linux.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.linux.*;
|
||||||
|
|
||||||
|
public class LinuxAARCH64ThreadContext extends AARCH64ThreadContext {
|
||||||
|
private LinuxDebugger debugger;
|
||||||
|
|
||||||
|
public LinuxAARCH64ThreadContext(LinuxDebugger debugger) {
|
||||||
|
super();
|
||||||
|
this.debugger = debugger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegisterAsAddress(int index, Address value) {
|
||||||
|
setRegister(index, debugger.getAddressValue(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getRegisterAsAddress(int index) {
|
||||||
|
return debugger.newAddress(getRegister(index));
|
||||||
|
}
|
||||||
|
}
|
@ -31,11 +31,13 @@ import java.lang.reflect.*;
|
|||||||
import sun.jvm.hotspot.debugger.*;
|
import sun.jvm.hotspot.debugger.*;
|
||||||
import sun.jvm.hotspot.debugger.cdbg.*;
|
import sun.jvm.hotspot.debugger.cdbg.*;
|
||||||
import sun.jvm.hotspot.debugger.proc.amd64.*;
|
import sun.jvm.hotspot.debugger.proc.amd64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.proc.aarch64.*;
|
||||||
import sun.jvm.hotspot.debugger.proc.sparc.*;
|
import sun.jvm.hotspot.debugger.proc.sparc.*;
|
||||||
import sun.jvm.hotspot.debugger.proc.ppc64.*;
|
import sun.jvm.hotspot.debugger.proc.ppc64.*;
|
||||||
import sun.jvm.hotspot.debugger.proc.x86.*;
|
import sun.jvm.hotspot.debugger.proc.x86.*;
|
||||||
import sun.jvm.hotspot.debugger.ppc64.*;
|
import sun.jvm.hotspot.debugger.ppc64.*;
|
||||||
import sun.jvm.hotspot.debugger.amd64.*;
|
import sun.jvm.hotspot.debugger.amd64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
import sun.jvm.hotspot.debugger.sparc.*;
|
import sun.jvm.hotspot.debugger.sparc.*;
|
||||||
import sun.jvm.hotspot.debugger.x86.*;
|
import sun.jvm.hotspot.debugger.x86.*;
|
||||||
import sun.jvm.hotspot.utilities.*;
|
import sun.jvm.hotspot.utilities.*;
|
||||||
@ -88,6 +90,10 @@ public class ProcDebuggerLocal extends DebuggerBase implements ProcDebugger {
|
|||||||
threadFactory = new ProcAMD64ThreadFactory(this);
|
threadFactory = new ProcAMD64ThreadFactory(this);
|
||||||
pcRegIndex = AMD64ThreadContext.RIP;
|
pcRegIndex = AMD64ThreadContext.RIP;
|
||||||
fpRegIndex = AMD64ThreadContext.RBP;
|
fpRegIndex = AMD64ThreadContext.RBP;
|
||||||
|
} else if (cpu.equals("aarch64")) {
|
||||||
|
threadFactory = new ProcAARCH64ThreadFactory(this);
|
||||||
|
pcRegIndex = AARCH64ThreadContext.PC;
|
||||||
|
fpRegIndex = AARCH64ThreadContext.FP;
|
||||||
} else if (cpu.equals("ppc64")) {
|
} else if (cpu.equals("ppc64")) {
|
||||||
threadFactory = new ProcPPC64ThreadFactory(this);
|
threadFactory = new ProcPPC64ThreadFactory(this);
|
||||||
pcRegIndex = PPC64ThreadContext.PC;
|
pcRegIndex = PPC64ThreadContext.PC;
|
||||||
|
@ -0,0 +1,87 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.proc.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.proc.*;
|
||||||
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
|
public class ProcAARCH64Thread implements ThreadProxy {
|
||||||
|
private ProcDebugger debugger;
|
||||||
|
private int id;
|
||||||
|
|
||||||
|
public ProcAARCH64Thread(ProcDebugger debugger, Address addr) {
|
||||||
|
this.debugger = debugger;
|
||||||
|
|
||||||
|
// FIXME: the size here should be configurable. However, making it
|
||||||
|
// so would produce a dependency on the "types" package from the
|
||||||
|
// debugger package, which is not desired.
|
||||||
|
this.id = (int) addr.getCIntegerAt(0, 4, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProcAARCH64Thread(ProcDebugger debugger, long id) {
|
||||||
|
this.debugger = debugger;
|
||||||
|
this.id = (int) id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadContext getContext() throws IllegalThreadStateException {
|
||||||
|
ProcAARCH64ThreadContext context = new ProcAARCH64ThreadContext(debugger);
|
||||||
|
long[] regs = debugger.getThreadIntegerRegisterSet(id);
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(regs.length == AARCH64ThreadContext.NPRGREG, "size mismatch");
|
||||||
|
}
|
||||||
|
for (int i = 0; i < regs.length; i++) {
|
||||||
|
context.setRegister(i, regs[i]);
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canSetContext() throws DebuggerException {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContext(ThreadContext context)
|
||||||
|
throws IllegalThreadStateException, DebuggerException {
|
||||||
|
throw new DebuggerException("Unimplemented");
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "t@" + id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if ((obj == null) || !(obj instanceof ProcAARCH64Thread)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (((ProcAARCH64Thread) obj).id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.proc.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.proc.*;
|
||||||
|
|
||||||
|
public class ProcAARCH64ThreadContext extends AARCH64ThreadContext {
|
||||||
|
private ProcDebugger debugger;
|
||||||
|
|
||||||
|
public ProcAARCH64ThreadContext(ProcDebugger debugger) {
|
||||||
|
super();
|
||||||
|
this.debugger = debugger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegisterAsAddress(int index, Address value) {
|
||||||
|
setRegister(index, debugger.getAddressValue(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getRegisterAsAddress(int index) {
|
||||||
|
return debugger.newAddress(getRegister(index));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.proc.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.proc.*;
|
||||||
|
|
||||||
|
public class ProcAARCH64ThreadFactory implements ProcThreadFactory {
|
||||||
|
private ProcDebugger debugger;
|
||||||
|
|
||||||
|
public ProcAARCH64ThreadFactory(ProcDebugger debugger) {
|
||||||
|
this.debugger = debugger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadProxy createThreadWrapper(Address threadIdentifierAddr) {
|
||||||
|
return new ProcAARCH64Thread(debugger, threadIdentifierAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadProxy createThreadWrapper(long id) {
|
||||||
|
return new ProcAARCH64Thread(debugger, id);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.remote.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.remote.*;
|
||||||
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
|
public class RemoteAARCH64Thread extends RemoteThread {
|
||||||
|
public RemoteAARCH64Thread(RemoteDebuggerClient debugger, Address addr) {
|
||||||
|
super(debugger, addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RemoteAARCH64Thread(RemoteDebuggerClient debugger, long id) {
|
||||||
|
super(debugger, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadContext getContext() throws IllegalThreadStateException {
|
||||||
|
RemoteAARCH64ThreadContext context = new RemoteAARCH64ThreadContext(debugger);
|
||||||
|
long[] regs = (addr != null)? debugger.getThreadIntegerRegisterSet(addr) :
|
||||||
|
debugger.getThreadIntegerRegisterSet(id);
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(regs.length == AARCH64ThreadContext.NPRGREG, "size of register set must match");
|
||||||
|
}
|
||||||
|
for (int i = 0; i < regs.length; i++) {
|
||||||
|
context.setRegister(i, regs[i]);
|
||||||
|
}
|
||||||
|
return context;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.remote.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.debugger.remote.*;
|
||||||
|
|
||||||
|
public class RemoteAARCH64ThreadContext extends AARCH64ThreadContext {
|
||||||
|
private RemoteDebuggerClient debugger;
|
||||||
|
|
||||||
|
public RemoteAARCH64ThreadContext(RemoteDebuggerClient debugger) {
|
||||||
|
super();
|
||||||
|
this.debugger = debugger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRegisterAsAddress(int index, Address value) {
|
||||||
|
setRegister(index, debugger.getAddressValue(value));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getRegisterAsAddress(int index) {
|
||||||
|
return debugger.newAddress(getRegister(index));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.debugger.remote.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.remote.*;
|
||||||
|
|
||||||
|
public class RemoteAARCH64ThreadFactory implements RemoteThreadFactory {
|
||||||
|
private RemoteDebuggerClient debugger;
|
||||||
|
|
||||||
|
public RemoteAARCH64ThreadFactory(RemoteDebuggerClient debugger) {
|
||||||
|
this.debugger = debugger;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadProxy createThreadWrapper(Address threadIdentifierAddr) {
|
||||||
|
return new RemoteAARCH64Thread(debugger, threadIdentifierAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadProxy createThreadWrapper(long id) {
|
||||||
|
return new RemoteAARCH64Thread(debugger, id);
|
||||||
|
}
|
||||||
|
}
|
@ -35,6 +35,7 @@ import sun.jvm.hotspot.runtime.win32_amd64.Win32AMD64JavaThreadPDAccess;
|
|||||||
import sun.jvm.hotspot.runtime.win32_x86.Win32X86JavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.win32_x86.Win32X86JavaThreadPDAccess;
|
||||||
import sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.linux_x86.LinuxX86JavaThreadPDAccess;
|
||||||
import sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.linux_amd64.LinuxAMD64JavaThreadPDAccess;
|
||||||
|
import sun.jvm.hotspot.runtime.linux_aarch64.LinuxAARCH64JavaThreadPDAccess;
|
||||||
import sun.jvm.hotspot.runtime.linux_ppc64.LinuxPPC64JavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.linux_ppc64.LinuxPPC64JavaThreadPDAccess;
|
||||||
import sun.jvm.hotspot.runtime.linux_sparc.LinuxSPARCJavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.linux_sparc.LinuxSPARCJavaThreadPDAccess;
|
||||||
import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
|
import sun.jvm.hotspot.runtime.bsd_x86.BsdX86JavaThreadPDAccess;
|
||||||
@ -91,6 +92,8 @@ public class Threads {
|
|||||||
access = new LinuxSPARCJavaThreadPDAccess();
|
access = new LinuxSPARCJavaThreadPDAccess();
|
||||||
} else if (cpu.equals("ppc64")) {
|
} else if (cpu.equals("ppc64")) {
|
||||||
access = new LinuxPPC64JavaThreadPDAccess();
|
access = new LinuxPPC64JavaThreadPDAccess();
|
||||||
|
} else if (cpu.equals("aarch64")) {
|
||||||
|
access = new LinuxAARCH64JavaThreadPDAccess();
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
access = (JavaThreadPDAccess)
|
access = (JavaThreadPDAccess)
|
||||||
|
@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.runtime.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.code.*;
|
||||||
|
import sun.jvm.hotspot.interpreter.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.runtime.aarch64.*;
|
||||||
|
|
||||||
|
/** <P> Should be able to be used on all aarch64 platforms we support
|
||||||
|
(Linux/aarch64) to implement JavaThread's "currentFrameGuess()"
|
||||||
|
functionality. Input is an AARCH64ThreadContext; output is SP, FP,
|
||||||
|
and PC for an AARCH64Frame. Instantiation of the AARCH64Frame is
|
||||||
|
left to the caller, since we may need to subclass AARCH64Frame to
|
||||||
|
support signal handler frames on Unix platforms. </P>
|
||||||
|
|
||||||
|
<P> Algorithm is to walk up the stack within a given range (say,
|
||||||
|
512K at most) looking for a plausible PC and SP for a Java frame,
|
||||||
|
also considering those coming in from the context. If we find a PC
|
||||||
|
that belongs to the VM (i.e., in generated code like the
|
||||||
|
interpreter or CodeCache) then we try to find an associated FP.
|
||||||
|
We repeat this until we either find a complete frame or run out of
|
||||||
|
stack to look at. </P> */
|
||||||
|
|
||||||
|
public class AARCH64CurrentFrameGuess {
|
||||||
|
private AARCH64ThreadContext context;
|
||||||
|
private JavaThread thread;
|
||||||
|
private Address spFound;
|
||||||
|
private Address fpFound;
|
||||||
|
private Address pcFound;
|
||||||
|
|
||||||
|
private static final boolean DEBUG = System.getProperty("sun.jvm.hotspot.runtime.aarch64.AARCH64Frame.DEBUG")
|
||||||
|
!= null;
|
||||||
|
|
||||||
|
public AARCH64CurrentFrameGuess(AARCH64ThreadContext context,
|
||||||
|
JavaThread thread) {
|
||||||
|
this.context = context;
|
||||||
|
this.thread = thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns false if not able to find a frame within a reasonable range. */
|
||||||
|
public boolean run(long regionInBytesToSearch) {
|
||||||
|
Address sp = context.getRegisterAsAddress(AARCH64ThreadContext.SP);
|
||||||
|
Address pc = context.getRegisterAsAddress(AARCH64ThreadContext.PC);
|
||||||
|
Address fp = context.getRegisterAsAddress(AARCH64ThreadContext.FP);
|
||||||
|
if (sp == null) {
|
||||||
|
// Bail out if no last java frame either
|
||||||
|
if (thread.getLastJavaSP() != null) {
|
||||||
|
setValues(thread.getLastJavaSP(), thread.getLastJavaFP(), null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Address end = sp.addOffsetTo(regionInBytesToSearch);
|
||||||
|
VM vm = VM.getVM();
|
||||||
|
|
||||||
|
setValues(null, null, null); // Assume we're not going to find anything
|
||||||
|
|
||||||
|
if (vm.isJavaPCDbg(pc)) {
|
||||||
|
if (vm.isClientCompiler()) {
|
||||||
|
// If the topmost frame is a Java frame, we are (pretty much)
|
||||||
|
// guaranteed to have a viable FP. We should be more robust
|
||||||
|
// than this (we have the potential for losing entire threads'
|
||||||
|
// stack traces) but need to see how much work we really have
|
||||||
|
// to do here. Searching the stack for an (SP, FP) pair is
|
||||||
|
// hard since it's easy to misinterpret inter-frame stack
|
||||||
|
// pointers as base-of-frame pointers; we also don't know the
|
||||||
|
// sizes of C1 frames (not registered in the nmethod) so can't
|
||||||
|
// derive them from SP.
|
||||||
|
|
||||||
|
setValues(sp, fp, pc);
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
if (vm.getInterpreter().contains(pc)) {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("CurrentFrameGuess: choosing interpreter frame: sp = " +
|
||||||
|
sp + ", fp = " + fp + ", pc = " + pc);
|
||||||
|
}
|
||||||
|
setValues(sp, fp, pc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For the server compiler, FP is not guaranteed to be valid
|
||||||
|
// for compiled code. In addition, an earlier attempt at a
|
||||||
|
// non-searching algorithm (see below) failed because the
|
||||||
|
// stack pointer from the thread context was pointing
|
||||||
|
// (considerably) beyond the ostensible end of the stack, into
|
||||||
|
// garbage; walking from the topmost frame back caused a crash.
|
||||||
|
//
|
||||||
|
// This algorithm takes the current PC as a given and tries to
|
||||||
|
// find the correct corresponding SP by walking up the stack
|
||||||
|
// and repeatedly performing stackwalks (very inefficient).
|
||||||
|
//
|
||||||
|
// FIXME: there is something wrong with stackwalking across
|
||||||
|
// adapter frames...this is likely to be the root cause of the
|
||||||
|
// failure with the simpler algorithm below.
|
||||||
|
|
||||||
|
for (long offset = 0;
|
||||||
|
offset < regionInBytesToSearch;
|
||||||
|
offset += vm.getAddressSize()) {
|
||||||
|
try {
|
||||||
|
Address curSP = sp.addOffsetTo(offset);
|
||||||
|
Frame frame = new AARCH64Frame(curSP, null, pc);
|
||||||
|
RegisterMap map = thread.newRegisterMap(false);
|
||||||
|
while (frame != null) {
|
||||||
|
if (frame.isEntryFrame() && frame.entryFrameIsFirst()) {
|
||||||
|
// We were able to traverse all the way to the
|
||||||
|
// bottommost Java frame.
|
||||||
|
// This sp looks good. Keep it.
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("CurrentFrameGuess: Choosing sp = " + curSP + ", pc = " + pc);
|
||||||
|
}
|
||||||
|
setValues(curSP, null, pc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
frame = frame.sender(map);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("CurrentFrameGuess: Exception " + e + " at offset " + offset);
|
||||||
|
}
|
||||||
|
// Bad SP. Try another.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Were not able to find a plausible SP to go with this PC.
|
||||||
|
// Bail out.
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
// Original algorithm which does not work because SP was
|
||||||
|
// pointing beyond where it should have:
|
||||||
|
|
||||||
|
// For the server compiler, FP is not guaranteed to be valid
|
||||||
|
// for compiled code. We see whether the PC is in the
|
||||||
|
// interpreter and take care of that, otherwise we run code
|
||||||
|
// (unfortunately) duplicated from AARCH64Frame.senderForCompiledFrame.
|
||||||
|
|
||||||
|
CodeCache cc = vm.getCodeCache();
|
||||||
|
if (cc.contains(pc)) {
|
||||||
|
CodeBlob cb = cc.findBlob(pc);
|
||||||
|
|
||||||
|
// See if we can derive a frame pointer from SP and PC
|
||||||
|
// NOTE: This is the code duplicated from AARCH64Frame
|
||||||
|
Address saved_fp = null;
|
||||||
|
int llink_offset = cb.getLinkOffset();
|
||||||
|
if (llink_offset >= 0) {
|
||||||
|
// Restore base-pointer, since next frame might be an interpreter frame.
|
||||||
|
Address fp_addr = sp.addOffsetTo(VM.getVM().getAddressSize() * llink_offset);
|
||||||
|
saved_fp = fp_addr.getAddressAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
setValues(sp, saved_fp, pc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If the current program counter was not known to us as a Java
|
||||||
|
// PC, we currently assume that we are in the run-time system
|
||||||
|
// and attempt to look to thread-local storage for saved SP and
|
||||||
|
// FP. Note that if these are null (because we were, in fact,
|
||||||
|
// in Java code, i.e., vtable stubs or similar, and the SA
|
||||||
|
// didn't have enough insight into the target VM to understand
|
||||||
|
// that) then we are going to lose the entire stack trace for
|
||||||
|
// the thread, which is sub-optimal. FIXME.
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("CurrentFrameGuess: choosing last Java frame: sp = " +
|
||||||
|
thread.getLastJavaSP() + ", fp = " + thread.getLastJavaFP());
|
||||||
|
}
|
||||||
|
if (thread.getLastJavaSP() == null) {
|
||||||
|
return false; // No known Java frames on stack
|
||||||
|
}
|
||||||
|
|
||||||
|
// The runtime has a nasty habit of not saving fp in the frame
|
||||||
|
// anchor, leaving us to grovel about in the stack to find a
|
||||||
|
// plausible address. Fortunately, this only happens in
|
||||||
|
// compiled code; there we always have a valid PC, and we always
|
||||||
|
// push LR and FP onto the stack as a pair, with FP at the lower
|
||||||
|
// address.
|
||||||
|
pc = thread.getLastJavaPC();
|
||||||
|
fp = thread.getLastJavaFP();
|
||||||
|
sp = thread.getLastJavaSP();
|
||||||
|
|
||||||
|
if (fp == null) {
|
||||||
|
CodeCache cc = vm.getCodeCache();
|
||||||
|
if (cc.contains(pc)) {
|
||||||
|
CodeBlob cb = cc.findBlob(pc);
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("FP is null. Found blob frame size " + cb.getFrameSize());
|
||||||
|
}
|
||||||
|
// See if we can derive a frame pointer from SP and PC
|
||||||
|
long link_offset = cb.getFrameSize() - 2 * VM.getVM().getAddressSize();
|
||||||
|
if (link_offset >= 0) {
|
||||||
|
fp = sp.addOffsetTo(link_offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setValues(sp, fp, null);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getSP() { return spFound; }
|
||||||
|
public Address getFP() { return fpFound; }
|
||||||
|
/** May be null if getting values from thread-local storage; take
|
||||||
|
care to call the correct AARCH64Frame constructor to recover this if
|
||||||
|
necessary */
|
||||||
|
public Address getPC() { return pcFound; }
|
||||||
|
|
||||||
|
private void setValues(Address sp, Address fp, Address pc) {
|
||||||
|
spFound = sp;
|
||||||
|
fpFound = fp;
|
||||||
|
pcFound = pc;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,555 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.runtime.aarch64;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import sun.jvm.hotspot.code.*;
|
||||||
|
import sun.jvm.hotspot.compiler.*;
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.oops.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.types.*;
|
||||||
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
|
/** Specialization of and implementation of abstract methods of the
|
||||||
|
Frame class for the aarch64 family of CPUs. */
|
||||||
|
|
||||||
|
public class AARCH64Frame extends Frame {
|
||||||
|
private static final boolean DEBUG;
|
||||||
|
static {
|
||||||
|
DEBUG = System.getProperty("sun.jvm.hotspot.runtime.aarch64.AARCH64Frame.DEBUG") != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// All frames
|
||||||
|
private static final int LINK_OFFSET = 0;
|
||||||
|
private static final int RETURN_ADDR_OFFSET = 1;
|
||||||
|
private static final int SENDER_SP_OFFSET = 2;
|
||||||
|
|
||||||
|
// Interpreter frames
|
||||||
|
private static final int INTERPRETER_FRAME_MIRROR_OFFSET = 2; // for native calls only
|
||||||
|
private static final int INTERPRETER_FRAME_SENDER_SP_OFFSET = -1;
|
||||||
|
private static final int INTERPRETER_FRAME_LAST_SP_OFFSET = INTERPRETER_FRAME_SENDER_SP_OFFSET - 1;
|
||||||
|
private static final int INTERPRETER_FRAME_METHOD_OFFSET = INTERPRETER_FRAME_LAST_SP_OFFSET - 1;
|
||||||
|
private static int INTERPRETER_FRAME_MDX_OFFSET; // Non-core builds only
|
||||||
|
private static int INTERPRETER_FRAME_CACHE_OFFSET;
|
||||||
|
private static int INTERPRETER_FRAME_LOCALS_OFFSET;
|
||||||
|
private static int INTERPRETER_FRAME_BCX_OFFSET;
|
||||||
|
private static int INTERPRETER_FRAME_INITIAL_SP_OFFSET;
|
||||||
|
private static int INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET;
|
||||||
|
private static int INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET;
|
||||||
|
|
||||||
|
// Entry frames
|
||||||
|
private static int ENTRY_FRAME_CALL_WRAPPER_OFFSET = -8;
|
||||||
|
|
||||||
|
// Native frames
|
||||||
|
private static final int NATIVE_FRAME_INITIAL_PARAM_OFFSET = 2;
|
||||||
|
|
||||||
|
private static VMReg fp = new VMReg(29);
|
||||||
|
|
||||||
|
static {
|
||||||
|
VM.registerVMInitializedObserver(new Observer() {
|
||||||
|
public void update(Observable o, Object data) {
|
||||||
|
initialize(VM.getVM().getTypeDataBase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized void initialize(TypeDataBase db) {
|
||||||
|
INTERPRETER_FRAME_MDX_OFFSET = INTERPRETER_FRAME_METHOD_OFFSET - 1;
|
||||||
|
INTERPRETER_FRAME_CACHE_OFFSET = INTERPRETER_FRAME_MDX_OFFSET - 1;
|
||||||
|
INTERPRETER_FRAME_LOCALS_OFFSET = INTERPRETER_FRAME_CACHE_OFFSET - 1;
|
||||||
|
INTERPRETER_FRAME_BCX_OFFSET = INTERPRETER_FRAME_LOCALS_OFFSET - 1;
|
||||||
|
INTERPRETER_FRAME_INITIAL_SP_OFFSET = INTERPRETER_FRAME_BCX_OFFSET - 1;
|
||||||
|
INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
|
||||||
|
INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET = INTERPRETER_FRAME_INITIAL_SP_OFFSET;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// an additional field beyond sp and pc:
|
||||||
|
Address raw_fp; // frame pointer
|
||||||
|
private Address raw_unextendedSP;
|
||||||
|
|
||||||
|
private AARCH64Frame() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private void adjustForDeopt() {
|
||||||
|
if ( pc != null) {
|
||||||
|
// Look for a deopt pc and if it is deopted convert to original pc
|
||||||
|
CodeBlob cb = VM.getVM().getCodeCache().findBlob(pc);
|
||||||
|
if (cb != null && cb.isJavaMethod()) {
|
||||||
|
NMethod nm = (NMethod) cb;
|
||||||
|
if (pc.equals(nm.deoptHandlerBegin())) {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(this.getUnextendedSP() != null, "null SP in Java frame");
|
||||||
|
}
|
||||||
|
// adjust pc if frame is deoptimized.
|
||||||
|
pc = this.getUnextendedSP().getAddressAt(nm.origPCOffset());
|
||||||
|
deoptimized = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AARCH64Frame(Address raw_sp, Address raw_fp, Address pc) {
|
||||||
|
this.raw_sp = raw_sp;
|
||||||
|
this.raw_unextendedSP = raw_sp;
|
||||||
|
this.raw_fp = raw_fp;
|
||||||
|
this.pc = pc;
|
||||||
|
adjustUnextendedSP();
|
||||||
|
|
||||||
|
// Frame must be fully constructed before this call
|
||||||
|
adjustForDeopt();
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("AARCH64Frame(sp, fp, pc): " + this);
|
||||||
|
dumpStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AARCH64Frame(Address raw_sp, Address raw_fp) {
|
||||||
|
this.raw_sp = raw_sp;
|
||||||
|
this.raw_unextendedSP = raw_sp;
|
||||||
|
this.raw_fp = raw_fp;
|
||||||
|
this.pc = raw_sp.getAddressAt(-1 * VM.getVM().getAddressSize());
|
||||||
|
adjustUnextendedSP();
|
||||||
|
|
||||||
|
// Frame must be fully constructed before this call
|
||||||
|
adjustForDeopt();
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("AARCH64Frame(sp, fp): " + this);
|
||||||
|
dumpStack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public AARCH64Frame(Address raw_sp, Address raw_unextendedSp, Address raw_fp, Address pc) {
|
||||||
|
this.raw_sp = raw_sp;
|
||||||
|
this.raw_unextendedSP = raw_unextendedSp;
|
||||||
|
this.raw_fp = raw_fp;
|
||||||
|
this.pc = pc;
|
||||||
|
adjustUnextendedSP();
|
||||||
|
|
||||||
|
// Frame must be fully constructed before this call
|
||||||
|
adjustForDeopt();
|
||||||
|
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("AARCH64Frame(sp, unextendedSP, fp, pc): " + this);
|
||||||
|
dumpStack();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
AARCH64Frame frame = new AARCH64Frame();
|
||||||
|
frame.raw_sp = raw_sp;
|
||||||
|
frame.raw_unextendedSP = raw_unextendedSP;
|
||||||
|
frame.raw_fp = raw_fp;
|
||||||
|
frame.pc = pc;
|
||||||
|
frame.deoptimized = deoptimized;
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean equals(Object arg) {
|
||||||
|
if (arg == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(arg instanceof AARCH64Frame)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
AARCH64Frame other = (AARCH64Frame) arg;
|
||||||
|
|
||||||
|
return (AddressOps.equal(getSP(), other.getSP()) &&
|
||||||
|
AddressOps.equal(getUnextendedSP(), other.getUnextendedSP()) &&
|
||||||
|
AddressOps.equal(getFP(), other.getFP()) &&
|
||||||
|
AddressOps.equal(getPC(), other.getPC()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int hashCode() {
|
||||||
|
if (raw_sp == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return raw_sp.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String toString() {
|
||||||
|
return "sp: " + (getSP() == null? "null" : getSP().toString()) +
|
||||||
|
", unextendedSP: " + (getUnextendedSP() == null? "null" : getUnextendedSP().toString()) +
|
||||||
|
", fp: " + (getFP() == null? "null" : getFP().toString()) +
|
||||||
|
", pc: " + (pc == null? "null" : pc.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// accessors for the instance variables
|
||||||
|
public Address getFP() { return raw_fp; }
|
||||||
|
public Address getSP() { return raw_sp; }
|
||||||
|
public Address getID() { return raw_sp; }
|
||||||
|
|
||||||
|
// FIXME: not implemented yet
|
||||||
|
public boolean isSignalHandlerFrameDbg() { return false; }
|
||||||
|
public int getSignalNumberDbg() { return 0; }
|
||||||
|
public String getSignalNameDbg() { return null; }
|
||||||
|
|
||||||
|
public boolean isInterpretedFrameValid() {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(isInterpretedFrame(), "Not an interpreted frame");
|
||||||
|
}
|
||||||
|
|
||||||
|
// These are reasonable sanity checks
|
||||||
|
if (getFP() == null || getFP().andWithMask(0x3) != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getSP() == null || getSP().andWithMask(0x3) != null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getFP().addOffsetTo(INTERPRETER_FRAME_INITIAL_SP_OFFSET * VM.getVM().getAddressSize()).lessThan(getSP())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// These are hacks to keep us out of trouble.
|
||||||
|
// The problem with these is that they mask other problems
|
||||||
|
if (getFP().lessThanOrEqual(getSP())) {
|
||||||
|
// this attempts to deal with unsigned comparison above
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getFP().minus(getSP()) > 4096 * VM.getVM().getAddressSize()) {
|
||||||
|
// stack frames shouldn't be large.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: not applicable in current system
|
||||||
|
// void patch_pc(Thread* thread, address pc);
|
||||||
|
|
||||||
|
public Frame sender(RegisterMap regMap, CodeBlob cb) {
|
||||||
|
AARCH64RegisterMap map = (AARCH64RegisterMap) regMap;
|
||||||
|
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(map != null, "map must be set");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Default is we done have to follow them. The sender_for_xxx will
|
||||||
|
// update it accordingly
|
||||||
|
map.setIncludeArgumentOops(false);
|
||||||
|
|
||||||
|
if (isEntryFrame()) return senderForEntryFrame(map);
|
||||||
|
if (isInterpretedFrame()) return senderForInterpreterFrame(map);
|
||||||
|
|
||||||
|
if(cb == null) {
|
||||||
|
cb = VM.getVM().getCodeCache().findBlob(getPC());
|
||||||
|
} else {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(cb.equals(VM.getVM().getCodeCache().findBlob(getPC())), "Must be the same");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cb != null) {
|
||||||
|
return senderForCompiledFrame(map, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must be native-compiled frame, i.e. the marshaling code for native
|
||||||
|
// methods that exists in the core system.
|
||||||
|
return new AARCH64Frame(getSenderSP(), getLink(), getSenderPC());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Frame senderForEntryFrame(AARCH64RegisterMap map) {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("senderForEntryFrame");
|
||||||
|
}
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(map != null, "map must be set");
|
||||||
|
}
|
||||||
|
// Java frame called from C; skip all C frames and return top C
|
||||||
|
// frame of that chunk as the sender
|
||||||
|
AARCH64JavaCallWrapper jcw = (AARCH64JavaCallWrapper) getEntryFrameCallWrapper();
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(!entryFrameIsFirst(), "next Java fp must be non zero");
|
||||||
|
Assert.that(jcw.getLastJavaSP().greaterThan(getSP()), "must be above this frame on stack");
|
||||||
|
}
|
||||||
|
AARCH64Frame fr;
|
||||||
|
if (jcw.getLastJavaPC() != null) {
|
||||||
|
fr = new AARCH64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP(), jcw.getLastJavaPC());
|
||||||
|
} else {
|
||||||
|
fr = new AARCH64Frame(jcw.getLastJavaSP(), jcw.getLastJavaFP());
|
||||||
|
}
|
||||||
|
map.clear();
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(map.getIncludeArgumentOops(), "should be set by clear");
|
||||||
|
}
|
||||||
|
return fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// frame::adjust_unextended_sp
|
||||||
|
private void adjustUnextendedSP() {
|
||||||
|
// If we are returning to a compiled MethodHandle call site, the
|
||||||
|
// saved_fp will in fact be a saved value of the unextended SP. The
|
||||||
|
// simplest way to tell whether we are returning to such a call site
|
||||||
|
// is as follows:
|
||||||
|
|
||||||
|
CodeBlob cb = cb();
|
||||||
|
NMethod senderNm = (cb == null) ? null : cb.asNMethodOrNull();
|
||||||
|
if (senderNm != null) {
|
||||||
|
// If the sender PC is a deoptimization point, get the original
|
||||||
|
// PC. For MethodHandle call site the unextended_sp is stored in
|
||||||
|
// saved_fp.
|
||||||
|
if (senderNm.isDeoptMhEntry(getPC())) {
|
||||||
|
// DEBUG_ONLY(verifyDeoptMhOriginalPc(senderNm, getFP()));
|
||||||
|
raw_unextendedSP = getFP();
|
||||||
|
}
|
||||||
|
else if (senderNm.isDeoptEntry(getPC())) {
|
||||||
|
// DEBUG_ONLY(verifyDeoptOriginalPc(senderNm, raw_unextendedSp));
|
||||||
|
}
|
||||||
|
else if (senderNm.isMethodHandleReturn(getPC())) {
|
||||||
|
raw_unextendedSP = getFP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Frame senderForInterpreterFrame(AARCH64RegisterMap map) {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("senderForInterpreterFrame");
|
||||||
|
}
|
||||||
|
Address unextendedSP = addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
|
||||||
|
Address sp = addressOfStackSlot(SENDER_SP_OFFSET);
|
||||||
|
// We do not need to update the callee-save register mapping because above
|
||||||
|
// us is either another interpreter frame or a converter-frame, but never
|
||||||
|
// directly a compiled frame.
|
||||||
|
// 11/24/04 SFG. With the removal of adapter frames this is no longer true.
|
||||||
|
// However c2 no longer uses callee save register for java calls so there
|
||||||
|
// are no callee register to find.
|
||||||
|
|
||||||
|
if (map.getUpdateMap())
|
||||||
|
updateMapWithSavedLink(map, addressOfStackSlot(LINK_OFFSET));
|
||||||
|
|
||||||
|
return new AARCH64Frame(sp, unextendedSP, getLink(), getSenderPC());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateMapWithSavedLink(RegisterMap map, Address savedFPAddr) {
|
||||||
|
map.setLocation(fp, savedFPAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Frame senderForCompiledFrame(AARCH64RegisterMap map, CodeBlob cb) {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("senderForCompiledFrame");
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// NOTE: some of this code is (unfortunately) duplicated AARCH64CurrentFrameGuess
|
||||||
|
//
|
||||||
|
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(map != null, "map must be set");
|
||||||
|
}
|
||||||
|
|
||||||
|
// frame owned by optimizing compiler
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
|
||||||
|
}
|
||||||
|
Address senderSP = getUnextendedSP().addOffsetTo(cb.getFrameSize());
|
||||||
|
|
||||||
|
// The return_address is always the word on the stack
|
||||||
|
Address senderPC = senderSP.getAddressAt(-1 * VM.getVM().getAddressSize());
|
||||||
|
|
||||||
|
// This is the saved value of FP which may or may not really be an FP.
|
||||||
|
// It is only an FP if the sender is an interpreter frame.
|
||||||
|
Address savedFPAddr = senderSP.addOffsetTo(- SENDER_SP_OFFSET * VM.getVM().getAddressSize());
|
||||||
|
|
||||||
|
if (map.getUpdateMap()) {
|
||||||
|
// Tell GC to use argument oopmaps for some runtime stubs that need it.
|
||||||
|
// For C1, the runtime stub might not have oop maps, so set this flag
|
||||||
|
// outside of update_register_map.
|
||||||
|
map.setIncludeArgumentOops(cb.callerMustGCArguments());
|
||||||
|
|
||||||
|
if (cb.getOopMaps() != null) {
|
||||||
|
ImmutableOopMapSet.updateRegisterMap(this, cb, map, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since the prolog does the save and restore of FP there is no oopmap
|
||||||
|
// for it so we must fill in its location as if there was an oopmap entry
|
||||||
|
// since if our caller was compiled code there could be live jvm state in it.
|
||||||
|
updateMapWithSavedLink(map, savedFPAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new AARCH64Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean hasSenderPD() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long frameSize() {
|
||||||
|
return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getLink() {
|
||||||
|
try {
|
||||||
|
if (DEBUG) {
|
||||||
|
System.out.println("Reading link at " + addressOfStackSlot(LINK_OFFSET)
|
||||||
|
+ " = " + addressOfStackSlot(LINK_OFFSET).getAddressAt(0));
|
||||||
|
}
|
||||||
|
return addressOfStackSlot(LINK_OFFSET).getAddressAt(0);
|
||||||
|
} catch (Exception e) {
|
||||||
|
if (DEBUG)
|
||||||
|
System.out.println("Returning null");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME: not implementable yet
|
||||||
|
//inline void frame::set_link(intptr_t* addr) { *(intptr_t **)addr_at(link_offset) = addr; }
|
||||||
|
|
||||||
|
public Address getUnextendedSP() { return raw_unextendedSP; }
|
||||||
|
|
||||||
|
// Return address:
|
||||||
|
public Address getSenderPCAddr() { return addressOfStackSlot(RETURN_ADDR_OFFSET); }
|
||||||
|
public Address getSenderPC() { return getSenderPCAddr().getAddressAt(0); }
|
||||||
|
|
||||||
|
// return address of param, zero origin index.
|
||||||
|
public Address getNativeParamAddr(int idx) {
|
||||||
|
return addressOfStackSlot(NATIVE_FRAME_INITIAL_PARAM_OFFSET + idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getSenderSP() { return addressOfStackSlot(SENDER_SP_OFFSET); }
|
||||||
|
|
||||||
|
public Address addressOfInterpreterFrameLocals() {
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_LOCALS_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Address addressOfInterpreterFrameBCX() {
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_BCX_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInterpreterFrameBCI() {
|
||||||
|
// FIXME: this is not atomic with respect to GC and is unsuitable
|
||||||
|
// for use in a non-debugging, or reflective, system. Need to
|
||||||
|
// figure out how to express this.
|
||||||
|
Address bcp = addressOfInterpreterFrameBCX().getAddressAt(0);
|
||||||
|
Address methodHandle = addressOfInterpreterFrameMethod().getAddressAt(0);
|
||||||
|
Method method = (Method)Metadata.instantiateWrapperFor(methodHandle);
|
||||||
|
return bcpToBci(bcp, method);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address addressOfInterpreterFrameMDX() {
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_MDX_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME
|
||||||
|
//inline int frame::interpreter_frame_monitor_size() {
|
||||||
|
// return BasicObjectLock::size();
|
||||||
|
//}
|
||||||
|
|
||||||
|
// expression stack
|
||||||
|
// (the max_stack arguments are used by the GC; see class FrameClosure)
|
||||||
|
|
||||||
|
public Address addressOfInterpreterFrameExpressionStack() {
|
||||||
|
Address monitorEnd = interpreterFrameMonitorEnd().address();
|
||||||
|
return monitorEnd.addOffsetTo(-1 * VM.getVM().getAddressSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInterpreterFrameExpressionStackDirection() { return -1; }
|
||||||
|
|
||||||
|
// top of expression stack
|
||||||
|
public Address addressOfInterpreterFrameTOS() {
|
||||||
|
return getSP();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Expression stack from top down */
|
||||||
|
public Address addressOfInterpreterFrameTOSAt(int slot) {
|
||||||
|
return addressOfInterpreterFrameTOS().addOffsetTo(slot * VM.getVM().getAddressSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getInterpreterFrameSenderSP() {
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
Assert.that(isInterpretedFrame(), "interpreted frame expected");
|
||||||
|
}
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_SENDER_SP_OFFSET).getAddressAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monitors
|
||||||
|
public BasicObjectLock interpreterFrameMonitorBegin() {
|
||||||
|
return new BasicObjectLock(addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_BOTTOM_OFFSET));
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicObjectLock interpreterFrameMonitorEnd() {
|
||||||
|
Address result = addressOfStackSlot(INTERPRETER_FRAME_MONITOR_BLOCK_TOP_OFFSET).getAddressAt(0);
|
||||||
|
if (Assert.ASSERTS_ENABLED) {
|
||||||
|
// make sure the pointer points inside the frame
|
||||||
|
Assert.that(AddressOps.gt(getFP(), result), "result must < than frame pointer");
|
||||||
|
Assert.that(AddressOps.lte(getSP(), result), "result must >= than stack pointer");
|
||||||
|
}
|
||||||
|
return new BasicObjectLock(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int interpreterFrameMonitorSize() {
|
||||||
|
return BasicObjectLock.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method
|
||||||
|
public Address addressOfInterpreterFrameMethod() {
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_METHOD_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constant pool cache
|
||||||
|
public Address addressOfInterpreterFrameCPCache() {
|
||||||
|
return addressOfStackSlot(INTERPRETER_FRAME_CACHE_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Entry frames
|
||||||
|
public JavaCallWrapper getEntryFrameCallWrapper() {
|
||||||
|
return new AARCH64JavaCallWrapper(addressOfStackSlot(ENTRY_FRAME_CALL_WRAPPER_OFFSET).getAddressAt(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Address addressOfSavedOopResult() {
|
||||||
|
// offset is 2 for compiler2 and 3 for compiler1
|
||||||
|
return getSP().addOffsetTo((VM.getVM().isClientCompiler() ? 2 : 3) *
|
||||||
|
VM.getVM().getAddressSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Address addressOfSavedReceiver() {
|
||||||
|
return getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void dumpStack() {
|
||||||
|
for (Address addr = getSP().addOffsetTo(-4 * VM.getVM().getAddressSize());
|
||||||
|
AddressOps.lt(addr, getSP());
|
||||||
|
addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
|
||||||
|
System.out.println(addr + ": " + addr.getAddressAt(0));
|
||||||
|
}
|
||||||
|
System.out.println("-----------------------");
|
||||||
|
for (Address addr = getSP();
|
||||||
|
AddressOps.lte(addr, getSP().addOffsetTo(20 * VM.getVM().getAddressSize()));
|
||||||
|
addr = addr.addOffsetTo(VM.getVM().getAddressSize())) {
|
||||||
|
System.out.println(addr + ": " + addr.getAddressAt(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.runtime.aarch64;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.types.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
|
public class AARCH64JavaCallWrapper extends JavaCallWrapper {
|
||||||
|
private static AddressField lastJavaFPField;
|
||||||
|
|
||||||
|
static {
|
||||||
|
VM.registerVMInitializedObserver(new Observer() {
|
||||||
|
public void update(Observable o, Object data) {
|
||||||
|
initialize(VM.getVM().getTypeDataBase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized void initialize(TypeDataBase db) {
|
||||||
|
Type type = db.lookupType("JavaFrameAnchor");
|
||||||
|
|
||||||
|
lastJavaFPField = type.getAddressField("_last_Java_fp");
|
||||||
|
}
|
||||||
|
|
||||||
|
public AARCH64JavaCallWrapper(Address addr) {
|
||||||
|
super(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getLastJavaFP() {
|
||||||
|
return lastJavaFPField.getValue(addr.addOffsetTo(anchorField.getOffset()));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.runtime.aarch64;
|
||||||
|
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
|
||||||
|
public class AARCH64RegisterMap extends RegisterMap {
|
||||||
|
|
||||||
|
/** This is the only public constructor */
|
||||||
|
public AARCH64RegisterMap(JavaThread thread, boolean updateMap) {
|
||||||
|
super(thread, updateMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AARCH64RegisterMap(RegisterMap map) {
|
||||||
|
super(map);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object clone() {
|
||||||
|
AARCH64RegisterMap retval = new AARCH64RegisterMap(this);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// no PD state to clear or copy:
|
||||||
|
protected void clearPD() {}
|
||||||
|
protected void initializePD() {}
|
||||||
|
protected void initializeFromPD(RegisterMap map) {}
|
||||||
|
protected Address getLocationPD(VMReg reg) { return null; }
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* Copyright (c) 2015, Red Hat Inc.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package sun.jvm.hotspot.runtime.linux_aarch64;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import sun.jvm.hotspot.debugger.*;
|
||||||
|
import sun.jvm.hotspot.debugger.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.runtime.*;
|
||||||
|
import sun.jvm.hotspot.runtime.aarch64.*;
|
||||||
|
import sun.jvm.hotspot.types.*;
|
||||||
|
import sun.jvm.hotspot.utilities.*;
|
||||||
|
|
||||||
|
public class LinuxAARCH64JavaThreadPDAccess implements JavaThreadPDAccess {
|
||||||
|
private static AddressField lastJavaFPField;
|
||||||
|
private static AddressField osThreadField;
|
||||||
|
|
||||||
|
// Field from OSThread
|
||||||
|
private static CIntegerField osThreadThreadIDField;
|
||||||
|
|
||||||
|
// This is currently unneeded but is being kept in case we change
|
||||||
|
// the currentFrameGuess algorithm
|
||||||
|
private static final long GUESS_SCAN_RANGE = 128 * 1024;
|
||||||
|
|
||||||
|
static {
|
||||||
|
VM.registerVMInitializedObserver(new Observer() {
|
||||||
|
public void update(Observable o, Object data) {
|
||||||
|
initialize(VM.getVM().getTypeDataBase());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static synchronized void initialize(TypeDataBase db) {
|
||||||
|
Type type = db.lookupType("JavaThread");
|
||||||
|
osThreadField = type.getAddressField("_osthread");
|
||||||
|
|
||||||
|
Type anchorType = db.lookupType("JavaFrameAnchor");
|
||||||
|
lastJavaFPField = anchorType.getAddressField("_last_Java_fp");
|
||||||
|
|
||||||
|
Type osThreadType = db.lookupType("OSThread");
|
||||||
|
osThreadThreadIDField = osThreadType.getCIntegerField("_thread_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getLastJavaFP(Address addr) {
|
||||||
|
return lastJavaFPField.getValue(addr.addOffsetTo(sun.jvm.hotspot.runtime.JavaThread.getAnchorField().getOffset()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getLastJavaPC(Address addr) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getBaseOfStackPointer(Address addr) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame getLastFramePD(JavaThread thread, Address addr) {
|
||||||
|
Address fp = thread.getLastJavaFP();
|
||||||
|
if (fp == null) {
|
||||||
|
return null; // no information
|
||||||
|
}
|
||||||
|
return new AARCH64Frame(thread.getLastJavaSP(), fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegisterMap newRegisterMap(JavaThread thread, boolean updateMap) {
|
||||||
|
return new AARCH64RegisterMap(thread, updateMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Frame getCurrentFrameGuess(JavaThread thread, Address addr) {
|
||||||
|
ThreadProxy t = getThreadProxy(addr);
|
||||||
|
AARCH64ThreadContext context = (AARCH64ThreadContext) t.getContext();
|
||||||
|
AARCH64CurrentFrameGuess guesser = new AARCH64CurrentFrameGuess(context, thread);
|
||||||
|
if (!guesser.run(GUESS_SCAN_RANGE)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (guesser.getPC() == null) {
|
||||||
|
return new AARCH64Frame(guesser.getSP(), guesser.getFP());
|
||||||
|
} else {
|
||||||
|
return new AARCH64Frame(guesser.getSP(), guesser.getFP(), guesser.getPC());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printThreadIDOn(Address addr, PrintStream tty) {
|
||||||
|
tty.print(getThreadProxy(addr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void printInfoOn(Address threadAddr, PrintStream tty) {
|
||||||
|
tty.print("Thread id: ");
|
||||||
|
printThreadIDOn(threadAddr, tty);
|
||||||
|
// tty.println("\nPostJavaState: " + getPostJavaState(threadAddr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public Address getLastSP(Address addr) {
|
||||||
|
ThreadProxy t = getThreadProxy(addr);
|
||||||
|
AARCH64ThreadContext context = (AARCH64ThreadContext) t.getContext();
|
||||||
|
return context.getRegisterAsAddress(AARCH64ThreadContext.SP);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ThreadProxy getThreadProxy(Address addr) {
|
||||||
|
// Addr is the address of the JavaThread.
|
||||||
|
// Fetch the OSThread (for now and for simplicity, not making a
|
||||||
|
// separate "OSThread" class in this package)
|
||||||
|
Address osThreadAddr = osThreadField.getValue(addr);
|
||||||
|
// Get the address of the _thread_id from the OSThread
|
||||||
|
Address threadIdAddr = osThreadAddr.addOffsetTo(osThreadThreadIDField.getOffset());
|
||||||
|
|
||||||
|
JVMDebugger debugger = VM.getVM().getDebugger();
|
||||||
|
return debugger.getThreadForIdentifierAddress(threadIdAddr);
|
||||||
|
}
|
||||||
|
}
|
@ -44,6 +44,7 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/code/*.java \
|
|||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/compiler/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/compiler/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/amd64/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/amd64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/bsd/x86/*.java \
|
||||||
@ -55,6 +56,7 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/*.java \
|
|||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/amd64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ia64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ia64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ppc64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/ppc64/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/x86/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/sparc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/linux/sparc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/posix/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/posix/*.java \
|
||||||
@ -63,6 +65,7 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/ppc64/*.java \
|
|||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/amd64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/ppc64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/ppc64/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/sparc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/sparc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/proc/x86/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/*.java \
|
||||||
@ -70,6 +73,7 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/amd64/*.java \
|
|||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/ppc64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/ppc64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/sparc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/sparc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/x86/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/remote/aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/sparc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/sparc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/win32/coff/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/debugger/windbg/*.java \
|
||||||
@ -92,11 +96,13 @@ $(AGENT_SRC_DIR)/sun/jvm/hotspot/opto/*.java \
|
|||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/prims/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/prims/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/amd64/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_amd64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/bsd_x86/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_amd64/*.java \
|
||||||
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_aarch64/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_x86/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_x86/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_sparc/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_sparc/*.java \
|
||||||
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_ppc64/*.java \
|
$(AGENT_SRC_DIR)/sun/jvm/hotspot/runtime/linux_ppc64/*.java \
|
||||||
|
@ -228,6 +228,9 @@ void VM_Version::get_processor_features() {
|
|||||||
warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU.");
|
warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU.");
|
||||||
FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
|
FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
|
||||||
}
|
}
|
||||||
|
if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) {
|
||||||
|
FLAG_SET_DEFAULT(UseSHA, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This machine allows unaligned memory accesses
|
// This machine allows unaligned memory accesses
|
||||||
|
@ -59,8 +59,8 @@
|
|||||||
extern sigjmp_buf* get_jmp_buf_for_continuation();
|
extern sigjmp_buf* get_jmp_buf_for_continuation();
|
||||||
|
|
||||||
address os::current_stack_pointer() {
|
address os::current_stack_pointer() {
|
||||||
address dummy = (address) &dummy;
|
// return the address of the current function
|
||||||
return dummy;
|
return (address)__builtin_frame_address(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
frame os::get_sender_for_C_frame(frame* fr) {
|
frame os::get_sender_for_C_frame(frame* fr) {
|
||||||
|
@ -71,8 +71,7 @@
|
|||||||
// Loaded method.
|
// Loaded method.
|
||||||
ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) :
|
ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) :
|
||||||
ciMetadata(h_m()),
|
ciMetadata(h_m()),
|
||||||
_holder(holder),
|
_holder(holder)
|
||||||
_has_injected_profile(false)
|
|
||||||
{
|
{
|
||||||
assert(h_m() != NULL, "no null method");
|
assert(h_m() != NULL, "no null method");
|
||||||
|
|
||||||
@ -170,8 +169,7 @@ ciMethod::ciMethod(ciInstanceKlass* holder,
|
|||||||
_liveness( NULL),
|
_liveness( NULL),
|
||||||
_can_be_statically_bound(false),
|
_can_be_statically_bound(false),
|
||||||
_method_blocks( NULL),
|
_method_blocks( NULL),
|
||||||
_method_data( NULL),
|
_method_data( NULL)
|
||||||
_has_injected_profile( false)
|
|
||||||
#if defined(COMPILER2) || defined(SHARK)
|
#if defined(COMPILER2) || defined(SHARK)
|
||||||
,
|
,
|
||||||
_flow( NULL),
|
_flow( NULL),
|
||||||
|
@ -81,7 +81,6 @@ class ciMethod : public ciMetadata {
|
|||||||
bool _is_c1_compilable;
|
bool _is_c1_compilable;
|
||||||
bool _is_c2_compilable;
|
bool _is_c2_compilable;
|
||||||
bool _can_be_statically_bound;
|
bool _can_be_statically_bound;
|
||||||
bool _has_injected_profile;
|
|
||||||
|
|
||||||
// Lazy fields, filled in on demand
|
// Lazy fields, filled in on demand
|
||||||
address _code;
|
address _code;
|
||||||
@ -179,9 +178,9 @@ class ciMethod : public ciMetadata {
|
|||||||
// Code size for inlining decisions.
|
// Code size for inlining decisions.
|
||||||
int code_size_for_inlining();
|
int code_size_for_inlining();
|
||||||
|
|
||||||
bool caller_sensitive() { return get_Method()->caller_sensitive(); }
|
bool caller_sensitive() const { return get_Method()->caller_sensitive(); }
|
||||||
bool force_inline() { return get_Method()->force_inline(); }
|
bool force_inline() const { return get_Method()->force_inline(); }
|
||||||
bool dont_inline() { return get_Method()->dont_inline(); }
|
bool dont_inline() const { return get_Method()->dont_inline(); }
|
||||||
|
|
||||||
int comp_level();
|
int comp_level();
|
||||||
int highest_osr_comp_level();
|
int highest_osr_comp_level();
|
||||||
@ -289,9 +288,6 @@ class ciMethod : public ciMetadata {
|
|||||||
int instructions_size();
|
int instructions_size();
|
||||||
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
|
int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC
|
||||||
|
|
||||||
bool has_injected_profile() const { return _has_injected_profile; }
|
|
||||||
void set_injected_profile(bool x) { _has_injected_profile = x; }
|
|
||||||
|
|
||||||
// Stack walking support
|
// Stack walking support
|
||||||
bool is_ignored_by_security_stack_walk() const;
|
bool is_ignored_by_security_stack_walk() const;
|
||||||
|
|
||||||
|
@ -1739,6 +1739,10 @@ ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* loader_d
|
|||||||
if (_location != _in_method) break; // only allow for methods
|
if (_location != _in_method) break; // only allow for methods
|
||||||
if (!privileged) break; // only allow in privileged code
|
if (!privileged) break; // only allow in privileged code
|
||||||
return _method_DontInline;
|
return _method_DontInline;
|
||||||
|
case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_InjectedProfile_signature):
|
||||||
|
if (_location != _in_method) break; // only allow for methods
|
||||||
|
if (!privileged) break; // only allow in privileged code
|
||||||
|
return _method_InjectedProfile;
|
||||||
case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature):
|
case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature):
|
||||||
if (_location != _in_method) break; // only allow for methods
|
if (_location != _in_method) break; // only allow for methods
|
||||||
if (!privileged) break; // only allow in privileged code
|
if (!privileged) break; // only allow in privileged code
|
||||||
@ -1780,6 +1784,8 @@ void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) {
|
|||||||
m->set_force_inline(true);
|
m->set_force_inline(true);
|
||||||
if (has_annotation(_method_DontInline))
|
if (has_annotation(_method_DontInline))
|
||||||
m->set_dont_inline(true);
|
m->set_dont_inline(true);
|
||||||
|
if (has_annotation(_method_InjectedProfile))
|
||||||
|
m->set_has_injected_profile(true);
|
||||||
if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none)
|
if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none)
|
||||||
m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm);
|
m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm);
|
||||||
if (has_annotation(_method_LambdaForm_Hidden))
|
if (has_annotation(_method_LambdaForm_Hidden))
|
||||||
|
@ -127,6 +127,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC {
|
|||||||
_method_CallerSensitive,
|
_method_CallerSensitive,
|
||||||
_method_ForceInline,
|
_method_ForceInline,
|
||||||
_method_DontInline,
|
_method_DontInline,
|
||||||
|
_method_InjectedProfile,
|
||||||
_method_LambdaForm_Compiled,
|
_method_LambdaForm_Compiled,
|
||||||
_method_LambdaForm_Hidden,
|
_method_LambdaForm_Hidden,
|
||||||
_sun_misc_Contended,
|
_sun_misc_Contended,
|
||||||
|
@ -278,6 +278,7 @@
|
|||||||
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
|
template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \
|
||||||
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
|
template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \
|
||||||
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
|
template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \
|
||||||
|
template(java_lang_invoke_InjectedProfile_signature, "Ljava/lang/invoke/InjectedProfile;") \
|
||||||
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
|
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
|
||||||
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
|
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
|
||||||
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
|
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
|
||||||
|
@ -93,6 +93,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) {
|
|||||||
set_force_inline(false);
|
set_force_inline(false);
|
||||||
set_hidden(false);
|
set_hidden(false);
|
||||||
set_dont_inline(false);
|
set_dont_inline(false);
|
||||||
|
set_has_injected_profile(false);
|
||||||
set_method_data(NULL);
|
set_method_data(NULL);
|
||||||
clear_method_counters();
|
clear_method_counters();
|
||||||
set_vtable_index(Method::garbage_vtable_index);
|
set_vtable_index(Method::garbage_vtable_index);
|
||||||
|
@ -76,12 +76,13 @@ class Method : public Metadata {
|
|||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
enum Flags {
|
enum Flags {
|
||||||
_jfr_towrite = 1 << 0,
|
_jfr_towrite = 1 << 0,
|
||||||
_caller_sensitive = 1 << 1,
|
_caller_sensitive = 1 << 1,
|
||||||
_force_inline = 1 << 2,
|
_force_inline = 1 << 2,
|
||||||
_dont_inline = 1 << 3,
|
_dont_inline = 1 << 3,
|
||||||
_hidden = 1 << 4,
|
_hidden = 1 << 4,
|
||||||
_running_emcp = 1 << 5
|
_has_injected_profile = 1 << 5,
|
||||||
|
_running_emcp = 1 << 6
|
||||||
};
|
};
|
||||||
u1 _flags;
|
u1 _flags;
|
||||||
|
|
||||||
@ -814,6 +815,13 @@ class Method : public Metadata {
|
|||||||
_flags = x ? (_flags | _hidden) : (_flags & ~_hidden);
|
_flags = x ? (_flags | _hidden) : (_flags & ~_hidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool has_injected_profile() {
|
||||||
|
return (_flags & _has_injected_profile) != 0;
|
||||||
|
}
|
||||||
|
void set_has_injected_profile(bool x) {
|
||||||
|
_flags = x ? (_flags | _has_injected_profile) : (_flags & ~_has_injected_profile);
|
||||||
|
}
|
||||||
|
|
||||||
ConstMethod::MethodType method_type() const {
|
ConstMethod::MethodType method_type() const {
|
||||||
return _constMethod->method_type();
|
return _constMethod->method_type();
|
||||||
}
|
}
|
||||||
|
@ -438,11 +438,17 @@ bool ArrayCopyNode::finish_transform(PhaseGVN *phase, bool can_reshape,
|
|||||||
// replace fallthrough projections of the ArrayCopyNode by the
|
// replace fallthrough projections of the ArrayCopyNode by the
|
||||||
// new memory, control and the input IO.
|
// new memory, control and the input IO.
|
||||||
CallProjections callprojs;
|
CallProjections callprojs;
|
||||||
extract_projections(&callprojs, true);
|
extract_projections(&callprojs, true, false);
|
||||||
|
|
||||||
igvn->replace_node(callprojs.fallthrough_ioproj, in(TypeFunc::I_O));
|
if (callprojs.fallthrough_ioproj != NULL) {
|
||||||
igvn->replace_node(callprojs.fallthrough_memproj, mem);
|
igvn->replace_node(callprojs.fallthrough_ioproj, in(TypeFunc::I_O));
|
||||||
igvn->replace_node(callprojs.fallthrough_catchproj, ctl);
|
}
|
||||||
|
if (callprojs.fallthrough_memproj != NULL) {
|
||||||
|
igvn->replace_node(callprojs.fallthrough_memproj, mem);
|
||||||
|
}
|
||||||
|
if (callprojs.fallthrough_catchproj != NULL) {
|
||||||
|
igvn->replace_node(callprojs.fallthrough_catchproj, ctl);
|
||||||
|
}
|
||||||
|
|
||||||
// The ArrayCopyNode is not disconnected. It still has the
|
// The ArrayCopyNode is not disconnected. It still has the
|
||||||
// projections for the exception case. Replace current
|
// projections for the exception case. Replace current
|
||||||
|
@ -724,6 +724,26 @@ uint CallNode::match_edge(uint idx) const {
|
|||||||
//
|
//
|
||||||
bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
|
bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
|
||||||
assert((t_oop != NULL), "sanity");
|
assert((t_oop != NULL), "sanity");
|
||||||
|
if (is_call_to_arraycopystub()) {
|
||||||
|
const TypeTuple* args = _tf->domain();
|
||||||
|
Node* dest = NULL;
|
||||||
|
// Stubs that can be called once an ArrayCopyNode is expanded have
|
||||||
|
// different signatures. Look for the second pointer argument,
|
||||||
|
// that is the destination of the copy.
|
||||||
|
for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) {
|
||||||
|
if (args->field_at(i)->isa_ptr()) {
|
||||||
|
j++;
|
||||||
|
if (j == 2) {
|
||||||
|
dest = in(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (t_oop->is_known_instance()) {
|
if (t_oop->is_known_instance()) {
|
||||||
// The instance_id is set only for scalar-replaceable allocations which
|
// The instance_id is set only for scalar-replaceable allocations which
|
||||||
// are not passed as arguments according to Escape Analysis.
|
// are not passed as arguments according to Escape Analysis.
|
||||||
@ -810,7 +830,7 @@ Node *CallNode::result_cast() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj) {
|
void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj, bool do_asserts) {
|
||||||
projs->fallthrough_proj = NULL;
|
projs->fallthrough_proj = NULL;
|
||||||
projs->fallthrough_catchproj = NULL;
|
projs->fallthrough_catchproj = NULL;
|
||||||
projs->fallthrough_ioproj = NULL;
|
projs->fallthrough_ioproj = NULL;
|
||||||
@ -873,17 +893,18 @@ void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The resproj may not exist because the result couuld be ignored
|
// The resproj may not exist because the result could be ignored
|
||||||
// and the exception object may not exist if an exception handler
|
// and the exception object may not exist if an exception handler
|
||||||
// swallows the exception but all the other must exist and be found.
|
// swallows the exception but all the other must exist and be found.
|
||||||
assert(projs->fallthrough_proj != NULL, "must be found");
|
assert(projs->fallthrough_proj != NULL, "must be found");
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->fallthrough_catchproj != NULL, "must be found");
|
do_asserts = do_asserts && !Compile::current()->inlining_incrementally();
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->fallthrough_memproj != NULL, "must be found");
|
assert(!do_asserts || projs->fallthrough_catchproj != NULL, "must be found");
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->fallthrough_ioproj != NULL, "must be found");
|
assert(!do_asserts || projs->fallthrough_memproj != NULL, "must be found");
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->catchall_catchproj != NULL, "must be found");
|
assert(!do_asserts || projs->fallthrough_ioproj != NULL, "must be found");
|
||||||
|
assert(!do_asserts || projs->catchall_catchproj != NULL, "must be found");
|
||||||
if (separate_io_proj) {
|
if (separate_io_proj) {
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->catchall_memproj != NULL, "must be found");
|
assert(!do_asserts || projs->catchall_memproj != NULL, "must be found");
|
||||||
assert(Compile::current()->inlining_incrementally() || projs->catchall_ioproj != NULL, "must be found");
|
assert(!do_asserts || projs->catchall_ioproj != NULL, "must be found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -909,6 +930,12 @@ Node *CallNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
|||||||
return SafePointNode::Ideal(phase, can_reshape);
|
return SafePointNode::Ideal(phase, can_reshape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CallNode::is_call_to_arraycopystub() const {
|
||||||
|
if (_name != NULL && strstr(_name, "arraycopy") != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
uint CallJavaNode::size_of() const { return sizeof(*this); }
|
uint CallJavaNode::size_of() const { return sizeof(*this); }
|
||||||
@ -1007,14 +1034,6 @@ void CallRuntimeNode::calling_convention( BasicType* sig_bt, VMRegPair *parm_reg
|
|||||||
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
bool CallLeafNode::is_call_to_arraycopystub() const {
|
|
||||||
if (_name != NULL && strstr(_name, "arraycopy") != 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
void CallLeafNode::dump_spec(outputStream *st) const {
|
void CallLeafNode::dump_spec(outputStream *st) const {
|
||||||
st->print("# ");
|
st->print("# ");
|
||||||
@ -1930,26 +1949,3 @@ bool CallNode::may_modify_arraycopy_helper(const TypeOopPtr* dest_t, const TypeO
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CallLeafNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) {
|
|
||||||
if (is_call_to_arraycopystub()) {
|
|
||||||
const TypeTuple* args = _tf->domain();
|
|
||||||
Node* dest = NULL;
|
|
||||||
// Stubs that can be called once an ArrayCopyNode is expanded have
|
|
||||||
// different signatures. Look for the second pointer argument,
|
|
||||||
// that is the destination of the copy.
|
|
||||||
for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) {
|
|
||||||
if (args->field_at(i)->isa_ptr()) {
|
|
||||||
j++;
|
|
||||||
if (j == 2) {
|
|
||||||
dest = in(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return CallNode::may_modify(t_oop, phase);
|
|
||||||
}
|
|
||||||
|
@ -565,13 +565,15 @@ public:
|
|||||||
address _entry_point; // Address of method being called
|
address _entry_point; // Address of method being called
|
||||||
float _cnt; // Estimate of number of times called
|
float _cnt; // Estimate of number of times called
|
||||||
CallGenerator* _generator; // corresponding CallGenerator for some late inline calls
|
CallGenerator* _generator; // corresponding CallGenerator for some late inline calls
|
||||||
|
const char *_name; // Printable name, if _method is NULL
|
||||||
|
|
||||||
CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type)
|
CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type)
|
||||||
: SafePointNode(tf->domain()->cnt(), NULL, adr_type),
|
: SafePointNode(tf->domain()->cnt(), NULL, adr_type),
|
||||||
_tf(tf),
|
_tf(tf),
|
||||||
_entry_point(addr),
|
_entry_point(addr),
|
||||||
_cnt(COUNT_UNKNOWN),
|
_cnt(COUNT_UNKNOWN),
|
||||||
_generator(NULL)
|
_generator(NULL),
|
||||||
|
_name(NULL)
|
||||||
{
|
{
|
||||||
init_class_id(Class_Call);
|
init_class_id(Class_Call);
|
||||||
}
|
}
|
||||||
@ -626,10 +628,12 @@ public:
|
|||||||
// Collect all the interesting edges from a call for use in
|
// Collect all the interesting edges from a call for use in
|
||||||
// replacing the call by something else. Used by macro expansion
|
// replacing the call by something else. Used by macro expansion
|
||||||
// and the late inlining support.
|
// and the late inlining support.
|
||||||
void extract_projections(CallProjections* projs, bool separate_io_proj);
|
void extract_projections(CallProjections* projs, bool separate_io_proj, bool do_asserts = true);
|
||||||
|
|
||||||
virtual uint match_edge(uint idx) const;
|
virtual uint match_edge(uint idx) const;
|
||||||
|
|
||||||
|
bool is_call_to_arraycopystub() const;
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
virtual void dump_req(outputStream *st = tty) const;
|
virtual void dump_req(outputStream *st = tty) const;
|
||||||
virtual void dump_spec(outputStream *st) const;
|
virtual void dump_spec(outputStream *st) const;
|
||||||
@ -683,7 +687,7 @@ class CallStaticJavaNode : public CallJavaNode {
|
|||||||
virtual uint size_of() const; // Size is bigger
|
virtual uint size_of() const; // Size is bigger
|
||||||
public:
|
public:
|
||||||
CallStaticJavaNode(Compile* C, const TypeFunc* tf, address addr, ciMethod* method, int bci)
|
CallStaticJavaNode(Compile* C, const TypeFunc* tf, address addr, ciMethod* method, int bci)
|
||||||
: CallJavaNode(tf, addr, method, bci), _name(NULL) {
|
: CallJavaNode(tf, addr, method, bci) {
|
||||||
init_class_id(Class_CallStaticJava);
|
init_class_id(Class_CallStaticJava);
|
||||||
if (C->eliminate_boxing() && (method != NULL) && method->is_boxing_method()) {
|
if (C->eliminate_boxing() && (method != NULL) && method->is_boxing_method()) {
|
||||||
init_flags(Flag_is_macro);
|
init_flags(Flag_is_macro);
|
||||||
@ -694,14 +698,14 @@ public:
|
|||||||
}
|
}
|
||||||
CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci,
|
CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci,
|
||||||
const TypePtr* adr_type)
|
const TypePtr* adr_type)
|
||||||
: CallJavaNode(tf, addr, NULL, bci), _name(name) {
|
: CallJavaNode(tf, addr, NULL, bci) {
|
||||||
init_class_id(Class_CallStaticJava);
|
init_class_id(Class_CallStaticJava);
|
||||||
// This node calls a runtime stub, which often has narrow memory effects.
|
// This node calls a runtime stub, which often has narrow memory effects.
|
||||||
_adr_type = adr_type;
|
_adr_type = adr_type;
|
||||||
_is_scalar_replaceable = false;
|
_is_scalar_replaceable = false;
|
||||||
_is_non_escaping = false;
|
_is_non_escaping = false;
|
||||||
|
_name = name;
|
||||||
}
|
}
|
||||||
const char *_name; // Runtime wrapper name
|
|
||||||
|
|
||||||
// Result of Escape Analysis
|
// Result of Escape Analysis
|
||||||
bool _is_scalar_replaceable;
|
bool _is_scalar_replaceable;
|
||||||
@ -754,13 +758,12 @@ class CallRuntimeNode : public CallNode {
|
|||||||
public:
|
public:
|
||||||
CallRuntimeNode(const TypeFunc* tf, address addr, const char* name,
|
CallRuntimeNode(const TypeFunc* tf, address addr, const char* name,
|
||||||
const TypePtr* adr_type)
|
const TypePtr* adr_type)
|
||||||
: CallNode(tf, addr, adr_type),
|
: CallNode(tf, addr, adr_type)
|
||||||
_name(name)
|
|
||||||
{
|
{
|
||||||
init_class_id(Class_CallRuntime);
|
init_class_id(Class_CallRuntime);
|
||||||
|
_name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *_name; // Printable name, if _method is NULL
|
|
||||||
virtual int Opcode() const;
|
virtual int Opcode() const;
|
||||||
virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
|
virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const;
|
||||||
|
|
||||||
@ -785,8 +788,6 @@ public:
|
|||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
virtual void dump_spec(outputStream *st) const;
|
virtual void dump_spec(outputStream *st) const;
|
||||||
#endif
|
#endif
|
||||||
bool is_call_to_arraycopystub() const;
|
|
||||||
virtual bool may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//------------------------------CallLeafNoFPNode-------------------------------
|
//------------------------------CallLeafNoFPNode-------------------------------
|
||||||
|
@ -3390,9 +3390,6 @@ bool Compile::final_graph_reshaping() {
|
|||||||
bool Compile::too_many_traps(ciMethod* method,
|
bool Compile::too_many_traps(ciMethod* method,
|
||||||
int bci,
|
int bci,
|
||||||
Deoptimization::DeoptReason reason) {
|
Deoptimization::DeoptReason reason) {
|
||||||
if (method->has_injected_profile()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ciMethodData* md = method->method_data();
|
ciMethodData* md = method->method_data();
|
||||||
if (md->is_empty()) {
|
if (md->is_empty()) {
|
||||||
// Assume the trap has not occurred, or that it occurred only
|
// Assume the trap has not occurred, or that it occurred only
|
||||||
@ -3442,9 +3439,6 @@ bool Compile::too_many_traps(Deoptimization::DeoptReason reason,
|
|||||||
bool Compile::too_many_recompiles(ciMethod* method,
|
bool Compile::too_many_recompiles(ciMethod* method,
|
||||||
int bci,
|
int bci,
|
||||||
Deoptimization::DeoptReason reason) {
|
Deoptimization::DeoptReason reason) {
|
||||||
if (method->has_injected_profile()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
ciMethodData* md = method->method_data();
|
ciMethodData* md = method->method_data();
|
||||||
if (md->is_empty()) {
|
if (md->is_empty()) {
|
||||||
// Assume the trap has not occurred, or that it occurred only
|
// Assume the trap has not occurred, or that it occurred only
|
||||||
|
@ -6125,8 +6125,6 @@ bool LibraryCallKit::inline_profileBoolean() {
|
|||||||
jint false_cnt = aobj->element_value(0).as_int();
|
jint false_cnt = aobj->element_value(0).as_int();
|
||||||
jint true_cnt = aobj->element_value(1).as_int();
|
jint true_cnt = aobj->element_value(1).as_int();
|
||||||
|
|
||||||
method()->set_injected_profile(true);
|
|
||||||
|
|
||||||
if (C->log() != NULL) {
|
if (C->log() != NULL) {
|
||||||
C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
|
C->log()->elem("observe source='profileBoolean' false='%d' true='%d'",
|
||||||
false_cnt, true_cnt);
|
false_cnt, true_cnt);
|
||||||
|
@ -108,11 +108,10 @@ extern void print_alias_types();
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, MergeMemNode* mm, PhaseTransform *phase) {
|
static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase) {
|
||||||
if (mm->memory_at(Compile::AliasIdxRaw)->is_Proj()) {
|
if (n->is_Proj()) {
|
||||||
Node* n = mm->memory_at(Compile::AliasIdxRaw)->in(0);
|
n = n->in(0);
|
||||||
if ((n->is_ArrayCopy() && n->as_ArrayCopy()->may_modify(t_oop, phase)) ||
|
if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) {
|
||||||
(n->is_CallLeaf() && n->as_CallLeaf()->may_modify(t_oop, phase))) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -121,16 +120,22 @@ static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, MergeMemNode* m
|
|||||||
|
|
||||||
static bool membar_for_arraycopy(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTransform *phase) {
|
static bool membar_for_arraycopy(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTransform *phase) {
|
||||||
Node* mem = mb->in(TypeFunc::Memory);
|
Node* mem = mb->in(TypeFunc::Memory);
|
||||||
|
|
||||||
if (mem->is_MergeMem()) {
|
if (mem->is_MergeMem()) {
|
||||||
return membar_for_arraycopy_helper(t_oop, mem->as_MergeMem(), phase);
|
Node* n = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw);
|
||||||
} else if (mem->is_Phi()) {
|
if (membar_for_arraycopy_helper(t_oop, n, phase)) {
|
||||||
// after macro expansion of an ArrayCopyNode we may have a Phi
|
return true;
|
||||||
for (uint i = 1; i < mem->req(); i++) {
|
} else if (n->is_Phi()) {
|
||||||
if (mem->in(i) != NULL && mem->in(i)->is_MergeMem() && membar_for_arraycopy_helper(t_oop, mem->in(i)->as_MergeMem(), phase)) {
|
for (uint i = 1; i < n->req(); i++) {
|
||||||
return true;
|
if (n->in(i) != NULL) {
|
||||||
|
if (membar_for_arraycopy_helper(t_oop, n->in(i), phase)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1460,7 +1460,11 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra
|
|||||||
//
|
//
|
||||||
// The other actions cause immediate removal of the present code.
|
// The other actions cause immediate removal of the present code.
|
||||||
|
|
||||||
bool update_trap_state = (reason != Reason_tenured);
|
// Traps caused by injected profile shouldn't pollute trap counts.
|
||||||
|
bool injected_profile_trap = trap_method->has_injected_profile() &&
|
||||||
|
(reason == Reason_intrinsic || reason == Reason_unreached);
|
||||||
|
|
||||||
|
bool update_trap_state = (reason != Reason_tenured) && !injected_profile_trap;
|
||||||
bool make_not_entrant = false;
|
bool make_not_entrant = false;
|
||||||
bool make_not_compilable = false;
|
bool make_not_compilable = false;
|
||||||
bool reprofile = false;
|
bool reprofile = false;
|
||||||
|
71
hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java
Normal file
71
hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @test
|
||||||
|
* @bug 8086046
|
||||||
|
* @summary load bypasses arraycopy that sets the value after the ArrayCopyNode is expanded
|
||||||
|
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:CompileCommand=dontinline,TestLoadBypassArrayCopy::test_helper -XX:-TieredCompilation TestLoadBypassArrayCopy
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TestLoadBypassArrayCopy {
|
||||||
|
|
||||||
|
static long i;
|
||||||
|
static boolean test_helper() {
|
||||||
|
i++;
|
||||||
|
if ((i%10) == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test(int[] src, int len, boolean flag) {
|
||||||
|
int[] dest = new int[10];
|
||||||
|
int res = 0;
|
||||||
|
while (test_helper()) {
|
||||||
|
System.arraycopy(src, 0, dest, 0, len);
|
||||||
|
// predicate moved out of loop so control of following
|
||||||
|
// load is not the ArrayCopyNode. Otherwise, if the memory
|
||||||
|
// of the load is changed and the control is set to the
|
||||||
|
// ArrayCopyNode the graph is unschedulable and the test
|
||||||
|
// doesn't fail.
|
||||||
|
if (flag) {
|
||||||
|
}
|
||||||
|
// The memory of this load shouldn't bypass the arraycopy
|
||||||
|
res = dest[0];
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void main(String[] args) {
|
||||||
|
int[] src = new int[10];
|
||||||
|
src[0] = 0x42;
|
||||||
|
for (int i = 0; i < 20000; i++) {
|
||||||
|
int res = test(src, 10, false);
|
||||||
|
if (res != src[0]) {
|
||||||
|
throw new RuntimeException("test failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -71,7 +71,7 @@ public class SHAOptionsBase extends CommandLineOptionTest {
|
|||||||
* instructions required by the option are not supported.
|
* instructions required by the option are not supported.
|
||||||
*/
|
*/
|
||||||
protected static String getWarningForUnsupportedCPU(String optionName) {
|
protected static String getWarningForUnsupportedCPU(String optionName) {
|
||||||
if (Platform.isSparc()) {
|
if (Platform.isSparc() || Platform.isAArch64()) {
|
||||||
switch (optionName) {
|
switch (optionName) {
|
||||||
case SHAOptionsBase.USE_SHA_OPTION:
|
case SHAOptionsBase.USE_SHA_OPTION:
|
||||||
return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE;
|
return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE;
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
*/
|
*/
|
||||||
public class TestUseSHA1IntrinsicsOptionOnSupportedCPU {
|
public class TestUseSHA1IntrinsicsOptionOnSupportedCPU {
|
||||||
public static void main(String args[]) throws Throwable {
|
public static void main(String args[]) throws Throwable {
|
||||||
new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU(
|
new SHAOptionsBase(new GenericTestCaseForSupportedCPU(
|
||||||
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,12 @@ public class TestUseSHA1IntrinsicsOptionOnUnsupportedCPU {
|
|||||||
new SHAOptionsBase(
|
new SHAOptionsBase(
|
||||||
new GenericTestCaseForUnsupportedSparcCPU(
|
new GenericTestCaseForUnsupportedSparcCPU(
|
||||||
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
||||||
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU(
|
|
||||||
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
|
||||||
new GenericTestCaseForUnsupportedX86CPU(
|
new GenericTestCaseForUnsupportedX86CPU(
|
||||||
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
||||||
|
new GenericTestCaseForUnsupportedAArch64CPU(
|
||||||
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
||||||
|
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU(
|
||||||
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION),
|
||||||
new GenericTestCaseForOtherCPU(
|
new GenericTestCaseForOtherCPU(
|
||||||
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
*/
|
*/
|
||||||
public class TestUseSHA256IntrinsicsOptionOnSupportedCPU {
|
public class TestUseSHA256IntrinsicsOptionOnSupportedCPU {
|
||||||
public static void main(String args[]) throws Throwable {
|
public static void main(String args[]) throws Throwable {
|
||||||
new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU(
|
new SHAOptionsBase(new GenericTestCaseForSupportedCPU(
|
||||||
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,12 @@ public class TestUseSHA256IntrinsicsOptionOnUnsupportedCPU {
|
|||||||
new SHAOptionsBase(
|
new SHAOptionsBase(
|
||||||
new GenericTestCaseForUnsupportedSparcCPU(
|
new GenericTestCaseForUnsupportedSparcCPU(
|
||||||
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
||||||
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU(
|
|
||||||
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
|
||||||
new GenericTestCaseForUnsupportedX86CPU(
|
new GenericTestCaseForUnsupportedX86CPU(
|
||||||
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
||||||
|
new GenericTestCaseForUnsupportedAArch64CPU(
|
||||||
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
||||||
|
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU(
|
||||||
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION),
|
||||||
new GenericTestCaseForOtherCPU(
|
new GenericTestCaseForOtherCPU(
|
||||||
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
*/
|
*/
|
||||||
public class TestUseSHA512IntrinsicsOptionOnSupportedCPU {
|
public class TestUseSHA512IntrinsicsOptionOnSupportedCPU {
|
||||||
public static void main(String args[]) throws Throwable {
|
public static void main(String args[]) throws Throwable {
|
||||||
new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU(
|
new SHAOptionsBase(new GenericTestCaseForSupportedCPU(
|
||||||
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -40,10 +40,12 @@ public class TestUseSHA512IntrinsicsOptionOnUnsupportedCPU {
|
|||||||
new SHAOptionsBase(
|
new SHAOptionsBase(
|
||||||
new GenericTestCaseForUnsupportedSparcCPU(
|
new GenericTestCaseForUnsupportedSparcCPU(
|
||||||
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
||||||
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU(
|
|
||||||
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
|
||||||
new GenericTestCaseForUnsupportedX86CPU(
|
new GenericTestCaseForUnsupportedX86CPU(
|
||||||
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
||||||
|
new GenericTestCaseForUnsupportedAArch64CPU(
|
||||||
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
||||||
|
new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU(
|
||||||
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION),
|
||||||
new GenericTestCaseForOtherCPU(
|
new GenericTestCaseForOtherCPU(
|
||||||
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test();
|
SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test();
|
||||||
}
|
}
|
||||||
|
@ -37,9 +37,9 @@
|
|||||||
public class TestUseSHAOptionOnSupportedCPU {
|
public class TestUseSHAOptionOnSupportedCPU {
|
||||||
public static void main(String args[]) throws Throwable {
|
public static void main(String args[]) throws Throwable {
|
||||||
new SHAOptionsBase(
|
new SHAOptionsBase(
|
||||||
new GenericTestCaseForSupportedSparcCPU(
|
new GenericTestCaseForSupportedCPU(
|
||||||
SHAOptionsBase.USE_SHA_OPTION),
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
new UseSHASpecificTestCaseForSupportedSparcCPU(
|
new UseSHASpecificTestCaseForSupportedCPU(
|
||||||
SHAOptionsBase.USE_SHA_OPTION)).test();
|
SHAOptionsBase.USE_SHA_OPTION)).test();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,10 +39,12 @@ public class TestUseSHAOptionOnUnsupportedCPU {
|
|||||||
new SHAOptionsBase(
|
new SHAOptionsBase(
|
||||||
new GenericTestCaseForUnsupportedSparcCPU(
|
new GenericTestCaseForUnsupportedSparcCPU(
|
||||||
SHAOptionsBase.USE_SHA_OPTION),
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
new UseSHASpecificTestCaseForUnsupportedSparcCPU(
|
|
||||||
SHAOptionsBase.USE_SHA_OPTION),
|
|
||||||
new GenericTestCaseForUnsupportedX86CPU(
|
new GenericTestCaseForUnsupportedX86CPU(
|
||||||
SHAOptionsBase.USE_SHA_OPTION),
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
|
new GenericTestCaseForUnsupportedAArch64CPU(
|
||||||
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
|
new UseSHASpecificTestCaseForUnsupportedCPU(
|
||||||
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
new GenericTestCaseForOtherCPU(
|
new GenericTestCaseForOtherCPU(
|
||||||
SHAOptionsBase.USE_SHA_OPTION)).test();
|
SHAOptionsBase.USE_SHA_OPTION)).test();
|
||||||
}
|
}
|
||||||
|
@ -35,16 +35,18 @@ public class GenericTestCaseForOtherCPU extends
|
|||||||
SHAOptionsBase.TestCase {
|
SHAOptionsBase.TestCase {
|
||||||
public GenericTestCaseForOtherCPU(String optionName) {
|
public GenericTestCaseForOtherCPU(String optionName) {
|
||||||
// Execute the test case on any CPU except SPARC and X86
|
// Execute the test case on any CPU except SPARC and X86
|
||||||
super(optionName, new NotPredicate(new OrPredicate(Platform::isSparc,
|
super(optionName, new NotPredicate(
|
||||||
new OrPredicate(Platform::isX64, Platform::isX86))));
|
new OrPredicate(
|
||||||
|
new OrPredicate(Platform::isSparc, Platform::isAArch64),
|
||||||
|
new OrPredicate(Platform::isX64, Platform::isX86))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void verifyWarnings() throws Throwable {
|
protected void verifyWarnings() throws Throwable {
|
||||||
String shouldPassMessage = String.format("JVM should start with "
|
String shouldPassMessage = String.format("JVM should start with "
|
||||||
+ "option '%s' without any warnings", optionName);
|
+ "option '%s' without any warnings", optionName);
|
||||||
// Verify that on non-x86 and non-SPARC CPU usage of SHA-related
|
// Verify that on non-x86, non-SPARC and non-AArch64 CPU usage of
|
||||||
// options will not cause any warnings.
|
// SHA-related options will not cause any warnings.
|
||||||
CommandLineOptionTest.verifySameJVMStartup(null,
|
CommandLineOptionTest.verifySameJVMStartup(null,
|
||||||
new String[] { ".*" + optionName + ".*" }, shouldPassMessage,
|
new String[] { ".*" + optionName + ".*" }, shouldPassMessage,
|
||||||
shouldPassMessage, ExitCode.OK,
|
shouldPassMessage, ExitCode.OK,
|
||||||
|
@ -25,16 +25,19 @@ import jdk.test.lib.ExitCode;
|
|||||||
import jdk.test.lib.Platform;
|
import jdk.test.lib.Platform;
|
||||||
import jdk.test.lib.cli.CommandLineOptionTest;
|
import jdk.test.lib.cli.CommandLineOptionTest;
|
||||||
import jdk.test.lib.cli.predicate.AndPredicate;
|
import jdk.test.lib.cli.predicate.AndPredicate;
|
||||||
|
import jdk.test.lib.cli.predicate.OrPredicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generic test case for SHA-related options targeted to SPARC CPUs which
|
* Generic test case for SHA-related options targeted to CPUs which
|
||||||
* support instructions required by the tested option.
|
* support instructions required by the tested option.
|
||||||
*/
|
*/
|
||||||
public class GenericTestCaseForSupportedSparcCPU extends
|
public class GenericTestCaseForSupportedCPU extends
|
||||||
SHAOptionsBase.TestCase {
|
SHAOptionsBase.TestCase {
|
||||||
public GenericTestCaseForSupportedSparcCPU(String optionName) {
|
public GenericTestCaseForSupportedCPU(String optionName) {
|
||||||
super(optionName, new AndPredicate(Platform::isSparc,
|
super(optionName,
|
||||||
SHAOptionsBase.getPredicateForOption(optionName)));
|
new AndPredicate(
|
||||||
|
new OrPredicate(Platform::isSparc, Platform::isAArch64),
|
||||||
|
SHAOptionsBase.getPredicateForOption(optionName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import jdk.test.lib.ExitCode;
|
||||||
|
import jdk.test.lib.Platform;
|
||||||
|
import jdk.test.lib.cli.CommandLineOptionTest;
|
||||||
|
import jdk.test.lib.cli.predicate.AndPredicate;
|
||||||
|
import jdk.test.lib.cli.predicate.NotPredicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic test case for SHA-related options targeted to AArch64 CPUs
|
||||||
|
* which don't support instruction required by the tested option.
|
||||||
|
*/
|
||||||
|
public class GenericTestCaseForUnsupportedAArch64CPU extends
|
||||||
|
SHAOptionsBase.TestCase {
|
||||||
|
public GenericTestCaseForUnsupportedAArch64CPU(String optionName) {
|
||||||
|
super(optionName, new AndPredicate(Platform::isAArch64,
|
||||||
|
new NotPredicate(SHAOptionsBase.getPredicateForOption(
|
||||||
|
optionName))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void verifyWarnings() throws Throwable {
|
||||||
|
String shouldPassMessage = String.format("JVM startup should pass with"
|
||||||
|
+ "option '-XX:-%s' without any warnings", optionName);
|
||||||
|
//Verify that option could be disabled without any warnings.
|
||||||
|
CommandLineOptionTest.verifySameJVMStartup(null, new String[] {
|
||||||
|
SHAOptionsBase.getWarningForUnsupportedCPU(optionName)
|
||||||
|
}, shouldPassMessage, shouldPassMessage, ExitCode.OK,
|
||||||
|
CommandLineOptionTest.prepareBooleanFlag(optionName, false));
|
||||||
|
|
||||||
|
shouldPassMessage = String.format("JVM should start with '-XX:+"
|
||||||
|
+ "%s' flag, but output should contain warning.", optionName);
|
||||||
|
// Verify that when the tested option is explicitly enabled, then
|
||||||
|
// a warning will occur in VM output.
|
||||||
|
CommandLineOptionTest.verifySameJVMStartup(new String[] {
|
||||||
|
SHAOptionsBase.getWarningForUnsupportedCPU(optionName)
|
||||||
|
}, null, shouldPassMessage, shouldPassMessage, ExitCode.OK,
|
||||||
|
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void verifyOptionValues() throws Throwable {
|
||||||
|
// Verify that option is disabled by default.
|
||||||
|
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
|
||||||
|
String.format("Option '%s' should be disabled by default",
|
||||||
|
optionName));
|
||||||
|
|
||||||
|
// Verify that option is disabled even if it was explicitly enabled
|
||||||
|
// using CLI options.
|
||||||
|
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
|
||||||
|
String.format("Option '%s' should be off on unsupported "
|
||||||
|
+ "AArch64CPU even if set to true directly", optionName),
|
||||||
|
CommandLineOptionTest.prepareBooleanFlag(optionName, true));
|
||||||
|
|
||||||
|
// Verify that option is disabled when +UseSHA was passed to JVM.
|
||||||
|
CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false",
|
||||||
|
String.format("Option '%s' should be off on unsupported "
|
||||||
|
+ "AArch64CPU even if %s flag set to JVM",
|
||||||
|
optionName, CommandLineOptionTest.prepareBooleanFlag(
|
||||||
|
SHAOptionsBase.USE_SHA_OPTION, true)),
|
||||||
|
CommandLineOptionTest.prepareBooleanFlag(
|
||||||
|
SHAOptionsBase.USE_SHA_OPTION, true));
|
||||||
|
}
|
||||||
|
}
|
@ -25,24 +25,26 @@ import jdk.test.lib.ExitCode;
|
|||||||
import jdk.test.lib.Platform;
|
import jdk.test.lib.Platform;
|
||||||
import jdk.test.lib.cli.CommandLineOptionTest;
|
import jdk.test.lib.cli.CommandLineOptionTest;
|
||||||
import jdk.test.lib.cli.predicate.AndPredicate;
|
import jdk.test.lib.cli.predicate.AndPredicate;
|
||||||
|
import jdk.test.lib.cli.predicate.OrPredicate;
|
||||||
import jdk.test.lib.cli.predicate.NotPredicate;
|
import jdk.test.lib.cli.predicate.NotPredicate;
|
||||||
import sha.predicate.IntrinsicPredicates;
|
import sha.predicate.IntrinsicPredicates;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test case specific to UseSHA*Intrinsics options targeted to SPARC CPUs which
|
* Test case specific to UseSHA*Intrinsics options targeted to SPARC and AArch64
|
||||||
* don't support required instruction, but support other SHA-related
|
* CPUs which don't support required instruction, but support other SHA-related
|
||||||
* instructions.
|
* instructions.
|
||||||
*
|
*
|
||||||
* For example, CPU support sha1 instruction, but don't support sha256 or
|
* For example, CPU support sha1 instruction, but don't support sha256 or
|
||||||
* sha512.
|
* sha512.
|
||||||
*/
|
*/
|
||||||
public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU
|
public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU
|
||||||
extends SHAOptionsBase.TestCase {
|
extends SHAOptionsBase.TestCase {
|
||||||
public UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU(
|
public UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU(
|
||||||
String optionName) {
|
String optionName) {
|
||||||
// execute test case on SPARC CPU that support any sha* instructions,
|
// execute test case on SPARC CPU that support any sha* instructions,
|
||||||
// but does not support sha* instruction required by the tested option.
|
// but does not support sha* instruction required by the tested option.
|
||||||
super(optionName, new AndPredicate(Platform::isSparc,
|
super(optionName, new AndPredicate(
|
||||||
|
new OrPredicate(Platform::isSparc, Platform::isAArch64),
|
||||||
new AndPredicate(
|
new AndPredicate(
|
||||||
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE,
|
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE,
|
||||||
new NotPredicate(SHAOptionsBase.getPredicateForOption(
|
new NotPredicate(SHAOptionsBase.getPredicateForOption(
|
@ -26,16 +26,18 @@ import jdk.test.lib.ExitCode;
|
|||||||
import jdk.test.lib.Platform;
|
import jdk.test.lib.Platform;
|
||||||
import jdk.test.lib.cli.CommandLineOptionTest;
|
import jdk.test.lib.cli.CommandLineOptionTest;
|
||||||
import jdk.test.lib.cli.predicate.AndPredicate;
|
import jdk.test.lib.cli.predicate.AndPredicate;
|
||||||
|
import jdk.test.lib.cli.predicate.OrPredicate;
|
||||||
import sha.predicate.IntrinsicPredicates;
|
import sha.predicate.IntrinsicPredicates;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UseSHA specific test case targeted to SPARC CPUs which support any sha*
|
* UseSHA specific test case targeted to SPARC and AArch64 CPUs which
|
||||||
* instruction.
|
* support any sha* instruction.
|
||||||
*/
|
*/
|
||||||
public class UseSHASpecificTestCaseForSupportedSparcCPU
|
public class UseSHASpecificTestCaseForSupportedCPU
|
||||||
extends SHAOptionsBase.TestCase {
|
extends SHAOptionsBase.TestCase {
|
||||||
public UseSHASpecificTestCaseForSupportedSparcCPU(String optionName) {
|
public UseSHASpecificTestCaseForSupportedCPU(String optionName) {
|
||||||
super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc,
|
super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(
|
||||||
|
new OrPredicate(Platform::isSparc, Platform::isAArch64),
|
||||||
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE));
|
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE));
|
||||||
|
|
||||||
Asserts.assertEQ(optionName, SHAOptionsBase.USE_SHA_OPTION,
|
Asserts.assertEQ(optionName, SHAOptionsBase.USE_SHA_OPTION,
|
@ -26,17 +26,19 @@ import jdk.test.lib.ExitCode;
|
|||||||
import jdk.test.lib.Platform;
|
import jdk.test.lib.Platform;
|
||||||
import jdk.test.lib.cli.CommandLineOptionTest;
|
import jdk.test.lib.cli.CommandLineOptionTest;
|
||||||
import jdk.test.lib.cli.predicate.AndPredicate;
|
import jdk.test.lib.cli.predicate.AndPredicate;
|
||||||
|
import jdk.test.lib.cli.predicate.OrPredicate;
|
||||||
import jdk.test.lib.cli.predicate.NotPredicate;
|
import jdk.test.lib.cli.predicate.NotPredicate;
|
||||||
import sha.predicate.IntrinsicPredicates;
|
import sha.predicate.IntrinsicPredicates;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UseSHA specific test case targeted to SPARC CPUs which don't support all sha*
|
* UseSHA specific test case targeted to SPARC and AArch64 CPUs which don't
|
||||||
* instructions.
|
* support all sha* instructions./
|
||||||
*/
|
*/
|
||||||
public class UseSHASpecificTestCaseForUnsupportedSparcCPU
|
public class UseSHASpecificTestCaseForUnsupportedCPU
|
||||||
extends SHAOptionsBase.TestCase {
|
extends SHAOptionsBase.TestCase {
|
||||||
public UseSHASpecificTestCaseForUnsupportedSparcCPU(String optionName) {
|
public UseSHASpecificTestCaseForUnsupportedCPU(String optionName) {
|
||||||
super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc,
|
super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(
|
||||||
|
new OrPredicate(Platform::isSparc, Platform::isAArch64),
|
||||||
new NotPredicate(
|
new NotPredicate(
|
||||||
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE)));
|
IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE)));
|
||||||
|
|
||||||
@ -49,7 +51,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU
|
|||||||
protected void verifyWarnings() throws Throwable {
|
protected void verifyWarnings() throws Throwable {
|
||||||
// Verify that attempt to use UseSHA option will cause a warning.
|
// Verify that attempt to use UseSHA option will cause a warning.
|
||||||
String shouldPassMessage = String.format("JVM startup should pass with"
|
String shouldPassMessage = String.format("JVM startup should pass with"
|
||||||
+ " '%s' option on unsupported SparcCPU, but there should be"
|
+ " '%s' option on unsupported CPU, but there should be"
|
||||||
+ "the message shown.", optionName);
|
+ "the message shown.", optionName);
|
||||||
CommandLineOptionTest.verifySameJVMStartup(new String[] {
|
CommandLineOptionTest.verifySameJVMStartup(new String[] {
|
||||||
SHAOptionsBase.getWarningForUnsupportedCPU(optionName)
|
SHAOptionsBase.getWarningForUnsupportedCPU(optionName)
|
||||||
@ -63,7 +65,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU
|
|||||||
// UseSHA*Intrinsics were enabled.
|
// UseSHA*Intrinsics were enabled.
|
||||||
CommandLineOptionTest.verifyOptionValueForSameVM(
|
CommandLineOptionTest.verifyOptionValueForSameVM(
|
||||||
SHAOptionsBase.USE_SHA_OPTION, "false", String.format(
|
SHAOptionsBase.USE_SHA_OPTION, "false", String.format(
|
||||||
"%s option should be disabled on unsupported SparcCPU"
|
"%s option should be disabled on unsupported CPU"
|
||||||
+ " even if all UseSHA*Intrinsics options were enabled.",
|
+ " even if all UseSHA*Intrinsics options were enabled.",
|
||||||
SHAOptionsBase.USE_SHA_OPTION),
|
SHAOptionsBase.USE_SHA_OPTION),
|
||||||
CommandLineOptionTest.prepareBooleanFlag(
|
CommandLineOptionTest.prepareBooleanFlag(
|
||||||
@ -77,7 +79,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU
|
|||||||
// UseSHA*Intrinsics options were enabled and UseSHA was enabled as well.
|
// UseSHA*Intrinsics options were enabled and UseSHA was enabled as well.
|
||||||
CommandLineOptionTest.verifyOptionValueForSameVM(
|
CommandLineOptionTest.verifyOptionValueForSameVM(
|
||||||
SHAOptionsBase.USE_SHA_OPTION, "false", String.format(
|
SHAOptionsBase.USE_SHA_OPTION, "false", String.format(
|
||||||
"%s option should be disabled on unsupported SparcCPU"
|
"%s option should be disabled on unsupported CPU"
|
||||||
+ " even if all UseSHA*Intrinsics options were enabled"
|
+ " even if all UseSHA*Intrinsics options were enabled"
|
||||||
+ " and %s was enabled as well",
|
+ " and %s was enabled as well",
|
||||||
SHAOptionsBase.USE_SHA_OPTION,
|
SHAOptionsBase.USE_SHA_OPTION,
|
109
hotspot/test/compiler/jsr292/PollutedTrapCounts.java
Normal file
109
hotspot/test/compiler/jsr292/PollutedTrapCounts.java
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
* @bug 8074551
|
||||||
|
* @library /testlibrary
|
||||||
|
* @run main PollutedTrapCounts
|
||||||
|
*/
|
||||||
|
import java.lang.invoke.*;
|
||||||
|
import jdk.test.lib.*;
|
||||||
|
|
||||||
|
public class PollutedTrapCounts {
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
|
||||||
|
"-XX:+IgnoreUnrecognizedVMOptions",
|
||||||
|
"-XX:-TieredCompilation", "-Xbatch",
|
||||||
|
"-XX:PerBytecodeRecompilationCutoff=10", "-XX:PerMethodRecompilationCutoff=10",
|
||||||
|
"-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining",
|
||||||
|
"PollutedTrapCounts$Test");
|
||||||
|
|
||||||
|
OutputAnalyzer analyzer = new OutputAnalyzer(pb.start());
|
||||||
|
|
||||||
|
analyzer.shouldHaveExitValue(0);
|
||||||
|
|
||||||
|
analyzer.shouldNotContain("not compilable (disabled)");
|
||||||
|
}
|
||||||
|
|
||||||
|
static class Test {
|
||||||
|
public static final MethodHandle test1;
|
||||||
|
public static final MethodHandle test2;
|
||||||
|
public static final MethodHandle empty;
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
Class<?> THIS_CLASS = Test.class;
|
||||||
|
MethodHandles.Lookup LOOKUP = MethodHandles.lookup();
|
||||||
|
test1 = LOOKUP.findStatic(THIS_CLASS, "test1", MethodType.methodType(boolean.class, boolean.class));
|
||||||
|
test2 = LOOKUP.findStatic(THIS_CLASS, "test2", MethodType.methodType(boolean.class, boolean.class));
|
||||||
|
empty = LOOKUP.findStatic(THIS_CLASS, "empty", MethodType.methodType(void.class, boolean.class));
|
||||||
|
} catch(Throwable e) {
|
||||||
|
throw new Error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static boolean test1(boolean b) {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
static boolean test2(boolean b) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
static void empty(boolean b) {}
|
||||||
|
|
||||||
|
static void test(boolean freqValue, boolean removeInlineBlocker) throws Throwable {
|
||||||
|
MethodHandle innerGWT = MethodHandles.guardWithTest(test1, empty, empty);
|
||||||
|
MethodHandle outerGWT = MethodHandles.guardWithTest(test2, innerGWT, innerGWT);
|
||||||
|
|
||||||
|
// Trigger compilation
|
||||||
|
for (int i = 0; i < 20_000; i++) {
|
||||||
|
outerGWT.invokeExact(freqValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trigger deopt & nmethod invalidation
|
||||||
|
outerGWT.invokeExact(!freqValue);
|
||||||
|
|
||||||
|
// Force inline blocker removal on rare-taken path
|
||||||
|
if (removeInlineBlocker) {
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
outerGWT.invokeExact(!freqValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trigger recompilation
|
||||||
|
for (int i = 0; i < 20_000; i++) {
|
||||||
|
outerGWT.invokeExact(freqValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
boolean freqValue = true;
|
||||||
|
boolean removeInlineBlocker = false;
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
test(freqValue, removeInlineBlocker);
|
||||||
|
freqValue = !freqValue;
|
||||||
|
removeInlineBlocker = !removeInlineBlocker;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -59,16 +59,19 @@ public class IntrinsicPredicates {
|
|||||||
};
|
};
|
||||||
|
|
||||||
public static final BooleanSupplier SHA1_INSTRUCTION_AVAILABLE
|
public static final BooleanSupplier SHA1_INSTRUCTION_AVAILABLE
|
||||||
= new CPUSpecificPredicate("sparc.*", new String[] { "sha1" },
|
= new OrPredicate(
|
||||||
null);
|
new CPUSpecificPredicate("sparc.*", new String[] { "sha1" },null),
|
||||||
|
new CPUSpecificPredicate("aarch64.*", new String[] { "sha1" },null));
|
||||||
|
|
||||||
public static final BooleanSupplier SHA256_INSTRUCTION_AVAILABLE
|
public static final BooleanSupplier SHA256_INSTRUCTION_AVAILABLE
|
||||||
= new CPUSpecificPredicate("sparc.*", new String[] { "sha256" },
|
= new OrPredicate(
|
||||||
null);
|
new CPUSpecificPredicate("sparc.*", new String[] { "sha256" },null),
|
||||||
|
new CPUSpecificPredicate("aarch64.*", new String[] { "sha256" },null));
|
||||||
|
|
||||||
public static final BooleanSupplier SHA512_INSTRUCTION_AVAILABLE
|
public static final BooleanSupplier SHA512_INSTRUCTION_AVAILABLE
|
||||||
= new CPUSpecificPredicate("sparc.*", new String[] { "sha512" },
|
= new OrPredicate(
|
||||||
null);
|
new CPUSpecificPredicate("sparc.*", new String[] { "sha512" },null),
|
||||||
|
new CPUSpecificPredicate("aarch64.*", new String[] { "sha512" },null));
|
||||||
|
|
||||||
public static final BooleanSupplier ANY_SHA_INSTRUCTION_AVAILABLE
|
public static final BooleanSupplier ANY_SHA_INSTRUCTION_AVAILABLE
|
||||||
= new OrPredicate(IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE,
|
= new OrPredicate(IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE,
|
||||||
|
@ -32,11 +32,15 @@
|
|||||||
* @run driver RandomGeneratorTest DIFFERENT_SEED
|
* @run driver RandomGeneratorTest DIFFERENT_SEED
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import jdk.test.lib.ProcessTools;
|
import java.io.FileWriter;
|
||||||
import jdk.test.lib.Utils;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import jdk.test.lib.OutputAnalyzer;
|
||||||
|
import jdk.test.lib.ProcessTools;
|
||||||
|
import jdk.test.lib.Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The test verifies correctness of work {@link jdk.test.lib.Utils#getRandomInstance()}.
|
* The test verifies correctness of work {@link jdk.test.lib.Utils#getRandomInstance()}.
|
||||||
@ -59,8 +63,13 @@ public class RandomGeneratorTest {
|
|||||||
jvmArgs.add(optStr);
|
jvmArgs.add(optStr);
|
||||||
}
|
}
|
||||||
jvmArgs.add(RandomRunner.class.getName());
|
jvmArgs.add(RandomRunner.class.getName());
|
||||||
|
String origFileName = seedOpt.name() + "_orig";
|
||||||
|
jvmArgs.add(origFileName);
|
||||||
|
int fileNameIndex = jvmArgs.size() - 1;
|
||||||
String[] cmdLineArgs = jvmArgs.toArray(new String[jvmArgs.size()]);
|
String[] cmdLineArgs = jvmArgs.toArray(new String[jvmArgs.size()]);
|
||||||
String etalon = ProcessTools.executeTestJvm(cmdLineArgs).getStdout().trim();
|
ProcessTools.executeTestJvm(cmdLineArgs).shouldHaveExitValue(0);
|
||||||
|
String etalon = Utils.fileAsString(origFileName).trim();
|
||||||
|
cmdLineArgs[fileNameIndex] = seedOpt.name();
|
||||||
seedOpt.verify(etalon, cmdLineArgs);
|
seedOpt.verify(etalon, cmdLineArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,26 +130,31 @@ public class RandomGeneratorTest {
|
|||||||
* @throws Throwable - Throws an exception in case test failure.
|
* @throws Throwable - Throws an exception in case test failure.
|
||||||
*/
|
*/
|
||||||
public void verify(String orig, String[] cmdLine) {
|
public void verify(String orig, String[] cmdLine) {
|
||||||
String lastLineOrig = getLastLine(orig);
|
String output;
|
||||||
String lastLine;
|
OutputAnalyzer oa;
|
||||||
try {
|
try {
|
||||||
lastLine = getLastLine(ProcessTools.executeTestJvm(cmdLine).getStdout().trim());
|
oa = ProcessTools.executeTestJvm(cmdLine);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throw new Error("TESTBUG: Unexpedted exception during jvm execution.", t);
|
throw new Error("TESTBUG: Unexpedted exception during jvm execution.", t);
|
||||||
}
|
}
|
||||||
if (!isOutputExpected(lastLineOrig, lastLine)) {
|
oa.shouldHaveExitValue(0);
|
||||||
throw new AssertionError("Unexpected random number sequence for mode: " + this.name());
|
try {
|
||||||
|
output = Utils.fileAsString(name()).trim();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
throw new Error("TESTBUG: Problem during IO operation with file: " + name(), ioe);
|
||||||
|
}
|
||||||
|
if (!isOutputExpected(orig, output)) {
|
||||||
|
System.err.println("Initial output: " + orig);
|
||||||
|
System.err.println("Second run output: " + output);
|
||||||
|
throw new AssertionError("Unexpected random number sequence for mode: " + this.name());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static String getLastLine(String output) {
|
|
||||||
return output.substring(output.lastIndexOf(Utils.NEW_LINE)).trim();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The helper class generates several random numbers
|
* The helper class generates several random numbers
|
||||||
* and prints them out.
|
* and put results to a file. The file name came as first
|
||||||
|
* command line argument.
|
||||||
*/
|
*/
|
||||||
public static class RandomRunner {
|
public static class RandomRunner {
|
||||||
private static final int COUNT = 10;
|
private static final int COUNT = 10;
|
||||||
@ -150,7 +164,11 @@ public class RandomGeneratorTest {
|
|||||||
for (int i = 0; i < COUNT; i++) {
|
for (int i = 0; i < COUNT; i++) {
|
||||||
sb.append(rng.nextLong()).append(' ');
|
sb.append(rng.nextLong()).append(' ');
|
||||||
}
|
}
|
||||||
System.out.println(sb.toString());
|
try (PrintWriter pw = new PrintWriter(new FileWriter(args[0]))) {
|
||||||
|
pw.write(sb.toString());
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
throw new Error("TESTBUG: Problem during IO operation with file: " + args[0], ioe);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -310,3 +310,5 @@ f4a4a54620370f077c2e830a5561c8cfa811712b jdk9-b61
|
|||||||
ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65
|
ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65
|
||||||
d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
|
d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
|
||||||
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
|
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
|
||||||
|
82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68
|
||||||
|
f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69
|
||||||
|
@ -1,21 +1,23 @@
|
|||||||
/*
|
/*
|
||||||
* reserved comment block
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT REMOVE OR ALTER!
|
|
||||||
*/
|
*/
|
||||||
/*
|
/**
|
||||||
* Copyright 1999-2005 The Apache Software Foundation.
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* Unless required by applicable law or agreed to in writing,
|
||||||
*
|
* software distributed under the License is distributed on an
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* KIND, either express or implied. See the License for the
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* specific language governing permissions and limitations
|
||||||
* See the License for the specific language governing permissions and
|
* under the License.
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* $Id: FunctionTable.java,v 1.3 2005/09/28 13:49:34 pvedula Exp $
|
* $Id: FunctionTable.java,v 1.3 2005/09/28 13:49:34 pvedula Exp $
|
||||||
@ -135,6 +137,9 @@ public class FunctionTable
|
|||||||
/** The 'unparsed-entity-uri()' id (XSLT). */
|
/** The 'unparsed-entity-uri()' id (XSLT). */
|
||||||
public static final int FUNC_UNPARSED_ENTITY_URI = 36;
|
public static final int FUNC_UNPARSED_ENTITY_URI = 36;
|
||||||
|
|
||||||
|
/** The 'here()' id (XML Signature). */
|
||||||
|
public static final int FUNC_HERE = 37;
|
||||||
|
|
||||||
// Proprietary
|
// Proprietary
|
||||||
|
|
||||||
/** The 'document-location()' id (Proprietary). */
|
/** The 'document-location()' id (Proprietary). */
|
||||||
@ -162,7 +167,7 @@ public class FunctionTable
|
|||||||
* Number of built in functions. Be sure to update this as
|
* Number of built in functions. Be sure to update this as
|
||||||
* built-in functions are added.
|
* built-in functions are added.
|
||||||
*/
|
*/
|
||||||
private static final int NUM_BUILT_IN_FUNCS = 37;
|
private static final int NUM_BUILT_IN_FUNCS = 38;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Number of built-in functions that may be added.
|
* Number of built-in functions that may be added.
|
||||||
@ -229,6 +234,8 @@ public class FunctionTable
|
|||||||
com.sun.org.apache.xpath.internal.functions.FuncDoclocation.class;
|
com.sun.org.apache.xpath.internal.functions.FuncDoclocation.class;
|
||||||
m_functions[FUNC_UNPARSED_ENTITY_URI] =
|
m_functions[FUNC_UNPARSED_ENTITY_URI] =
|
||||||
com.sun.org.apache.xpath.internal.functions.FuncUnparsedEntityURI.class;
|
com.sun.org.apache.xpath.internal.functions.FuncUnparsedEntityURI.class;
|
||||||
|
m_functions[FUNC_HERE] =
|
||||||
|
com.sun.org.apache.xpath.internal.functions.FuncHere.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
static{
|
static{
|
||||||
@ -302,6 +309,8 @@ public class FunctionTable
|
|||||||
new Integer(FunctionTable.FUNC_UNPARSED_ENTITY_URI));
|
new Integer(FunctionTable.FUNC_UNPARSED_ENTITY_URI));
|
||||||
m_functionID.put(Keywords.FUNC_DOCLOCATION_STRING,
|
m_functionID.put(Keywords.FUNC_DOCLOCATION_STRING,
|
||||||
new Integer(FunctionTable.FUNC_DOCLOCATION));
|
new Integer(FunctionTable.FUNC_DOCLOCATION));
|
||||||
|
m_functionID.put(Keywords.FUNC_HERE_STRING,
|
||||||
|
new Integer(FunctionTable.FUNC_HERE));
|
||||||
}
|
}
|
||||||
|
|
||||||
public FunctionTable(){
|
public FunctionTable(){
|
||||||
|
@ -1,21 +1,23 @@
|
|||||||
/*
|
/*
|
||||||
* reserved comment block
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT REMOVE OR ALTER!
|
|
||||||
*/
|
*/
|
||||||
/*
|
/**
|
||||||
* Copyright 1999-2005 The Apache Software Foundation.
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
*
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
* Unless required by applicable law or agreed to in writing,
|
||||||
*
|
* software distributed under the License is distributed on an
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
* KIND, either express or implied. See the License for the
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* specific language governing permissions and limitations
|
||||||
* See the License for the specific language governing permissions and
|
* under the License.
|
||||||
* limitations under the License.
|
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* $Id: Keywords.java,v 1.2.4.1 2005/09/14 19:46:01 jeffsuttor Exp $
|
* $Id: Keywords.java,v 1.2.4.1 2005/09/14 19:46:01 jeffsuttor Exp $
|
||||||
@ -210,6 +212,9 @@ public class Keywords
|
|||||||
public static final String FUNC_UNPARSED_ENTITY_URI_STRING =
|
public static final String FUNC_UNPARSED_ENTITY_URI_STRING =
|
||||||
"unparsed-entity-uri";
|
"unparsed-entity-uri";
|
||||||
|
|
||||||
|
/** here function string (XML Signature). */
|
||||||
|
public static final String FUNC_HERE_STRING = "here";
|
||||||
|
|
||||||
// Proprietary, built in functions
|
// Proprietary, built in functions
|
||||||
|
|
||||||
/** current function string (Proprietary). */
|
/** current function string (Proprietary). */
|
||||||
|
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance
|
||||||
|
* with the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
* KIND, either express or implied. See the License for the
|
||||||
|
* specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
package com.sun.org.apache.xpath.internal.functions;
|
||||||
|
|
||||||
|
import javax.xml.transform.TransformerException;
|
||||||
|
import org.w3c.dom.Document;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
import com.sun.org.apache.xml.internal.dtm.DTM;
|
||||||
|
import com.sun.org.apache.xpath.internal.NodeSetDTM;
|
||||||
|
import com.sun.org.apache.xpath.internal.XPathContext;
|
||||||
|
import com.sun.org.apache.xpath.internal.objects.XNodeSet;
|
||||||
|
import com.sun.org.apache.xpath.internal.objects.XObject;
|
||||||
|
import com.sun.org.apache.xpath.internal.res.XPATHErrorResources;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the XML Signature here() function.
|
||||||
|
*/
|
||||||
|
public final class FuncHere extends Function {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 4328660760070034592L;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public XObject execute(XPathContext xctxt) throws TransformerException {
|
||||||
|
Node xpathOwnerNode = (Node)xctxt.getOwnerObject();
|
||||||
|
if (xpathOwnerNode == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
int xpathOwnerNodeDTM = xctxt.getDTMHandleFromNode(xpathOwnerNode);
|
||||||
|
int currentNode = xctxt.getCurrentNode();
|
||||||
|
DTM dtm = xctxt.getDTM(currentNode);
|
||||||
|
int docContext = dtm.getDocument();
|
||||||
|
|
||||||
|
if (docContext == DTM.NULL) {
|
||||||
|
error(xctxt, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check whether currentNode and the node containing the XPath
|
||||||
|
// expression are in the same document
|
||||||
|
Document currentDoc = getOwnerDocument(dtm.getNode(currentNode));
|
||||||
|
Document xpathOwnerDoc = getOwnerDocument(xpathOwnerNode);
|
||||||
|
|
||||||
|
if (currentDoc != xpathOwnerDoc) {
|
||||||
|
throw new TransformerException("Owner documents differ");
|
||||||
|
}
|
||||||
|
|
||||||
|
XNodeSet nodes = new XNodeSet(xctxt.getDTMManager());
|
||||||
|
NodeSetDTM nodeSet = nodes.mutableNodeset();
|
||||||
|
|
||||||
|
int hereNode = DTM.NULL;
|
||||||
|
|
||||||
|
switch (dtm.getNodeType(xpathOwnerNodeDTM)) {
|
||||||
|
|
||||||
|
case Node.ATTRIBUTE_NODE:
|
||||||
|
case Node.PROCESSING_INSTRUCTION_NODE: {
|
||||||
|
// returns a node-set containing the attribute / processing
|
||||||
|
// instruction node
|
||||||
|
hereNode = xpathOwnerNodeDTM;
|
||||||
|
nodeSet.addNode(hereNode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Node.TEXT_NODE : {
|
||||||
|
// returns a node-set containing the parent element of the
|
||||||
|
// text node that directly bears the XPath expression
|
||||||
|
hereNode = dtm.getParent(xpathOwnerNodeDTM);
|
||||||
|
nodeSet.addNode(hereNode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** $todo$ Do I have to do this detach() call? */
|
||||||
|
nodeSet.detach();
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Document getOwnerDocument(Node node) {
|
||||||
|
if (node.getNodeType() == Node.DOCUMENT_NODE) {
|
||||||
|
return (Document)node;
|
||||||
|
}
|
||||||
|
return node.getOwnerDocument();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void fixupVariables(java.util.Vector vars, int globalsSize) { }
|
||||||
|
}
|
@ -7,3 +7,6 @@ lib.dirs = /javax/xml/jaxp/libs
|
|||||||
# Tests that must run in othervm mode
|
# Tests that must run in othervm mode
|
||||||
othervm.dirs= /javax/xml/jaxp/functional
|
othervm.dirs= /javax/xml/jaxp/functional
|
||||||
|
|
||||||
|
# Declare module dependency
|
||||||
|
modules=java.xml
|
||||||
|
|
||||||
|
@ -23,28 +23,32 @@
|
|||||||
|
|
||||||
package javax.xml.parsers.ptests;
|
package javax.xml.parsers.ptests;
|
||||||
|
|
||||||
|
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
|
||||||
|
import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
|
||||||
|
import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
|
||||||
|
import static jaxp.library.JAXPTestUtilities.USER_DIR;
|
||||||
|
import static jaxp.library.JAXPTestUtilities.compareWithGold;
|
||||||
|
import static jaxp.library.JAXPTestUtilities.filenameToURL;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
import static org.testng.Assert.assertNull;
|
import static org.testng.Assert.assertNull;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
|
import java.io.Closeable;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FilePermission;
|
import java.io.FilePermission;
|
||||||
import java.io.FileReader;
|
import java.io.FileReader;
|
||||||
|
|
||||||
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
|
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.FactoryConfigurationError;
|
import javax.xml.parsers.FactoryConfigurationError;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
import javax.xml.parsers.SAXParser;
|
import javax.xml.parsers.SAXParser;
|
||||||
import javax.xml.parsers.SAXParserFactory;
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
|
||||||
import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR;
|
|
||||||
import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR;
|
|
||||||
|
|
||||||
import javax.xml.transform.Transformer;
|
import javax.xml.transform.Transformer;
|
||||||
import javax.xml.transform.TransformerFactory;
|
import javax.xml.transform.TransformerFactory;
|
||||||
import javax.xml.transform.dom.DOMSource;
|
import javax.xml.transform.dom.DOMSource;
|
||||||
@ -52,10 +56,6 @@ import javax.xml.transform.sax.SAXResult;
|
|||||||
|
|
||||||
import jaxp.library.JAXPDataProvider;
|
import jaxp.library.JAXPDataProvider;
|
||||||
import jaxp.library.JAXPFileBaseTest;
|
import jaxp.library.JAXPFileBaseTest;
|
||||||
import static jaxp.library.JAXPTestUtilities.USER_DIR;
|
|
||||||
import static jaxp.library.JAXPTestUtilities.compareWithGold;
|
|
||||||
import static org.testng.Assert.assertFalse;
|
|
||||||
import static org.testng.Assert.assertTrue;
|
|
||||||
|
|
||||||
import org.testng.annotations.DataProvider;
|
import org.testng.annotations.DataProvider;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
@ -67,6 +67,7 @@ import org.xml.sax.SAXException;
|
|||||||
import org.xml.sax.helpers.DefaultHandler;
|
import org.xml.sax.helpers.DefaultHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @bug 8080907
|
||||||
* This checks the methods of DocumentBuilderFactoryImpl.
|
* This checks the methods of DocumentBuilderFactoryImpl.
|
||||||
*/
|
*/
|
||||||
public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
|
public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
|
||||||
@ -134,28 +135,11 @@ public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
|
|||||||
assertFalse(eh.isErrorOccured());
|
assertFalse(eh.isErrorOccured());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@DataProvider(name = "schema-source")
|
||||||
* Test the default functionality of schema support method. In
|
public Object[][] getSchemaSource() throws FileNotFoundException {
|
||||||
* this case the schema source property is set.
|
return new Object[][] {
|
||||||
* @throws Exception If any errors occur.
|
{ new FileInputStream(new File(XML_DIR, "test.xsd")) },
|
||||||
*/
|
{ new InputSource(filenameToURL(XML_DIR + "test.xsd")) } };
|
||||||
@Test
|
|
||||||
public void testCheckSchemaSupport2() throws Exception {
|
|
||||||
try (FileInputStream fis = new FileInputStream(new File(
|
|
||||||
XML_DIR, "test.xsd"))) {
|
|
||||||
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
|
||||||
dbf.setValidating(true);
|
|
||||||
dbf.setNamespaceAware(true);
|
|
||||||
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
|
|
||||||
W3C_XML_SCHEMA_NS_URI);
|
|
||||||
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource",
|
|
||||||
new InputSource(fis));
|
|
||||||
MyErrorHandler eh = MyErrorHandler.newInstance();
|
|
||||||
DocumentBuilder db = dbf.newDocumentBuilder();
|
|
||||||
db.setErrorHandler(eh);
|
|
||||||
db.parse(new File(XML_DIR, "test1.xml"));
|
|
||||||
assertFalse(eh.isErrorOccured());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,22 +147,50 @@ public class DocumentBuilderFactoryTest extends JAXPFileBaseTest {
|
|||||||
* this case the schema source property is set.
|
* this case the schema source property is set.
|
||||||
* @throws Exception If any errors occur.
|
* @throws Exception If any errors occur.
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test(dataProvider = "schema-source")
|
||||||
public void testCheckSchemaSupport3() throws Exception {
|
public void testCheckSchemaSupport2(Object schemaSource) throws Exception {
|
||||||
try (FileInputStream fis = new FileInputStream(new File(
|
try {
|
||||||
XML_DIR, "test.xsd"))) {
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
||||||
|
dbf.setValidating(true);
|
||||||
|
dbf.setNamespaceAware(true);
|
||||||
|
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
|
||||||
|
W3C_XML_SCHEMA_NS_URI);
|
||||||
|
dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource);
|
||||||
|
MyErrorHandler eh = MyErrorHandler.newInstance();
|
||||||
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
||||||
|
db.setErrorHandler(eh);
|
||||||
|
db.parse(new File(XML_DIR, "test1.xml"));
|
||||||
|
assertFalse(eh.isErrorOccured());
|
||||||
|
} finally {
|
||||||
|
if (schemaSource instanceof Closeable) {
|
||||||
|
((Closeable) schemaSource).close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test the default functionality of schema support method. In
|
||||||
|
* this case the schema source property is set.
|
||||||
|
* @throws Exception If any errors occur.
|
||||||
|
*/
|
||||||
|
@Test(dataProvider = "schema-source")
|
||||||
|
public void testCheckSchemaSupport3(Object schemaSource) throws Exception {
|
||||||
|
try {
|
||||||
SAXParserFactory spf = SAXParserFactory.newInstance();
|
SAXParserFactory spf = SAXParserFactory.newInstance();
|
||||||
spf.setNamespaceAware(true);
|
|
||||||
spf.setValidating(true);
|
spf.setValidating(true);
|
||||||
spf.setNamespaceAware(true);
|
spf.setNamespaceAware(true);
|
||||||
SAXParser sp = spf.newSAXParser();
|
SAXParser sp = spf.newSAXParser();
|
||||||
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
|
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
|
||||||
W3C_XML_SCHEMA_NS_URI);
|
W3C_XML_SCHEMA_NS_URI);
|
||||||
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
|
sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource);
|
||||||
new InputSource(fis));
|
|
||||||
DefaultHandler dh = new DefaultHandler();
|
DefaultHandler dh = new DefaultHandler();
|
||||||
// Not expect any unrecoverable error here.
|
// Not expect any unrecoverable error here.
|
||||||
sp.parse(new File(XML_DIR, "test1.xml"), dh);
|
sp.parse(new File(XML_DIR, "test1.xml"), dh);
|
||||||
|
} finally {
|
||||||
|
if (schemaSource instanceof Closeable) {
|
||||||
|
((Closeable) schemaSource).close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ import static javax.xml.validation.ptests.ValidationTestConst.XML_DIR;
|
|||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
import static org.testng.Assert.assertNull;
|
import static org.testng.Assert.assertNull;
|
||||||
import static org.testng.Assert.assertSame;
|
import static org.testng.Assert.assertSame;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -39,9 +40,12 @@ import java.nio.file.Paths;
|
|||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.stream.XMLInputFactory;
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
import javax.xml.transform.Source;
|
import javax.xml.transform.Source;
|
||||||
import javax.xml.transform.dom.DOMSource;
|
import javax.xml.transform.dom.DOMSource;
|
||||||
import javax.xml.transform.sax.SAXSource;
|
import javax.xml.transform.sax.SAXSource;
|
||||||
|
import javax.xml.transform.stax.StAXSource;
|
||||||
import javax.xml.transform.stream.StreamSource;
|
import javax.xml.transform.stream.StreamSource;
|
||||||
import javax.xml.validation.Schema;
|
import javax.xml.validation.Schema;
|
||||||
import javax.xml.validation.SchemaFactory;
|
import javax.xml.validation.SchemaFactory;
|
||||||
@ -60,6 +64,7 @@ import org.xml.sax.SAXNotSupportedException;
|
|||||||
import org.xml.sax.SAXParseException;
|
import org.xml.sax.SAXParseException;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* @bug 8080907
|
||||||
* @summary Class containing the test cases for SchemaFactory
|
* @summary Class containing the test cases for SchemaFactory
|
||||||
*/
|
*/
|
||||||
@Test(singleThreaded = true)
|
@Test(singleThreaded = true)
|
||||||
@ -68,9 +73,10 @@ public class SchemaFactoryTest {
|
|||||||
@BeforeClass
|
@BeforeClass
|
||||||
public void setup() throws SAXException, IOException, ParserConfigurationException {
|
public void setup() throws SAXException, IOException, ParserConfigurationException {
|
||||||
sf = newSchemaFactory();
|
sf = newSchemaFactory();
|
||||||
|
|
||||||
assertNotNull(sf);
|
assertNotNull(sf);
|
||||||
|
|
||||||
|
ifac = XMLInputFactory.newInstance();
|
||||||
|
|
||||||
xsd1 = Files.readAllBytes(Paths.get(XML_DIR + "test.xsd"));
|
xsd1 = Files.readAllBytes(Paths.get(XML_DIR + "test.xsd"));
|
||||||
xsd2 = Files.readAllBytes(Paths.get(XML_DIR + "test1.xsd"));
|
xsd2 = Files.readAllBytes(Paths.get(XML_DIR + "test1.xsd"));
|
||||||
|
|
||||||
@ -152,11 +158,13 @@ public class SchemaFactoryTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DataProvider(name = "valid-source")
|
@DataProvider(name = "valid-source")
|
||||||
public Object[][] getValidSource() {
|
public Object[][] getValidSource() throws XMLStreamException {
|
||||||
return new Object[][] {
|
return new Object[][] {
|
||||||
{ streamSource(xsd1) },
|
{ streamSource(xsd1) },
|
||||||
{ saxSource(xsd1) },
|
{ saxSource(xsd1) },
|
||||||
{ domSource(xsdDoc1) } };
|
{ domSource(xsdDoc1) },
|
||||||
|
{ staxStreamSource(xsd1) },
|
||||||
|
{ staxEventSource(xsd1) } };
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -299,6 +307,34 @@ public class SchemaFactoryTest {
|
|||||||
sf.setFeature(null, true);
|
sf.setFeature(null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DataProvider(name = "source-feature")
|
||||||
|
public Object[][] getSourceFeature() {
|
||||||
|
return new Object[][] {
|
||||||
|
{ StreamSource.FEATURE },
|
||||||
|
{ SAXSource.FEATURE },
|
||||||
|
{ DOMSource.FEATURE },
|
||||||
|
{ DOMSource.FEATURE } };
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return true for each of the JAXP Source features to indicate that this
|
||||||
|
* SchemaFactory supports all of the built-in JAXP Source types.
|
||||||
|
*/
|
||||||
|
@Test(dataProvider = "source-feature")
|
||||||
|
public void testSourceFeatureGet(String sourceFeature) throws Exception {
|
||||||
|
assertTrue(newSchemaFactory().getFeature(sourceFeature));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JAXP Source features are read-only because this SchemaFactory always
|
||||||
|
* supports all JAXP Source types.
|
||||||
|
*/
|
||||||
|
@Test(dataProvider = "source-feature", expectedExceptions = SAXNotSupportedException.class)
|
||||||
|
public void testSourceFeatureSet(String sourceFeature) throws Exception {
|
||||||
|
newSchemaFactory().setFeature(sourceFeature, false);
|
||||||
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||||
public void testInvalidSchemaLanguage() {
|
public void testInvalidSchemaLanguage() {
|
||||||
final String INVALID_SCHEMA_LANGUAGE = "http://relaxng.org/ns/structure/1.0";
|
final String INVALID_SCHEMA_LANGUAGE = "http://relaxng.org/ns/structure/1.0";
|
||||||
@ -337,6 +373,15 @@ public class SchemaFactoryTest {
|
|||||||
return new DOMSource(xsdDoc);
|
return new DOMSource(xsdDoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Source staxStreamSource(byte[] xsd) throws XMLStreamException {
|
||||||
|
return new StAXSource(ifac.createXMLStreamReader(newInputStream(xsd)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Source staxEventSource(byte[] xsd) throws XMLStreamException {
|
||||||
|
return new StAXSource(ifac.createXMLEventReader(newInputStream(xsd)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private SchemaFactory newSchemaFactory() {
|
private SchemaFactory newSchemaFactory() {
|
||||||
return SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
|
return SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI);
|
||||||
}
|
}
|
||||||
@ -346,6 +391,7 @@ public class SchemaFactoryTest {
|
|||||||
private static final String SCHEMA_FACTORY_CLASSNAME = "com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory";
|
private static final String SCHEMA_FACTORY_CLASSNAME = "com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory";
|
||||||
|
|
||||||
private SchemaFactory sf;
|
private SchemaFactory sf;
|
||||||
|
private XMLInputFactory ifac;
|
||||||
private byte[] xsd1;
|
private byte[] xsd1;
|
||||||
private byte[] xsd2;
|
private byte[] xsd2;
|
||||||
private Document xsdDoc1;
|
private Document xsdDoc1;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
# jaxp test uses TestNG
|
# jaxp test uses TestNG
|
||||||
TestNG.dirs = .
|
TestNG.dirs = .
|
||||||
|
|
||||||
|
# Declare module dependency
|
||||||
|
modules=java.xml
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -23,37 +23,47 @@
|
|||||||
|
|
||||||
package javax.xml.parsers.xinclude;
|
package javax.xml.parsers.xinclude;
|
||||||
|
|
||||||
|
import static java.lang.System.lineSeparator;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.StringWriter;
|
import java.io.StringWriter;
|
||||||
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
|
||||||
import javax.xml.transform.OutputKeys;
|
import javax.xml.transform.OutputKeys;
|
||||||
import javax.xml.transform.Transformer;
|
import javax.xml.transform.Transformer;
|
||||||
import javax.xml.transform.TransformerConfigurationException;
|
|
||||||
import javax.xml.transform.TransformerException;
|
|
||||||
import javax.xml.transform.TransformerFactory;
|
import javax.xml.transform.TransformerFactory;
|
||||||
import javax.xml.transform.dom.DOMSource;
|
import javax.xml.transform.dom.DOMSource;
|
||||||
import javax.xml.transform.stream.StreamResult;
|
import javax.xml.transform.stream.StreamResult;
|
||||||
|
|
||||||
import org.testng.Assert;
|
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
import org.xml.sax.SAXException;
|
import org.w3c.dom.NodeList;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* @bug 6794483
|
* @bug 6794483 8080908
|
||||||
* @summary Test JAXP parser can parse xml file using <xi:include> to include another xml, which has an empty element.
|
* @summary Test JAXP parser can resolve the included content properly if the
|
||||||
|
* included xml contains an empty tag that ends with "/>", refer to XERCESJ-1134.
|
||||||
*/
|
*/
|
||||||
public class Bug6794483Test {
|
public class Bug6794483Test {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public final void test() {
|
public final void test() throws Exception {
|
||||||
String xml = getClass().getResource("test1.xml").getPath();
|
Document doc = parseXmlFile(getClass().getResource("test1.xml").getPath());
|
||||||
Document doc = parseXmlFile(xml);
|
|
||||||
|
|
||||||
|
// check node4
|
||||||
|
NodeList nodeList = doc.getElementsByTagName("node4");
|
||||||
|
assertEquals(nodeList.getLength(), 1);
|
||||||
|
assertEquals(nodeList.item(0).getTextContent(), "Node4 Value", "The data of node4 is missed in parsing: " + lineSeparator() + printXmlDoc(doc));
|
||||||
|
|
||||||
|
// check node6
|
||||||
|
nodeList = doc.getElementsByTagName("node6");
|
||||||
|
assertEquals(nodeList.getLength(), 1);
|
||||||
|
assertEquals(nodeList.item(0).getTextContent(), "Node6 Value", "The data of node6 is missed in parsing: " + lineSeparator() + printXmlDoc(doc));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String printXmlDoc(Document doc) throws Exception {
|
||||||
StringWriter sw = new StringWriter();
|
StringWriter sw = new StringWriter();
|
||||||
StreamResult result = new StreamResult(sw);
|
StreamResult result = new StreamResult(sw);
|
||||||
|
|
||||||
@ -61,27 +71,16 @@ public class Bug6794483Test {
|
|||||||
transformerFact.setAttribute("indent-number", new Integer(4));
|
transformerFact.setAttribute("indent-number", new Integer(4));
|
||||||
Transformer transformer;
|
Transformer transformer;
|
||||||
|
|
||||||
try {
|
transformer = transformerFact.newTransformer();
|
||||||
transformer = transformerFact.newTransformer();
|
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
||||||
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
|
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
|
||||||
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
|
transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
|
||||||
transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
|
|
||||||
|
|
||||||
// "true" indicate Append content If file exist in system
|
|
||||||
transformer.transform(new DOMSource(doc), result);
|
|
||||||
System.out.println("test" + sw);
|
|
||||||
|
|
||||||
} catch (TransformerConfigurationException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
Assert.fail("unexpected TransformerConfigurationException");
|
|
||||||
} catch (TransformerException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
Assert.fail("unexpected TransformerException");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
transformer.transform(new DOMSource(doc), result);
|
||||||
|
return sw.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Document parseXmlFile(String fileName) {
|
public Document parseXmlFile(String fileName) throws Exception {
|
||||||
System.out.println("Parsing XML file... " + fileName);
|
System.out.println("Parsing XML file... " + fileName);
|
||||||
DocumentBuilder docBuilder = null;
|
DocumentBuilder docBuilder = null;
|
||||||
Document doc = null;
|
Document doc = null;
|
||||||
@ -92,20 +91,10 @@ public class Bug6794483Test {
|
|||||||
docBuilderFactory.setNamespaceAware(true);
|
docBuilderFactory.setNamespaceAware(true);
|
||||||
docBuilderFactory.setExpandEntityReferences(true);
|
docBuilderFactory.setExpandEntityReferences(true);
|
||||||
|
|
||||||
try {
|
docBuilder = docBuilderFactory.newDocumentBuilder();
|
||||||
docBuilder = docBuilderFactory.newDocumentBuilder();
|
|
||||||
} catch (ParserConfigurationException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
File sourceFile = new File(fileName);
|
File sourceFile = new File(fileName);
|
||||||
try {
|
doc = docBuilder.parse(sourceFile);
|
||||||
doc = docBuilder.parse(sourceFile);
|
|
||||||
} catch (SAXException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
System.out.println("XML file parsed");
|
System.out.println("XML file parsed");
|
||||||
return doc;
|
return doc;
|
||||||
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
package javax.xml.validation;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @bug 8080907
|
||||||
|
* @summary Test processContents attribute of any element
|
||||||
|
*/
|
||||||
|
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
|
||||||
|
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
|
||||||
|
import javax.xml.transform.stream.StreamSource;
|
||||||
|
|
||||||
|
import org.testng.annotations.BeforeClass;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
import org.xml.sax.SAXParseException;
|
||||||
|
|
||||||
|
public class AnyElementTest {
|
||||||
|
@BeforeClass
|
||||||
|
public void setup() throws URISyntaxException, SAXException {
|
||||||
|
validator = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI).newSchema(new StreamSource(getUri("ProcessContents.xsd"))).newValidator();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* processContents attribute - Specifies how the XML processor should handle
|
||||||
|
* validation against the elements specified by this any element. Can be set
|
||||||
|
* to one of the following:
|
||||||
|
* strict - the XML processor must obtain the schema for the required
|
||||||
|
* namespaces and validate the elements (this is default)
|
||||||
|
* lax - same as strict, but if the schema cannot be obtained, no errors
|
||||||
|
* will occur
|
||||||
|
* skip - The XML processor does not attempt to validate any elements from
|
||||||
|
* the specified namespaces
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testProcessContents() throws Exception {
|
||||||
|
validator.validate(new StreamSource(getUri("ProcessContents-ok.xml")));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When processContents="lax", validation will be performed when the element
|
||||||
|
* is declared in the schema.
|
||||||
|
*/
|
||||||
|
@Test(expectedExceptions = SAXParseException.class)
|
||||||
|
public void testProcessContentsLax() throws Exception {
|
||||||
|
validator.validate(new StreamSource(getUri("ProcessContents-lax-error.xml")));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the URI of the file, which is in the same path as this class
|
||||||
|
*/
|
||||||
|
private String getUri(String fileName) throws URISyntaxException {
|
||||||
|
return this.getClass().getResource(fileName).toURI().toASCIIString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Validator validator;
|
||||||
|
}
|
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<my_lax>
|
||||||
|
<my_int>25.5</my_int>
|
||||||
|
</my_lax>
|
@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<my_strict>
|
||||||
|
<my_int>255</my_int>
|
||||||
|
<my_skip>
|
||||||
|
<my_int>2.55</my_int>
|
||||||
|
<un_define/>
|
||||||
|
<my_lax>
|
||||||
|
<my_int>25.5</my_int>
|
||||||
|
</my_lax>
|
||||||
|
<my_strict>
|
||||||
|
<un_define>TTT</un_define>
|
||||||
|
</my_strict>
|
||||||
|
</my_skip>
|
||||||
|
<my_lax>
|
||||||
|
<my_int>2555</my_int>
|
||||||
|
<un_define>TTT</un_define>
|
||||||
|
<my_strict>
|
||||||
|
<my_int>20</my_int>
|
||||||
|
</my_strict>
|
||||||
|
</my_lax>
|
||||||
|
</my_strict>
|
@ -0,0 +1,34 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||||
|
|
||||||
|
<xs:element name="my_lax">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:any processContents="lax" maxOccurs="unbounded"/>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="my_skip">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:any processContents="skip" maxOccurs="unbounded"/>
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="my_strict">
|
||||||
|
<xs:complexType>
|
||||||
|
<xs:sequence>
|
||||||
|
<xs:any maxOccurs="unbounded"/> <!-- by default, processContents="strict" -->
|
||||||
|
</xs:sequence>
|
||||||
|
</xs:complexType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
<xs:element name="my_int">
|
||||||
|
<xs:simpleType>
|
||||||
|
<xs:restriction base="xs:int"/>
|
||||||
|
</xs:simpleType>
|
||||||
|
</xs:element>
|
||||||
|
|
||||||
|
</xs:schema>
|
@ -44,6 +44,7 @@ import org.xml.sax.SAXException;
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* @bug 6439439 8080906
|
||||||
* @summary Test LSSerializer.
|
* @summary Test LSSerializer.
|
||||||
*/
|
*/
|
||||||
public class LSSerializerTest {
|
public class LSSerializerTest {
|
||||||
@ -98,6 +99,17 @@ public class LSSerializerTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @bug 8080906
|
||||||
|
* It will fail in a Jigsaw build until JDK-8080266 is fixed.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testDefaultLSSerializer() throws Exception {
|
||||||
|
DOMImplementationLS domImpl = (DOMImplementationLS) DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation();
|
||||||
|
LSSerializer lsSerializer = domImpl.createLSSerializer();
|
||||||
|
Assert.assertTrue(lsSerializer.getClass().getName().endsWith("dom3.LSSerializerImpl"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDOMErrorHandler() {
|
public void testDOMErrorHandler() {
|
||||||
|
|
||||||
|
@ -313,3 +313,5 @@ df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64
|
|||||||
45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65
|
45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65
|
||||||
1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66
|
1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66
|
||||||
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
|
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
|
||||||
|
b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68
|
||||||
|
f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
|
||||||
|
@ -68,6 +68,9 @@ class ContextFinder {
|
|||||||
*/
|
*/
|
||||||
private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
|
private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
|
||||||
|
|
||||||
|
// previous value of JAXBContext.JAXB_CONTEXT_FACTORY, using also this to ensure backwards compatibility
|
||||||
|
private static final String JAXB_CONTEXT_FACTORY_DEPRECATED = "javax.xml.bind.context.factory";
|
||||||
|
|
||||||
private static final Logger logger;
|
private static final Logger logger;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@ -92,6 +95,14 @@ class ContextFinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ServiceLoaderUtil.ExceptionHandler<JAXBException> EXCEPTION_HANDLER =
|
||||||
|
new ServiceLoaderUtil.ExceptionHandler<JAXBException>() {
|
||||||
|
@Override
|
||||||
|
public JAXBException createException(Throwable throwable, String message) {
|
||||||
|
return new JAXBException(message, throwable);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the {@link InvocationTargetException} wraps an exception that shouldn't be wrapped,
|
* If the {@link InvocationTargetException} wraps an exception that shouldn't be wrapped,
|
||||||
* throw the wrapped exception.
|
* throw the wrapped exception.
|
||||||
@ -159,7 +170,10 @@ class ContextFinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static JAXBContext newInstance(String contextPath, Class spFactory, ClassLoader classLoader, Map properties) throws JAXBException {
|
static JAXBContext newInstance(String contextPath,
|
||||||
|
Class spFactory,
|
||||||
|
ClassLoader classLoader,
|
||||||
|
Map properties) throws JAXBException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
/*
|
/*
|
||||||
@ -239,6 +253,7 @@ class ContextFinder {
|
|||||||
Map properties,
|
Map properties,
|
||||||
Class spFactory) throws JAXBException {
|
Class spFactory) throws JAXBException {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
Method m = spFactory.getMethod("createContext", Class[].class, Map.class);
|
Method m = spFactory.getMethod("createContext", Class[].class, Map.class);
|
||||||
Object context = m.invoke(null, classes, properties);
|
Object context = m.invoke(null, classes, properties);
|
||||||
if (!(context instanceof JAXBContext)) {
|
if (!(context instanceof JAXBContext)) {
|
||||||
@ -246,10 +261,10 @@ class ContextFinder {
|
|||||||
throw handleClassCastException(context.getClass(), JAXBContext.class);
|
throw handleClassCastException(context.getClass(), JAXBContext.class);
|
||||||
}
|
}
|
||||||
return (JAXBContext) context;
|
return (JAXBContext) context;
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
throw new JAXBException(e);
|
} catch (NoSuchMethodException | IllegalAccessException e) {
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
throw new JAXBException(e);
|
throw new JAXBException(e);
|
||||||
|
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
handleInvocationTargetException(e);
|
handleInvocationTargetException(e);
|
||||||
|
|
||||||
@ -261,9 +276,10 @@ class ContextFinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties) throws JAXBException {
|
static JAXBContext find(String factoryId,
|
||||||
|
String contextPath,
|
||||||
// TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP?
|
ClassLoader classLoader,
|
||||||
|
Map properties) throws JAXBException {
|
||||||
|
|
||||||
StringTokenizer packages = new StringTokenizer(contextPath, ":");
|
StringTokenizer packages = new StringTokenizer(contextPath, ":");
|
||||||
if (!packages.hasMoreTokens()) {
|
if (!packages.hasMoreTokens()) {
|
||||||
@ -275,63 +291,85 @@ class ContextFinder {
|
|||||||
logger.fine("Searching jaxb.properties");
|
logger.fine("Searching jaxb.properties");
|
||||||
while (packages.hasMoreTokens()) {
|
while (packages.hasMoreTokens()) {
|
||||||
// com.acme.foo - > com/acme/foo/jaxb.properties
|
// com.acme.foo - > com/acme/foo/jaxb.properties
|
||||||
String className = classNameFromPackageProperties(factoryId, classLoader, packages.nextToken(":").replace('.', '/'));
|
String factoryClassName =
|
||||||
if (className != null) return newInstance(contextPath, className, classLoader, properties);
|
classNameFromPackageProperties(
|
||||||
|
classLoader,
|
||||||
|
packages.nextToken(":").replace('.', '/'),
|
||||||
|
factoryId,
|
||||||
|
JAXB_CONTEXT_FACTORY_DEPRECATED);
|
||||||
|
|
||||||
|
if (factoryClassName != null) {
|
||||||
|
return newInstance(contextPath, factoryClassName, classLoader, properties);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String factoryName = classNameFromSystemProperties();
|
String factoryName = classNameFromSystemProperties();
|
||||||
if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
|
if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
|
||||||
|
|
||||||
Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
|
JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader(
|
||||||
|
JAXBContextFactory.class, logger, EXCEPTION_HANDLER);
|
||||||
|
|
||||||
|
if (obj != null) return obj.createContext(contextPath, classLoader, properties);
|
||||||
|
|
||||||
|
// to ensure backwards compatibility
|
||||||
|
factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader);
|
||||||
|
if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
|
||||||
|
|
||||||
|
Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader(
|
||||||
|
"javax.xml.bind.JAXBContext", logger);
|
||||||
|
|
||||||
if (ctxFactory != null) {
|
if (ctxFactory != null) {
|
||||||
return newInstance(contextPath, ctxFactory, classLoader, properties);
|
return newInstance(contextPath, ctxFactory, classLoader, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: SPEC change required! This is supposed to be!
|
|
||||||
// JAXBContext obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER);
|
|
||||||
// if (obj != null) return obj;
|
|
||||||
|
|
||||||
// TODO: Deprecated - SPEC change required!
|
|
||||||
factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader);
|
|
||||||
if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties);
|
|
||||||
|
|
||||||
// else no provider found
|
// else no provider found
|
||||||
logger.fine("Trying to create the platform default provider");
|
logger.fine("Trying to create the platform default provider");
|
||||||
return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties);
|
return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
static JAXBContext find(Class[] classes, Map properties) throws JAXBException {
|
static JAXBContext find(Class<?>[] classes, Map<String, ?> properties) throws JAXBException {
|
||||||
|
|
||||||
// search for jaxb.properties in the class loader of each class first
|
// search for jaxb.properties in the class loader of each class first
|
||||||
logger.fine("Searching jaxb.properties");
|
logger.fine("Searching jaxb.properties");
|
||||||
for (final Class c : classes) {
|
for (final Class c : classes) {
|
||||||
// this classloader is used only to load jaxb.properties, so doing this should be safe.
|
// this classloader is used only to load jaxb.properties, so doing this should be safe.
|
||||||
if (c.getPackage() == null) continue; // this is possible for primitives, arrays, and classes that are loaded by poorly implemented ClassLoaders
|
// this is possible for primitives, arrays, and classes that are
|
||||||
|
// loaded by poorly implemented ClassLoaders
|
||||||
|
if (c.getPackage() == null) continue;
|
||||||
|
|
||||||
// TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz
|
// TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz
|
||||||
// classes from the same package might come from different class loades, so it might be a bad idea
|
// classes from the same package might come from different class loades, so it might be a bad idea
|
||||||
// TODO: it's easier to look things up from the class
|
// TODO: it's easier to look things up from the class
|
||||||
// c.getResourceAsStream("jaxb.properties");
|
// c.getResourceAsStream("jaxb.properties");
|
||||||
|
|
||||||
String className = classNameFromPackageProperties(JAXBContext.JAXB_CONTEXT_FACTORY, getClassClassLoader(c), c.getPackage().getName().replace('.', '/'));
|
String factoryClassName =
|
||||||
if (className != null) return newInstance(classes, properties, className);
|
classNameFromPackageProperties(
|
||||||
|
getClassClassLoader(c),
|
||||||
|
c.getPackage().getName().replace('.', '/'),
|
||||||
|
JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED);
|
||||||
|
|
||||||
|
if (factoryClassName != null) return newInstance(classes, properties, factoryClassName);
|
||||||
}
|
}
|
||||||
|
|
||||||
String factoryName = classNameFromSystemProperties();
|
String factoryClassName = classNameFromSystemProperties();
|
||||||
if (factoryName != null) return newInstance(classes, properties, factoryName);
|
if (factoryClassName != null) return newInstance(classes, properties, factoryClassName);
|
||||||
|
|
||||||
Class ctxFactoryClass = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
|
JAXBContextFactory factory =
|
||||||
if (ctxFactoryClass != null) {
|
ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER);
|
||||||
return newInstance(classes, properties, ctxFactoryClass);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: to be removed - deprecated!!! Requires SPEC change!!!
|
if (factory != null) return factory.createContext(classes, properties);
|
||||||
|
|
||||||
|
// to ensure backwards compatibility
|
||||||
String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader());
|
String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader());
|
||||||
if (className != null) return newInstance(classes, properties, className);
|
if (className != null) return newInstance(classes, properties, className);
|
||||||
|
|
||||||
// // TODO: supposed to be:
|
logger.fine("Trying to create the platform default provider");
|
||||||
// obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER);
|
Class ctxFactoryClass =
|
||||||
// if (obj != null) return obj;
|
(Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger);
|
||||||
|
|
||||||
|
if (ctxFactoryClass != null) {
|
||||||
|
return newInstance(classes, properties, ctxFactoryClass);
|
||||||
|
}
|
||||||
|
|
||||||
// else no provider found
|
// else no provider found
|
||||||
logger.fine("Trying to create the platform default provider");
|
logger.fine("Trying to create the platform default provider");
|
||||||
@ -339,42 +377,69 @@ class ContextFinder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static String classNameFromPackageProperties(String factoryId, ClassLoader classLoader, String packageName) throws JAXBException {
|
/**
|
||||||
|
* first factoryId should be the preffered one,
|
||||||
|
* more of those can be provided to support backwards compatibility
|
||||||
|
*/
|
||||||
|
private static String classNameFromPackageProperties(ClassLoader classLoader,
|
||||||
|
String packageName,
|
||||||
|
String ... factoryIds) throws JAXBException {
|
||||||
|
|
||||||
String resourceName = packageName + "/jaxb.properties";
|
String resourceName = packageName + "/jaxb.properties";
|
||||||
logger.log(Level.FINE, "Trying to locate {0}", resourceName);
|
logger.log(Level.FINE, "Trying to locate {0}", resourceName);
|
||||||
Properties props = loadJAXBProperties(classLoader, resourceName);
|
Properties props = loadJAXBProperties(classLoader, resourceName);
|
||||||
if (props != null) {
|
if (props != null) {
|
||||||
if (props.containsKey(factoryId)) {
|
for(String factoryId : factoryIds) {
|
||||||
return props.getProperty(factoryId);
|
if (props.containsKey(factoryId)) {
|
||||||
} else {
|
return props.getProperty(factoryId);
|
||||||
throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryId));
|
}
|
||||||
}
|
}
|
||||||
|
throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0]));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String classNameFromSystemProperties() throws JAXBException {
|
private static String classNameFromSystemProperties() throws JAXBException {
|
||||||
logger.log(Level.FINE, "Checking system property {0}", JAXBContext.JAXB_CONTEXT_FACTORY);
|
|
||||||
// search for a system property second (javax.xml.bind.JAXBContext)
|
String factoryClassName = getSystemProperty(JAXBContext.JAXB_CONTEXT_FACTORY);
|
||||||
String factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.JAXB_CONTEXT_FACTORY));
|
if (factoryClassName != null) {
|
||||||
|
return factoryClassName;
|
||||||
|
}
|
||||||
|
// leave this here to assure compatibility
|
||||||
|
factoryClassName = getDeprecatedSystemProperty(JAXB_CONTEXT_FACTORY_DEPRECATED);
|
||||||
|
if (factoryClassName != null) {
|
||||||
|
return factoryClassName;
|
||||||
|
}
|
||||||
|
// leave this here to assure compatibility
|
||||||
|
factoryClassName = getDeprecatedSystemProperty(JAXBContext.class.getName());
|
||||||
if (factoryClassName != null) {
|
if (factoryClassName != null) {
|
||||||
logger.log(Level.FINE, " found {0}", factoryClassName);
|
|
||||||
return factoryClassName;
|
return factoryClassName;
|
||||||
} else { // leave this here to assure compatibility
|
|
||||||
logger.fine(" not found");
|
|
||||||
logger.log(Level.FINE, "Checking system property {0}", JAXBContext.class.getName());
|
|
||||||
factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.class.getName()));
|
|
||||||
if (factoryClassName != null) {
|
|
||||||
logger.log(Level.FINE, " found {0}", factoryClassName);
|
|
||||||
return factoryClassName;
|
|
||||||
} else {
|
|
||||||
logger.fine(" not found");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Properties loadJAXBProperties(ClassLoader classLoader, String propFileName) throws JAXBException {
|
private static String getDeprecatedSystemProperty(String property) {
|
||||||
|
String value = getSystemProperty(property);
|
||||||
|
if (value != null) {
|
||||||
|
logger.log(Level.WARNING, "Using non-standard property: {0}. Property {1} should be used instead.",
|
||||||
|
new Object[] {property, JAXBContext.JAXB_CONTEXT_FACTORY});
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getSystemProperty(String property) {
|
||||||
|
logger.log(Level.FINE, "Checking system property {0}", property);
|
||||||
|
String value = AccessController.doPrivileged(new GetPropertyAction(property));
|
||||||
|
if (value != null) {
|
||||||
|
logger.log(Level.FINE, " found {0}", value);
|
||||||
|
} else {
|
||||||
|
logger.log(Level.FINE, " not found");
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties loadJAXBProperties(ClassLoader classLoader,
|
||||||
|
String propFileName) throws JAXBException {
|
||||||
|
|
||||||
Properties props = null;
|
Properties props = null;
|
||||||
try {
|
try {
|
||||||
@ -480,17 +545,18 @@ class ContextFinder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: to be removed - SPEC change required
|
// ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead.
|
||||||
// ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead.
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
static String firstByServiceLoaderDeprecated(Class spiClass, ClassLoader classLoader) throws JAXBException {
|
static String firstByServiceLoaderDeprecated(Class spiClass,
|
||||||
|
ClassLoader classLoader) throws JAXBException {
|
||||||
|
|
||||||
final String jaxbContextFQCN = spiClass.getName();
|
final String jaxbContextFQCN = spiClass.getName();
|
||||||
|
|
||||||
logger.fine("Searching META-INF/services");
|
logger.fine("Searching META-INF/services");
|
||||||
|
|
||||||
// search META-INF services next
|
// search META-INF services next
|
||||||
BufferedReader r = null;
|
BufferedReader r = null;
|
||||||
final String resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN).toString();
|
final String resource = "META-INF/services/" + jaxbContextFQCN;
|
||||||
try {
|
try {
|
||||||
final InputStream resourceStream =
|
final InputStream resourceStream =
|
||||||
(classLoader == null) ?
|
(classLoader == null) ?
|
||||||
@ -510,9 +576,6 @@ class ContextFinder {
|
|||||||
logger.log(Level.FINE, "Unable to load:{0}", resource);
|
logger.log(Level.FINE, "Unable to load:{0}", resource);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} catch (UnsupportedEncodingException e) {
|
|
||||||
// should never happen
|
|
||||||
throw new JAXBException(e);
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new JAXBException(e);
|
throw new JAXBException(e);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -45,29 +45,20 @@ import java.io.InputStream;
|
|||||||
* specialized forms of the method available:
|
* specialized forms of the method available:
|
||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>{@link #newInstance(String,ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
|
* <li>{@link #newInstance(String, ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
|
||||||
* The JAXBContext instance is initialized from a list of colon
|
* The JAXBContext instance is initialized from a list of colon
|
||||||
* separated Java package names. Each java package contains
|
* separated Java package names. Each java package contains
|
||||||
* JAXB mapped classes, schema-derived classes and/or user annotated
|
* JAXB mapped classes, schema-derived classes and/or user annotated
|
||||||
* classes. Additionally, the java package may contain JAXB package annotations
|
* classes. Additionally, the java package may contain JAXB package annotations
|
||||||
* that must be processed. (see JLS, Section 7.4.1 "Named Packages").
|
* that must be processed. (see JLS, Section 7.4.1 "Named Packages").
|
||||||
* </li>
|
* </li>
|
||||||
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
|
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
|
||||||
* The JAXBContext instance is initialized with class(es)
|
* The JAXBContext instance is initialized with class(es)
|
||||||
* passed as parameter(s) and classes that are statically reachable from
|
* passed as parameter(s) and classes that are statically reachable from
|
||||||
* these class(es). See {@link #newInstance(Class...)} for details.
|
* these class(es). See {@link #newInstance(Class...)} for details.
|
||||||
* </li>
|
* </li>
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p>
|
|
||||||
* <i><B>SPEC REQUIREMENT:</B> the provider must supply an implementation
|
|
||||||
* class containing the following method signatures:</i>
|
|
||||||
*
|
|
||||||
* <pre>{@code
|
|
||||||
* public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Map<String,Object> properties ) throws JAXBException
|
|
||||||
* public static JAXBContext createContext( Class[] classes, Map<String,Object> properties ) throws JAXBException
|
|
||||||
* }</pre>
|
|
||||||
*
|
|
||||||
* <p><i>
|
* <p><i>
|
||||||
* The following JAXB 1.0 requirement is only required for schema to
|
* The following JAXB 1.0 requirement is only required for schema to
|
||||||
* java interface/implementation binding. It does not apply to JAXB annotated
|
* java interface/implementation binding. It does not apply to JAXB annotated
|
||||||
@ -109,11 +100,11 @@ import java.io.InputStream;
|
|||||||
* any of the schemas listed in the <tt>contextPath</tt>. For example:
|
* any of the schemas listed in the <tt>contextPath</tt>. For example:
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
|
* JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
|
||||||
* Unmarshaller u = jc.createUnmarshaller();
|
* Unmarshaller u = jc.createUnmarshaller();
|
||||||
* FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
|
* FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
|
||||||
* BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
|
* BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
|
||||||
* BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
|
* BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
@ -146,7 +137,7 @@ import java.io.InputStream;
|
|||||||
* Section 4.2 <i>Java Package</i> of the specification.
|
* Section 4.2 <i>Java Package</i> of the specification.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* <i><B>SPEC REQUIREMENT:</B> the provider must generate a class in each
|
* <i>The provider must generate a class in each
|
||||||
* package that contains all of the necessary object factory methods for that
|
* package that contains all of the necessary object factory methods for that
|
||||||
* package named ObjectFactory as well as the static
|
* package named ObjectFactory as well as the static
|
||||||
* <tt>newInstance( javaContentInterface )</tt> method</i>
|
* <tt>newInstance( javaContentInterface )</tt> method</i>
|
||||||
@ -214,6 +205,7 @@ import java.io.InputStream;
|
|||||||
* by the following steps.
|
* by the following steps.
|
||||||
*
|
*
|
||||||
* <ol>
|
* <ol>
|
||||||
|
*
|
||||||
* <li>
|
* <li>
|
||||||
* For each package/class explicitly passed in to the {@link #newInstance} method, in the order they are specified,
|
* For each package/class explicitly passed in to the {@link #newInstance} method, in the order they are specified,
|
||||||
* <tt>jaxb.properties</tt> file is looked up in its package, by using the associated classloader —
|
* <tt>jaxb.properties</tt> file is looked up in its package, by using the associated classloader —
|
||||||
@ -223,7 +215,7 @@ import java.io.InputStream;
|
|||||||
* <p>
|
* <p>
|
||||||
* If such a file is discovered, it is {@link Properties#load(InputStream) loaded} as a property file, and
|
* If such a file is discovered, it is {@link Properties#load(InputStream) loaded} as a property file, and
|
||||||
* the value of the {@link #JAXB_CONTEXT_FACTORY} key will be assumed to be the provider factory class.
|
* the value of the {@link #JAXB_CONTEXT_FACTORY} key will be assumed to be the provider factory class.
|
||||||
* This class is then loaded by the associated classloader discussed above.
|
* This class is then loaded by the associated class loader discussed above.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* This phase of the look up allows some packages to force the use of a certain JAXB implementation.
|
* This phase of the look up allows some packages to force the use of a certain JAXB implementation.
|
||||||
@ -234,10 +226,36 @@ import java.io.InputStream;
|
|||||||
* factory class. This phase of the look up enables per-JVM override of the JAXB implementation.
|
* factory class. This phase of the look up enables per-JVM override of the JAXB implementation.
|
||||||
*
|
*
|
||||||
* <li>
|
* <li>
|
||||||
* Look for <tt>/META-INF/services/javax.xml.bind.JAXBContext</tt> file in the associated classloader.
|
* Provider of {@link javax.xml.bind.JAXBContextFactory} is loaded using the service-provider loading
|
||||||
* This file follows the standard service descriptor convention, and if such a file exists, its content
|
* facilities, defined by the {@link java.util.ServiceLoader} class, to attempt
|
||||||
* is assumed to be the provider factory class. This phase of the look up is for automatic discovery.
|
* to locate and load an implementation of the service using the {@linkplain
|
||||||
* It allows users to just put a JAXB implementation in a classpath and use it without any furhter configuration.
|
* java.util.ServiceLoader#load(java.lang.Class) default loading mechanism}: the service-provider loading facility
|
||||||
|
* will use the {@linkplain java.lang.Thread#getContextClassLoader() current thread's context class loader}
|
||||||
|
* to attempt to load the context factory. If the context class loader is null, the
|
||||||
|
* {@linkplain ClassLoader#getSystemClassLoader() system class loader} will be used.
|
||||||
|
* <br>
|
||||||
|
* In case of {@link java.util.ServiceConfigurationError service
|
||||||
|
* configuration error} a {@link javax.xml.bind.JAXBException} will be thrown.
|
||||||
|
* </li>
|
||||||
|
*
|
||||||
|
* <li>
|
||||||
|
* Look for resource {@code /META-INF/services/javax.xml.bind.JAXBContext} using provided class loader.
|
||||||
|
* Methods without class loader parameter use {@code Thread.currentThread().getContextClassLoader()}.
|
||||||
|
* If such a resource exists, its content is assumed to be the provider factory class and must supply
|
||||||
|
* an implementation class containing the following method signatures:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
*
|
||||||
|
* public static JAXBContext createContext(
|
||||||
|
* String contextPath,
|
||||||
|
* ClassLoader classLoader,
|
||||||
|
* Map<String,Object> properties throws JAXBException
|
||||||
|
*
|
||||||
|
* public static JAXBContext createContext(
|
||||||
|
* Class[] classes,
|
||||||
|
* Map<String,Object> properties ) throws JAXBException
|
||||||
|
* </pre>
|
||||||
|
* This configuration method is deprecated.
|
||||||
*
|
*
|
||||||
* <li>
|
* <li>
|
||||||
* Finally, if all the steps above fail, then the rest of the look up is unspecified. That said,
|
* Finally, if all the steps above fail, then the rest of the look up is unspecified. That said,
|
||||||
@ -246,17 +264,30 @@ import java.io.InputStream;
|
|||||||
* </ol>
|
* </ol>
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* Once the provider factory class is discovered, its
|
* Once the provider factory class {@link javax.xml.bind.JAXBContextFactory} is discovered, one of its methods
|
||||||
* <tt>public static JAXBContext createContext(String,ClassLoader,Map)</tt> method
|
* {@link javax.xml.bind.JAXBContextFactory#createContext(String, ClassLoader, java.util.Map)} or
|
||||||
* (see {@link #newInstance(String, ClassLoader, Map)} for the parameter semantics.)
|
* {@link javax.xml.bind.JAXBContextFactory#createContext(Class[], java.util.Map)} is invoked
|
||||||
* or <tt>public static JAXBContext createContet(Class[],Map)</tt> method
|
|
||||||
* (see {@link #newInstance(Class[], Map)} for the parameter semantics) are invoked
|
|
||||||
* to create a {@link JAXBContext}.
|
* to create a {@link JAXBContext}.
|
||||||
*
|
*
|
||||||
* @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li><li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
|
* <p/>
|
||||||
|
*
|
||||||
|
* @apiNote
|
||||||
|
* <p>Service discovery method using file /META-INF/services/javax.xml.bind.JAXBContext (described in step 4)
|
||||||
|
* and leveraging provider's static methods is supported only to allow backwards compatibility, but it is strongly
|
||||||
|
* recommended to migrate to standard ServiceLoader mechanism (described in step 3).
|
||||||
|
*
|
||||||
|
* @implNote
|
||||||
|
* Within the last step, if Glassfish AS environment detected, its specific service loader is used to find factory class.
|
||||||
|
*
|
||||||
|
* @author <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li>
|
||||||
|
* <li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li>
|
||||||
|
* <li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
|
||||||
|
*
|
||||||
* @see Marshaller
|
* @see Marshaller
|
||||||
* @see Unmarshaller
|
* @see Unmarshaller
|
||||||
* @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages" in Java Language Specification</a>
|
* @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages"
|
||||||
|
* in Java Language Specification</a>
|
||||||
|
*
|
||||||
* @since 1.6, JAXB 1.0
|
* @since 1.6, JAXB 1.0
|
||||||
*/
|
*/
|
||||||
public abstract class JAXBContext {
|
public abstract class JAXBContext {
|
||||||
@ -265,9 +296,7 @@ public abstract class JAXBContext {
|
|||||||
* The name of the property that contains the name of the class capable
|
* The name of the property that contains the name of the class capable
|
||||||
* of creating new <tt>JAXBContext</tt> objects.
|
* of creating new <tt>JAXBContext</tt> objects.
|
||||||
*/
|
*/
|
||||||
public static final String JAXB_CONTEXT_FACTORY =
|
public static final String JAXB_CONTEXT_FACTORY = "javax.xml.bind.JAXBContextFactory";
|
||||||
"javax.xml.bind.context.factory";
|
|
||||||
|
|
||||||
|
|
||||||
protected JAXBContext() {
|
protected JAXBContext() {
|
||||||
}
|
}
|
||||||
@ -275,7 +304,7 @@ public abstract class JAXBContext {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* This is a convenience method to invoke the
|
* This is a convenience method to invoke the
|
||||||
@ -300,7 +329,7 @@ public abstract class JAXBContext {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* The client application must supply a context path which is a list of
|
* The client application must supply a context path which is a list of
|
||||||
@ -396,7 +425,7 @@ public abstract class JAXBContext {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* This is mostly the same as {@link JAXBContext#newInstance(String, ClassLoader)},
|
* This is mostly the same as {@link JAXBContext#newInstance(String, ClassLoader)},
|
||||||
@ -425,8 +454,9 @@ public abstract class JAXBContext {
|
|||||||
* </ol>
|
* </ol>
|
||||||
* @since 1.6, JAXB 2.0
|
* @since 1.6, JAXB 2.0
|
||||||
*/
|
*/
|
||||||
public static JAXBContext newInstance( String contextPath, ClassLoader classLoader, Map<String,?> properties )
|
public static JAXBContext newInstance( String contextPath,
|
||||||
throws JAXBException {
|
ClassLoader classLoader,
|
||||||
|
Map<String,?> properties ) throws JAXBException {
|
||||||
|
|
||||||
return ContextFinder.find(
|
return ContextFinder.find(
|
||||||
/* The default property name according to the JAXB spec */
|
/* The default property name according to the JAXB spec */
|
||||||
@ -443,7 +473,7 @@ public abstract class JAXBContext {
|
|||||||
// TODO: resurrect this once we introduce external annotations
|
// TODO: resurrect this once we introduce external annotations
|
||||||
// /**
|
// /**
|
||||||
// * <p>
|
// * <p>
|
||||||
// * Obtain a new instance of a <tt>JAXBContext</tt> class.
|
// * Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
// *
|
// *
|
||||||
// * <p>
|
// * <p>
|
||||||
// * The client application must supply a list of classes that the new
|
// * The client application must supply a list of classes that the new
|
||||||
@ -479,7 +509,7 @@ public abstract class JAXBContext {
|
|||||||
// * spec-defined classes will be returned.
|
// * spec-defined classes will be returned.
|
||||||
// *
|
// *
|
||||||
// * @return
|
// * @return
|
||||||
// * A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
|
// * A new instance of a <tt>JAXBContext</tt>.
|
||||||
// *
|
// *
|
||||||
// * @throws JAXBException
|
// * @throws JAXBException
|
||||||
// * if an error was encountered while creating the
|
// * if an error was encountered while creating the
|
||||||
@ -517,7 +547,7 @@ public abstract class JAXBContext {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* The client application must supply a list of classes that the new
|
* The client application must supply a list of classes that the new
|
||||||
@ -559,7 +589,7 @@ public abstract class JAXBContext {
|
|||||||
* spec-defined classes will be returned.
|
* spec-defined classes will be returned.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
|
* A new instance of a <tt>JAXBContext</tt>.
|
||||||
*
|
*
|
||||||
* @throws JAXBException
|
* @throws JAXBException
|
||||||
* if an error was encountered while creating the
|
* if an error was encountered while creating the
|
||||||
@ -578,7 +608,7 @@ public abstract class JAXBContext {
|
|||||||
*
|
*
|
||||||
* @since 1.6, JAXB 2.0
|
* @since 1.6, JAXB 2.0
|
||||||
*/
|
*/
|
||||||
public static JAXBContext newInstance( Class... classesToBeBound )
|
public static JAXBContext newInstance( Class<?> ... classesToBeBound )
|
||||||
throws JAXBException {
|
throws JAXBException {
|
||||||
|
|
||||||
return newInstance(classesToBeBound,Collections.<String,Object>emptyMap());
|
return newInstance(classesToBeBound,Collections.<String,Object>emptyMap());
|
||||||
@ -586,7 +616,7 @@ public abstract class JAXBContext {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
*
|
*
|
||||||
* <p>
|
* <p>
|
||||||
* An overloading of {@link JAXBContext#newInstance(Class...)}
|
* An overloading of {@link JAXBContext#newInstance(Class...)}
|
||||||
@ -605,7 +635,7 @@ public abstract class JAXBContext {
|
|||||||
* in an empty map.
|
* in an empty map.
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
* A new instance of a <tt>JAXBContext</tt>. Always non-null valid object.
|
* A new instance of a <tt>JAXBContext</tt>.
|
||||||
*
|
*
|
||||||
* @throws JAXBException
|
* @throws JAXBException
|
||||||
* if an error was encountered while creating the
|
* if an error was encountered while creating the
|
||||||
@ -624,7 +654,7 @@ public abstract class JAXBContext {
|
|||||||
*
|
*
|
||||||
* @since 1.6, JAXB 2.0
|
* @since 1.6, JAXB 2.0
|
||||||
*/
|
*/
|
||||||
public static JAXBContext newInstance( Class[] classesToBeBound, Map<String,?> properties )
|
public static JAXBContext newInstance( Class<?>[] classesToBeBound, Map<String,?> properties )
|
||||||
throws JAXBException {
|
throws JAXBException {
|
||||||
|
|
||||||
if (classesToBeBound == null) {
|
if (classesToBeBound == null) {
|
||||||
@ -756,9 +786,9 @@ public abstract class JAXBContext {
|
|||||||
if (System.getSecurityManager() == null) {
|
if (System.getSecurityManager() == null) {
|
||||||
return Thread.currentThread().getContextClassLoader();
|
return Thread.currentThread().getContextClassLoader();
|
||||||
} else {
|
} else {
|
||||||
return (ClassLoader) java.security.AccessController.doPrivileged(
|
return java.security.AccessController.doPrivileged(
|
||||||
new java.security.PrivilegedAction() {
|
new java.security.PrivilegedAction<ClassLoader>() {
|
||||||
public java.lang.Object run() {
|
public ClassLoader run() {
|
||||||
return Thread.currentThread().getContextClassLoader();
|
return Thread.currentThread().getContextClassLoader();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package javax.xml.bind;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Factory that creates new <code>JAXBContext</code> instances.
|
||||||
|
*
|
||||||
|
* JAXBContextFactory can be located using {@link java.util.ServiceLoader#load(Class)}
|
||||||
|
*
|
||||||
|
* @since 1.9, JAXB 2.3
|
||||||
|
*/
|
||||||
|
public interface JAXBContextFactory {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For semantics see {@link javax.xml.bind.JAXBContext#newInstance(Class[], java.util.Map)}
|
||||||
|
*
|
||||||
|
* @param classesToBeBound
|
||||||
|
* list of java classes to be recognized by the new {@link JAXBContext}.
|
||||||
|
* Can be empty, in which case a {@link JAXBContext} that only knows about
|
||||||
|
* spec-defined classes will be returned.
|
||||||
|
* @param properties
|
||||||
|
* provider-specific properties. Can be null, which means the same thing as passing
|
||||||
|
* in an empty map.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* A new instance of a <tt>JAXBContext</tt>.
|
||||||
|
*
|
||||||
|
* @throws JAXBException
|
||||||
|
* if an error was encountered while creating the
|
||||||
|
* <tt>JAXBContext</tt>, such as (but not limited to):
|
||||||
|
* <ol>
|
||||||
|
* <li>Classes use JAXB annotations incorrectly
|
||||||
|
* <li>Classes have colliding annotations (i.e., two classes with the same type name)
|
||||||
|
* <li>The JAXB implementation was unable to locate
|
||||||
|
* provider-specific out-of-band information (such as additional
|
||||||
|
* files generated at the development time.)
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* if the parameter contains {@code null} (i.e., {@code newInstance(null,someMap);})
|
||||||
|
*
|
||||||
|
* @since 1.9, JAXB 2.3
|
||||||
|
*/
|
||||||
|
JAXBContext createContext(Class<?>[] classesToBeBound,
|
||||||
|
Map<String, ?> properties ) throws JAXBException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For semantics see {@link javax.xml.bind.JAXBContext#newInstance(String, ClassLoader, java.util.Map)}
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* The interpretation of properties is up to implementations. Implementations should
|
||||||
|
* throw <tt>JAXBException</tt> if it finds properties that it doesn't understand.
|
||||||
|
*
|
||||||
|
* @param contextPath list of java package names that contain schema derived classes
|
||||||
|
* @param classLoader
|
||||||
|
* This class loader will be used to locate the implementation classes.
|
||||||
|
* @param properties
|
||||||
|
* provider-specific properties. Can be null, which means the same thing as passing
|
||||||
|
* in an empty map.
|
||||||
|
*
|
||||||
|
* @return a new instance of a <tt>JAXBContext</tt>
|
||||||
|
* @throws JAXBException if an error was encountered while creating the
|
||||||
|
* <tt>JAXBContext</tt> such as
|
||||||
|
* <ol>
|
||||||
|
* <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li>
|
||||||
|
* <li>an ambiguity among global elements contained in the contextPath</li>
|
||||||
|
* <li>failure to locate a value for the context factory provider property</li>
|
||||||
|
* <li>mixing schema derived packages from different providers on the same contextPath</li>
|
||||||
|
* </ol>
|
||||||
|
* @since 1.9, JAXB 2.3
|
||||||
|
*/
|
||||||
|
JAXBContext createContext(String contextPath,
|
||||||
|
ClassLoader classLoader,
|
||||||
|
Map<String, ?> properties ) throws JAXBException;
|
||||||
|
|
||||||
|
}
|
@ -25,14 +25,9 @@
|
|||||||
|
|
||||||
package javax.xml.bind;
|
package javax.xml.bind;
|
||||||
|
|
||||||
import java.io.File;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.security.AccessController;
|
|
||||||
import java.security.PrivilegedAction;
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.ServiceLoader;
|
import java.util.ServiceLoader;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
@ -49,27 +44,27 @@ class ServiceLoaderUtil {
|
|||||||
private static final String OSGI_SERVICE_LOADER_CLASS_NAME = "com.sun.org.glassfish.hk2.osgiresourcelocator.ServiceLoader";
|
private static final String OSGI_SERVICE_LOADER_CLASS_NAME = "com.sun.org.glassfish.hk2.osgiresourcelocator.ServiceLoader";
|
||||||
private static final String OSGI_SERVICE_LOADER_METHOD_NAME = "lookupProviderClasses";
|
private static final String OSGI_SERVICE_LOADER_METHOD_NAME = "lookupProviderClasses";
|
||||||
|
|
||||||
static <P> P firstByServiceLoader(Class<P> spiClass, Logger logger) {
|
static <P, T extends Exception> P firstByServiceLoader(Class<P> spiClass,
|
||||||
|
Logger logger,
|
||||||
|
ExceptionHandler<T> handler) throws T {
|
||||||
// service discovery
|
// service discovery
|
||||||
ServiceLoader<P> serviceLoader = ServiceLoader.load(spiClass);
|
try {
|
||||||
for (P impl : serviceLoader) {
|
ServiceLoader<P> serviceLoader = ServiceLoader.load(spiClass);
|
||||||
logger.fine("ServiceProvider loading Facility used; returning object [" + impl.getClass().getName() + "]");
|
|
||||||
return impl;
|
for (P impl : serviceLoader) {
|
||||||
|
logger.fine("ServiceProvider loading Facility used; returning object [" +
|
||||||
|
impl.getClass().getName() + "]");
|
||||||
|
|
||||||
|
return impl;
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
throw handler.createException(t, "Error while searching for service [" + spiClass.getName() + "]");
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isOsgi(Logger logger) {
|
|
||||||
try {
|
|
||||||
Class.forName(OSGI_SERVICE_LOADER_CLASS_NAME);
|
|
||||||
return true;
|
|
||||||
} catch (ClassNotFoundException ignored) {
|
|
||||||
logger.log(Level.FINE, "OSGi classes not found, OSGi not available.", ignored);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) {
|
static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Use reflection to avoid having any dependendcy on ServiceLoader class
|
// Use reflection to avoid having any dependendcy on ServiceLoader class
|
||||||
Class serviceClass = Class.forName(factoryId);
|
Class serviceClass = Class.forName(factoryId);
|
||||||
@ -78,39 +73,22 @@ class ServiceLoaderUtil {
|
|||||||
Iterator iter = ((Iterable) m.invoke(null, serviceClass)).iterator();
|
Iterator iter = ((Iterable) m.invoke(null, serviceClass)).iterator();
|
||||||
if (iter.hasNext()) {
|
if (iter.hasNext()) {
|
||||||
Object next = iter.next();
|
Object next = iter.next();
|
||||||
logger.fine("Found implementation using OSGi facility; returning object [" + next.getClass().getName() + "].");
|
logger.fine("Found implementation using OSGi facility; returning object [" +
|
||||||
|
next.getClass().getName() + "].");
|
||||||
return next;
|
return next;
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
} catch (Exception ignored) {
|
} catch (IllegalAccessException |
|
||||||
|
InvocationTargetException |
|
||||||
|
ClassNotFoundException |
|
||||||
|
NoSuchMethodException ignored) {
|
||||||
|
|
||||||
logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored);
|
logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static String propertyFileLookup(final String configFullPath, final String factoryId) throws IOException {
|
|
||||||
File f = new File(configFullPath);
|
|
||||||
String factoryClassName = null;
|
|
||||||
if (f.exists()) {
|
|
||||||
Properties props = new Properties();
|
|
||||||
FileInputStream stream = null;
|
|
||||||
try {
|
|
||||||
stream = new FileInputStream(f);
|
|
||||||
props.load(stream);
|
|
||||||
factoryClassName = props.getProperty(factoryId);
|
|
||||||
} finally {
|
|
||||||
if (stream != null) {
|
|
||||||
try {
|
|
||||||
stream.close();
|
|
||||||
} catch (IOException ignored) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return factoryClassName;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void checkPackageAccess(String className) {
|
static void checkPackageAccess(String className) {
|
||||||
// make sure that the current thread has an access to the package of the given name.
|
// make sure that the current thread has an access to the package of the given name.
|
||||||
SecurityManager s = System.getSecurityManager();
|
SecurityManager s = System.getSecurityManager();
|
||||||
@ -130,18 +108,12 @@ class ServiceLoaderUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// Returns instance of required class. It checks package access (security)
|
||||||
* Returns instance of required class. It checks package access (security) unless it is defaultClassname. It means if you
|
// unless it is defaultClassname. It means if you are trying to instantiate
|
||||||
* are trying to instantiate default implementation (fallback), pass the class name to both first and second parameter.
|
// default implementation (fallback), pass the class name to both first and second parameter.
|
||||||
*
|
static <T extends Exception> Object newInstance(String className,
|
||||||
* @param className class to be instantiated
|
String defaultImplClassName,
|
||||||
* @param isDefaultClassname says whether default implementation class
|
final ExceptionHandler<T> handler) throws T {
|
||||||
* @param handler exception handler - necessary for wrapping exceptions and logging
|
|
||||||
* @param <T> Type of exception being thrown (necessary to distinguish between Runtime and checked exceptions)
|
|
||||||
* @return instantiated object or throws Runtime/checked exception, depending on ExceptionHandler's type
|
|
||||||
* @throws T
|
|
||||||
*/
|
|
||||||
static <T extends Exception> Object newInstance(String className, String defaultImplClassName, final ExceptionHandler<T> handler) throws T {
|
|
||||||
try {
|
try {
|
||||||
return safeLoadClass(className, defaultImplClassName, contextClassLoader(handler)).newInstance();
|
return safeLoadClass(className, defaultImplClassName, contextClassLoader(handler)).newInstance();
|
||||||
} catch (ClassNotFoundException x) {
|
} catch (ClassNotFoundException x) {
|
||||||
@ -151,7 +123,10 @@ class ServiceLoaderUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Class safeLoadClass(String className, String defaultImplClassName, ClassLoader classLoader) throws ClassNotFoundException {
|
static Class safeLoadClass(String className,
|
||||||
|
String defaultImplClassName,
|
||||||
|
ClassLoader classLoader) throws ClassNotFoundException {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
checkPackageAccess(className);
|
checkPackageAccess(className);
|
||||||
} catch (SecurityException se) {
|
} catch (SecurityException se) {
|
||||||
@ -165,16 +140,6 @@ class ServiceLoaderUtil {
|
|||||||
return nullSafeLoadClass(className, classLoader);
|
return nullSafeLoadClass(className, classLoader);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String getJavaHomeLibConfigPath(String filename) {
|
|
||||||
String javah = AccessController.doPrivileged(new PrivilegedAction<String>() {
|
|
||||||
@Override
|
|
||||||
public String run() {
|
|
||||||
return System.getProperty("java.home");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return javah + File.separator + "lib" + File.separator + filename;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ClassLoader contextClassLoader(ExceptionHandler exceptionHandler) throws Exception {
|
static ClassLoader contextClassLoader(ExceptionHandler exceptionHandler) throws Exception {
|
||||||
try {
|
try {
|
||||||
return Thread.currentThread().getContextClassLoader();
|
return Thread.currentThread().getContextClassLoader();
|
||||||
|
@ -310,3 +310,5 @@ fd3281c400347088b36aeb16273aa679d53a81a4 jdk9-b63
|
|||||||
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
|
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
|
||||||
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
|
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
|
||||||
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
|
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
|
||||||
|
046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
|
||||||
|
551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69
|
||||||
|
@ -54,7 +54,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE, \
|
|||||||
OPTIMIZATION := HIGHEST, \
|
OPTIMIZATION := HIGHEST, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) \
|
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||||
$(BUILD_LIBMLIB_CFLAGS), \
|
$(BUILD_LIBMLIB_CFLAGS), \
|
||||||
DISABLED_WARNINGS_gcc := parentheses, \
|
DISABLED_WARNINGS_gcc := parentheses array-bounds, \
|
||||||
DISABLED_WARNINGS_clang := parentheses, \
|
DISABLED_WARNINGS_clang := parentheses, \
|
||||||
DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \
|
DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \
|
||||||
MAPFILE := $(BUILD_LIBMLIB_IMAGE_MAPFILE), \
|
MAPFILE := $(BUILD_LIBMLIB_IMAGE_MAPFILE), \
|
||||||
@ -491,10 +491,10 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVAJPEG, \
|
|||||||
SRC := $(LIBJAVAJPEG_SRC), \
|
SRC := $(LIBJAVAJPEG_SRC), \
|
||||||
INCLUDE_FILES := $(BUILD_LIBJAVAJPEG_INCLUDE_FILES), \
|
INCLUDE_FILES := $(BUILD_LIBJAVAJPEG_INCLUDE_FILES), \
|
||||||
OPTIMIZATION := HIGHEST, \
|
OPTIMIZATION := HIGHEST, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(addprefix -I, $(LIBJAVAJPEG_SRC)) \
|
CFLAGS := $(CFLAGS_JDKLIB) $(BUILD_LIBJAVAJPEG_HEADERS) \
|
||||||
$(LIBJAVA_HEADER_FLAGS) \
|
$(LIBJAVA_HEADER_FLAGS) \
|
||||||
-I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \
|
-I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \
|
||||||
DISABLED_WARNINGS_gcc := clobbered parentheses, \
|
DISABLED_WARNINGS_gcc := clobbered parentheses array-bounds, \
|
||||||
DISABLED_WARNINGS_clang := logical-op-parentheses, \
|
DISABLED_WARNINGS_clang := logical-op-parentheses, \
|
||||||
DISABLED_WARNINGS_microsoft := 4267, \
|
DISABLED_WARNINGS_microsoft := 4267, \
|
||||||
MAPFILE := $(BUILD_LIBJAVAJPEG_MAPFILE), \
|
MAPFILE := $(BUILD_LIBJAVAJPEG_MAPFILE), \
|
||||||
|
@ -61,7 +61,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBINSTRUMENT, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBINSTRUMENT_SRC), \
|
SRC := $(LIBINSTRUMENT_SRC), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(LIBINSTRUMENT_CFLAGS) $(CFLAGS_WARNINGS_ARE_ERRORS), \
|
CFLAGS := $(LIBINSTRUMENT_CFLAGS), \
|
||||||
CFLAGS_debug := -DJPLIS_LOGGING, \
|
CFLAGS_debug := -DJPLIS_LOGGING, \
|
||||||
CFLAGS_release := -DNO_JPLIS_LOGGING, \
|
CFLAGS_release := -DNO_JPLIS_LOGGING, \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \
|
||||||
|
@ -50,7 +50,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMANAGEMENT, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBMANAGEMENT_SRC), \
|
SRC := $(LIBMANAGEMENT_SRC), \
|
||||||
OPTIMIZATION := $(LIBMANAGEMENT_OPTIMIZATION), \
|
OPTIMIZATION := $(LIBMANAGEMENT_OPTIMIZATION), \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_CFLAGS), \
|
CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_CFLAGS), \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement/mapfile-vers, \
|
||||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -39,7 +39,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBATTACH, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(call FindSrcDirsForLib, jdk.attach, attach), \
|
SRC := $(call FindSrcDirsForLib, jdk.attach, attach), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
|
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||||
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \
|
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \
|
||||||
$(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \
|
$(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \
|
||||||
CFLAGS_windows := /Gy, \
|
CFLAGS_windows := /Gy, \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -31,7 +31,7 @@ BUILD_LIBHPROF_SRC := $(call FindSrcDirsForLib, jdk.hprof.agent, hprof)
|
|||||||
|
|
||||||
BUILD_LIBHPROF_CFLAGS := $(addprefix -I, $(BUILD_LIBHPROF_SRC)) \
|
BUILD_LIBHPROF_CFLAGS := $(addprefix -I, $(BUILD_LIBHPROF_SRC)) \
|
||||||
-I$(JDK_TOPDIR)/src/demo/share/jvmti/java_crw_demo
|
-I$(JDK_TOPDIR)/src/demo/share/jvmti/java_crw_demo
|
||||||
|
|
||||||
BUILD_LIBHPROF_LDFLAGS :=
|
BUILD_LIBHPROF_LDFLAGS :=
|
||||||
|
|
||||||
LIBHPROF_OPTIMIZATION := HIGHEST
|
LIBHPROF_OPTIMIZATION := HIGHEST
|
||||||
@ -46,7 +46,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBHPROF, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(BUILD_LIBHPROF_SRC), \
|
SRC := $(BUILD_LIBHPROF_SRC), \
|
||||||
OPTIMIZATION := $(LIBHPROF_OPTIMIZATION), \
|
OPTIMIZATION := $(LIBHPROF_OPTIMIZATION), \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
|
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||||
$(BUILD_LIBHPROF_CFLAGS), \
|
$(BUILD_LIBHPROF_CFLAGS), \
|
||||||
CFLAGS_debug := -DHPROF_LOGGING, \
|
CFLAGS_debug := -DHPROF_LOGGING, \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libhprof/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libhprof/mapfile-vers, \
|
||||||
@ -75,7 +75,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA_CRW_DEMO, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBJAVA_CRW_DEMO_SRC), \
|
SRC := $(LIBJAVA_CRW_DEMO_SRC), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \
|
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||||
$(addprefix -I, $(LIBJAVA_CRW_DEMO_SRC)), \
|
$(addprefix -I, $(LIBJAVA_CRW_DEMO_SRC)), \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava_crw_demo/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava_crw_demo/mapfile-vers, \
|
||||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -44,7 +44,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBDT_SHMEM_SRC), \
|
SRC := $(LIBDT_SHMEM_SRC), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
|
CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
|
||||||
$(LIBDT_SHMEM_CPPFLAGS), \
|
$(LIBDT_SHMEM_CPPFLAGS), \
|
||||||
LDFLAGS := $(LDFLAGS_JDKLIB), \
|
LDFLAGS := $(LDFLAGS_JDKLIB), \
|
||||||
LDFLAGS_windows := -export:jdwpTransport_OnLoad, \
|
LDFLAGS_windows := -export:jdwpTransport_OnLoad, \
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -41,7 +41,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBDT_SOCKET, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBDT_SOCKET_SRC), \
|
SRC := $(LIBDT_SOCKET_SRC), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \
|
CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \
|
||||||
$(LIBDT_SOCKET_CPPFLAGS), \
|
$(LIBDT_SOCKET_CPPFLAGS), \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libdt_socket/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libdt_socket/mapfile-vers, \
|
||||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||||
@ -77,7 +77,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP, \
|
|||||||
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \
|
||||||
SRC := $(LIBJDWP_SRC), \
|
SRC := $(LIBJDWP_SRC), \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \
|
CFLAGS := $(CFLAGS_JDKLIB) -DJDWP_LOGGING \
|
||||||
$(LIBJDWP_CPPFLAGS) \
|
$(LIBJDWP_CPPFLAGS) \
|
||||||
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent, \
|
-I$(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent, \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjdwp/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjdwp/mapfile-vers, \
|
||||||
|
@ -59,7 +59,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMANAGEMENT_EXT, \
|
|||||||
SRC := $(LIBMANAGEMENT_EXT_SRC), \
|
SRC := $(LIBMANAGEMENT_EXT_SRC), \
|
||||||
LANG := C, \
|
LANG := C, \
|
||||||
OPTIMIZATION := $(LIBMANAGEMENT_EXT_OPTIMIZATION), \
|
OPTIMIZATION := $(LIBMANAGEMENT_EXT_OPTIMIZATION), \
|
||||||
CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_EXT_CFLAGS), \
|
CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_EXT_CFLAGS), \
|
||||||
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement_ext/mapfile-vers, \
|
MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement_ext/mapfile-vers, \
|
||||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user