Merge
This commit is contained in:
commit
50b678d7a0
2
.hgtags
2
.hgtags
@ -380,3 +380,5 @@ a71210c0d9800eb6925b61ecd6198abd554f90ee jdk-9+134
|
||||
e384420383a5b79fa0012ebcb25d8f83cff7f777 jdk-9+135
|
||||
1b4b5d01aa11edf24b6fadbe3d2f3e411e3b02cd jdk-9+136
|
||||
9cb87c88ed851c0575b8ead753ea238ed5b544e9 jdk-9+137
|
||||
d273dfe9a126d3bffe92072547fef2cd1361b0eb jdk-9+138
|
||||
65477538bec32963dc41153d89c4417eb46c45fc jdk-9+139
|
||||
|
@ -380,3 +380,5 @@ be1218f792a450dfb5d4b1f82616b9d95a6a732e jdk-9+133
|
||||
82b94cb5f342319d2cda77f9fa59703ad7fde576 jdk-9+135
|
||||
3ec350f5f32af249b59620d7e37b54bdcd77b233 jdk-9+136
|
||||
d7f519b004254b19e384131d9f0d0e40e31a0fd3 jdk-9+137
|
||||
67c4388142bdf58aec8fefa4475faaa8a5d7380c jdk-9+138
|
||||
7dcf453eacae79ee86a6bcc75fd0b546fc99b48a jdk-9+139
|
||||
|
@ -1,27 +1,27 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Sun at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
is making a combined work based on this library. Thus, the terms
|
||||
and conditions of GPL2 cover the whole combination.
|
||||
|
||||
As a special exception, Sun gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Sun as indicated at
|
||||
As a special exception, Oracle gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Oracle as indicated at
|
||||
http://openjdk.java.net/legal/exception-modules-2007-05-08.html
|
||||
("Designated Exception Modules") to produce an executable,
|
||||
regardless of the license terms of the Designated Exception Modules,
|
||||
and to copy and distribute the resulting executable under GPL2,
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Sun.
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Sun's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Sun
|
||||
could not provide under GPL2 (or that Sun has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -33,6 +33,7 @@ include @SPEC@
|
||||
CC := @BUILD_CC@
|
||||
CXX := @BUILD_CXX@
|
||||
LD := @BUILD_LD@
|
||||
LDCXX := @BUILD_LDCXX@
|
||||
AS := @BUILD_AS@
|
||||
NM := @BUILD_NM@
|
||||
AR := @BUILD_AR@
|
||||
|
@ -687,7 +687,6 @@ XMKMF
|
||||
MSVCP_DLL
|
||||
MSVCR_DLL
|
||||
LIBCXX
|
||||
STATIC_CXX_SETTING
|
||||
FIXPATH_DETACH_FLAG
|
||||
FIXPATH
|
||||
BUILD_GTEST
|
||||
@ -5092,7 +5091,7 @@ VS_SDK_PLATFORM_NAME_2013=
|
||||
#CUSTOM_AUTOCONF_INCLUDE
|
||||
|
||||
# Do not change or remove the following line, it is needed for consistency checks:
|
||||
DATE_WHEN_GENERATED=1474894604
|
||||
DATE_WHEN_GENERATED=1475218974
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
@ -53087,49 +53086,10 @@ fi
|
||||
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||
# Test if -lstdc++ works.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if dynamic link of stdc++ is possible" >&5
|
||||
$as_echo_n "checking if dynamic link of stdc++ is possible... " >&6; }
|
||||
ac_ext=cpp
|
||||
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||
|
||||
OLD_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS -lstdc++"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
return 0;
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
if ac_fn_cxx_try_link "$LINENO"; then :
|
||||
has_dynamic_libstdcxx=yes
|
||||
else
|
||||
has_dynamic_libstdcxx=no
|
||||
fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
CXXFLAGS="$OLD_CXXFLAGS"
|
||||
ac_ext=cpp
|
||||
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
|
||||
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_dynamic_libstdcxx" >&5
|
||||
$as_echo "$has_dynamic_libstdcxx" >&6; }
|
||||
|
||||
# Test if stdc++ can be linked statically.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if static link of stdc++ is possible" >&5
|
||||
$as_echo_n "checking if static link of stdc++ is possible... " >&6; }
|
||||
STATIC_STDCXX_FLAGS="-Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic"
|
||||
STATIC_STDCXX_FLAGS="-static-libstdc++ -static-libgcc"
|
||||
ac_ext=cpp
|
||||
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
@ -53137,9 +53097,7 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex
|
||||
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||
|
||||
OLD_LIBS="$LIBS"
|
||||
OLD_CXX="$CXX"
|
||||
LIBS="$STATIC_STDCXX_FLAGS"
|
||||
CXX="$CC"
|
||||
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||
/* end confdefs.h. */
|
||||
|
||||
@ -53159,7 +53117,6 @@ fi
|
||||
rm -f core conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS="$OLD_LIBS"
|
||||
CXX="$OLD_CXX"
|
||||
ac_ext=cpp
|
||||
ac_cpp='$CXXCPP $CPPFLAGS'
|
||||
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
|
||||
@ -53169,59 +53126,34 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $has_static_libstdcxx" >&5
|
||||
$as_echo "$has_static_libstdcxx" >&6; }
|
||||
|
||||
if test "x$has_static_libstdcxx" = xno && test "x$has_dynamic_libstdcxx" = xno; then
|
||||
as_fn_error $? "Cannot link to stdc++, neither dynamically nor statically!" "$LINENO" 5
|
||||
fi
|
||||
|
||||
if test "x$with_stdc__lib" = xstatic && test "x$has_static_libstdcxx" = xno; then
|
||||
as_fn_error $? "Static linking of libstdc++ was not possible!" "$LINENO" 5
|
||||
fi
|
||||
|
||||
if test "x$with_stdc__lib" = xdynamic && test "x$has_dynamic_libstdcxx" = xno; then
|
||||
as_fn_error $? "Dynamic linking of libstdc++ was not possible!" "$LINENO" 5
|
||||
fi
|
||||
|
||||
# If dynamic was requested, it's available since it would fail above otherwise.
|
||||
# If dynamic wasn't requested, go with static unless it isn't available.
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libstdc++" >&5
|
||||
$as_echo_n "checking how to link with libstdc++... " >&6; }
|
||||
if test "x$with_stdc__lib" = xdynamic || test "x$has_static_libstdcxx" = xno || [[ " $JVM_VARIANTS " =~ " zeroshark " ]] ; then
|
||||
LIBCXX="$LIBCXX -lstdc++"
|
||||
# To help comparisons with old build, put stdc++ first in JVM_LIBS
|
||||
JVM_LIBS="-lstdc++ $JVM_LIBS"
|
||||
# Ideally, we should test stdc++ for the BUILD toolchain separately. For now
|
||||
# just use the same setting as for the TARGET toolchain.
|
||||
OPENJDK_BUILD_JVM_LIBS="-lstdc++ $OPENJDK_BUILD_JVM_LIBS"
|
||||
LDCXX="$CXX"
|
||||
STATIC_CXX_SETTING="STATIC_CXX=false"
|
||||
if test "x$with_stdc__lib" = xdynamic || test "x$has_static_libstdcxx" = xno \
|
||||
|| [[ " $JVM_VARIANTS " =~ " zeroshark " ]] ; then
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic" >&5
|
||||
$as_echo "dynamic" >&6; }
|
||||
else
|
||||
LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS"
|
||||
JVM_LDFLAGS="$JVM_LDFLAGS -static-libgcc"
|
||||
# To help comparisons with old build, put stdc++ first in JVM_LIBS
|
||||
JVM_LIBS="-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic $JVM_LIBS"
|
||||
JVM_LDFLAGS="$JVM_LDFLAGS $STATIC_STDCXX_FLAGS"
|
||||
# Ideally, we should test stdc++ for the BUILD toolchain separately. For now
|
||||
# just use the same setting as for the TARGET toolchain.
|
||||
OPENJDK_BUILD_JVM_LDFLAGS="$OPENJDK_BUILD_JVM_LDFLAGS -static-libgcc"
|
||||
OPENJDK_BUILD_JVM_LIBS="-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic $OPENJDK_BUILD_JVM_LIBS"
|
||||
LDCXX="$CC"
|
||||
STATIC_CXX_SETTING="STATIC_CXX=true"
|
||||
OPENJDK_BUILD_JVM_LDFLAGS="$OPENJDK_BUILD_JVM_LDFLAGS $STATIC_STDCXX_FLAGS"
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5
|
||||
$as_echo "static" >&6; }
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
# libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so)
|
||||
if test "x$TOOLCHAIN_TYPE" = xsolstudio && test "x$LIBCXX" = x; then
|
||||
LIBCXX="${SYSROOT}/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1"
|
||||
fi
|
||||
|
||||
# TODO better (platform agnostic) test
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$LIBCXX" = x && test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||
LIBCXX="-lstdc++"
|
||||
fi
|
||||
|
||||
|
||||
# Setup Windows runtime dlls
|
||||
|
@ -45,84 +45,44 @@ AC_DEFUN_ONCE([LIB_SETUP_STD_LIBS],
|
||||
)
|
||||
|
||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||
# Test if -lstdc++ works.
|
||||
AC_MSG_CHECKING([if dynamic link of stdc++ is possible])
|
||||
AC_LANG_PUSH(C++)
|
||||
OLD_CXXFLAGS="$CXXFLAGS"
|
||||
CXXFLAGS="$CXXFLAGS -lstdc++"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
||||
[has_dynamic_libstdcxx=yes],
|
||||
[has_dynamic_libstdcxx=no])
|
||||
CXXFLAGS="$OLD_CXXFLAGS"
|
||||
AC_LANG_POP(C++)
|
||||
AC_MSG_RESULT([$has_dynamic_libstdcxx])
|
||||
|
||||
# Test if stdc++ can be linked statically.
|
||||
AC_MSG_CHECKING([if static link of stdc++ is possible])
|
||||
STATIC_STDCXX_FLAGS="-Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic"
|
||||
STATIC_STDCXX_FLAGS="-static-libstdc++ -static-libgcc"
|
||||
AC_LANG_PUSH(C++)
|
||||
OLD_LIBS="$LIBS"
|
||||
OLD_CXX="$CXX"
|
||||
LIBS="$STATIC_STDCXX_FLAGS"
|
||||
CXX="$CC"
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
|
||||
[has_static_libstdcxx=yes],
|
||||
[has_static_libstdcxx=no])
|
||||
LIBS="$OLD_LIBS"
|
||||
CXX="$OLD_CXX"
|
||||
AC_LANG_POP(C++)
|
||||
AC_MSG_RESULT([$has_static_libstdcxx])
|
||||
|
||||
if test "x$has_static_libstdcxx" = xno && test "x$has_dynamic_libstdcxx" = xno; then
|
||||
AC_MSG_ERROR([Cannot link to stdc++, neither dynamically nor statically!])
|
||||
fi
|
||||
|
||||
if test "x$with_stdc__lib" = xstatic && test "x$has_static_libstdcxx" = xno; then
|
||||
AC_MSG_ERROR([Static linking of libstdc++ was not possible!])
|
||||
fi
|
||||
|
||||
if test "x$with_stdc__lib" = xdynamic && test "x$has_dynamic_libstdcxx" = xno; then
|
||||
AC_MSG_ERROR([Dynamic linking of libstdc++ was not possible!])
|
||||
fi
|
||||
|
||||
# If dynamic was requested, it's available since it would fail above otherwise.
|
||||
# If dynamic wasn't requested, go with static unless it isn't available.
|
||||
AC_MSG_CHECKING([how to link with libstdc++])
|
||||
if test "x$with_stdc__lib" = xdynamic || test "x$has_static_libstdcxx" = xno || HOTSPOT_CHECK_JVM_VARIANT(zeroshark); then
|
||||
LIBCXX="$LIBCXX -lstdc++"
|
||||
# To help comparisons with old build, put stdc++ first in JVM_LIBS
|
||||
JVM_LIBS="-lstdc++ $JVM_LIBS"
|
||||
# Ideally, we should test stdc++ for the BUILD toolchain separately. For now
|
||||
# just use the same setting as for the TARGET toolchain.
|
||||
OPENJDK_BUILD_JVM_LIBS="-lstdc++ $OPENJDK_BUILD_JVM_LIBS"
|
||||
LDCXX="$CXX"
|
||||
STATIC_CXX_SETTING="STATIC_CXX=false"
|
||||
if test "x$with_stdc__lib" = xdynamic || test "x$has_static_libstdcxx" = xno \
|
||||
|| HOTSPOT_CHECK_JVM_VARIANT(zeroshark); then
|
||||
AC_MSG_RESULT([dynamic])
|
||||
else
|
||||
LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS"
|
||||
JVM_LDFLAGS="$JVM_LDFLAGS -static-libgcc"
|
||||
# To help comparisons with old build, put stdc++ first in JVM_LIBS
|
||||
JVM_LIBS="-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic $JVM_LIBS"
|
||||
JVM_LDFLAGS="$JVM_LDFLAGS $STATIC_STDCXX_FLAGS"
|
||||
# Ideally, we should test stdc++ for the BUILD toolchain separately. For now
|
||||
# just use the same setting as for the TARGET toolchain.
|
||||
OPENJDK_BUILD_JVM_LDFLAGS="$OPENJDK_BUILD_JVM_LDFLAGS -static-libgcc"
|
||||
OPENJDK_BUILD_JVM_LIBS="-Wl,-Bstatic -lstdc++ -Wl,-Bdynamic $OPENJDK_BUILD_JVM_LIBS"
|
||||
LDCXX="$CC"
|
||||
STATIC_CXX_SETTING="STATIC_CXX=true"
|
||||
OPENJDK_BUILD_JVM_LDFLAGS="$OPENJDK_BUILD_JVM_LDFLAGS $STATIC_STDCXX_FLAGS"
|
||||
AC_MSG_RESULT([static])
|
||||
fi
|
||||
fi
|
||||
AC_SUBST(STATIC_CXX_SETTING)
|
||||
|
||||
# libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so)
|
||||
if test "x$TOOLCHAIN_TYPE" = xsolstudio && test "x$LIBCXX" = x; then
|
||||
LIBCXX="${SYSROOT}/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1"
|
||||
fi
|
||||
|
||||
# TODO better (platform agnostic) test
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$LIBCXX" = x && test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||
LIBCXX="-lstdc++"
|
||||
fi
|
||||
AC_SUBST(LIBCXX)
|
||||
|
||||
# Setup Windows runtime dlls
|
||||
|
@ -654,10 +654,10 @@ compare_bin_file() {
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz"
|
||||
elif [ "$NAME" = "jimage.exe" ] \
|
||||
&& [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz"
|
||||
OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.jlink/jimage.diz"
|
||||
elif [ "$NAME" = "javacpl.exe" ] \
|
||||
&& [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
|
||||
OTHER_DIZ_FILE="$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz"
|
||||
OTHER_DIZ_FILE="$OTHER/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
|
||||
elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
|
||||
OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
|
||||
else
|
||||
@ -686,10 +686,10 @@ compare_bin_file() {
|
||||
THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz"
|
||||
elif [ "$NAME" = "jimage.exe" ] \
|
||||
&& [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
|
||||
THIS_DIZ_FILE="$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz"
|
||||
THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.jlink/jimage.diz"
|
||||
elif [ "$NAME" = "javacpl.exe" ] \
|
||||
&& [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
|
||||
THIS_DIZ_FILE="$THIS/support/native/jdk.plugin/javacpl/javacpl.diz"
|
||||
THIS_DIZ_FILE="$THIS/support/modules_cmds/jdk.deploy.controlpanel/javacpl.diz"
|
||||
elif [ -f "${THIS_FILE_BASE}.diz" ]; then
|
||||
THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
|
||||
else
|
||||
|
@ -380,3 +380,5 @@ f7e1d5337c2e550fe553df7a3886bbed80292ecd jdk-9+131
|
||||
094d0db606db976045f594dba47d4593b715cc81 jdk-9+135
|
||||
aa053a3faf266c12b4fd5272da431a3e08e4a3e3 jdk-9+136
|
||||
258cf18fa7fc59359b874f8743b7168dc48baf73 jdk-9+137
|
||||
27bb44be32076861a0951bcefb07a1d92509a4b6 jdk-9+138
|
||||
8c9da7fc5b07c606afd571c7012441b77dda83b2 jdk-9+139
|
||||
|
@ -1,27 +1,27 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Sun at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
is making a combined work based on this library. Thus, the terms
|
||||
and conditions of GPL2 cover the whole combination.
|
||||
|
||||
As a special exception, Sun gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Sun as indicated at
|
||||
As a special exception, Oracle gives you permission to link this
|
||||
OpenJDK Code with certain code licensed by Oracle as indicated at
|
||||
http://openjdk.java.net/legal/exception-modules-2007-05-08.html
|
||||
("Designated Exception Modules") to produce an executable,
|
||||
regardless of the license terms of the Designated Exception Modules,
|
||||
and to copy and distribute the resulting executable under GPL2,
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Sun.
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Sun's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Sun
|
||||
could not provide under GPL2 (or that Sun has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -38,7 +38,7 @@ $(eval $(call SetupJavaCompilation,BUILD_TOOLS_CORBA, \
|
||||
SRC := $(CORBA_TOPDIR)/make/src/classes, \
|
||||
BIN := $(BUILDTOOLS_OUTPUTDIR)/corba_tools_classes))
|
||||
|
||||
TOOL_LOGUTIL_CMD := $(JAVA) -cp $(BUILDTOOLS_OUTPUTDIR)/corba_tools_classes \
|
||||
TOOL_LOGUTIL_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/corba_tools_classes \
|
||||
build.tools.logutil.MC
|
||||
|
||||
$(eval $(call SetupJavaCompilation,BUILD_IDLJ, \
|
||||
@ -50,7 +50,7 @@ $(eval $(call SetupJavaCompilation,BUILD_IDLJ, \
|
||||
EXCLUDE_FILES := ResourceBundleUtil.java module-info.java))
|
||||
|
||||
# Force the language to english for predictable source code generation.
|
||||
TOOL_IDLJ_CMD := $(JAVA) -cp $(BUILDTOOLS_OUTPUTDIR)/idlj_classes \
|
||||
TOOL_IDLJ_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/idlj_classes \
|
||||
-Duser.language=en com.sun.tools.corba.se.idl.toJavaPortable.Compile
|
||||
|
||||
################################################################################
|
||||
|
@ -541,3 +541,4 @@ b8b694c6b4d2ab0939aed7adaf0eec1ac321a085 jdk-9+134
|
||||
a20da289f646ee44440695b81abc0548330e4ca7 jdk-9+136
|
||||
dfcbf839e299e7e2bba1da69bdb347617ea4c7e8 jdk-9+137
|
||||
fc0956308c7a586267c5dd35dff74f773aa9c3eb jdk-9+138
|
||||
08492e67bf3226784dab3bf9ae967382ddbc1af5 jdk-9+139
|
||||
|
@ -1,9 +1,9 @@
|
||||
|
||||
OPENJDK ASSEMBLY EXCEPTION
|
||||
|
||||
The OpenJDK source code made available by Oracle at openjdk.java.net and
|
||||
openjdk.dev.java.net ("OpenJDK Code") is distributed under the terms of the
|
||||
GNU General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
The OpenJDK source code made available by Oracle America, Inc. (Oracle) at
|
||||
openjdk.java.net ("OpenJDK Code") is distributed under the terms of the GNU
|
||||
General Public License <http://www.gnu.org/copyleft/gpl.html> version 2
|
||||
only ("GPL2"), with the following clarification and special exception.
|
||||
|
||||
Linking this OpenJDK Code statically or dynamically with other code
|
||||
@ -19,9 +19,9 @@ only ("GPL2"), with the following clarification and special exception.
|
||||
provided that the Designated Exception Modules continue to be
|
||||
governed by the licenses under which they were offered by Oracle.
|
||||
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code to
|
||||
build an executable that includes those portions of necessary code that Oracle
|
||||
could not provide under GPL2 (or that Oracle has provided under GPL2 with the
|
||||
Classpath exception). If you modify or add to the OpenJDK code, that new
|
||||
GPL2 code may still be combined with Designated Exception Modules if the
|
||||
new code is made subject to this exception by its copyright holder.
|
||||
As such, it allows licensees and sublicensees of Oracle's GPL2 OpenJDK Code
|
||||
to build an executable that includes those portions of necessary code that
|
||||
Oracle could not provide under GPL2 (or that Oracle has provided under GPL2
|
||||
with the Classpath exception). If you modify or add to the OpenJDK code,
|
||||
that new GPL2 code may still be combined with Designated Exception Modules
|
||||
if the new code is made subject to this exception by its copyright holder.
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -45,10 +45,7 @@ $(VARIANT_TARGETS): variant-%: variant-%-gensrc variant-%-libs
|
||||
jsig:
|
||||
+$(MAKE) -f lib/CompileLibjsig.gmk
|
||||
|
||||
dist: $(VARIANT_TARGETS) jsig
|
||||
+$(MAKE) -f Dist.gmk
|
||||
|
||||
all: dist
|
||||
all: $(VARIANT_TARGETS) jsig
|
||||
|
||||
.PHONY: $(VARIANT_TARGETS) $(VARIANT_GENSRC_TARGETS) $(VARIANT_LIBS_TARGETS) \
|
||||
jsig dist all
|
||||
jsig all
|
||||
|
55
hotspot/make/CopyToExplodedJdk.gmk
Normal file
55
hotspot/make/CopyToExplodedJdk.gmk
Normal file
@ -0,0 +1,55 @@
|
||||
#
|
||||
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. 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.
|
||||
#
|
||||
|
||||
# Copy all built libraries into exploded jdk
|
||||
LIB_TARGETS := $(filter $(LIB_OUTPUTDIR)/%, $(TARGETS))
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS_BIN, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/bin, \
|
||||
FILES := $(filter-out %.lib, $(LIB_TARGETS)), \
|
||||
))
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS_LIB, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter %.lib, $(LIB_TARGETS))))
|
||||
|
||||
TARGETS += $(COPY_LIBS_BIN) $(COPY_LIBS_LIB)
|
||||
else
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBS, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \
|
||||
))
|
||||
$(eval $(call SetupCopyFiles, LINK_LIBS, \
|
||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
|
||||
DEST := $(JDK_OUTPUTDIR)/lib, \
|
||||
FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(LIB_TARGETS)), \
|
||||
MACRO := link-file-relative, \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_LIBS) $(LINK_LIBS)
|
||||
endif
|
@ -1,223 +0,0 @@
|
||||
#
|
||||
# Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
################################################################################
|
||||
# Copy the generated output into well-defined places in the dist directory.
|
||||
|
||||
# This must be the first rule
|
||||
default: all
|
||||
|
||||
include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
|
||||
$(eval $(call IncludeCustomExtension, hotspot, Dist.gmk))
|
||||
|
||||
DIST_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/dist
|
||||
|
||||
# Unfortunately, all platforms have different target subdirs.
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
LIB_SUBDIR := bin
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LIB_SUBDIR := lib
|
||||
else
|
||||
LIB_SUBDIR := lib$(OPENJDK_TARGET_CPU_LIBDIR)
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# Setup make rules to copy a native library and associated data.
|
||||
#
|
||||
# Parameter 1 is the name of the rule. This name is used as variable prefix,
|
||||
# and the targets generated are listed in a variable by that name.
|
||||
#
|
||||
# Remaining parameters are named arguments. These include:
|
||||
# NAME -- The base name of the native library (e.g. 'jvm')
|
||||
# VARIANT -- The variant to copy from
|
||||
# VARIANT_TARGET_DIR -- The variant target sub dir, with trailing slash, optional
|
||||
SetupDistLibFile = $(NamedParamsMacroTemplate)
|
||||
define SetupDistLibFileBody
|
||||
ifneq ($$($1_VARIANT), )
|
||||
$1_SRC_DIR := $$(HOTSPOT_OUTPUTDIR)/variant-$$($1_VARIANT)/lib$$($1_NAME)
|
||||
else
|
||||
$1_SRC_DIR := $$(HOTSPOT_OUTPUTDIR)/lib$$($1_NAME)
|
||||
endif
|
||||
$1_LIB_NAME := $(LIBRARY_PREFIX)$$($1_NAME)
|
||||
$1_TARGET_DIR := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$$($1_VARIANT_TARGET_DIR)
|
||||
|
||||
# Copy the the native library.
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_LIB, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
FILES := $$(wildcard \
|
||||
$$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX)), \
|
||||
))
|
||||
|
||||
TARGETS += $$($1_COPY_LIB)
|
||||
|
||||
# Copy related data (debug symbols, static-build symbols file etc)
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_FILES, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
FILES := $$(wildcard \
|
||||
$$(addprefix $$($1_SRC_DIR)/$$($1_LIB_NAME), \
|
||||
.diz .debuginfo .pdb .map .symbols)), \
|
||||
))
|
||||
|
||||
TARGETS += $$($1_COPY_FILES)
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# Debug symbols on macosx is a directory, not a single file, per library.
|
||||
$1_DSYM_SRC := $$($1_SRC_DIR)/$$($1_LIB_NAME)$(SHARED_LIBRARY_SUFFIX).dSYM)
|
||||
ifneq ($$(wildcard $$($1_DSYM_SRC)), )
|
||||
$$(eval $$(call SetupCopyFiles, $1_COPY_DSYM_DIR, \
|
||||
DEST := $$($1_TARGET_DIR), \
|
||||
SRC := $$($1_SRC_DIR), \
|
||||
FILES := $$(shell $(FIND) $$($1_DSYM_SRC) -type f), \
|
||||
))
|
||||
TARGETS += $$($1_COPY_DSYM_DIR)
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
################################################################################
|
||||
# Copy common files, which are independent on the jvm variant(s) being built.
|
||||
# For files that were generated during the build, we assume all versions of
|
||||
# these files are identical, and just pick one arbitrarily to use as source.
|
||||
|
||||
ANY_JVM_VARIANT := $(firstword $(JVM_VARIANTS))
|
||||
JVM_VARIANT_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR)/variant-$(ANY_JVM_VARIANT)
|
||||
|
||||
### Copy platform-independent .h files
|
||||
INCLUDE_FILES_SRC_DIR := $(HOTSPOT_TOPDIR)/src/share/vm
|
||||
$(eval $(call SetupCopyFiles, COPY_INCLUDE, \
|
||||
SRC := $(INCLUDE_FILES_SRC_DIR), \
|
||||
DEST := $(DIST_OUTPUTDIR)/include, \
|
||||
FLATTEN := true, \
|
||||
FILES := $(INCLUDE_FILES_SRC_DIR)/prims/jni.h \
|
||||
$(INCLUDE_FILES_SRC_DIR)/code/jvmticmlr.h \
|
||||
$(INCLUDE_FILES_SRC_DIR)/services/jmm.h))
|
||||
|
||||
TARGETS += $(COPY_INCLUDE)
|
||||
|
||||
### Copy jni_md.h
|
||||
|
||||
# This might have been defined in a custom extension
|
||||
ifeq ($(JNI_MD_H_SRC), )
|
||||
JNI_MD_H_SRC := $(HOTSPOT_TOPDIR)/src/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/vm/jni_$(HOTSPOT_TARGET_CPU_ARCH).h
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: This should most likely be darwin, but the old hotspot build uses bsd
|
||||
JNI_MD_SUBDIR := bsd
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JNI_MD_SUBDIR := win32
|
||||
else
|
||||
JNI_MD_SUBDIR := $(OPENJDK_TARGET_OS)
|
||||
endif
|
||||
|
||||
# SetupCopyFiles is not used here since it's non-trivial to copy a single
|
||||
# file with a different target name.
|
||||
$(DIST_OUTPUTDIR)/include/$(JNI_MD_SUBDIR)/jni_md.h: $(JNI_MD_H_SRC)
|
||||
$(call LogInfo, Copying hotspot/dist/include/$(JNI_MD_SUBDIR)/jni_md.h)
|
||||
$(install-file)
|
||||
|
||||
TARGETS += $(DIST_OUTPUTDIR)/include/$(JNI_MD_SUBDIR)/jni_md.h
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_JVMTI_H, \
|
||||
DEST := $(DIST_OUTPUTDIR)/include, \
|
||||
FLATTEN := true, \
|
||||
FILES := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles/jvmti.h))
|
||||
|
||||
TARGETS += $(COPY_JVMTI_H)
|
||||
|
||||
# NOTE: In the old build, this file was not copied on Windows.
|
||||
ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_JVMTI_HTML, \
|
||||
DEST := $(DIST_OUTPUTDIR)/docs/platform/jvmti, \
|
||||
FILES := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jvmtifiles/jvmti.html))
|
||||
endif
|
||||
|
||||
TARGETS += $(COPY_JVMTI_HTML)
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupCopyFiles, COPY_JVM_LIB, \
|
||||
DEST := $(DIST_OUTPUTDIR)/lib, \
|
||||
FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib))
|
||||
|
||||
TARGETS += $(COPY_JVM_LIB)
|
||||
endif
|
||||
|
||||
# Copy libjsig, if it exists
|
||||
$(eval $(call SetupDistLibFile, DIST_jsig, \
|
||||
NAME := jsig, \
|
||||
))
|
||||
|
||||
################################################################################
|
||||
# Copy variant-specific files
|
||||
|
||||
# Setup make rules to copy a single variant to dist.
|
||||
# $1: The name of the variant
|
||||
define SetupDistForVariant
|
||||
ifneq ($$(filter client minimal, $1), )
|
||||
VARIANT_TARGET_DIR := $1
|
||||
else
|
||||
# Use 'server' as default target directory name for all other variants.
|
||||
VARIANT_TARGET_DIR := server
|
||||
endif
|
||||
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm, \
|
||||
NAME := jvm, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
# Copy the dtrace libraries, if they exist
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm_db, \
|
||||
NAME := jvm_db, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
$$(eval $$(call SetupDistLibFile, DIST_$(strip $1)_jvm_dtrace, \
|
||||
NAME := jvm_dtrace, \
|
||||
VARIANT := $1, \
|
||||
VARIANT_TARGET_DIR := $$(VARIANT_TARGET_DIR)/, \
|
||||
))
|
||||
|
||||
# Copy the Xusage.txt file
|
||||
$$(eval $$(call SetupCopyFiles, DIST_$(strip $1)_Xusage, \
|
||||
DEST := $$(DIST_OUTPUTDIR)/$$(LIB_SUBDIR)/$(strip $1), \
|
||||
FILES := $$(HOTSPOT_OUTPUTDIR)/variant-$(strip $1)/support/misc/Xusage.txt, \
|
||||
))
|
||||
|
||||
TARGETS += $$(DIST_$(strip $1)_Xusage)
|
||||
endef
|
||||
|
||||
$(foreach variant, $(JVM_VARIANTS), \
|
||||
$(eval $(call SetupDistForVariant, $(variant))) \
|
||||
)
|
||||
|
||||
################################################################################
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
.PHONY: all
|
@ -33,6 +33,15 @@ JVM_SUPPORT_DIR := $(JVM_VARIANT_OUTPUTDIR)/support
|
||||
|
||||
DTRACE_SUPPORT_DIR := $(JVM_SUPPORT_DIR)/dtrace
|
||||
|
||||
LIB_OUTPUTDIR := $(call FindLibDirForModule, java.base)
|
||||
ifneq ($(filter client minimal, $(JVM_VARIANT)), )
|
||||
JVM_VARIANT_SUBDIR := $(JVM_VARIANT)
|
||||
else
|
||||
# Use 'server' as default target directory name for all other variants.
|
||||
JVM_VARIANT_SUBDIR := server
|
||||
endif
|
||||
JVM_LIB_OUTPUTDIR := $(LIB_OUTPUTDIR)/$(JVM_VARIANT_SUBDIR)
|
||||
|
||||
################################################################################
|
||||
|
||||
# Test if a feature is available in the present build of JVM_VARIANT. Will return
|
||||
|
67
hotspot/make/copy/Copy-java.base.gmk
Normal file
67
hotspot/make/copy/Copy-java.base.gmk
Normal file
@ -0,0 +1,67 @@
|
||||
#
|
||||
# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. 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.
|
||||
#
|
||||
|
||||
# These include files are currently being copied from the jdk repository for
|
||||
# historical reasons. Disable copying from here until this has been cleaned up.
|
||||
# The files in hotspot differ slightly from the corresponding files in jdk.
|
||||
# See JDK-8167078.
|
||||
|
||||
INCLUDE_DST_DIR := $(SUPPORT_OUTPUTDIR)/modules_include/$(MODULE)
|
||||
|
||||
################################################################################
|
||||
# Copy platform-independent .h files
|
||||
$(eval $(call SetupCopyFiles, COPY_INCLUDE_FILES, \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/share/vm, \
|
||||
DEST := $(INCLUDE_DST_DIR), \
|
||||
FLATTEN := true, \
|
||||
FILES := prims/jni.h code/jvmticmlr.h \
|
||||
))
|
||||
|
||||
#TARGETS += $(COPY_INCLUDE_FILES)
|
||||
|
||||
################################################################################
|
||||
# Copy jni_md.h
|
||||
|
||||
# This might have been defined in a custom extension
|
||||
JNI_MD_H_SRC ?= $(HOTSPOT_TOPDIR)/src/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/vm/jni_$(HOTSPOT_TARGET_CPU_ARCH).h
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: This should most likely be darwin, but the old hotspot build uses bsd
|
||||
JNI_MD_SUBDIR := bsd
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JNI_MD_SUBDIR := win32
|
||||
else
|
||||
JNI_MD_SUBDIR := $(OPENJDK_TARGET_OS)
|
||||
endif
|
||||
|
||||
# SetupCopyFiles is not used here since it's non-trivial to copy a single
|
||||
# file with a different target name.
|
||||
$(INCLUDE_DST_DIR)/$(JNI_MD_SUBDIR)/jni_md.h: $(JNI_MD_H_SRC)
|
||||
$(call LogInfo, Copying hotspot/dist/include/$(JNI_MD_SUBDIR)/jni_md.h)
|
||||
$(install-file)
|
||||
|
||||
#TARGETS += $(INCLUDE_DST_DIR)/$(JNI_MD_SUBDIR)/jni_md.h
|
||||
|
||||
################################################################################
|
@ -47,7 +47,7 @@ $(eval $(call IncludeCustomExtension, hotspot, gensrc/GenerateSources.gmk))
|
||||
# The Xusage.txt file needs to have platform specific path separator
|
||||
$(eval $(call SetupTextFileProcessing, CREATE_XUSAGE, \
|
||||
SOURCE_FILES := $(HOTSPOT_TOPDIR)/src/share/vm/Xusage.txt, \
|
||||
OUTPUT_FILE := $(JVM_SUPPORT_DIR)/misc/Xusage.txt, \
|
||||
OUTPUT_FILE := $(JVM_LIB_OUTPUTDIR)/Xusage.txt, \
|
||||
REPLACEMENTS := separated by ;> => separated by $(PATH_SEP)> ; , \
|
||||
))
|
||||
|
||||
|
@ -129,6 +129,21 @@ $(JVMTI_OUTPUTDIR)/jvmtiEnvRecommended.cpp: $(JVMTI_SRCDIR)/jvmtiEnv.cpp \
|
||||
|
||||
TARGETS += $(JVMTI_OUTPUTDIR)/jvmtiEnvRecommended.cpp
|
||||
|
||||
################################################################################
|
||||
# Disable copy of jvmti.h from hotspot until this has been cleared up. The file
|
||||
# is currently being copied from the jdk repository. See JDK-8167078.
|
||||
# Copy jvmti.h to include dir
|
||||
|
||||
# The file is the same regardless of jvm variant. Only let one do the copy.
|
||||
#ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS)))
|
||||
# $(eval $(call SetupCopyFiles, COPY_JVMTI_H, \
|
||||
# DEST := $(SUPPORT_OUTPUTDIR)/modules_include/java.base, \
|
||||
# FILES := $(JVMTI_OUTPUTDIR)/jvmti.h, \
|
||||
# ))
|
||||
|
||||
# TARGETS += $(COPY_JVMTI_H)
|
||||
#endif
|
||||
|
||||
################################################################################
|
||||
# Create trace files in gensrc/tracefiles
|
||||
|
||||
|
@ -180,7 +180,7 @@ ifeq ($(call check-jvm-feature, dtrace), true)
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DTRACE, \
|
||||
LIBRARY := jvm_dtrace, \
|
||||
OUTPUT_DIR := $(LIBJVM_DTRACE_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/os/solaris/dtrace, \
|
||||
INCLUDE_FILES := jvm_dtrace.c, \
|
||||
CFLAGS := -m64 -G -mt -KPIC, \
|
||||
@ -197,7 +197,7 @@ ifeq ($(call check-jvm-feature, dtrace), true)
|
||||
# the old build.
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM_DB, \
|
||||
LIBRARY := jvm_db, \
|
||||
OUTPUT_DIR := $(LIBJVM_DB_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(HOTSPOT_TOPDIR)/src/os/solaris/dtrace, \
|
||||
INCLUDE_FILES := libjvm_db.c, \
|
||||
CFLAGS := -I$(JVM_VARIANT_OUTPUTDIR)/gensrc -I$(DTRACE_SUPPORT_DIR) \
|
||||
|
@ -55,7 +55,7 @@ endif
|
||||
# Disabling switch warning for clang because of test source.
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \
|
||||
TOOLCHAIN := $(JVM_TOOLCHAIN), \
|
||||
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
|
||||
LIBRARY := jvm, \
|
||||
OUTPUT_DIR := $(JVM_OUTPUTDIR)/gtest, \
|
||||
OBJECT_DIR := $(JVM_OUTPUTDIR)/gtest/objs, \
|
||||
@ -69,7 +69,7 @@ $(eval $(call SetupNativeCompilation, BUILD_GTEST_LIBJVM, \
|
||||
CFLAGS := $(JVM_CFLAGS) -I$(GTEST_FRAMEWORK_SRC) \
|
||||
-I$(GTEST_FRAMEWORK_SRC)/include \
|
||||
$(addprefix -I,$(GTEST_TEST_SRC)), \
|
||||
CFLAGS_windows := /EHsc, \
|
||||
CFLAGS_windows := -EHsc, \
|
||||
CFLAGS_solaris := -DGTEST_HAS_EXCEPTIONS=0 -library=stlport4, \
|
||||
CFLAGS_macosx := -DGTEST_OS_MAC=1, \
|
||||
CFLAGS_DEBUG_SYMBOLS := $(JVM_CFLAGS_SYMBOLS), \
|
||||
@ -95,7 +95,7 @@ TARGETS += $(BUILD_GTEST_LIBJVM)
|
||||
################################################################################
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_GTEST_LAUNCHER, \
|
||||
TOOLCHAIN := $(JVM_TOOLCHAIN), \
|
||||
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
|
||||
PROGRAM := gtestLauncher, \
|
||||
OUTPUT_DIR := $(JVM_OUTPUTDIR)/gtest, \
|
||||
EXTRA_FILES := $(GTEST_LAUNCHER_SRC), \
|
||||
|
@ -143,13 +143,6 @@ ifneq ($(filter $(OPENJDK_TARGET_OS), linux macosx windows), )
|
||||
JVM_PRECOMPILED_HEADER := $(HOTSPOT_TOPDIR)/src/share/vm/precompiled/precompiled.hpp
|
||||
endif
|
||||
|
||||
ifneq ($(filter $(OPENJDK_TARGET_OS), macosx aix solaris), )
|
||||
# On macosx, aix and solaris we have to link with the C++ compiler
|
||||
JVM_TOOLCHAIN := TOOLCHAIN_LINK_CXX
|
||||
else
|
||||
JVM_TOOLCHAIN := TOOLCHAIN_DEFAULT
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_CPU), x86)
|
||||
JVM_EXCLUDE_PATTERNS += x86_64
|
||||
else ifeq ($(OPENJDK_TARGET_CPU), x86_64)
|
||||
@ -181,13 +174,6 @@ ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
JVM_RCFLAGS += -D"HS_FILEDESC=$(HOTSPOT_VM_DISTRO) $(RC_DESC)$(JVM_VARIANT) VM"
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
# NOTE: The old build did not strip binaries on macosx.
|
||||
JVM_STRIP_SYMBOLS := false
|
||||
else
|
||||
JVM_STRIP_SYMBOLS := true
|
||||
endif
|
||||
|
||||
JVM_OPTIMIZATION ?= HIGHEST_JVM
|
||||
|
||||
# Need to set JVM_STRIPFLAGS to the default value from SPEC since the STRIPFLAGS
|
||||
@ -199,9 +185,9 @@ JVM_STRIPFLAGS ?= $(STRIPFLAGS)
|
||||
# Now set up the actual compilation of the main hotspot native library
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
TOOLCHAIN := $(JVM_TOOLCHAIN), \
|
||||
TOOLCHAIN := TOOLCHAIN_LINK_CXX, \
|
||||
LIBRARY := jvm, \
|
||||
OUTPUT_DIR := $(JVM_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(JVM_LIB_OUTPUTDIR), \
|
||||
SRC := $(JVM_SRC_DIRS), \
|
||||
EXCLUDES := $(JVM_EXCLUDES), \
|
||||
EXCLUDE_FILES := $(JVM_EXCLUDE_FILES), \
|
||||
@ -223,7 +209,6 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
OBJECT_DIR := $(JVM_OUTPUTDIR)/objs, \
|
||||
MAPFILE := $(JVM_MAPFILE), \
|
||||
USE_MAPFILE_FOR_SYMBOLS := true, \
|
||||
STRIP_SYMBOLS := $(JVM_STRIP_SYMBOLS), \
|
||||
STRIPFLAGS := $(JVM_STRIPFLAGS), \
|
||||
EMBED_MANIFEST := true, \
|
||||
RC_FLAGS := $(JVM_RCFLAGS), \
|
||||
@ -232,6 +217,18 @@ $(eval $(call SetupNativeCompilation, BUILD_LIBJVM, \
|
||||
PRECOMPILED_HEADER_EXCLUDE := $(JVM_PRECOMPILED_HEADER_EXCLUDE), \
|
||||
))
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
# It doesn't matter which jvm.lib file gets exported, but we need
|
||||
# to pick just one.
|
||||
ifeq ($(JVM_VARIANT), $(firstword $(JVM_VARIANTS)))
|
||||
$(eval $(call SetupCopyFiles, COPY_JVM_LIB, \
|
||||
DEST := $(LIB_OUTPUTDIR), \
|
||||
FILES :=$(JVM_VARIANT_OUTPUTDIR)/libjvm/objs/jvm.lib, \
|
||||
))
|
||||
TARGETS += $(COPY_JVM_LIB)
|
||||
endif
|
||||
endif
|
||||
|
||||
# AIX warning explanation:
|
||||
# 1500-010 : (W) WARNING in ...: Infinite loop. Program may not stop.
|
||||
# There are several infinite loops in the vm, so better suppress.
|
||||
|
@ -34,7 +34,6 @@ include NativeCompilation.gmk
|
||||
|
||||
ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
ifeq ($(STATIC_BUILD), false)
|
||||
LIBJSIG_STRIP_SYMBOLS := true
|
||||
ifeq ($(OPENJDK_TARGET_OS), linux)
|
||||
LIBJSIG_CFLAGS := -fPIC -D_GNU_SOURCE -D_REENTRANT $(EXTRA_CFLAGS)
|
||||
LIBJSIG_LDFLAGS := $(LDFLAGS_HASH_STYLE) $(EXTRA_CFLAGS)
|
||||
@ -72,8 +71,6 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LIBJSIG_CFLAGS := -m64 -D_GNU_SOURCE -pthread -mno-omit-leaf-frame-pointer -mstack-alignment=16 -fPIC
|
||||
LIBJSIG_LDFLAGS := $(LDFLAGS_HASH_STYLE)
|
||||
# NOTE: This lib is not stripped on macosx in old build. Looks like a mistake.
|
||||
LIBJSIG_STRIP_SYMBOLS := false
|
||||
else
|
||||
$(error Unknown target OS $(OPENJDK_TARGET_OS) in CompileLibjsig.gmk)
|
||||
endif
|
||||
@ -84,20 +81,71 @@ ifneq ($(OPENJDK_TARGET_OS), windows)
|
||||
|
||||
LIBJSIG_LDFLAGS += $(SHARED_LIBRARY_FLAGS)
|
||||
|
||||
LIB_OUTPUTDIR := $(call FindLibDirForModule, java.base)
|
||||
|
||||
$(eval $(call SetupNativeCompilation, BUILD_LIBJSIG, \
|
||||
LIBRARY := jsig, \
|
||||
EXTRA_FILES := $(LIBJSIG_SRC_FILE), \
|
||||
OUTPUT_DIR := $(LIBJSIG_OUTPUTDIR), \
|
||||
OUTPUT_DIR := $(LIB_OUTPUTDIR), \
|
||||
LANG := C, \
|
||||
CFLAGS := $(LIBJSIG_CFLAGS) $(LIBJSIG_CPU_FLAGS), \
|
||||
LDFLAGS := $(LIBJSIG_LDFLAGS) $(LIBJSIG_CPU_FLAGS), \
|
||||
LIBS := $(LIBJSIG_LIBS), \
|
||||
MAPFILE := $(LIBJSIG_MAPFILE), \
|
||||
OBJECT_DIR := $(LIBJSIG_OUTPUTDIR)/objs, \
|
||||
STRIP_SYMBOLS := $(LIBJSIG_STRIP_SYMBOLS), \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_LIBJSIG)
|
||||
|
||||
############################################################################
|
||||
# Create symlinks in each variant sub dir
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
DEBUG_INFO_SUFFIX := $(SHARED_LIBRARY_SUFFIX).dSYM
|
||||
else
|
||||
DEBUG_INFO_SUFFIX := .debuginfo
|
||||
endif
|
||||
|
||||
# $1 variant subdir
|
||||
define CreateSymlinks
|
||||
# Always symlink from libdir/variant/libjsig.so -> ../libjsig.so and
|
||||
# the corresponding debuginfo.
|
||||
$(LIB_OUTPUTDIR)/$1/$(call SHARED_LIBRARY,jsig): \
|
||||
$(LIB_OUTPUTDIR)/$(call SHARED_LIBRARY,jsig)
|
||||
$$(call MakeDir, $$(@D))
|
||||
$(RM) $$@
|
||||
$(LN) -s ../$$(@F) $$@
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(call SHARED_LIBRARY,jsig)
|
||||
|
||||
ifeq ($(COPY_DEBUG_SYMBOLS), true)
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX): \
|
||||
$(LIB_OUTPUTDIR)/$(call SHARED_LIBRARY,jsig)
|
||||
$$(call MakeDir, $$(@D))
|
||||
$(RM) $$@
|
||||
$(LN) -s ../$$(@F) $$@
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX)
|
||||
|
||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), true)
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig.diz: \
|
||||
$(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig$(DEBUG_INFO_SUFFIX)
|
||||
$(CD) $$(@D) && $(ZIP) -q -y $$@ $$(basename $$(@F))$(DEBUG_INFO_SUFFIX)
|
||||
|
||||
TARGETS += $(LIB_OUTPUTDIR)/$1/$(LIBRARY_PREFIX)jsig.diz
|
||||
endif
|
||||
endif
|
||||
endef
|
||||
|
||||
# The subdir is the same as the variant for client and minimal, for all
|
||||
# others it's server.
|
||||
VARIANT_SUBDIRS := $(filter client minimal, $(JVM_VARIANTS)) \
|
||||
$(if $(filter-out client minimal, $(JVM_VARIANTS)), server)
|
||||
$(foreach v, $(VARIANT_SUBDIRS), $(eval $(call CreateSymlinks,$v)))
|
||||
|
||||
############################################################################
|
||||
|
||||
include CopyToExplodedJdk.gmk
|
||||
|
||||
endif
|
||||
endif
|
||||
|
||||
|
@ -41,6 +41,8 @@ ifeq ($(BUILD_GTEST), true)
|
||||
include lib/CompileGtest.gmk
|
||||
endif
|
||||
|
||||
include CopyToExplodedJdk.gmk
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
.PHONY: all
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@ -130,8 +130,8 @@ void InterpreterRuntime::SignatureHandlerGenerator::pass_float() {
|
||||
if (_num_fp_args < Argument::n_float_register_parameters_c) {
|
||||
__ ldrs(as_FloatRegister(_num_fp_args++), src);
|
||||
} else {
|
||||
__ ldrh(r0, src);
|
||||
__ strh(r0, Address(to(), _stack_offset));
|
||||
__ ldrw(r0, src);
|
||||
__ strw(r0, Address(to(), _stack_offset));
|
||||
_stack_offset += wordSize;
|
||||
_num_fp_args++;
|
||||
}
|
||||
@ -349,7 +349,7 @@ class SlowSignatureHandler
|
||||
_num_fp_args++;
|
||||
} else {
|
||||
*_to++ = from_obj;
|
||||
_num_int_args++;
|
||||
_num_fp_args++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -364,7 +364,7 @@ class SlowSignatureHandler
|
||||
_num_fp_args++;
|
||||
} else {
|
||||
*_to++ = from_obj;
|
||||
_num_int_args++;
|
||||
_num_fp_args++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -60,12 +60,12 @@ void CodeInstaller::pd_patch_OopConstant(int pc_offset, Handle constant, TRAPS)
|
||||
void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, TRAPS) {
|
||||
address pc = _instructions->start() + pc_offset;
|
||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||
narrowKlass narrowOop = record_narrow_metadata_reference(constant, CHECK);
|
||||
narrowKlass narrowOop = record_narrow_metadata_reference(_instructions, pc, constant, CHECK);
|
||||
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop);
|
||||
Unimplemented();
|
||||
} else {
|
||||
NativeMovConstReg* move = nativeMovConstReg_at(pc);
|
||||
void* reference = record_metadata_reference(constant, CHECK);
|
||||
void* reference = record_metadata_reference(_instructions, pc, constant, CHECK);
|
||||
move->set_data((intptr_t) reference);
|
||||
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference));
|
||||
}
|
||||
|
@ -989,7 +989,16 @@ static void object_move(MacroAssembler* masm,
|
||||
|
||||
// A float arg may have to do float reg int reg conversion
|
||||
static void float_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
if (src.first() != dst.first()) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg(), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
__ ldrw(rscratch1, Address(rfp, reg2offset_in(src.first())));
|
||||
__ strw(rscratch1, Address(sp, reg2offset_out(dst.first())));
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
} else if (src.first() != dst.first()) {
|
||||
if (src.is_single_phys_reg() && dst.is_single_phys_reg())
|
||||
__ fmovs(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
|
||||
else
|
||||
@ -1023,7 +1032,16 @@ static void long_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
|
||||
// A double move
|
||||
static void double_move(MacroAssembler* masm, VMRegPair src, VMRegPair dst) {
|
||||
if (src.first() != dst.first()) {
|
||||
assert(src.first()->is_stack() && dst.first()->is_stack() ||
|
||||
src.first()->is_reg() && dst.first()->is_reg(), "Unexpected error");
|
||||
if (src.first()->is_stack()) {
|
||||
if (dst.first()->is_stack()) {
|
||||
__ ldr(rscratch1, Address(rfp, reg2offset_in(src.first())));
|
||||
__ str(rscratch1, Address(sp, reg2offset_out(dst.first())));
|
||||
} else {
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
} else if (src.first() != dst.first()) {
|
||||
if (src.is_single_phys_reg() && dst.is_single_phys_reg())
|
||||
__ fmovd(dst.first()->as_FloatRegister(), src.first()->as_FloatRegister());
|
||||
else
|
||||
|
@ -64,17 +64,16 @@ void C1_MacroAssembler::explicit_null_check(Register base) {
|
||||
|
||||
|
||||
void C1_MacroAssembler::build_frame(int frame_size_in_bytes, int bang_size_in_bytes) {
|
||||
assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
|
||||
// Avoid stack bang as first instruction. It may get overwritten by patch_verified_entry.
|
||||
const Register return_pc = R20;
|
||||
mflr(return_pc);
|
||||
|
||||
// Make sure there is enough stack space for this method's activation.
|
||||
assert(bang_size_in_bytes >= frame_size_in_bytes, "stack bang size incorrect");
|
||||
generate_stack_overflow_check(bang_size_in_bytes);
|
||||
|
||||
// Create the frame.
|
||||
const Register return_pc = R0;
|
||||
|
||||
mflr(return_pc);
|
||||
// Get callers sp.
|
||||
std(return_pc, _abi(lr), R1_SP); // SP->lr = return_pc
|
||||
push_frame(frame_size_in_bytes, R0); // SP -= frame_size_in_bytes
|
||||
std(return_pc, _abi(lr), R1_SP); // SP->lr = return_pc
|
||||
push_frame(frame_size_in_bytes, R0); // SP -= frame_size_in_bytes
|
||||
}
|
||||
|
||||
|
||||
|
@ -2550,7 +2550,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
|
||||
__ lbzx(R17_tos, Rclass_or_obj, Roffset);
|
||||
__ extsb(R17_tos, R17_tos);
|
||||
__ push(ztos);
|
||||
if (!is_static) {
|
||||
if (!is_static && rc == may_rewrite) {
|
||||
// use btos rewriting, no truncating to t/f bit is needed for getfield.
|
||||
patch_bytecode(Bytecodes::_fast_bgetfield, Rbc, Rscratch);
|
||||
}
|
||||
@ -2874,7 +2874,9 @@ void TemplateTable::putfield_or_static(int byte_no, bool is_static, RewriteContr
|
||||
if (!is_static) { pop_and_check_object(Rclass_or_obj); } // Kills R11_scratch1.
|
||||
__ andi(R17_tos, R17_tos, 0x1);
|
||||
__ stbx(R17_tos, Rclass_or_obj, Roffset);
|
||||
if (!is_static) { patch_bytecode(Bytecodes::_fast_zputfield, Rbc, Rscratch, true, byte_no); }
|
||||
if (!is_static && rc == may_rewrite) {
|
||||
patch_bytecode(Bytecodes::_fast_zputfield, Rbc, Rscratch, true, byte_no);
|
||||
}
|
||||
if (!support_IRIW_for_not_multiple_copy_atomic_cpu) {
|
||||
__ beq(CR_is_vol, Lvolatile); // Volatile?
|
||||
}
|
||||
|
@ -71,7 +71,7 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||
#ifdef _LP64
|
||||
NativeMovConstReg32* move = nativeMovConstReg32_at(pc);
|
||||
narrowKlass narrowOop = record_narrow_metadata_reference(constant, CHECK);
|
||||
narrowKlass narrowOop = record_narrow_metadata_reference(_instructions, pc, constant, CHECK);
|
||||
move->set_data((intptr_t)narrowOop);
|
||||
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/0x%x", p2i(pc), narrowOop);
|
||||
#else
|
||||
@ -79,7 +79,7 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
||||
#endif
|
||||
} else {
|
||||
NativeMovConstReg* move = nativeMovConstReg_at(pc);
|
||||
void* reference = record_metadata_reference(constant, CHECK);
|
||||
void* reference = record_metadata_reference(_instructions, pc, constant, CHECK);
|
||||
move->set_data((intptr_t)reference);
|
||||
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(reference));
|
||||
}
|
||||
|
@ -84,7 +84,6 @@
|
||||
declare_constant(VM_Version::sun4v_m) \
|
||||
declare_constant(VM_Version::blk_init_instructions_m) \
|
||||
declare_constant(VM_Version::fmaf_instructions_m) \
|
||||
declare_constant(VM_Version::fmau_instructions_m) \
|
||||
declare_constant(VM_Version::sparc64_family_m) \
|
||||
declare_constant(VM_Version::M_family_m) \
|
||||
declare_constant(VM_Version::T_family_m) \
|
||||
|
@ -179,7 +179,7 @@ void VM_Version::initialize() {
|
||||
assert((OptoLoopAlignment % relocInfo::addr_unit()) == 0, "alignment is not a multiple of NOP size");
|
||||
|
||||
char buf[512];
|
||||
jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
|
||||
(has_v9() ? ", v9" : (has_v8() ? ", v8" : "")),
|
||||
(has_hardware_popc() ? ", popc" : ""),
|
||||
(has_vis1() ? ", vis1" : ""),
|
||||
@ -193,6 +193,7 @@ void VM_Version::initialize() {
|
||||
(has_sha512() ? ", sha512" : ""),
|
||||
(has_crc32c() ? ", crc32c" : ""),
|
||||
(is_ultra3() ? ", ultra3" : ""),
|
||||
(has_sparc5_instr() ? ", sparc5" : ""),
|
||||
(is_sun4v() ? ", sun4v" : ""),
|
||||
(is_niagara_plus() ? ", niagara_plus" : (is_niagara() ? ", niagara" : "")),
|
||||
(is_sparc64() ? ", sparc64" : ""),
|
||||
@ -487,16 +488,11 @@ int VM_Version::parse_features(const char* implementation) {
|
||||
if (strstr(impl, "SPARC-T1") != NULL) {
|
||||
features |= T1_model_m;
|
||||
}
|
||||
} else if (strstr(impl, "SUN4V-CPU") != NULL) {
|
||||
// Generic or migration class LDOM
|
||||
features |= T_family_m;
|
||||
} else {
|
||||
if (strstr(impl, "SPARC") == NULL) {
|
||||
#ifndef PRODUCT
|
||||
// kstat on Solaris 8 virtual machines (branded zones)
|
||||
// returns "(unsupported)" implementation. Solaris 8 is not
|
||||
// supported anymore, but include this check to be on the
|
||||
// safe side.
|
||||
warning("Can't parse CPU implementation = '%s', assume generic SPARC", impl);
|
||||
#endif
|
||||
}
|
||||
log_info(os, cpu)("Failed to parse CPU implementation = '%s'", impl);
|
||||
}
|
||||
os::free((void*)impl);
|
||||
return features;
|
||||
|
@ -34,30 +34,29 @@ class VM_Version: public Abstract_VM_Version {
|
||||
|
||||
protected:
|
||||
enum Feature_Flag {
|
||||
v8_instructions = 0,
|
||||
hardware_mul32 = 1,
|
||||
hardware_div32 = 2,
|
||||
hardware_fsmuld = 3,
|
||||
hardware_popc = 4,
|
||||
v9_instructions = 5,
|
||||
vis1_instructions = 6,
|
||||
vis2_instructions = 7,
|
||||
sun4v_instructions = 8,
|
||||
v8_instructions = 0,
|
||||
hardware_mul32 = 1,
|
||||
hardware_div32 = 2,
|
||||
hardware_fsmuld = 3,
|
||||
hardware_popc = 4,
|
||||
v9_instructions = 5,
|
||||
vis1_instructions = 6,
|
||||
vis2_instructions = 7,
|
||||
sun4v_instructions = 8,
|
||||
blk_init_instructions = 9,
|
||||
fmaf_instructions = 10,
|
||||
fmau_instructions = 11,
|
||||
vis3_instructions = 12,
|
||||
cbcond_instructions = 13,
|
||||
sparc64_family = 14,
|
||||
M_family = 15,
|
||||
T_family = 16,
|
||||
T1_model = 17,
|
||||
sparc5_instructions = 18,
|
||||
aes_instructions = 19,
|
||||
sha1_instruction = 20,
|
||||
sha256_instruction = 21,
|
||||
sha512_instruction = 22,
|
||||
crc32c_instruction = 23
|
||||
fmaf_instructions = 10,
|
||||
vis3_instructions = 11,
|
||||
cbcond_instructions = 12,
|
||||
sparc64_family = 13,
|
||||
M_family = 14,
|
||||
T_family = 15,
|
||||
T1_model = 16,
|
||||
sparc5_instructions = 17,
|
||||
aes_instructions = 18,
|
||||
sha1_instruction = 19,
|
||||
sha256_instruction = 20,
|
||||
sha512_instruction = 21,
|
||||
crc32c_instruction = 22
|
||||
};
|
||||
|
||||
enum Feature_Flag_Set {
|
||||
@ -75,7 +74,6 @@ protected:
|
||||
sun4v_m = 1 << sun4v_instructions,
|
||||
blk_init_instructions_m = 1 << blk_init_instructions,
|
||||
fmaf_instructions_m = 1 << fmaf_instructions,
|
||||
fmau_instructions_m = 1 << fmau_instructions,
|
||||
vis3_instructions_m = 1 << vis3_instructions,
|
||||
cbcond_instructions_m = 1 << cbcond_instructions,
|
||||
sparc64_family_m = 1 << sparc64_family,
|
||||
|
@ -89,14 +89,14 @@ void CodeInstaller::pd_patch_MetaspaceConstant(int pc_offset, Handle constant, T
|
||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||
#ifdef _LP64
|
||||
address operand = Assembler::locate_operand(pc, Assembler::narrow_oop_operand);
|
||||
*((narrowKlass*) operand) = record_narrow_metadata_reference(constant, CHECK);
|
||||
*((narrowKlass*) operand) = record_narrow_metadata_reference(_instructions, operand, constant, CHECK);
|
||||
TRACE_jvmci_3("relocating (narrow metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand));
|
||||
#else
|
||||
JVMCI_ERROR("compressed Klass* on 32bit");
|
||||
#endif
|
||||
} else {
|
||||
address operand = Assembler::locate_operand(pc, Assembler::imm_operand);
|
||||
*((void**) operand) = record_metadata_reference(constant, CHECK);
|
||||
*((void**) operand) = record_metadata_reference(_instructions, operand, constant, CHECK);
|
||||
TRACE_jvmci_3("relocating (metaspace constant) at " PTR_FORMAT "/" PTR_FORMAT, p2i(pc), p2i(operand));
|
||||
}
|
||||
}
|
||||
|
@ -96,9 +96,6 @@ public class SPARCHotSpotJVMCIBackendFactory implements HotSpotJVMCIBackendFacto
|
||||
if ((config.vmVersionFeatures & config.sparcFmafInstructions) != 0) {
|
||||
features.add(CPUFeature.FMAF);
|
||||
}
|
||||
if ((config.vmVersionFeatures & config.sparcFmauInstructions) != 0) {
|
||||
features.add(CPUFeature.FMAU);
|
||||
}
|
||||
if ((config.vmVersionFeatures & config.sparcSparc64Family) != 0) {
|
||||
features.add(CPUFeature.SPARC64_FAMILY);
|
||||
}
|
||||
|
@ -55,7 +55,6 @@ class SPARCHotSpotVMConfig extends HotSpotVMConfigAccess {
|
||||
final int sparcSun4v = getConstant("VM_Version::sun4v_m", Integer.class);
|
||||
final int sparcBlkInitInstructions = getConstant("VM_Version::blk_init_instructions_m", Integer.class);
|
||||
final int sparcFmafInstructions = getConstant("VM_Version::fmaf_instructions_m", Integer.class);
|
||||
final int sparcFmauInstructions = getConstant("VM_Version::fmau_instructions_m", Integer.class);
|
||||
final int sparcSparc64Family = getConstant("VM_Version::sparc64_family_m", Integer.class);
|
||||
final int sparcMFamily = getConstant("VM_Version::M_family_m", Integer.class);
|
||||
final int sparcTFamily = getConstant("VM_Version::T_family_m", Integer.class);
|
||||
|
@ -20,17 +20,13 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.hotspot.services;
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
/**
|
||||
* An empty implementation for {@link EventProvider}. This implementation is used when no logging is
|
||||
* requested.
|
||||
*/
|
||||
final class EmptyEventProvider extends EventProvider {
|
||||
|
||||
EmptyEventProvider() {
|
||||
super(null);
|
||||
}
|
||||
final class EmptyEventProvider implements EventProvider {
|
||||
|
||||
static InternalError shouldNotReachHere() {
|
||||
throw new InternalError("should not reach here");
|
@ -20,58 +20,36 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.hotspot.services;
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import jdk.vm.ci.hotspot.services.EmptyEventProvider.EmptyCompilationEvent;
|
||||
import jdk.vm.ci.hotspot.services.EmptyEventProvider.EmptyCompilerFailureEvent;
|
||||
import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilationEvent;
|
||||
import jdk.vm.ci.hotspot.EmptyEventProvider.EmptyCompilerFailureEvent;
|
||||
import jdk.vm.ci.services.JVMCIPermission;
|
||||
|
||||
/**
|
||||
* Service-provider class for logging compiler related events.
|
||||
*/
|
||||
public abstract class EventProvider {
|
||||
|
||||
private static Void checkPermission() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new JVMCIPermission());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
EventProvider(Void ignore) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a new instance of this class.
|
||||
*
|
||||
* @throws SecurityException if a security manager has been installed and it denies
|
||||
* {@link JVMCIPermission}
|
||||
*/
|
||||
protected EventProvider() {
|
||||
this(checkPermission());
|
||||
}
|
||||
public interface EventProvider {
|
||||
|
||||
/**
|
||||
* Creates and returns an empty implementation for {@link EventProvider}. This implementation
|
||||
* can be used when no logging is requested.
|
||||
*/
|
||||
public static EventProvider createEmptyEventProvider() {
|
||||
static EventProvider createEmptyEventProvider() {
|
||||
return new EmptyEventProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and returns an empty implementation for {@link CompilationEvent}.
|
||||
*/
|
||||
public static CompilationEvent createEmptyCompilationEvent() {
|
||||
static CompilationEvent createEmptyCompilationEvent() {
|
||||
return new EmptyCompilationEvent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates and returns an empty implementation for {@link CompilationEvent}.
|
||||
*/
|
||||
public static CompilerFailureEvent createEmptyCompilerFailureEvent() {
|
||||
static CompilerFailureEvent createEmptyCompilerFailureEvent() {
|
||||
return new EmptyCompilerFailureEvent();
|
||||
}
|
||||
|
@ -26,8 +26,10 @@ import jdk.vm.ci.code.CompilationRequest;
|
||||
import jdk.vm.ci.common.JVMCIError;
|
||||
import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
|
||||
import jdk.vm.ci.runtime.JVMCICompiler;
|
||||
import jdk.vm.ci.runtime.JVMCICompilerFactory;
|
||||
import jdk.vm.ci.runtime.JVMCIRuntime;
|
||||
import jdk.vm.ci.runtime.services.JVMCICompilerFactory;
|
||||
import jdk.vm.ci.services.JVMCIServiceLocator;
|
||||
import jdk.vm.ci.services.JVMCIPermission;
|
||||
import jdk.vm.ci.services.Services;
|
||||
|
||||
final class HotSpotJVMCICompilerConfig {
|
||||
@ -37,7 +39,7 @@ final class HotSpotJVMCICompilerConfig {
|
||||
* to perform a compilation. This allows the reflective parts of the JVMCI API to be used
|
||||
* without requiring a compiler implementation to be available.
|
||||
*/
|
||||
private static class DummyCompilerFactory extends JVMCICompilerFactory implements JVMCICompiler {
|
||||
private static class DummyCompilerFactory implements JVMCICompilerFactory, JVMCICompiler {
|
||||
|
||||
public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) {
|
||||
throw new JVMCIError("no JVMCI compiler selected");
|
||||
@ -63,15 +65,16 @@ final class HotSpotJVMCICompilerConfig {
|
||||
* Gets the selected system compiler factory.
|
||||
*
|
||||
* @return the selected system compiler factory
|
||||
* @throws SecurityException if a security manager is present and it denies
|
||||
* {@link JVMCIPermission} for any {@link JVMCIServiceLocator} loaded by this method
|
||||
*/
|
||||
static JVMCICompilerFactory getCompilerFactory() {
|
||||
if (compilerFactory == null) {
|
||||
JVMCICompilerFactory factory = null;
|
||||
String compilerName = Option.Compiler.getString();
|
||||
if (compilerName != null) {
|
||||
for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) {
|
||||
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
|
||||
if (f.getCompilerName().equals(compilerName)) {
|
||||
Services.exportJVMCITo(f.getClass());
|
||||
factory = f;
|
||||
}
|
||||
}
|
||||
@ -80,8 +83,9 @@ final class HotSpotJVMCICompilerConfig {
|
||||
}
|
||||
} else {
|
||||
// Auto select a single available compiler
|
||||
for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) {
|
||||
for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
|
||||
if (factory == null) {
|
||||
Services.exportJVMCITo(f.getClass());
|
||||
factory = f;
|
||||
} else {
|
||||
// Multiple factories seen - cancel auto selection
|
||||
|
@ -20,14 +20,14 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.hotspot.services;
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import jdk.vm.ci.runtime.services.JVMCICompilerFactory;
|
||||
import jdk.vm.ci.runtime.JVMCICompilerFactory;
|
||||
|
||||
/**
|
||||
* HotSpot extensions to {@link JVMCICompilerFactory}.
|
||||
*/
|
||||
public abstract class HotSpotJVMCICompilerFactory extends JVMCICompilerFactory {
|
||||
public abstract class HotSpotJVMCICompilerFactory implements JVMCICompilerFactory {
|
||||
|
||||
/**
|
||||
* Gets 0 or more prefixes identifying classes that should by compiled by C1 in simple mode
|
@ -27,13 +27,11 @@ import static jdk.vm.ci.common.InitTimer.timer;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.TreeMap;
|
||||
|
||||
import jdk.internal.misc.VM;
|
||||
@ -43,16 +41,15 @@ import jdk.vm.ci.code.CompiledCode;
|
||||
import jdk.vm.ci.code.InstalledCode;
|
||||
import jdk.vm.ci.common.InitTimer;
|
||||
import jdk.vm.ci.common.JVMCIError;
|
||||
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory;
|
||||
import jdk.vm.ci.hotspot.services.HotSpotJVMCICompilerFactory.CompilationLevel;
|
||||
import jdk.vm.ci.hotspot.services.HotSpotVMEventListener;
|
||||
import jdk.vm.ci.hotspot.HotSpotJVMCICompilerFactory.CompilationLevel;
|
||||
import jdk.vm.ci.meta.JavaKind;
|
||||
import jdk.vm.ci.meta.JavaType;
|
||||
import jdk.vm.ci.meta.ResolvedJavaType;
|
||||
import jdk.vm.ci.runtime.JVMCI;
|
||||
import jdk.vm.ci.runtime.JVMCIBackend;
|
||||
import jdk.vm.ci.runtime.JVMCICompiler;
|
||||
import jdk.vm.ci.runtime.services.JVMCICompilerFactory;
|
||||
import jdk.vm.ci.runtime.JVMCICompilerFactory;
|
||||
import jdk.vm.ci.services.JVMCIServiceLocator;
|
||||
import jdk.vm.ci.services.Services;
|
||||
|
||||
/**
|
||||
@ -246,11 +243,7 @@ public final class HotSpotJVMCIRuntime implements HotSpotJVMCIRuntimeProvider {
|
||||
if (vmEventListeners == null) {
|
||||
synchronized (this) {
|
||||
if (vmEventListeners == null) {
|
||||
List<HotSpotVMEventListener> listeners = new ArrayList<>();
|
||||
for (HotSpotVMEventListener vmEventListener : ServiceLoader.load(HotSpotVMEventListener.class)) {
|
||||
listeners.add(vmEventListener);
|
||||
}
|
||||
vmEventListeners = listeners;
|
||||
vmEventListeners = JVMCIServiceLocator.getProviders(HotSpotVMEventListener.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,59 +20,35 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.hotspot.services;
|
||||
package jdk.vm.ci.hotspot;
|
||||
|
||||
import jdk.vm.ci.code.CompiledCode;
|
||||
import jdk.vm.ci.code.InstalledCode;
|
||||
import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
|
||||
import jdk.vm.ci.services.JVMCIPermission;
|
||||
|
||||
/**
|
||||
* Service-provider class for responding to VM events.
|
||||
* Listener for responding to VM events.
|
||||
*/
|
||||
public abstract class HotSpotVMEventListener {
|
||||
|
||||
private static Void checkPermission() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new JVMCIPermission());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
HotSpotVMEventListener(Void ignore) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a new instance of this class.
|
||||
*
|
||||
* @throws SecurityException if a security manager has been installed and it denies
|
||||
* {@link JVMCIPermission}
|
||||
*/
|
||||
protected HotSpotVMEventListener() {
|
||||
this(checkPermission());
|
||||
}
|
||||
public interface HotSpotVMEventListener {
|
||||
|
||||
/**
|
||||
* Notifies this client that the VM is shutting down.
|
||||
*/
|
||||
public void notifyShutdown() {
|
||||
default void notifyShutdown() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify on successful install into the code cache.
|
||||
*
|
||||
* @param hotSpotCodeCacheProvider
|
||||
* @param installedCode
|
||||
* @param compiledCode
|
||||
* @param hotSpotCodeCacheProvider the code cache into which the code was installed
|
||||
* @param installedCode the code that was installed
|
||||
* @param compiledCode the compiled code from which {@code installedCode} was produced
|
||||
*/
|
||||
public void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) {
|
||||
default void notifyInstall(HotSpotCodeCacheProvider hotSpotCodeCacheProvider, InstalledCode installedCode, CompiledCode compiledCode) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify on completion of a bootstrap.
|
||||
*/
|
||||
public void notifyBootstrapFinished() {
|
||||
default void notifyBootstrapFinished() {
|
||||
}
|
||||
}
|
@ -20,64 +20,38 @@
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.runtime.services;
|
||||
package jdk.vm.ci.runtime;
|
||||
|
||||
import java.io.PrintStream;
|
||||
|
||||
import jdk.vm.ci.runtime.JVMCICompiler;
|
||||
import jdk.vm.ci.runtime.JVMCIRuntime;
|
||||
import jdk.vm.ci.services.JVMCIPermission;
|
||||
|
||||
/**
|
||||
* Service-provider class for creating JVMCI compilers.
|
||||
* Factory for creating JVMCI compilers.
|
||||
*/
|
||||
public abstract class JVMCICompilerFactory {
|
||||
|
||||
private static Void checkPermission() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new JVMCIPermission());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private JVMCICompilerFactory(Void ignore) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes a new instance of this class.
|
||||
*
|
||||
* @throws SecurityException if a security manager has been installed and it denies
|
||||
* {@link JVMCIPermission}
|
||||
*/
|
||||
protected JVMCICompilerFactory() {
|
||||
this(checkPermission());
|
||||
}
|
||||
public interface JVMCICompilerFactory {
|
||||
|
||||
/**
|
||||
* Get the name of this compiler. The name is used by JVMCI to determine which factory to use.
|
||||
*/
|
||||
public abstract String getCompilerName();
|
||||
String getCompilerName();
|
||||
|
||||
/**
|
||||
* Notifies this object that it has been selected to {@linkplain #createCompiler(JVMCIRuntime)
|
||||
* create} a compiler and it should now perform any heavy weight initialization that it deferred
|
||||
* during construction.
|
||||
*/
|
||||
public void onSelection() {
|
||||
default void onSelection() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new instance of a {@link JVMCICompiler}.
|
||||
*/
|
||||
public abstract JVMCICompiler createCompiler(JVMCIRuntime runtime);
|
||||
JVMCICompiler createCompiler(JVMCIRuntime runtime);
|
||||
|
||||
/**
|
||||
* Prints a description of the properties used to configure this compiler.
|
||||
*
|
||||
* @param out where to print the message
|
||||
*/
|
||||
public void printProperties(PrintStream out) {
|
||||
default void printProperties(PrintStream out) {
|
||||
}
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package jdk.vm.ci.services;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Service-provider class for the runtime to locate providers of JVMCI services where the latter are
|
||||
* not in packages exported by the JVMCI module. As part of instantiating
|
||||
* {@link JVMCIServiceLocator}, all JVMCI packages will be {@linkplain Services#exportJVMCITo(Class)
|
||||
* exported} to the module defining the class of the instantiated object.
|
||||
*
|
||||
* While the {@link #getProvider(Class)} method can be used directly, it's usually easier to use
|
||||
* {@link #getProviders(Class)}.
|
||||
*/
|
||||
public abstract class JVMCIServiceLocator {
|
||||
|
||||
private static Void checkPermission() {
|
||||
SecurityManager sm = System.getSecurityManager();
|
||||
if (sm != null) {
|
||||
sm.checkPermission(new JVMCIPermission());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private JVMCIServiceLocator(Void ignore) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a capability for accessing JVMCI. Once successfully instantiated, JVMCI exports all
|
||||
* its packages to the module defining the type of this object.
|
||||
*
|
||||
* @throws SecurityException if a security manager has been installed and it denies
|
||||
* {@link JVMCIPermission}
|
||||
*/
|
||||
protected JVMCIServiceLocator() {
|
||||
this(checkPermission());
|
||||
Services.exportJVMCITo(getClass());
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the provider of the service defined by {@code service} or {@code null} if this object
|
||||
* does not have a provider for {@code service}.
|
||||
*/
|
||||
public abstract <S> S getProvider(Class<S> service);
|
||||
|
||||
/**
|
||||
* Gets the providers of the service defined by {@code service} by querying the
|
||||
* {@link JVMCIServiceLocator} providers obtained by {@link Services#load(Class)}.
|
||||
*/
|
||||
public static <S> List<S> getProviders(Class<S> service) {
|
||||
List<S> providers = new ArrayList<>();
|
||||
for (JVMCIServiceLocator access : Services.load(JVMCIServiceLocator.class)) {
|
||||
S provider = access.getProvider(service);
|
||||
if (provider != null) {
|
||||
providers.add(provider);
|
||||
}
|
||||
}
|
||||
return providers;
|
||||
}
|
||||
}
|
@ -349,7 +349,6 @@ public class SPARC extends Architecture {
|
||||
SUN4V,
|
||||
BLK_INIT_INSTRUCTIONS,
|
||||
FMAF,
|
||||
FMAU,
|
||||
SPARC64_FAMILY,
|
||||
M_FAMILY,
|
||||
T_FAMILY,
|
||||
|
@ -25,12 +25,9 @@
|
||||
|
||||
module jdk.vm.ci {
|
||||
exports jdk.vm.ci.services;
|
||||
exports jdk.vm.ci.runtime.services;
|
||||
exports jdk.vm.ci.hotspot.services;
|
||||
|
||||
uses jdk.vm.ci.hotspot.services.HotSpotVMEventListener;
|
||||
uses jdk.vm.ci.services.JVMCIServiceLocator;
|
||||
uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory;
|
||||
uses jdk.vm.ci.runtime.services.JVMCICompilerFactory;
|
||||
|
||||
provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with
|
||||
jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory;
|
||||
|
@ -2563,7 +2563,7 @@ bool os::get_page_info(char *start, page_info* info) {
|
||||
uint64_t outdata[2];
|
||||
uint_t validity = 0;
|
||||
|
||||
if (os::Solaris::meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
|
||||
if (meminfo(&addr, 1, info_types, 2, outdata, &validity) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2601,7 +2601,7 @@ char *os::scan_pages(char *start, char* end, page_info* page_expected,
|
||||
addrs_count++;
|
||||
}
|
||||
|
||||
if (os::Solaris::meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
|
||||
if (meminfo(addrs, addrs_count, info_types, types, outdata, validity) < 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -4160,9 +4160,6 @@ void os::Solaris::install_signal_handlers() {
|
||||
void report_error(const char* file_name, int line_no, const char* title,
|
||||
const char* format, ...);
|
||||
|
||||
// (Static) wrapper for getisax(2) call.
|
||||
os::Solaris::getisax_func_t os::Solaris::_getisax = 0;
|
||||
|
||||
// (Static) wrappers for the liblgrp API
|
||||
os::Solaris::lgrp_home_func_t os::Solaris::_lgrp_home;
|
||||
os::Solaris::lgrp_init_func_t os::Solaris::_lgrp_init;
|
||||
@ -4174,9 +4171,6 @@ os::Solaris::lgrp_nlgrps_func_t os::Solaris::_lgrp_nlgrps;
|
||||
os::Solaris::lgrp_cookie_stale_func_t os::Solaris::_lgrp_cookie_stale;
|
||||
os::Solaris::lgrp_cookie_t os::Solaris::_lgrp_cookie = 0;
|
||||
|
||||
// (Static) wrapper for meminfo() call.
|
||||
os::Solaris::meminfo_func_t os::Solaris::_meminfo = 0;
|
||||
|
||||
static address resolve_symbol_lazy(const char* name) {
|
||||
address addr = (address) dlsym(RTLD_DEFAULT, name);
|
||||
if (addr == NULL) {
|
||||
@ -4300,27 +4294,6 @@ bool os::Solaris::liblgrp_init() {
|
||||
return false;
|
||||
}
|
||||
|
||||
void os::Solaris::misc_sym_init() {
|
||||
address func;
|
||||
|
||||
// getisax
|
||||
func = resolve_symbol_lazy("getisax");
|
||||
if (func != NULL) {
|
||||
os::Solaris::_getisax = CAST_TO_FN_PTR(getisax_func_t, func);
|
||||
}
|
||||
|
||||
// meminfo
|
||||
func = resolve_symbol_lazy("meminfo");
|
||||
if (func != NULL) {
|
||||
os::Solaris::set_meminfo(CAST_TO_FN_PTR(meminfo_func_t, func));
|
||||
}
|
||||
}
|
||||
|
||||
uint_t os::Solaris::getisax(uint32_t* array, uint_t n) {
|
||||
assert(_getisax != NULL, "_getisax not set");
|
||||
return _getisax(array, n);
|
||||
}
|
||||
|
||||
// int pset_getloadavg(psetid_t pset, double loadavg[], int nelem);
|
||||
typedef long (*pset_getloadavg_type)(psetid_t pset, double loadavg[], int nelem);
|
||||
static pset_getloadavg_type pset_getloadavg_ptr = NULL;
|
||||
@ -4351,10 +4324,6 @@ void os::init(void) {
|
||||
|
||||
Solaris::initialize_system_info();
|
||||
|
||||
// Initialize misc. symbols as soon as possible, so we can use them
|
||||
// if we need them.
|
||||
Solaris::misc_sym_init();
|
||||
|
||||
int fd = ::open("/dev/zero", O_RDWR);
|
||||
if (fd < 0) {
|
||||
fatal("os::init: cannot open /dev/zero (%s)", os::strerror(errno));
|
||||
|
@ -73,8 +73,6 @@ class Solaris {
|
||||
LGRP_VIEW_OS // what's available to operating system
|
||||
} lgrp_view_t;
|
||||
|
||||
typedef uint_t (*getisax_func_t)(uint32_t* array, uint_t n);
|
||||
|
||||
typedef lgrp_id_t (*lgrp_home_func_t)(idtype_t idtype, id_t id);
|
||||
typedef lgrp_cookie_t (*lgrp_init_func_t)(lgrp_view_t view);
|
||||
typedef int (*lgrp_fini_func_t)(lgrp_cookie_t cookie);
|
||||
@ -86,11 +84,6 @@ class Solaris {
|
||||
lgrp_rsrc_t type);
|
||||
typedef int (*lgrp_nlgrps_func_t)(lgrp_cookie_t cookie);
|
||||
typedef int (*lgrp_cookie_stale_func_t)(lgrp_cookie_t cookie);
|
||||
typedef int (*meminfo_func_t)(const uint64_t inaddr[], int addr_count,
|
||||
const uint_t info_req[], int info_count,
|
||||
uint64_t outdata[], uint_t validity[]);
|
||||
|
||||
static getisax_func_t _getisax;
|
||||
|
||||
static lgrp_home_func_t _lgrp_home;
|
||||
static lgrp_init_func_t _lgrp_init;
|
||||
@ -102,8 +95,6 @@ class Solaris {
|
||||
static lgrp_cookie_stale_func_t _lgrp_cookie_stale;
|
||||
static lgrp_cookie_t _lgrp_cookie;
|
||||
|
||||
static meminfo_func_t _meminfo;
|
||||
|
||||
// Large Page Support
|
||||
static bool is_valid_page_size(size_t bytes);
|
||||
static size_t page_size_for_alignment(size_t alignment);
|
||||
@ -191,8 +182,6 @@ class Solaris {
|
||||
static void libthread_init();
|
||||
static void synchronization_init();
|
||||
static bool liblgrp_init();
|
||||
// Load miscellaneous symbols.
|
||||
static void misc_sym_init();
|
||||
// This boolean allows users to forward their own non-matching signals
|
||||
// to JVM_handle_solaris_signal, harmlessly.
|
||||
static bool signal_handlers_are_installed;
|
||||
@ -272,17 +261,6 @@ class Solaris {
|
||||
}
|
||||
static lgrp_cookie_t lgrp_cookie() { return _lgrp_cookie; }
|
||||
|
||||
static bool supports_getisax() { return _getisax != NULL; }
|
||||
static uint_t getisax(uint32_t* array, uint_t n);
|
||||
|
||||
static void set_meminfo(meminfo_func_t func) { _meminfo = func; }
|
||||
static int meminfo (const uint64_t inaddr[], int addr_count,
|
||||
const uint_t info_req[], int info_count,
|
||||
uint64_t outdata[], uint_t validity[]) {
|
||||
return _meminfo != NULL ? _meminfo(inaddr, addr_count, info_req, info_count,
|
||||
outdata, validity) : -1;
|
||||
}
|
||||
|
||||
static sigset_t* unblocked_signals();
|
||||
static sigset_t* vm_signals();
|
||||
static sigset_t* allowdebug_blocked_signals();
|
||||
|
@ -784,7 +784,7 @@ void os::set_native_thread_name(const char *name) {
|
||||
|
||||
__try {
|
||||
RaiseException (MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info );
|
||||
} __except(EXCEPTION_CONTINUE_EXECUTION) {}
|
||||
} __except(EXCEPTION_EXECUTE_HANDLER) {}
|
||||
}
|
||||
|
||||
bool os::distribute_processes(uint length, uint* distribution) {
|
||||
|
@ -1404,12 +1404,14 @@ static HANDLE open_sharedmem_object(const char* objectname, DWORD ofm_access, TR
|
||||
objectname); /* name for object */
|
||||
|
||||
if (fmh == NULL) {
|
||||
DWORD lasterror = GetLastError();
|
||||
if (PrintMiscellaneous && Verbose) {
|
||||
warning("OpenFileMapping failed for shared memory object %s:"
|
||||
" lasterror = %d\n", objectname, GetLastError());
|
||||
" lasterror = %d\n", objectname, lasterror);
|
||||
}
|
||||
THROW_MSG_(vmSymbols::java_lang_Exception(),
|
||||
"Could not open PerfMemory", INVALID_HANDLE_VALUE);
|
||||
THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(),
|
||||
err_msg("Could not open PerfMemory, error %d", lasterror),
|
||||
INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
return fmh;;
|
||||
|
@ -343,8 +343,15 @@ public:
|
||||
#define _SC_L2CACHE_LINESZ 527 /* Size of L2 cache line */
|
||||
#endif
|
||||
|
||||
// Hardware capability bits that appeared after Solaris 11.1
|
||||
#ifndef AV_SPARC_FMAF
|
||||
#define AV_SPARC_FMAF 0x00000100 /* Fused Multiply-Add */
|
||||
#endif
|
||||
#ifndef AV2_SPARC_SPARC5
|
||||
#define AV2_SPARC_SPARC5 0x00000008 /* The 29 new fp and sub instructions */
|
||||
#endif
|
||||
|
||||
int VM_Version::platform_features(int features) {
|
||||
assert(os::Solaris::supports_getisax(), "getisax() must be available");
|
||||
|
||||
// Check 32-bit architecture.
|
||||
if (Sysinfo(SI_ARCHITECTURE_32).match("sparc")) {
|
||||
@ -357,119 +364,75 @@ int VM_Version::platform_features(int features) {
|
||||
}
|
||||
|
||||
// Extract valid instruction set extensions.
|
||||
uint_t avs[2];
|
||||
uint_t avn = os::Solaris::getisax(avs, 2);
|
||||
assert(avn <= 2, "should return two or less av's");
|
||||
uint_t av = avs[0];
|
||||
uint_t avs[AV_HW2_IDX + 1];
|
||||
uint_t avn = getisax(avs, ARRAY_SIZE(avs));
|
||||
|
||||
log_info(os, cpu)("getisax(2) returned: " PTR32_FORMAT, av);
|
||||
if (avn > 1) {
|
||||
log_info(os, cpu)(" " PTR32_FORMAT, avs[1]);
|
||||
log_info(os, cpu)("getisax(2) returned %d words:", avn);
|
||||
for (int i = 0; i < avn; i++) {
|
||||
log_info(os, cpu)(" word %d: " PTR32_FORMAT, i, avs[i]);
|
||||
}
|
||||
|
||||
if (av & AV_SPARC_MUL32) features |= hardware_mul32_m;
|
||||
if (av & AV_SPARC_DIV32) features |= hardware_div32_m;
|
||||
if (av & AV_SPARC_FSMULD) features |= hardware_fsmuld_m;
|
||||
if (av & AV_SPARC_V8PLUS) features |= v9_instructions_m;
|
||||
if (av & AV_SPARC_POPC) features |= hardware_popc_m;
|
||||
if (av & AV_SPARC_VIS) features |= vis1_instructions_m;
|
||||
if (av & AV_SPARC_VIS2) features |= vis2_instructions_m;
|
||||
if (avn > 1) {
|
||||
uint_t av2 = avs[1];
|
||||
#ifndef AV2_SPARC_SPARC5
|
||||
#define AV2_SPARC_SPARC5 0x00000008 /* The 29 new fp and sub instructions */
|
||||
#endif
|
||||
if (av2 & AV2_SPARC_SPARC5) features |= sparc5_instructions_m;
|
||||
uint_t av1 = avs[AV_HW1_IDX];
|
||||
if (av1 & AV_SPARC_MUL32) features |= hardware_mul32_m;
|
||||
if (av1 & AV_SPARC_DIV32) features |= hardware_div32_m;
|
||||
if (av1 & AV_SPARC_FSMULD) features |= hardware_fsmuld_m;
|
||||
if (av1 & AV_SPARC_V8PLUS) features |= v9_instructions_m;
|
||||
if (av1 & AV_SPARC_POPC) features |= hardware_popc_m;
|
||||
if (av1 & AV_SPARC_VIS) features |= vis1_instructions_m;
|
||||
if (av1 & AV_SPARC_VIS2) features |= vis2_instructions_m;
|
||||
if (av1 & AV_SPARC_ASI_BLK_INIT) features |= blk_init_instructions_m;
|
||||
if (av1 & AV_SPARC_FMAF) features |= fmaf_instructions_m;
|
||||
if (av1 & AV_SPARC_VIS3) features |= vis3_instructions_m;
|
||||
if (av1 & AV_SPARC_CBCOND) features |= cbcond_instructions_m;
|
||||
if (av1 & AV_SPARC_CRC32C) features |= crc32c_instruction_m;
|
||||
if (av1 & AV_SPARC_AES) features |= aes_instructions_m;
|
||||
if (av1 & AV_SPARC_SHA1) features |= sha1_instruction_m;
|
||||
if (av1 & AV_SPARC_SHA256) features |= sha256_instruction_m;
|
||||
if (av1 & AV_SPARC_SHA512) features |= sha512_instruction_m;
|
||||
|
||||
if (avn > AV_HW2_IDX) {
|
||||
uint_t av2 = avs[AV_HW2_IDX];
|
||||
if (av2 & AV2_SPARC_SPARC5) features |= sparc5_instructions_m;
|
||||
}
|
||||
|
||||
// We only build on Solaris 10 and up, but some of the values below
|
||||
// are not defined on all versions of Solaris 10, so we define them,
|
||||
// if necessary.
|
||||
#ifndef AV_SPARC_ASI_BLK_INIT
|
||||
#define AV_SPARC_ASI_BLK_INIT 0x0080 /* ASI_BLK_INIT_xxx ASI */
|
||||
#endif
|
||||
if (av & AV_SPARC_ASI_BLK_INIT) features |= blk_init_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_FMAF
|
||||
#define AV_SPARC_FMAF 0x0100 /* Fused Multiply-Add */
|
||||
#endif
|
||||
if (av & AV_SPARC_FMAF) features |= fmaf_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_FMAU
|
||||
#define AV_SPARC_FMAU 0x0200 /* Unfused Multiply-Add */
|
||||
#endif
|
||||
if (av & AV_SPARC_FMAU) features |= fmau_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_VIS3
|
||||
#define AV_SPARC_VIS3 0x0400 /* VIS3 instruction set extensions */
|
||||
#endif
|
||||
if (av & AV_SPARC_VIS3) features |= vis3_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_CBCOND
|
||||
#define AV_SPARC_CBCOND 0x10000000 /* compare and branch instrs supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_CBCOND) features |= cbcond_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_CRC32C
|
||||
#define AV_SPARC_CRC32C 0x20000000 /* crc32c instruction supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_CRC32C) features |= crc32c_instruction_m;
|
||||
|
||||
#ifndef AV_SPARC_AES
|
||||
#define AV_SPARC_AES 0x00020000 /* aes instrs supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_AES) features |= aes_instructions_m;
|
||||
|
||||
#ifndef AV_SPARC_SHA1
|
||||
#define AV_SPARC_SHA1 0x00400000 /* sha1 instruction supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_SHA1) features |= sha1_instruction_m;
|
||||
|
||||
#ifndef AV_SPARC_SHA256
|
||||
#define AV_SPARC_SHA256 0x00800000 /* sha256 instruction supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_SHA256) features |= sha256_instruction_m;
|
||||
|
||||
#ifndef AV_SPARC_SHA512
|
||||
#define AV_SPARC_SHA512 0x01000000 /* sha512 instruction supported */
|
||||
#endif
|
||||
if (av & AV_SPARC_SHA512) features |= sha512_instruction_m;
|
||||
|
||||
// Determine the machine type.
|
||||
if (Sysinfo(SI_MACHINE).match("sun4v")) {
|
||||
features |= sun4v_m;
|
||||
}
|
||||
|
||||
bool use_solaris_12_api = false;
|
||||
Sysinfo impl(SI_CPUBRAND);
|
||||
if (impl.valid()) {
|
||||
// If SI_CPUBRAND works, that means Solaris 12 API to get the cache line sizes
|
||||
// is available to us as well
|
||||
use_solaris_12_api = true;
|
||||
features |= parse_features(impl.value());
|
||||
// If SI_CPUBRAND works, that means Solaris 12 API to get the cache line sizes
|
||||
// is available to us as well
|
||||
Sysinfo cpu_info(SI_CPUBRAND);
|
||||
bool use_solaris_12_api = cpu_info.valid();
|
||||
const char* impl;
|
||||
int impl_m = 0;
|
||||
if (use_solaris_12_api) {
|
||||
impl = cpu_info.value();
|
||||
log_info(os, cpu)("Parsing CPU implementation from %s", impl);
|
||||
impl_m = parse_features(impl);
|
||||
} else {
|
||||
// Otherwise use kstat to determine the machine type.
|
||||
kstat_ctl_t* kc = kstat_open();
|
||||
kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, NULL);
|
||||
const char* implementation;
|
||||
bool has_implementation = false;
|
||||
if (ksp != NULL) {
|
||||
if (kstat_read(kc, ksp, NULL) != -1 && ksp->ks_data != NULL) {
|
||||
kstat_named_t* knm = (kstat_named_t *)ksp->ks_data;
|
||||
for (int i = 0; i < ksp->ks_ndata; i++) {
|
||||
if (strcmp((const char*)&(knm[i].name),"implementation") == 0) {
|
||||
implementation = KSTAT_NAMED_STR_PTR(&knm[i]);
|
||||
has_implementation = true;
|
||||
log_info(os, cpu)("cpu_info.implementation: %s", implementation);
|
||||
features |= parse_features(implementation);
|
||||
break;
|
||||
if (kc != NULL) {
|
||||
kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, NULL);
|
||||
if (ksp != NULL) {
|
||||
if (kstat_read(kc, ksp, NULL) != -1 && ksp->ks_data != NULL) {
|
||||
kstat_named_t* knm = (kstat_named_t *)ksp->ks_data;
|
||||
for (int i = 0; i < ksp->ks_ndata; i++) {
|
||||
if (strcmp((const char*)&(knm[i].name), "implementation") == 0) {
|
||||
impl = KSTAT_NAMED_STR_PTR(&knm[i]);
|
||||
log_info(os, cpu)("Parsing CPU implementation from %s", impl);
|
||||
impl_m = parse_features(impl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} // for(
|
||||
}
|
||||
}
|
||||
kstat_close(kc);
|
||||
}
|
||||
assert(has_implementation, "unknown cpu info (changed kstat interface?)");
|
||||
kstat_close(kc);
|
||||
}
|
||||
assert(impl_m != 0, "Unknown CPU implementation %s", impl);
|
||||
features |= impl_m;
|
||||
|
||||
bool is_sun4v = (features & sun4v_m) != 0;
|
||||
if (use_solaris_12_api && is_sun4v) {
|
||||
|
@ -1493,6 +1493,21 @@ void GraphBuilder::method_return(Value x, bool ignore_return) {
|
||||
// Check to see whether we are inlining. If so, Return
|
||||
// instructions become Gotos to the continuation point.
|
||||
if (continuation() != NULL) {
|
||||
|
||||
int invoke_bci = state()->caller_state()->bci();
|
||||
|
||||
if (x != NULL && !ignore_return) {
|
||||
ciMethod* caller = state()->scope()->caller()->method();
|
||||
Bytecodes::Code invoke_raw_bc = caller->raw_code_at_bci(invoke_bci);
|
||||
if (invoke_raw_bc == Bytecodes::_invokehandle || invoke_raw_bc == Bytecodes::_invokedynamic) {
|
||||
ciType* declared_ret_type = caller->get_declared_signature_at_bci(invoke_bci)->return_type();
|
||||
if (declared_ret_type->is_klass() && x->exact_type() == NULL &&
|
||||
x->declared_type() != declared_ret_type && declared_ret_type != compilation()->env()->Object_klass()) {
|
||||
x = append(new TypeCast(declared_ret_type->as_klass(), x, copy_state_before()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assert(!method()->is_synchronized() || InlineSynchronizedMethods, "can not inline synchronized methods yet");
|
||||
|
||||
if (compilation()->env()->dtrace_method_probes()) {
|
||||
@ -1516,7 +1531,6 @@ void GraphBuilder::method_return(Value x, bool ignore_return) {
|
||||
// State at end of inlined method is the state of the caller
|
||||
// without the method parameters on stack, including the
|
||||
// return value, if any, of the inlined method on operand stack.
|
||||
int invoke_bci = state()->caller_state()->bci();
|
||||
set_state(state()->caller_state()->copy_for_parsing());
|
||||
if (x != NULL) {
|
||||
if (!ignore_return) {
|
||||
|
@ -360,7 +360,8 @@ void Invoke::state_values_do(ValueVisitor* f) {
|
||||
}
|
||||
|
||||
ciType* Invoke::declared_type() const {
|
||||
ciType *t = _target->signature()->return_type();
|
||||
ciSignature* declared_signature = state()->scope()->method()->get_declared_signature_at_bci(state()->bci());
|
||||
ciType *t = declared_signature->return_type();
|
||||
assert(t->basic_type() != T_VOID, "need return value of void method?");
|
||||
return t;
|
||||
}
|
||||
|
@ -256,6 +256,14 @@ class ciMethod : public ciMetadata {
|
||||
return get_method_at_bci(bci, ignored_will_link, &ignored_declared_signature);
|
||||
}
|
||||
|
||||
ciSignature* get_declared_signature_at_bci(int bci) {
|
||||
bool ignored_will_link;
|
||||
ciSignature* declared_signature;
|
||||
get_method_at_bci(bci, ignored_will_link, &declared_signature);
|
||||
assert(declared_signature != NULL, "cannot be null");
|
||||
return declared_signature;
|
||||
}
|
||||
|
||||
// Given a certain calling environment, find the monomorphic target
|
||||
// for the call. Return NULL if the call is not monomorphic in
|
||||
// its calling environment.
|
||||
|
@ -2041,7 +2041,6 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
||||
if (nm != NULL && !m->is_method_handle_intrinsic()) {
|
||||
// Throw out the code so that the code cache doesn't fill up
|
||||
nm->make_not_entrant();
|
||||
m->clear_code();
|
||||
}
|
||||
CompileBroker::compile_method(m, InvocationEntryBci, CompLevel_full_optimization,
|
||||
methodHandle(), 0, CompileTask::Reason_CTW, THREAD);
|
||||
@ -2060,7 +2059,6 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
||||
if (nm != NULL && !m->is_method_handle_intrinsic()) {
|
||||
// Throw out the code so that the code cache doesn't fill up
|
||||
nm->make_not_entrant();
|
||||
m->clear_code();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -780,19 +780,26 @@ void java_lang_Class::set_mirror_module_field(KlassHandle k, Handle mirror, Hand
|
||||
// Put the class on the fixup_module_list to patch later when the java.lang.reflect.Module
|
||||
// for java.base is known.
|
||||
assert(!Universe::is_module_initialized(), "Incorrect java.lang.reflect.Module pre module system initialization");
|
||||
MutexLocker m1(Module_lock, THREAD);
|
||||
// Keep list of classes needing java.base module fixup
|
||||
if (!ModuleEntryTable::javabase_defined()) {
|
||||
if (fixup_module_field_list() == NULL) {
|
||||
GrowableArray<Klass*>* list =
|
||||
new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, true);
|
||||
set_fixup_module_field_list(list);
|
||||
|
||||
bool javabase_was_defined = false;
|
||||
{
|
||||
MutexLocker m1(Module_lock, THREAD);
|
||||
// Keep list of classes needing java.base module fixup
|
||||
if (!ModuleEntryTable::javabase_defined()) {
|
||||
if (fixup_module_field_list() == NULL) {
|
||||
GrowableArray<Klass*>* list =
|
||||
new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, true);
|
||||
set_fixup_module_field_list(list);
|
||||
}
|
||||
k->class_loader_data()->inc_keep_alive();
|
||||
fixup_module_field_list()->push(k());
|
||||
} else {
|
||||
javabase_was_defined = true;
|
||||
}
|
||||
k->class_loader_data()->inc_keep_alive();
|
||||
fixup_module_field_list()->push(k());
|
||||
} else {
|
||||
// java.base was defined at some point between calling create_mirror()
|
||||
// and obtaining the Module_lock, patch this particular class with java.base.
|
||||
}
|
||||
|
||||
// If java.base was already defined then patch this particular class with java.base.
|
||||
if (javabase_was_defined) {
|
||||
ModuleEntry *javabase_entry = ModuleEntryTable::javabase_moduleEntry();
|
||||
assert(javabase_entry != NULL && javabase_entry->module() != NULL,
|
||||
"Setting class module field, java.base should be defined");
|
||||
|
@ -368,9 +368,6 @@ void ModuleEntryTable::finalize_javabase(Handle module_handle, Symbol* version,
|
||||
|
||||
// Store pointer to the ModuleEntry for java.base in the java.lang.reflect.Module object.
|
||||
java_lang_reflect_Module::set_module_entry(module_handle(), jb_module);
|
||||
|
||||
// Patch any previously loaded classes' module field with java.base's java.lang.reflect.Module.
|
||||
patch_javabase_entries(module_handle);
|
||||
}
|
||||
|
||||
// Within java.lang.Class instances there is a java.lang.reflect.Module field
|
||||
@ -378,7 +375,6 @@ void ModuleEntryTable::finalize_javabase(Handle module_handle, Symbol* version,
|
||||
// definition, classes needing their module field set are added to the fixup_module_list.
|
||||
// Their module field is set once java.base's java.lang.reflect.Module is known to the VM.
|
||||
void ModuleEntryTable::patch_javabase_entries(Handle module_handle) {
|
||||
assert(Module_lock->owned_by_self(), "should have the Module_lock");
|
||||
if (module_handle.is_null()) {
|
||||
fatal("Unable to patch the module field of classes loaded prior to java.base's definition, invalid java.lang.reflect.Module");
|
||||
}
|
||||
|
@ -244,6 +244,12 @@ static void define_javabase_module(jobject module, jstring version,
|
||||
"Module java.base is already defined");
|
||||
}
|
||||
|
||||
// Only the thread that actually defined the base module will get here,
|
||||
// so no locking is needed.
|
||||
|
||||
// Patch any previously loaded class's module field with java.base's java.lang.reflect.Module.
|
||||
ModuleEntryTable::patch_javabase_entries(module_handle);
|
||||
|
||||
log_debug(modules)("define_javabase_module(): Definition of module: java.base,"
|
||||
" version: %s, location: %s, package #: %d",
|
||||
module_version != NULL ? module_version : "NULL",
|
||||
|
@ -226,7 +226,7 @@ class SystemDictionary : AllStatic {
|
||||
WKID_LIMIT,
|
||||
|
||||
#if INCLUDE_JVMCI
|
||||
FIRST_JVMCI_WKID = WK_KLASS_ENUM_NAME(HotSpotCompiledCode_klass),
|
||||
FIRST_JVMCI_WKID = WK_KLASS_ENUM_NAME(JVMCI_klass),
|
||||
LAST_JVMCI_WKID = WK_KLASS_ENUM_NAME(Value_klass),
|
||||
#endif
|
||||
|
||||
|
@ -1252,7 +1252,7 @@ bool nmethod::make_not_entrant_or_zombie(unsigned int state) {
|
||||
if (method() != NULL && (method()->code() == this ||
|
||||
method()->from_compiled_entry() == verified_entry_point())) {
|
||||
HandleMark hm;
|
||||
method()->clear_code();
|
||||
method()->clear_code(false /* already owns Patching_lock */);
|
||||
}
|
||||
} // leave critical region under Patching_lock
|
||||
|
||||
|
@ -35,7 +35,6 @@
|
||||
#include "prims/jni_md.h"
|
||||
#include "utilities/ticks.hpp"
|
||||
|
||||
#define LOG_STOP_TIME_FORMAT "(%.3fs, %.3fs) %.3fms"
|
||||
#define LOG_STOP_HEAP_FORMAT SIZE_FORMAT "M->" SIZE_FORMAT "M(" SIZE_FORMAT "M)"
|
||||
|
||||
inline void GCTraceTimeImpl::log_start(jlong start_counter) {
|
||||
@ -46,7 +45,7 @@ inline void GCTraceTimeImpl::log_start(jlong start_counter) {
|
||||
if (_gc_cause != GCCause::_no_gc) {
|
||||
out.print(" (%s)", GCCause::to_string(_gc_cause));
|
||||
}
|
||||
out.print_cr(" (%.3fs)", TimeHelper::counter_to_seconds(start_counter));
|
||||
out.cr();
|
||||
}
|
||||
}
|
||||
|
||||
@ -71,7 +70,7 @@ inline void GCTraceTimeImpl::log_stop(jlong start_counter, jlong stop_counter) {
|
||||
out.print(" " LOG_STOP_HEAP_FORMAT, used_before_m, used_m, capacity_m);
|
||||
}
|
||||
|
||||
out.print_cr(" " LOG_STOP_TIME_FORMAT, start_time_in_secs, stop_time_in_secs, duration_in_ms);
|
||||
out.print_cr(" %.3fms", duration_in_ms);
|
||||
}
|
||||
|
||||
inline void GCTraceTimeImpl::time_stamp(Ticks& ticks) {
|
||||
@ -117,7 +116,7 @@ template <LogLevelType Level, LogTagType T0, LogTagType T1, LogTagType T2, LogTa
|
||||
GCTraceConcTimeImpl<Level, T0, T1, T2, T3, T4, GuardTag>::GCTraceConcTimeImpl(const char* title) :
|
||||
_enabled(LogImpl<T0, T1, T2, T3, T4, GuardTag>::is_level(Level)), _start_time(os::elapsed_counter()), _title(title) {
|
||||
if (_enabled) {
|
||||
LogImpl<T0, T1, T2, T3, T4>::template write<Level>("%s (%.3fs)", _title, TimeHelper::counter_to_seconds(_start_time));
|
||||
LogImpl<T0, T1, T2, T3, T4>::template write<Level>("%s", _title);
|
||||
}
|
||||
}
|
||||
|
||||
@ -125,11 +124,8 @@ template <LogLevelType Level, LogTagType T0, LogTagType T1, LogTagType T2, LogTa
|
||||
GCTraceConcTimeImpl<Level, T0, T1, T2, T3, T4, GuardTag>::~GCTraceConcTimeImpl() {
|
||||
if (_enabled) {
|
||||
jlong stop_time = os::elapsed_counter();
|
||||
LogImpl<T0, T1, T2, T3, T4>::template write<Level>("%s " LOG_STOP_TIME_FORMAT,
|
||||
_title,
|
||||
TimeHelper::counter_to_seconds(_start_time),
|
||||
TimeHelper::counter_to_seconds(stop_time),
|
||||
TimeHelper::counter_to_millis(stop_time - _start_time));
|
||||
LogImpl<T0, T1, T2, T3, T4>::template write<Level>("%s %0.3fms", _title,
|
||||
TimeHelper::counter_to_millis(stop_time - _start_time));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -172,7 +172,7 @@ OopMap* CodeInstaller::create_oop_map(Handle debug_info, TRAPS) {
|
||||
return map;
|
||||
}
|
||||
|
||||
void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
|
||||
void* CodeInstaller::record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS) {
|
||||
/*
|
||||
* This method needs to return a raw (untyped) pointer, since the value of a pointer to the base
|
||||
* class is in general not equal to the pointer of the subclass. When patching metaspace pointers,
|
||||
@ -184,12 +184,14 @@ void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
|
||||
Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
|
||||
assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed klass pointer %s @ " INTPTR_FORMAT, klass->name()->as_C_string(), p2i(klass));
|
||||
int index = _oop_recorder->find_index(klass);
|
||||
section->relocate(dest, metadata_Relocation::spec(index));
|
||||
TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
|
||||
return klass;
|
||||
} else if (obj->is_a(HotSpotResolvedJavaMethodImpl::klass())) {
|
||||
Method* method = (Method*) (address) HotSpotResolvedJavaMethodImpl::metaspaceMethod(obj);
|
||||
assert(!HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected compressed method pointer %s @ " INTPTR_FORMAT, method->name()->as_C_string(), p2i(method));
|
||||
int index = _oop_recorder->find_index(method);
|
||||
section->relocate(dest, metadata_Relocation::spec(index));
|
||||
TRACE_jvmci_3("metadata[%d of %d] = %s", index, _oop_recorder->metadata_count(), method->name()->as_C_string());
|
||||
return method;
|
||||
} else {
|
||||
@ -198,7 +200,7 @@ void* CodeInstaller::record_metadata_reference(Handle constant, TRAPS) {
|
||||
}
|
||||
|
||||
#ifdef _LP64
|
||||
narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle constant, TRAPS) {
|
||||
narrowKlass CodeInstaller::record_narrow_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS) {
|
||||
oop obj = HotSpotMetaspaceConstantImpl::metaspaceObject(constant);
|
||||
assert(HotSpotMetaspaceConstantImpl::compressed(constant), "unexpected uncompressed pointer");
|
||||
|
||||
@ -208,6 +210,7 @@ narrowKlass CodeInstaller::record_narrow_metadata_reference(Handle constant, TRA
|
||||
|
||||
Klass* klass = java_lang_Class::as_Klass(HotSpotResolvedObjectTypeImpl::javaClass(obj));
|
||||
int index = _oop_recorder->find_index(klass);
|
||||
section->relocate(dest, metadata_Relocation::spec(index));
|
||||
TRACE_jvmci_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
|
||||
return Klass::encode_klass(klass);
|
||||
}
|
||||
@ -701,12 +704,12 @@ JVMCIEnv::CodeInstallResult CodeInstaller::initialize_buffer(CodeBuffer& buffer,
|
||||
if (constant->is_a(HotSpotMetaspaceConstantImpl::klass())) {
|
||||
if (HotSpotMetaspaceConstantImpl::compressed(constant)) {
|
||||
#ifdef _LP64
|
||||
*((narrowKlass*) dest) = record_narrow_metadata_reference(constant, CHECK_OK);
|
||||
*((narrowKlass*) dest) = record_narrow_metadata_reference(_constants, dest, constant, CHECK_OK);
|
||||
#else
|
||||
JVMCI_ERROR_OK("unexpected compressed Klass* in 32-bit mode");
|
||||
#endif
|
||||
} else {
|
||||
*((void**) dest) = record_metadata_reference(constant, CHECK_OK);
|
||||
*((void**) dest) = record_metadata_reference(_constants, dest, constant, CHECK_OK);
|
||||
}
|
||||
} else if (constant->is_a(HotSpotObjectConstantImpl::klass())) {
|
||||
Handle obj = HotSpotObjectConstantImpl::object(constant);
|
||||
|
@ -189,9 +189,9 @@ protected:
|
||||
ScopeValue* get_scope_value(Handle value, BasicType type, GrowableArray<ScopeValue*>* objects, ScopeValue* &second, TRAPS);
|
||||
MonitorValue* get_monitor_value(Handle value, GrowableArray<ScopeValue*>* objects, TRAPS);
|
||||
|
||||
void* record_metadata_reference(Handle constant, TRAPS);
|
||||
void* record_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS);
|
||||
#ifdef _LP64
|
||||
narrowKlass record_narrow_metadata_reference(Handle constant, TRAPS);
|
||||
narrowKlass record_narrow_metadata_reference(CodeSection* section, address dest, Handle constant, TRAPS);
|
||||
#endif
|
||||
|
||||
// extract the fields of the HotSpotCompiledCode
|
||||
|
@ -640,8 +640,6 @@ JVM_ENTRY(jobject, JVM_GetJVMCIRuntime(JNIEnv *env, jclass c))
|
||||
JVM_END
|
||||
|
||||
Handle JVMCIRuntime::callStatic(const char* className, const char* methodName, const char* signature, JavaCallArguments* args, TRAPS) {
|
||||
guarantee(!_HotSpotJVMCIRuntime_initialized, "cannot reinitialize HotSpotJVMCIRuntime");
|
||||
|
||||
TempNewSymbol name = SymbolTable::new_symbol(className, CHECK_(Handle()));
|
||||
KlassHandle klass = SystemDictionary::resolve_or_fail(name, true, CHECK_(Handle()));
|
||||
TempNewSymbol runtime = SymbolTable::new_symbol(methodName, CHECK_(Handle()));
|
||||
@ -656,42 +654,37 @@ Handle JVMCIRuntime::callStatic(const char* className, const char* methodName, c
|
||||
}
|
||||
|
||||
void JVMCIRuntime::initialize_HotSpotJVMCIRuntime(TRAPS) {
|
||||
if (JNIHandles::resolve(_HotSpotJVMCIRuntime_instance) == NULL) {
|
||||
ResourceMark rm;
|
||||
#ifdef ASSERT
|
||||
// This should only be called in the context of the JVMCI class being initialized
|
||||
TempNewSymbol name = SymbolTable::new_symbol("jdk/vm/ci/runtime/JVMCI", CHECK);
|
||||
Klass* k = SystemDictionary::resolve_or_null(name, CHECK);
|
||||
instanceKlassHandle klass = InstanceKlass::cast(k);
|
||||
assert(klass->is_being_initialized() && klass->is_reentrant_initialization(THREAD),
|
||||
"HotSpotJVMCIRuntime initialization should only be triggered through JVMCI initialization");
|
||||
#endif
|
||||
guarantee(!_HotSpotJVMCIRuntime_initialized, "cannot reinitialize HotSpotJVMCIRuntime");
|
||||
JVMCIRuntime::initialize_well_known_classes(CHECK);
|
||||
// This should only be called in the context of the JVMCI class being initialized
|
||||
instanceKlassHandle klass = InstanceKlass::cast(SystemDictionary::JVMCI_klass());
|
||||
guarantee(klass->is_being_initialized() && klass->is_reentrant_initialization(THREAD),
|
||||
"HotSpotJVMCIRuntime initialization should only be triggered through JVMCI initialization");
|
||||
|
||||
Handle result = callStatic("jdk/vm/ci/hotspot/HotSpotJVMCIRuntime",
|
||||
"runtime",
|
||||
"()Ljdk/vm/ci/hotspot/HotSpotJVMCIRuntime;", NULL, CHECK);
|
||||
objArrayOop trivial_prefixes = HotSpotJVMCIRuntime::trivialPrefixes(result);
|
||||
if (trivial_prefixes != NULL) {
|
||||
char** prefixes = NEW_C_HEAP_ARRAY(char*, trivial_prefixes->length(), mtCompiler);
|
||||
for (int i = 0; i < trivial_prefixes->length(); i++) {
|
||||
oop str = trivial_prefixes->obj_at(i);
|
||||
if (str == NULL) {
|
||||
THROW(vmSymbols::java_lang_NullPointerException());
|
||||
} else {
|
||||
prefixes[i] = strdup(java_lang_String::as_utf8_string(str));
|
||||
}
|
||||
Handle result = callStatic("jdk/vm/ci/hotspot/HotSpotJVMCIRuntime",
|
||||
"runtime",
|
||||
"()Ljdk/vm/ci/hotspot/HotSpotJVMCIRuntime;", NULL, CHECK);
|
||||
objArrayOop trivial_prefixes = HotSpotJVMCIRuntime::trivialPrefixes(result);
|
||||
if (trivial_prefixes != NULL) {
|
||||
char** prefixes = NEW_C_HEAP_ARRAY(char*, trivial_prefixes->length(), mtCompiler);
|
||||
for (int i = 0; i < trivial_prefixes->length(); i++) {
|
||||
oop str = trivial_prefixes->obj_at(i);
|
||||
if (str == NULL) {
|
||||
THROW(vmSymbols::java_lang_NullPointerException());
|
||||
} else {
|
||||
prefixes[i] = strdup(java_lang_String::as_utf8_string(str));
|
||||
}
|
||||
_trivial_prefixes = prefixes;
|
||||
_trivial_prefixes_count = trivial_prefixes->length();
|
||||
}
|
||||
int adjustment = HotSpotJVMCIRuntime::compilationLevelAdjustment(result);
|
||||
assert(adjustment >= JVMCIRuntime::none &&
|
||||
adjustment <= JVMCIRuntime::by_full_signature,
|
||||
"compilation level adjustment out of bounds");
|
||||
_comp_level_adjustment = (CompLevelAdjustment) adjustment;
|
||||
_HotSpotJVMCIRuntime_initialized = true;
|
||||
_HotSpotJVMCIRuntime_instance = JNIHandles::make_global(result());
|
||||
_trivial_prefixes = prefixes;
|
||||
_trivial_prefixes_count = trivial_prefixes->length();
|
||||
}
|
||||
int adjustment = HotSpotJVMCIRuntime::compilationLevelAdjustment(result);
|
||||
assert(adjustment >= JVMCIRuntime::none &&
|
||||
adjustment <= JVMCIRuntime::by_full_signature,
|
||||
"compilation level adjustment out of bounds");
|
||||
_comp_level_adjustment = (CompLevelAdjustment) adjustment;
|
||||
_HotSpotJVMCIRuntime_initialized = true;
|
||||
_HotSpotJVMCIRuntime_instance = JNIHandles::make_global(result());
|
||||
}
|
||||
|
||||
void JVMCIRuntime::initialize_JVMCI(TRAPS) {
|
||||
|
@ -29,6 +29,7 @@
|
||||
#else
|
||||
#define JVMCI_WK_KLASSES_DO(do_klass) \
|
||||
/* JVMCI classes. These are loaded on-demand. */ \
|
||||
do_klass(JVMCI_klass, jdk_vm_ci_runtime_JVMCI, Jvmci) \
|
||||
do_klass(HotSpotCompiledCode_klass, jdk_vm_ci_hotspot_HotSpotCompiledCode, Jvmci) \
|
||||
do_klass(HotSpotCompiledCode_Comment_klass, jdk_vm_ci_hotspot_HotSpotCompiledCode_Comment, Jvmci) \
|
||||
do_klass(HotSpotCompiledNmethod_klass, jdk_vm_ci_hotspot_HotSpotCompiledNmethod, Jvmci) \
|
||||
|
@ -712,7 +712,6 @@
|
||||
declare_constant(VM_Version::sun4v_m) \
|
||||
declare_constant(VM_Version::blk_init_instructions_m) \
|
||||
declare_constant(VM_Version::fmaf_instructions_m) \
|
||||
declare_constant(VM_Version::fmau_instructions_m) \
|
||||
declare_constant(VM_Version::sparc64_family_m) \
|
||||
declare_constant(VM_Version::M_family_m) \
|
||||
declare_constant(VM_Version::T_family_m) \
|
||||
|
@ -29,6 +29,7 @@
|
||||
#define JVMCI_VM_SYMBOLS_DO(template, do_alias)
|
||||
#else
|
||||
#define JVMCI_VM_SYMBOLS_DO(template, do_alias) \
|
||||
template(jdk_vm_ci_runtime_JVMCI, "jdk/vm/ci/runtime/JVMCI") \
|
||||
template(jdk_vm_ci_hotspot_HotSpotCompiledCode, "jdk/vm/ci/hotspot/HotSpotCompiledCode") \
|
||||
template(jdk_vm_ci_hotspot_HotSpotCompiledCode_Comment, "jdk/vm/ci/hotspot/HotSpotCompiledCode$Comment") \
|
||||
template(jdk_vm_ci_hotspot_HotSpotCompiledNmethod, "jdk/vm/ci/hotspot/HotSpotCompiledNmethod") \
|
||||
|
@ -97,7 +97,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags) {
|
||||
// Fix and bury in Method*
|
||||
set_interpreter_entry(NULL); // sets i2i entry and from_int
|
||||
set_adapter_entry(NULL);
|
||||
clear_code(); // from_c/from_i get set to c2i/i2i
|
||||
clear_code(false /* don't need a lock */); // from_c/from_i get set to c2i/i2i
|
||||
|
||||
if (access_flags.is_native()) {
|
||||
clear_native_function();
|
||||
@ -907,8 +907,8 @@ void Method::set_not_osr_compilable(int comp_level, bool report, const char* rea
|
||||
}
|
||||
|
||||
// Revert to using the interpreter and clear out the nmethod
|
||||
void Method::clear_code() {
|
||||
|
||||
void Method::clear_code(bool acquire_lock /* = true */) {
|
||||
MutexLockerEx pl(acquire_lock ? Patching_lock : NULL, Mutex::_no_safepoint_check_flag);
|
||||
// this may be NULL if c2i adapters have not been made yet
|
||||
// Only should happen at allocate time.
|
||||
if (adapter() == NULL) {
|
||||
@ -1077,6 +1077,7 @@ bool Method::check_code() const {
|
||||
|
||||
// Install compiled code. Instantly it can execute.
|
||||
void Method::set_code(methodHandle mh, CompiledMethod *code) {
|
||||
MutexLockerEx pl(Patching_lock, Mutex::_no_safepoint_check_flag);
|
||||
assert( code, "use clear_code to remove code" );
|
||||
assert( mh->check_code(), "" );
|
||||
|
||||
|
@ -436,7 +436,7 @@ class Method : public Metadata {
|
||||
address verified_code_entry();
|
||||
bool check_code() const; // Not inline to avoid circular ref
|
||||
CompiledMethod* volatile code() const { assert( check_code(), "" ); return (CompiledMethod *)OrderAccess::load_ptr_acquire(&_code); }
|
||||
void clear_code(); // Clear out any compiled code
|
||||
void clear_code(bool acquire_lock = true); // Clear out any compiled code
|
||||
static void set_code(methodHandle mh, CompiledMethod* code);
|
||||
void set_adapter_entry(AdapterHandlerEntry* adapter) {
|
||||
constMethod()->set_adapter_entry(adapter);
|
||||
|
@ -1190,12 +1190,11 @@ protected:
|
||||
#if INCLUDE_JVMCI
|
||||
// Description of the different counters
|
||||
// ReceiverTypeData for instanceof/checkcast/aastore:
|
||||
// C1/C2: count is incremented on type overflow and decremented for failed type checks
|
||||
// JVMCI: count decremented for failed type checks and nonprofiled_count is incremented on type overflow
|
||||
// TODO (chaeubl): in fact, JVMCI should also increment the count for failed type checks to mimic the C1/C2 behavior
|
||||
// count is decremented for failed type checks
|
||||
// JVMCI only: nonprofiled_count is incremented on type overflow
|
||||
// VirtualCallData for invokevirtual/invokeinterface:
|
||||
// C1/C2: count is incremented on type overflow
|
||||
// JVMCI: count is incremented on type overflow, nonprofiled_count is incremented on method overflow
|
||||
// count is incremented on type overflow
|
||||
// JVMCI only: nonprofiled_count is incremented on method overflow
|
||||
|
||||
// JVMCI is interested in knowing the percentage of type checks involving a type not explicitly in the profile
|
||||
nonprofiled_count_off_set = counter_cell_count,
|
||||
|
@ -1687,6 +1687,12 @@ void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) {
|
||||
Node *init2 = phi2->in( LoopNode::EntryControl );
|
||||
int stride_con2 = incr2->in(2)->get_int();
|
||||
|
||||
// The ratio of the two strides cannot be represented as an int
|
||||
// if stride_con2 is min_int and stride_con is -1.
|
||||
if (stride_con2 == min_jint && stride_con == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// The general case here gets a little tricky. We want to find the
|
||||
// GCD of all possible parallel IV's and make a new IV using this
|
||||
// GCD for the loop. Then all possible IVs are simple multiples of
|
||||
|
@ -439,12 +439,6 @@ Node* PhaseMacroExpand::make_arraycopy_load(ArrayCopyNode* ac, intptr_t offset,
|
||||
Node* adr = _igvn.transform(new AddPNode(base, base, MakeConX(offset)));
|
||||
const TypePtr* adr_type = _igvn.type(base)->is_ptr()->add_offset(offset);
|
||||
Node* m = ac->in(TypeFunc::Memory);
|
||||
while (m->is_MergeMem()) {
|
||||
m = m->as_MergeMem()->memory_at(C->get_alias_index(adr_type));
|
||||
if (m->is_Proj() && m->in(0)->is_MemBar()) {
|
||||
m = m->in(0)->in(TypeFunc::Memory);
|
||||
}
|
||||
}
|
||||
res = LoadNode::make(_igvn, ctl, m, adr, adr_type, type, bt, MemNode::unordered, LoadNode::Pinned);
|
||||
} else {
|
||||
if (ac->modifies(offset, offset, &_igvn, true)) {
|
||||
@ -978,6 +972,17 @@ bool PhaseMacroExpand::scalar_replacement(AllocateNode *alloc, GrowableArray <Sa
|
||||
return true;
|
||||
}
|
||||
|
||||
static void disconnect_projections(MultiNode* n, PhaseIterGVN& igvn) {
|
||||
Node* ctl_proj = n->proj_out(TypeFunc::Control);
|
||||
Node* mem_proj = n->proj_out(TypeFunc::Memory);
|
||||
if (ctl_proj != NULL) {
|
||||
igvn.replace_node(ctl_proj, n->in(0));
|
||||
}
|
||||
if (mem_proj != NULL) {
|
||||
igvn.replace_node(mem_proj, n->in(TypeFunc::Memory));
|
||||
}
|
||||
}
|
||||
|
||||
// Process users of eliminated allocation.
|
||||
void PhaseMacroExpand::process_users_of_allocation(CallNode *alloc) {
|
||||
Node* res = alloc->result_cast();
|
||||
@ -1008,13 +1013,13 @@ void PhaseMacroExpand::process_users_of_allocation(CallNode *alloc) {
|
||||
// Disconnect ArrayCopy node
|
||||
ArrayCopyNode* ac = n->as_ArrayCopy();
|
||||
assert(ac->is_clonebasic(), "unexpected array copy kind");
|
||||
Node* ctl_proj = ac->proj_out(TypeFunc::Control);
|
||||
Node* mem_proj = ac->proj_out(TypeFunc::Memory);
|
||||
if (ctl_proj != NULL) {
|
||||
_igvn.replace_node(ctl_proj, n->in(0));
|
||||
}
|
||||
if (mem_proj != NULL) {
|
||||
_igvn.replace_node(mem_proj, n->in(TypeFunc::Memory));
|
||||
Node* membar_after = ac->proj_out(TypeFunc::Control)->unique_ctrl_out();
|
||||
disconnect_projections(ac, _igvn);
|
||||
assert(alloc->in(0)->is_Proj() && alloc->in(0)->in(0)->Opcode() == Op_MemBarCPUOrder, "mem barrier expected before allocation");
|
||||
Node* membar_before = alloc->in(0)->in(0);
|
||||
disconnect_projections(membar_before->as_MemBar(), _igvn);
|
||||
if (membar_after->is_MemBar()) {
|
||||
disconnect_projections(membar_after->as_MemBar(), _igvn);
|
||||
}
|
||||
} else {
|
||||
eliminate_card_mark(n);
|
||||
|
@ -351,14 +351,6 @@ void Arguments::init_version_specific_system_properties() {
|
||||
* Deprecated options should be tested in VMDeprecatedOptions.java.
|
||||
*/
|
||||
|
||||
// Obsolete or deprecated -XX flag.
|
||||
typedef struct {
|
||||
const char* name;
|
||||
JDK_Version deprecated_in; // When the deprecation warning started (or "undefined").
|
||||
JDK_Version obsolete_in; // When the obsolete warning started (or "undefined").
|
||||
JDK_Version expired_in; // When the option expires (or "undefined").
|
||||
} SpecialFlag;
|
||||
|
||||
// The special_jvm_flags table declares options that are being deprecated and/or obsoleted. The
|
||||
// "deprecated_in" or "obsolete_in" fields may be set to "undefined", but not both.
|
||||
// When the JDK version reaches 'deprecated_in' limit, the JVM will process this flag on
|
||||
@ -380,6 +372,8 @@ static SpecialFlag const special_jvm_flags[] = {
|
||||
// -------------- Deprecated Flags --------------
|
||||
// --- Non-alias flags - sorted by obsolete_in then expired_in:
|
||||
{ "MaxGCMinorPauseMillis", JDK_Version::jdk(8), JDK_Version::undefined(), JDK_Version::undefined() },
|
||||
{ "AutoGCSelectPauseMillis", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
|
||||
{ "UseAutoGCSelectPolicy", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
|
||||
{ "UseParNewGC", JDK_Version::jdk(9), JDK_Version::undefined(), JDK_Version::jdk(10) },
|
||||
{ "ConvertSleepToYield", JDK_Version::jdk(9), JDK_Version::jdk(10), JDK_Version::jdk(11) },
|
||||
{ "ConvertYieldToSleep", JDK_Version::jdk(9), JDK_Version::jdk(10), JDK_Version::jdk(11) },
|
||||
@ -498,7 +492,14 @@ static bool version_less_than(JDK_Version v, JDK_Version other) {
|
||||
}
|
||||
}
|
||||
|
||||
extern bool lookup_special_flag_ext(const char *flag_name, SpecialFlag& flag);
|
||||
|
||||
static bool lookup_special_flag(const char *flag_name, SpecialFlag& flag) {
|
||||
// Allow extensions to have priority
|
||||
if (lookup_special_flag_ext(flag_name, flag)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (size_t i = 0; special_jvm_flags[i].name != NULL; i++) {
|
||||
if ((strcmp(special_jvm_flags[i].name, flag_name) == 0)) {
|
||||
flag = special_jvm_flags[i];
|
||||
@ -1802,10 +1803,15 @@ bool Arguments::gc_selected() {
|
||||
void Arguments::select_gc_ergonomically() {
|
||||
#if INCLUDE_ALL_GCS
|
||||
if (os::is_server_class_machine()) {
|
||||
if (should_auto_select_low_pause_collector()) {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseConcMarkSweepGC, true);
|
||||
if (!UseAutoGCSelectPolicy) {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
|
||||
} else {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseG1GC, true);
|
||||
if (should_auto_select_low_pause_collector()) {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseConcMarkSweepGC, true);
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseParNewGC, true);
|
||||
} else {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseParallelGC, true);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FLAG_SET_ERGO_IF_DEFAULT(bool, UseSerialGC, true);
|
||||
@ -2870,11 +2876,13 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, bool* patch_m
|
||||
if (FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true) != Flag::SUCCESS) {
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
handle_extra_cms_flags("-Xconcgc uses UseConcMarkSweepGC");
|
||||
// -Xnoconcgc
|
||||
} else if (match_option(option, "-Xnoconcgc")) {
|
||||
if (FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false) != Flag::SUCCESS) {
|
||||
return JNI_EINVAL;
|
||||
}
|
||||
handle_extra_cms_flags("-Xnoconcgc uses UseConcMarkSweepGC");
|
||||
// -Xbatch
|
||||
} else if (match_option(option, "-Xbatch")) {
|
||||
if (FLAG_SET_CMDLINE(bool, BackgroundCompilation, false) != Flag::SUCCESS) {
|
||||
@ -4157,6 +4165,15 @@ bool Arguments::handle_deprecated_print_gc_flags() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void Arguments::handle_extra_cms_flags(const char* msg) {
|
||||
SpecialFlag flag;
|
||||
const char *flag_name = "UseConcMarkSweepGC";
|
||||
if (lookup_special_flag(flag_name, flag)) {
|
||||
handle_aliases_and_deprecation(flag_name, /* print warning */ true);
|
||||
warning("%s", msg);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse entry point called from JNI_CreateJavaVM
|
||||
|
||||
jint Arguments::parse(const JavaVMInitArgs* initial_cmd_args) {
|
||||
|
@ -41,6 +41,14 @@ extern "C" {
|
||||
typedef jint (JNICALL *vfprintf_hook_t)(FILE *fp, const char *format, va_list args) ATTRIBUTE_PRINTF(2, 0);
|
||||
}
|
||||
|
||||
// Obsolete or deprecated -XX flag.
|
||||
struct SpecialFlag {
|
||||
const char* name;
|
||||
JDK_Version deprecated_in; // When the deprecation warning started (or "undefined").
|
||||
JDK_Version obsolete_in; // When the obsolete warning started (or "undefined").
|
||||
JDK_Version expired_in; // When the option expires (or "undefined").
|
||||
};
|
||||
|
||||
// PathString is used as:
|
||||
// - the underlying value for a SystemProperty
|
||||
// - the path portion of an --patch-module module/path pair
|
||||
@ -519,6 +527,8 @@ class Arguments : AllStatic {
|
||||
|
||||
static bool handle_deprecated_print_gc_flags();
|
||||
|
||||
static void handle_extra_cms_flags(const char* msg);
|
||||
|
||||
static jint parse_vm_init_args(const JavaVMInitArgs *java_tool_options_args,
|
||||
const JavaVMInitArgs *java_options_args,
|
||||
const JavaVMInitArgs *cmd_line_args);
|
||||
|
30
hotspot/src/share/vm/runtime/arguments_ext.cpp
Normal file
30
hotspot/src/share/vm/runtime/arguments_ext.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "runtime/arguments.hpp"
|
||||
|
||||
bool lookup_special_flag_ext(const char *flag_name, SpecialFlag& flag) {
|
||||
return false;
|
||||
}
|
@ -452,7 +452,7 @@ void Monitor::ILock(Thread * Self) {
|
||||
ParkEvent * const ESelf = Self->_MutexEvent;
|
||||
assert(_OnDeck != ESelf, "invariant");
|
||||
|
||||
// As an optimization, spinners could conditionally try to set ONDECK to _LBIT
|
||||
// As an optimization, spinners could conditionally try to set _OnDeck to _LBIT
|
||||
// Synchronizer.cpp uses a similar optimization.
|
||||
if (TrySpin(Self)) goto Exeunt;
|
||||
|
||||
@ -463,7 +463,7 @@ void Monitor::ILock(Thread * Self) {
|
||||
OrderAccess::fence();
|
||||
|
||||
// Optional optimization ... try barging on the inner lock
|
||||
if ((NativeMonitorFlags & 32) && CASPTR (&_OnDeck, NULL, UNS(Self)) == 0) {
|
||||
if ((NativeMonitorFlags & 32) && CASPTR (&_OnDeck, NULL, UNS(ESelf)) == 0) {
|
||||
goto OnDeck_LOOP;
|
||||
}
|
||||
|
||||
@ -471,14 +471,14 @@ void Monitor::ILock(Thread * Self) {
|
||||
|
||||
// At any given time there is at most one ondeck thread.
|
||||
// ondeck implies not resident on cxq and not resident on EntryList
|
||||
// Only the OnDeck thread can try to acquire -- contended for -- the lock.
|
||||
// Only the OnDeck thread can try to acquire -- contend for -- the lock.
|
||||
// CONSIDER: use Self->OnDeck instead of m->OnDeck.
|
||||
// Deschedule Self so that others may run.
|
||||
while (_OnDeck != ESelf) {
|
||||
while (OrderAccess::load_ptr_acquire(&_OnDeck) != ESelf) {
|
||||
ParkCommon(ESelf, 0);
|
||||
}
|
||||
|
||||
// Self is now in the ONDECK position and will remain so until it
|
||||
// Self is now in the OnDeck position and will remain so until it
|
||||
// manages to acquire the lock.
|
||||
OnDeck_LOOP:
|
||||
for (;;) {
|
||||
@ -501,8 +501,8 @@ void Monitor::ILock(Thread * Self) {
|
||||
// A. Shift or defer dropping the inner lock until the subsequent IUnlock() operation.
|
||||
// This might avoid potential reacquisition of the inner lock in IUlock().
|
||||
// B. While still holding the inner lock, attempt to opportunistically select
|
||||
// and unlink the next ONDECK thread from the EntryList.
|
||||
// If successful, set ONDECK to refer to that thread, otherwise clear ONDECK.
|
||||
// and unlink the next OnDeck thread from the EntryList.
|
||||
// If successful, set OnDeck to refer to that thread, otherwise clear OnDeck.
|
||||
// It's critical that the select-and-unlink operation run in constant-time as
|
||||
// it executes when holding the outer lock and may artificially increase the
|
||||
// effective length of the critical section.
|
||||
@ -529,7 +529,7 @@ void Monitor::IUnlock(bool RelaxAssert) {
|
||||
OrderAccess::release_store(&_LockWord.Bytes[_LSBINDEX], 0); // drop outer lock
|
||||
|
||||
OrderAccess::storeload();
|
||||
ParkEvent * const w = _OnDeck;
|
||||
ParkEvent * const w = _OnDeck; // raw load as we will just return if non-NULL
|
||||
assert(RelaxAssert || w != Thread::current()->_MutexEvent, "invariant");
|
||||
if (w != NULL) {
|
||||
// Either we have a valid ondeck thread or ondeck is transiently "locked"
|
||||
@ -537,7 +537,7 @@ void Monitor::IUnlock(bool RelaxAssert) {
|
||||
// OnDeck allows us to discriminate two cases. If the latter, the
|
||||
// responsibility for progress and succession lies with that other thread.
|
||||
// For good performance, we also depend on the fact that redundant unpark()
|
||||
// operations are cheap. That is, repeated Unpark()ing of the ONDECK thread
|
||||
// operations are cheap. That is, repeated Unpark()ing of the OnDeck thread
|
||||
// is inexpensive. This approach provides implicit futile wakeup throttling.
|
||||
// Note that the referent "w" might be stale with respect to the lock.
|
||||
// In that case the following unpark() is harmless and the worst that'll happen
|
||||
@ -586,8 +586,13 @@ void Monitor::IUnlock(bool RelaxAssert) {
|
||||
_EntryList = w->ListNext;
|
||||
// as a diagnostic measure consider setting w->_ListNext = BAD
|
||||
assert(UNS(_OnDeck) == _LBIT, "invariant");
|
||||
_OnDeck = w; // pass OnDeck to w.
|
||||
// w will clear OnDeck once it acquires the outer lock
|
||||
|
||||
// Pass OnDeck role to w, ensuring that _EntryList has been set first.
|
||||
// w will clear _OnDeck once it acquires the outer lock.
|
||||
// Note that once we set _OnDeck that thread can acquire the mutex, proceed
|
||||
// with its critical section and then enter this code to unlock the mutex. So
|
||||
// you can have multiple threads active in IUnlock at the same time.
|
||||
OrderAccess::release_store_ptr(&_OnDeck, w);
|
||||
|
||||
// Another optional optimization ...
|
||||
// For heavily contended locks it's not uncommon that some other
|
||||
@ -835,7 +840,7 @@ int Monitor::IWait(Thread * Self, jlong timo) {
|
||||
// ESelf is now on the cxq, EntryList or at the OnDeck position.
|
||||
// The following fragment is extracted from Monitor::ILock()
|
||||
for (;;) {
|
||||
if (_OnDeck == ESelf && TrySpin(Self)) break;
|
||||
if (OrderAccess::load_ptr_acquire(&_OnDeck) == ESelf && TrySpin(Self)) break;
|
||||
ParkCommon(ESelf, 0);
|
||||
}
|
||||
assert(_OnDeck == ESelf, "invariant");
|
||||
@ -1050,10 +1055,10 @@ void Monitor::jvm_raw_lock() {
|
||||
|
||||
// At any given time there is at most one ondeck thread.
|
||||
// ondeck implies not resident on cxq and not resident on EntryList
|
||||
// Only the OnDeck thread can try to acquire -- contended for -- the lock.
|
||||
// Only the OnDeck thread can try to acquire -- contend for -- the lock.
|
||||
// CONSIDER: use Self->OnDeck instead of m->OnDeck.
|
||||
for (;;) {
|
||||
if (_OnDeck == ESelf && TrySpin(NULL)) break;
|
||||
if (OrderAccess::load_ptr_acquire(&_OnDeck) == ESelf && TrySpin(NULL)) break;
|
||||
ParkCommon(ESelf, 0);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -81,7 +81,9 @@ class ParkEvent ;
|
||||
// *in that order*. If their implementations change such that these
|
||||
// assumptions are violated, a whole lot of code will break.
|
||||
|
||||
// The default length of monitor name is chosen to be 64 to avoid false sharing.
|
||||
// The default length of monitor name was originally chosen to be 64 to avoid
|
||||
// false sharing. Now, PaddedMonitor is available for this purpose.
|
||||
// TODO: Check if _name[MONITOR_NAME_LEN] should better get replaced by const char*.
|
||||
static const int MONITOR_NAME_LEN = 64;
|
||||
|
||||
class Monitor : public CHeapObj<mtInternal> {
|
||||
@ -254,6 +256,18 @@ class Monitor : public CHeapObj<mtInternal> {
|
||||
|
||||
};
|
||||
|
||||
class PaddedMonitor : public Monitor {
|
||||
enum {
|
||||
CACHE_LINE_PADDING = (int)DEFAULT_CACHE_LINE_SIZE - (int)sizeof(Monitor),
|
||||
PADDING_LEN = CACHE_LINE_PADDING > 0 ? CACHE_LINE_PADDING : 1
|
||||
};
|
||||
char _padding[PADDING_LEN];
|
||||
public:
|
||||
PaddedMonitor(int rank, const char *name, bool allow_vm_block = false,
|
||||
SafepointCheckRequired safepoint_check_required = _safepoint_check_always) :
|
||||
Monitor(rank, name, allow_vm_block, safepoint_check_required) {};
|
||||
};
|
||||
|
||||
// Normally we'd expect Monitor to extend Mutex in the sense that a monitor
|
||||
// constructed from pthreads primitives might extend a mutex by adding
|
||||
// a condvar and some extra metadata. In fact this was the case until J2SE7.
|
||||
@ -292,5 +306,16 @@ class Mutex : public Monitor { // degenerate Monitor
|
||||
}
|
||||
};
|
||||
|
||||
class PaddedMutex : public Mutex {
|
||||
enum {
|
||||
CACHE_LINE_PADDING = (int)DEFAULT_CACHE_LINE_SIZE - (int)sizeof(Mutex),
|
||||
PADDING_LEN = CACHE_LINE_PADDING > 0 ? CACHE_LINE_PADDING : 1
|
||||
};
|
||||
char _padding[PADDING_LEN];
|
||||
public:
|
||||
PaddedMutex(int rank, const char *name, bool allow_vm_block = false,
|
||||
SafepointCheckRequired safepoint_check_required = _safepoint_check_always) :
|
||||
Mutex(rank, name, allow_vm_block, safepoint_check_required) {};
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_RUNTIME_MUTEX_HPP
|
||||
|
@ -169,122 +169,123 @@ void assert_lock_strong(const Monitor * lock) {
|
||||
_mutex_array[_num_mutex++] = var; \
|
||||
}
|
||||
|
||||
// Using Padded subclasses to prevent false sharing of these global monitors and mutexes.
|
||||
void mutex_init() {
|
||||
def(tty_lock , Mutex , event, true, Monitor::_safepoint_check_never); // allow to lock in VM
|
||||
def(tty_lock , PaddedMutex , event, true, Monitor::_safepoint_check_never); // allow to lock in VM
|
||||
|
||||
def(CGC_lock , Monitor, special, true, Monitor::_safepoint_check_never); // coordinate between fore- and background GC
|
||||
def(STS_lock , Monitor, leaf, true, Monitor::_safepoint_check_never);
|
||||
def(CGC_lock , PaddedMonitor, special, true, Monitor::_safepoint_check_never); // coordinate between fore- and background GC
|
||||
def(STS_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never);
|
||||
|
||||
if (UseConcMarkSweepGC || UseG1GC) {
|
||||
def(FullGCCount_lock , Monitor, leaf, true, Monitor::_safepoint_check_never); // in support of ExplicitGCInvokesConcurrent
|
||||
def(FullGCCount_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never); // in support of ExplicitGCInvokesConcurrent
|
||||
}
|
||||
if (UseG1GC) {
|
||||
|
||||
def(SATB_Q_FL_lock , Mutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(SATB_Q_CBL_mon , Monitor, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(Shared_SATB_Q_lock , Mutex, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(SATB_Q_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(SATB_Q_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(Shared_SATB_Q_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never);
|
||||
|
||||
def(DirtyCardQ_FL_lock , Mutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(DirtyCardQ_CBL_mon , Monitor, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(Shared_DirtyCardQ_lock , Mutex, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(DirtyCardQ_FL_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(DirtyCardQ_CBL_mon , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(Shared_DirtyCardQ_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never);
|
||||
|
||||
def(FreeList_lock , Mutex, leaf , true, Monitor::_safepoint_check_never);
|
||||
def(SecondaryFreeList_lock , Monitor, leaf , true, Monitor::_safepoint_check_never);
|
||||
def(OldSets_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(RootRegionScan_lock , Monitor, leaf , true, Monitor::_safepoint_check_never);
|
||||
def(MMUTracker_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(FreeList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(SecondaryFreeList_lock , PaddedMonitor, leaf , true, Monitor::_safepoint_check_never);
|
||||
def(OldSets_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(RootRegionScan_lock , PaddedMonitor, leaf , true, Monitor::_safepoint_check_never);
|
||||
def(MMUTracker_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
|
||||
def(StringDedupQueue_lock , Monitor, leaf, true, Monitor::_safepoint_check_never);
|
||||
def(StringDedupTable_lock , Mutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(StringDedupQueue_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_never);
|
||||
def(StringDedupTable_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
|
||||
def(MarkStackFreeList_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(MarkStackChunkList_lock , Mutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(MarkStackFreeList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
def(MarkStackChunkList_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_never);
|
||||
}
|
||||
def(ParGCRareEvent_lock , Mutex , leaf , true, Monitor::_safepoint_check_sometimes);
|
||||
def(DerivedPointerTableGC_lock , Mutex, leaf, true, Monitor::_safepoint_check_never);
|
||||
def(CodeCache_lock , Mutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(RawMonitor_lock , Mutex, special, true, Monitor::_safepoint_check_never);
|
||||
def(OopMapCacheAlloc_lock , Mutex, leaf, true, Monitor::_safepoint_check_always); // used for oop_map_cache allocation.
|
||||
def(ParGCRareEvent_lock , PaddedMutex , leaf , true, Monitor::_safepoint_check_sometimes);
|
||||
def(DerivedPointerTableGC_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(CodeCache_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(RawMonitor_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(OopMapCacheAlloc_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for oop_map_cache allocation.
|
||||
|
||||
def(Patching_lock , Mutex , special, true, Monitor::_safepoint_check_never); // used for safepointing and code patching.
|
||||
def(Service_lock , Monitor, special, true, Monitor::_safepoint_check_never); // used for service thread operations
|
||||
def(JmethodIdCreation_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for creating jmethodIDs.
|
||||
def(Patching_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never); // used for safepointing and code patching.
|
||||
def(Service_lock , PaddedMonitor, special, true, Monitor::_safepoint_check_never); // used for service thread operations
|
||||
def(JmethodIdCreation_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for creating jmethodIDs.
|
||||
|
||||
def(SystemDictionary_lock , Monitor, leaf, true, Monitor::_safepoint_check_always); // lookups done by VM thread
|
||||
def(Module_lock , Mutex , leaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(InlineCacheBuffer_lock , Mutex , leaf, true, Monitor::_safepoint_check_always);
|
||||
def(VMStatistic_lock , Mutex , leaf, false, Monitor::_safepoint_check_always);
|
||||
def(ExpandHeap_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // Used during compilation by VM thread
|
||||
def(JNIHandleBlockFreeList_lock , Mutex , leaf, true, Monitor::_safepoint_check_never); // handles are used by VM thread
|
||||
def(SignatureHandlerLibrary_lock , Mutex , leaf, false, Monitor::_safepoint_check_always);
|
||||
def(SymbolTable_lock , Mutex , leaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(StringTable_lock , Mutex , leaf, true, Monitor::_safepoint_check_always);
|
||||
def(ProfilePrint_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing
|
||||
def(ExceptionCache_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing
|
||||
def(OsrList_lock , Mutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(Debug1_lock , Mutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(SystemDictionary_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always); // lookups done by VM thread
|
||||
def(Module_lock , PaddedMutex , leaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(InlineCacheBuffer_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always);
|
||||
def(VMStatistic_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always);
|
||||
def(ExpandHeap_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // Used during compilation by VM thread
|
||||
def(JNIHandleBlockFreeList_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never); // handles are used by VM thread
|
||||
def(SignatureHandlerLibrary_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always);
|
||||
def(SymbolTable_lock , PaddedMutex , leaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(StringTable_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always);
|
||||
def(ProfilePrint_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing
|
||||
def(ExceptionCache_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // serial profile printing
|
||||
def(OsrList_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(Debug1_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
#ifndef PRODUCT
|
||||
def(FullGCALot_lock , Mutex , leaf, false, Monitor::_safepoint_check_always); // a lock to make FullGCALot MT safe
|
||||
def(FullGCALot_lock , PaddedMutex , leaf, false, Monitor::_safepoint_check_always); // a lock to make FullGCALot MT safe
|
||||
#endif
|
||||
def(BeforeExit_lock , Monitor, leaf, true, Monitor::_safepoint_check_always);
|
||||
def(PerfDataMemAlloc_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for allocating PerfData memory for performance data
|
||||
def(PerfDataManager_lock , Mutex , leaf, true, Monitor::_safepoint_check_always); // used for synchronized access to PerfDataManager resources
|
||||
def(BeforeExit_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always);
|
||||
def(PerfDataMemAlloc_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for allocating PerfData memory for performance data
|
||||
def(PerfDataManager_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always); // used for synchronized access to PerfDataManager resources
|
||||
|
||||
// CMS_modUnionTable_lock leaf
|
||||
// CMS_bitMap_lock leaf 1
|
||||
// CMS_freeList_lock leaf 2
|
||||
|
||||
def(Safepoint_lock , Monitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock
|
||||
def(Safepoint_lock , PaddedMonitor, safepoint, true, Monitor::_safepoint_check_sometimes); // locks SnippetCache_lock/Threads_lock
|
||||
|
||||
def(Threads_lock , Monitor, barrier, true, Monitor::_safepoint_check_sometimes);
|
||||
def(Threads_lock , PaddedMonitor, barrier, true, Monitor::_safepoint_check_sometimes);
|
||||
|
||||
def(VMOperationQueue_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these
|
||||
def(VMOperationRequest_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes);
|
||||
def(RetData_lock , Mutex , nonleaf, false, Monitor::_safepoint_check_always);
|
||||
def(Terminator_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_sometimes);
|
||||
def(VtableStubs_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always);
|
||||
def(Notify_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_always);
|
||||
def(JNIGlobalHandle_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always); // locks JNIHandleBlockFreeList_lock
|
||||
def(JNICritical_lock , Monitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions
|
||||
def(AdapterHandlerLibrary_lock , Mutex , nonleaf, true, Monitor::_safepoint_check_always);
|
||||
def(VMOperationQueue_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes); // VM_thread allowed to block on these
|
||||
def(VMOperationRequest_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes);
|
||||
def(RetData_lock , PaddedMutex , nonleaf, false, Monitor::_safepoint_check_always);
|
||||
def(Terminator_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_sometimes);
|
||||
def(VtableStubs_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always);
|
||||
def(Notify_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always);
|
||||
def(JNIGlobalHandle_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always); // locks JNIHandleBlockFreeList_lock
|
||||
def(JNICritical_lock , PaddedMonitor, nonleaf, true, Monitor::_safepoint_check_always); // used for JNI critical regions
|
||||
def(AdapterHandlerLibrary_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always);
|
||||
|
||||
def(Heap_lock , Monitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes);
|
||||
def(JfieldIdCreation_lock , Mutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation
|
||||
def(MemberNameTable_lock , Mutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect MemberNameTable
|
||||
def(Heap_lock , PaddedMonitor, nonleaf+1, false, Monitor::_safepoint_check_sometimes);
|
||||
def(JfieldIdCreation_lock , PaddedMutex , nonleaf+1, true, Monitor::_safepoint_check_always); // jfieldID, Used in VM_Operation
|
||||
def(MemberNameTable_lock , PaddedMutex , nonleaf+1, false, Monitor::_safepoint_check_always); // Used to protect MemberNameTable
|
||||
|
||||
def(CompiledIC_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock
|
||||
def(CompileTaskAlloc_lock , Mutex , nonleaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(CompileStatistics_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always);
|
||||
def(DirectivesStack_lock , Mutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(MultiArray_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock
|
||||
def(CompiledIC_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks VtableStubs_lock, InlineCacheBuffer_lock
|
||||
def(CompileTaskAlloc_lock , PaddedMutex , nonleaf+2, true, Monitor::_safepoint_check_always);
|
||||
def(CompileStatistics_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always);
|
||||
def(DirectivesStack_lock , PaddedMutex , special, true, Monitor::_safepoint_check_never);
|
||||
def(MultiArray_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // locks SymbolTable_lock
|
||||
|
||||
def(JvmtiThreadState_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController
|
||||
def(Management_lock , Mutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management
|
||||
def(JvmtiThreadState_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // Used by JvmtiThreadState/JvmtiEventController
|
||||
def(Management_lock , PaddedMutex , nonleaf+2, false, Monitor::_safepoint_check_always); // used for JVM management
|
||||
|
||||
def(Compile_lock , Mutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes);
|
||||
def(MethodData_lock , Mutex , nonleaf+3, false, Monitor::_safepoint_check_always);
|
||||
def(TouchedMethodLog_lock , Mutex , nonleaf+3, false, Monitor::_safepoint_check_always);
|
||||
def(Compile_lock , PaddedMutex , nonleaf+3, true, Monitor::_safepoint_check_sometimes);
|
||||
def(MethodData_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always);
|
||||
def(TouchedMethodLog_lock , PaddedMutex , nonleaf+3, false, Monitor::_safepoint_check_always);
|
||||
|
||||
def(MethodCompileQueue_lock , Monitor, nonleaf+4, true, Monitor::_safepoint_check_always);
|
||||
def(Debug2_lock , Mutex , nonleaf+4, true, Monitor::_safepoint_check_never);
|
||||
def(Debug3_lock , Mutex , nonleaf+4, true, Monitor::_safepoint_check_never);
|
||||
def(CompileThread_lock , Monitor, nonleaf+5, false, Monitor::_safepoint_check_always);
|
||||
def(PeriodicTask_lock , Monitor, nonleaf+5, true, Monitor::_safepoint_check_sometimes);
|
||||
def(RedefineClasses_lock , Monitor, nonleaf+5, true, Monitor::_safepoint_check_always);
|
||||
def(MethodCompileQueue_lock , PaddedMonitor, nonleaf+4, true, Monitor::_safepoint_check_always);
|
||||
def(Debug2_lock , PaddedMutex , nonleaf+4, true, Monitor::_safepoint_check_never);
|
||||
def(Debug3_lock , PaddedMutex , nonleaf+4, true, Monitor::_safepoint_check_never);
|
||||
def(CompileThread_lock , PaddedMonitor, nonleaf+5, false, Monitor::_safepoint_check_always);
|
||||
def(PeriodicTask_lock , PaddedMonitor, nonleaf+5, true, Monitor::_safepoint_check_sometimes);
|
||||
def(RedefineClasses_lock , PaddedMonitor, nonleaf+5, true, Monitor::_safepoint_check_always);
|
||||
if (WhiteBoxAPI) {
|
||||
def(Compilation_lock , Monitor, leaf, false, Monitor::_safepoint_check_never);
|
||||
def(Compilation_lock , PaddedMonitor, leaf, false, Monitor::_safepoint_check_never);
|
||||
}
|
||||
|
||||
#ifdef INCLUDE_TRACE
|
||||
def(JfrMsg_lock , Monitor, leaf, true, Monitor::_safepoint_check_always);
|
||||
def(JfrBuffer_lock , Mutex, leaf, true, Monitor::_safepoint_check_never);
|
||||
def(JfrThreadGroups_lock , Mutex, leaf, true, Monitor::_safepoint_check_always);
|
||||
def(JfrStream_lock , Mutex, leaf+1, true, Monitor::_safepoint_check_never); // ensure to rank lower than 'safepoint'
|
||||
def(JfrStacktrace_lock , Mutex, special, true, Monitor::_safepoint_check_sometimes);
|
||||
def(JfrMsg_lock , PaddedMonitor, leaf, true, Monitor::_safepoint_check_always);
|
||||
def(JfrBuffer_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_never);
|
||||
def(JfrThreadGroups_lock , PaddedMutex , leaf, true, Monitor::_safepoint_check_always);
|
||||
def(JfrStream_lock , PaddedMutex , leaf+1, true, Monitor::_safepoint_check_never); // ensure to rank lower than 'safepoint'
|
||||
def(JfrStacktrace_lock , PaddedMutex , special, true, Monitor::_safepoint_check_sometimes);
|
||||
#endif
|
||||
|
||||
#ifndef SUPPORTS_NATIVE_CX8
|
||||
def(UnsafeJlong_lock , Mutex, special, false, Monitor::_safepoint_check_never);
|
||||
def(UnsafeJlong_lock , PaddedMutex , special, false, Monitor::_safepoint_check_never);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -66,6 +66,7 @@ ifeq ($(UNAME_S), SunOS)
|
||||
ifeq ($(ARCH), i386)
|
||||
ARCH=i586
|
||||
endif
|
||||
NUM_CORES := $(shell LC_MESSAGES=C /usr/sbin/psrinfo -v | grep -c on-line)
|
||||
endif
|
||||
ifeq ($(UNAME_S), Linux)
|
||||
PLATFORM = linux
|
||||
@ -74,6 +75,7 @@ ifeq ($(UNAME_S), Linux)
|
||||
ifeq ($(ARCH), i386)
|
||||
ARCH = i586
|
||||
endif
|
||||
NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
|
||||
endif
|
||||
ifeq ($(UNAME_S), Darwin)
|
||||
PLATFORM = bsd
|
||||
@ -82,6 +84,7 @@ ifeq ($(UNAME_S), Darwin)
|
||||
ifeq ($(ARCH), i386)
|
||||
ARCH = i586
|
||||
endif
|
||||
NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
|
||||
endif
|
||||
ifeq ($(findstring BSD,$(UNAME_S)), BSD)
|
||||
PLATFORM = bsd
|
||||
@ -115,6 +118,13 @@ ifeq ($(PLATFORM),)
|
||||
endif
|
||||
endif
|
||||
EXESUFFIX = .exe
|
||||
ifneq ($(NUMBER_OF_PROCESSORS), )
|
||||
NUM_CORES := $(NUMBER_OF_PROCESSORS)
|
||||
else
|
||||
ifneq ($(HOTSPOT_BUILD_JOBS), )
|
||||
NUM_CORES := $(HOTSPOT_BUILD_JOBS)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef ALT_SLASH_JAVA
|
||||
@ -308,9 +318,22 @@ ifdef TESTDIRS
|
||||
TEST_SELECTION = $(TESTDIRS)
|
||||
endif
|
||||
|
||||
ifdef CONCURRENCY
|
||||
JTREG_BASIC_OPTIONS += -concurrency:$(CONCURRENCY)
|
||||
# Concurrency based on min(cores / 2, 12)
|
||||
ifdef NUM_CORES
|
||||
CONCURRENCY := $(shell expr $(NUM_CORES) / 2)
|
||||
ifeq ($(CONCURRENCY), 0)
|
||||
CONCURRENCY := 1
|
||||
else ifeq ($(shell expr $(CONCURRENCY) \> 12), 1)
|
||||
CONCURRENCY := 12
|
||||
endif
|
||||
else
|
||||
CONCURRENCY := 1
|
||||
endif
|
||||
JTREG_BASIC_OPTIONS += -concurrency:$(CONCURRENCY)
|
||||
|
||||
# Make sure MaxRAMFraction is high enough to not cause OOM or swapping since we may end up with a lot of JVM's
|
||||
JTREG_BASIC_OPTIONS += -vmoption:-XX:MaxRAMFraction=$(shell expr $(CONCURRENCY) \* 4)
|
||||
|
||||
ifdef EXTRA_JTREG_OPTIONS
|
||||
JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS)
|
||||
endif
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, Red Hat, Inc. 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
|
||||
@ -21,30 +21,38 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
/**
|
||||
* @test
|
||||
* @bug 6505888
|
||||
* @summary Tests CheckedSortedMap encoding
|
||||
* @author Sergey Malenkov
|
||||
* @bug 8166836
|
||||
* @summary Elimination of clone's ArrayCopyNode may make compilation fail silently
|
||||
* @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:CompileCommand=dontinline,TestEliminatedCloneBadMemEdge::not_inlined TestEliminatedCloneBadMemEdge
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
public class TestEliminatedCloneBadMemEdge implements Cloneable {
|
||||
|
||||
public final class java_util_Collections_CheckedSortedMap extends AbstractTest<SortedMap<String, String>> {
|
||||
public static void main(String[] args) {
|
||||
new java_util_Collections_CheckedSortedMap().test(true);
|
||||
int f1;
|
||||
int f2;
|
||||
int f3;
|
||||
int f4;
|
||||
int f5;
|
||||
int f6;
|
||||
int f7;
|
||||
int f8;
|
||||
int f9;
|
||||
|
||||
static void not_inlined() {}
|
||||
|
||||
static void test(TestEliminatedCloneBadMemEdge o1) throws CloneNotSupportedException {
|
||||
TestEliminatedCloneBadMemEdge o2 = (TestEliminatedCloneBadMemEdge)o1.clone();
|
||||
not_inlined();
|
||||
o2.f1 = 0x42;
|
||||
}
|
||||
|
||||
protected SortedMap<String, String> getObject() {
|
||||
SortedMap<String, String> map = new TreeMap<String, String>();
|
||||
map.put("key", "value");
|
||||
return Collections.checkedSortedMap(map, String.class, String.class);
|
||||
}
|
||||
|
||||
protected SortedMap<String, String> getAnotherObject() {
|
||||
SortedMap<String, String> map = new TreeMap<String, String>();
|
||||
return Collections.checkedSortedMap(map, String.class, String.class);
|
||||
static public void main(String[] args) throws CloneNotSupportedException {
|
||||
TestEliminatedCloneBadMemEdge o1 = new TestEliminatedCloneBadMemEdge();
|
||||
for (int i = 0; i < 20000; i++) {
|
||||
test(o1);
|
||||
}
|
||||
}
|
||||
}
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,6 @@
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user