Merge
This commit is contained in:
commit
2c868d6101
.hgtags
make
CompileToolsHotspot.gmkDocs.gmkMain.gmkRunTests.gmkToolsHotspot.gmk
autoconf
common
conf
data/symbols
java.base-F.sym.txtjava.compiler-F.sym.txtjava.desktop-F.sym.txtjava.management.rmi-F.sym.txtjava.naming-F.sym.txtjava.rmi-F.sym.txtjava.xml-F.sym.txtjdk.compiler-F.sym.txtjdk.incubator.foreign-F.sym.txtjdk.jartool-F.sym.txtjdk.javadoc-F.sym.txtjdk.jdi-F.sym.txtjdk.net-F.sym.txtjdk.nio.mapmode-F.sym.txtjdk.rmic-F.sym.txtjdk.scripting.nashorn-F.sym.txtjdk.unsupported-F.sym.txtsymbols
hotspot
modules/jdk.jfr
src/classes/build/tools/jfr
test
src/hotspot
cpu/aarch64
os
aix
bsd
linux
posix
windows
share
aot
ci
classfile
classFileParser.cppclassListParser.cppclassLoader.cppclassLoader.hppclassLoaderData.cppclassLoaderData.hppclassLoaderExt.cppcompactHashtable.cppjavaClasses.cppjavaClasses.hppmoduleEntry.cppmoduleEntry.hpppackageEntry.cppstringTable.cppsystemDictionary.cppsystemDictionary.hppsystemDictionaryShared.cppsystemDictionaryShared.hppverifier.cppvmSymbols.hpp
code
compiler
gc
7
.hgtags
7
.hgtags
@ -635,7 +635,10 @@ dd5198db2e5b1ebcafe065d987c03ba9fcb50fc3 jdk-15+17
|
||||
7223c6d610343fd8323af9d07d501e01fa1a7696 jdk-15+22
|
||||
f143729ca00ec14a98ea5c7f73acba88da97746e jdk-15+23
|
||||
497fd9f9129c4928fd5a876dd55e0daf6298b511 jdk-15+24
|
||||
58833044988772ca06c97ab2f142474a8627af80 jdk-15+25
|
||||
58833044988772ca06c97ab2f142474a8627af80 jdk-15+25
|
||||
90b266a84c06f1b3dc0ed8767856793e8c1c357e jdk-15+25
|
||||
0a32396f7a690015d22ca3328ac441a358295d90 jdk-15+26
|
||||
93813843680bbe1b7efbca56c03fd137f20a2c31 jdk-16+0
|
||||
93813843680bbe1b7efbca56c03fd137f20a2c31 jdk-15+27
|
||||
4a485c89d5a08b495961835f5308a96038678aeb jdk-16+1
|
||||
06c9f89459daba98395fad726100feb44f89ba71 jdk-15+28
|
||||
bcbe7b8a77b8971bc221c0be1bd2abb6fb68c2d0 jdk-16+2
|
||||
|
@ -36,6 +36,24 @@ TARGETS :=
|
||||
# Hook to include the corresponding custom file, if present.
|
||||
$(eval $(call IncludeCustomExtension, hotspot/CompileTools.gmk))
|
||||
|
||||
################################################################################
|
||||
# Build tools needed for the JFR source code generation
|
||||
|
||||
HOTSPOT_TOOLS_SRCDIR := $(TOPDIR)/make/src/classes
|
||||
|
||||
HOTSPOT_TOOLS_OUTPUTDIR := $(BUILDTOOLS_OUTPUTDIR)/buildtools/hotspot_tools_classes
|
||||
|
||||
$(eval $(call SetupJavaCompilation, BUILD_TOOLS_HOTSPOT, \
|
||||
COMPILER := bootjdk, \
|
||||
SRC := $(HOTSPOT_TOOLS_SRCDIR), \
|
||||
BIN := $(HOTSPOT_TOOLS_OUTPUTDIR), \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_TOOLS_HOTSPOT)
|
||||
|
||||
|
||||
################################################################################
|
||||
# Graal build tools
|
||||
ifeq ($(INCLUDE_GRAAL), true)
|
||||
VM_CI_SRC_DIR := $(TOPDIR)/src/jdk.internal.vm.ci/share/classes
|
||||
|
||||
|
@ -63,7 +63,7 @@ MODULES_SOURCE_PATH := $(call PathList, $(call GetModuleSrcPath) )
|
||||
JAVADOC_BASE_URL := https://docs.oracle.com/pls/topic/lookup?ctx=javase$(VERSION_NUMBER)&id=homepage
|
||||
BUG_SUBMIT_URL := https://bugreport.java.com/bugreport/
|
||||
COPYRIGHT_URL := legal/copyright.html
|
||||
LICENSE_URL := https://www.oracle.com/technetwork/java/javase/terms/license/java$(VERSION_NUMBER)speclicense.html
|
||||
LICENSE_URL := https://www.oracle.com/java/javase/terms/license/java$(VERSION_NUMBER)speclicense.html
|
||||
REDISTRIBUTION_URL := https://www.oracle.com/technetwork/java/redist-137594.html
|
||||
|
||||
# In order to get a specific ordering it's necessary to specify the total
|
||||
|
@ -640,6 +640,18 @@ $(eval $(call SetupTarget, test-image-jdk-jtreg-native, \
|
||||
DEPS := build-test-jdk-jtreg-native, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupTarget, build-test-libtest-jtreg-native, \
|
||||
MAKEFILE := test/JtregNativeLibTest, \
|
||||
TARGET := build-test-libtest-jtreg-native, \
|
||||
DEPS := buildtools-jdk, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupTarget, test-image-libtest-jtreg-native, \
|
||||
MAKEFILE := test/JtregNativeLibTest, \
|
||||
TARGET := test-image-libtest-jtreg-native, \
|
||||
DEPS := build-test-libtest-jtreg-native, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupTarget, build-test-hotspot-jtreg-graal, \
|
||||
MAKEFILE := test/JtregGraalUnit, \
|
||||
TARGET := build-test-hotspot-jtreg-graal, \
|
||||
@ -792,7 +804,7 @@ else
|
||||
|
||||
# Declare dependencies between hotspot-<variant>* targets
|
||||
$(foreach v, $(JVM_VARIANTS), \
|
||||
$(eval hotspot-$v-gensrc: java.base-copy) \
|
||||
$(eval hotspot-$v-gensrc: java.base-copy buildtools-hotspot) \
|
||||
$(eval hotspot-$v-libs: hotspot-$v-gensrc java.base-copy) \
|
||||
)
|
||||
|
||||
@ -982,6 +994,7 @@ else
|
||||
interim-image: $(INTERIM_JMOD_TARGETS)
|
||||
|
||||
build-test-hotspot-jtreg-native: hotspot-$(JVM_VARIANT_MAIN)-libs
|
||||
build-test-libtest-jtreg-native: hotspot-$(JVM_VARIANT_MAIN)-libs
|
||||
|
||||
endif
|
||||
|
||||
@ -1105,7 +1118,7 @@ endif
|
||||
docs-image: docs-jdk
|
||||
|
||||
# This target builds the test image
|
||||
test-image: prepare-test-image test-image-jdk-jtreg-native test-image-demos-jdk
|
||||
test-image: prepare-test-image test-image-jdk-jtreg-native test-image-demos-jdk test-image-libtest-jtreg-native
|
||||
|
||||
ifneq ($(JVM_TEST_IMAGE_TARGETS), )
|
||||
# If JVM_TEST_IMAGE_TARGETS is externally defined, use it instead of the
|
||||
|
@ -342,11 +342,13 @@ hotspot_JTREG_MAX_MEM := 0
|
||||
hotspot_JTREG_ASSERT := false
|
||||
hotspot_JTREG_NATIVEPATH := $(TEST_IMAGE_DIR)/hotspot/jtreg/native
|
||||
jdk_JTREG_NATIVEPATH := $(TEST_IMAGE_DIR)/jdk/jtreg/native
|
||||
lib-test_JTREG_NATIVEPATH := $(TEST_IMAGE_DIR)/lib-test/jtreg/native
|
||||
|
||||
jdk_JTREG_PROBLEM_LIST += $(TOPDIR)/test/jdk/ProblemList.txt
|
||||
jaxp_JTREG_PROBLEM_LIST += $(TOPDIR)/test/jaxp/ProblemList.txt
|
||||
langtools_JTREG_PROBLEM_LIST += $(TOPDIR)/test/langtools/ProblemList.txt
|
||||
hotspot_JTREG_PROBLEM_LIST += $(TOPDIR)/test/hotspot/jtreg/ProblemList.txt
|
||||
lib-test_JTREG_PROBLEM_LIST += $(TOPDIR)/test/lib-test/ProblemList.txt
|
||||
|
||||
langtools_JTREG_MAX_MEM := 768m
|
||||
|
||||
|
47
make/ToolsHotspot.gmk
Normal file
47
make/ToolsHotspot.gmk
Normal file
@ -0,0 +1,47 @@
|
||||
#
|
||||
# Copyright (c) 2020, 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.
|
||||
#
|
||||
|
||||
ifndef _TOOLS_HOTSPOT_GMK
|
||||
_TOOLS_HOTSPOT_GMK := 1
|
||||
|
||||
include JavaCompilation.gmk
|
||||
|
||||
HOTSPOT_TOOLS_OUTPUTDIR := $(BUILDTOOLS_OUTPUTDIR)/buildtools/hotspot_tools_classes
|
||||
|
||||
################################################################################
|
||||
# To avoid reevaluating the compilation setup for the tools each time this file
|
||||
# is included, the actual compilation is handled by CompileToolsHotspot.gmk. The
|
||||
# following trick is used to be able to declare a dependency on the built tools.
|
||||
BUILD_TOOLS_HOTSPOT := $(call SetupJavaCompilationCompileTarget, \
|
||||
BUILD_TOOLS_HOTSPOT, $(HOTSPOT_TOOLS_OUTPUTDIR))
|
||||
|
||||
################################################################################
|
||||
|
||||
TOOL_JFR_GEN := $(JAVA_SMALL) -cp $(HOTSPOT_TOOLS_OUTPUTDIR) \
|
||||
build.tools.jfr.GenerateJfrFiles
|
||||
|
||||
##########################################################################################
|
||||
|
||||
endif # _TOOLS_HOTSPOT_GMK
|
@ -62,17 +62,10 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
||||
[
|
||||
# Setup basic LDFLAGS
|
||||
if test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||
# If this is a --hash-style=gnu system, use --hash-style=both, why?
|
||||
# We have previously set HAS_GNU_HASH if this is the case
|
||||
if test -n "$HAS_GNU_HASH"; then
|
||||
BASIC_LDFLAGS="-Wl,--hash-style=both"
|
||||
LIBJSIG_HASHSTYLE_LDFLAGS="-Wl,--hash-style=both"
|
||||
fi
|
||||
|
||||
# Add -z,defs, to forbid undefined symbols in object files.
|
||||
# add -z,relro (mark relocations read only) for all libs
|
||||
# add -z,now ("full relro" - more of the Global Offset Table GOT is marked read only)
|
||||
BASIC_LDFLAGS="$BASIC_LDFLAGS -Wl,-z,defs -Wl,-z,relro -Wl,-z,now"
|
||||
BASIC_LDFLAGS="-Wl,--hash-style=gnu -Wl,-z,defs -Wl,-z,relro -Wl,-z,now"
|
||||
# Linux : remove unused code+data in link step
|
||||
if test "x$ENABLE_LINKTIME_GC" = xtrue; then
|
||||
if test "x$OPENJDK_TARGET_CPU" = xs390x; then
|
||||
@ -152,8 +145,6 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
||||
# Export some intermediate variables for compatibility
|
||||
LDFLAGS_CXX_JDK="$BASIC_LDFLAGS_ONLYCXX $BASIC_LDFLAGS_ONLYCXX_JDK_ONLY $DEBUGLEVEL_LDFLAGS_JDK_ONLY"
|
||||
AC_SUBST(LDFLAGS_CXX_JDK)
|
||||
AC_SUBST(LIBJSIG_HASHSTYLE_LDFLAGS)
|
||||
AC_SUBST(LIBJSIG_NOEXECSTACK_LDFLAGS)
|
||||
])
|
||||
|
||||
################################################################################
|
||||
|
@ -179,7 +179,7 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
AC_MSG_ERROR([--with-version-string must have a value])
|
||||
elif test "x$with_version_string" != x; then
|
||||
# Additional [] needed to keep m4 from mangling shell constructs.
|
||||
if [ [[ $with_version_string =~ ^([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(-([a-zA-Z]+))?((\+)([0-9]+)?(-([-a-zA-Z0-9.]+))?)?$ ]] ]; then
|
||||
if [ [[ $with_version_string =~ ^([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?(-([a-zA-Z0-9]+))?(((\+)([0-9]*))?(-([-a-zA-Z0-9.]+))?)?$ ]] ]; then
|
||||
VERSION_FEATURE=${BASH_REMATCH[[1]]}
|
||||
VERSION_INTERIM=${BASH_REMATCH[[3]]}
|
||||
VERSION_UPDATE=${BASH_REMATCH[[5]]}
|
||||
@ -188,9 +188,9 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
VERSION_EXTRA2=${BASH_REMATCH[[11]]}
|
||||
VERSION_EXTRA3=${BASH_REMATCH[[13]]}
|
||||
VERSION_PRE=${BASH_REMATCH[[15]]}
|
||||
version_plus_separator=${BASH_REMATCH[[17]]}
|
||||
VERSION_BUILD=${BASH_REMATCH[[18]]}
|
||||
VERSION_OPT=${BASH_REMATCH[[20]]}
|
||||
version_plus_separator=${BASH_REMATCH[[18]]}
|
||||
VERSION_BUILD=${BASH_REMATCH[[19]]}
|
||||
VERSION_OPT=${BASH_REMATCH[[21]]}
|
||||
# Unspecified numerical fields are interpreted as 0.
|
||||
if test "x$VERSION_INTERIM" = x; then
|
||||
VERSION_INTERIM=0
|
||||
@ -233,8 +233,8 @@ AC_DEFUN_ONCE([JDKVER_SETUP_JDK_VERSION_NUMBERS],
|
||||
# Interpret --without-* as empty string instead of the literal "no"
|
||||
VERSION_PRE=
|
||||
else
|
||||
# Only [a-zA-Z] is allowed in the VERSION_PRE. Outer [ ] to quote m4.
|
||||
[ VERSION_PRE=`$ECHO "$with_version_pre" | $TR -c -d '[a-z][A-Z]'` ]
|
||||
# Only [a-zA-Z0-9] is allowed in the VERSION_PRE. Outer [ ] to quote m4.
|
||||
[ VERSION_PRE=`$ECHO "$with_version_pre" | $TR -c -d '[a-zA-Z0-9]'` ]
|
||||
if test "x$VERSION_PRE" != "x$with_version_pre"; then
|
||||
AC_MSG_WARN([--with-version-pre value has been sanitized from '$with_version_pre' to '$VERSION_PRE'])
|
||||
fi
|
||||
|
@ -489,9 +489,6 @@ CXXFLAGS_JDKLIB:=@CXXFLAGS_JDKLIB@
|
||||
CFLAGS_JDKEXE:=@CFLAGS_JDKEXE@
|
||||
CXXFLAGS_JDKEXE:=@CXXFLAGS_JDKEXE@
|
||||
|
||||
LIBJSIG_HASHSTYLE_LDFLAGS := @LIBJSIG_HASHSTYLE_LDFLAGS@
|
||||
LIBJSIG_NOEXECSTACK_LDFLAGS := @LIBJSIG_NOEXECSTACK_LDFLAGS@
|
||||
|
||||
FDLIBM_CFLAGS := @FDLIBM_CFLAGS@
|
||||
JVM_CFLAGS := @JVM_CFLAGS@
|
||||
JVM_LDFLAGS := @JVM_LDFLAGS@
|
||||
|
@ -972,12 +972,6 @@ AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS],
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||
# If this is a --hash-style=gnu system, use --hash-style=both, why?
|
||||
HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'`
|
||||
# This is later checked when setting flags.
|
||||
fi
|
||||
|
||||
if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||
# Check if linker has -z noexecstack.
|
||||
HAS_NOEXECSTACK=`$CC -Wl,--help 2>/dev/null | $GREP 'z noexecstack'`
|
||||
@ -1005,8 +999,27 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG],
|
||||
AC_MSG_CHECKING([for jtreg test harness])
|
||||
AC_MSG_RESULT([no, disabled])
|
||||
elif test "x$with_jtreg" != xyes && test "x$with_jtreg" != x; then
|
||||
# An explicit path is specified, use it.
|
||||
JT_HOME="$with_jtreg"
|
||||
if test -d "$with_jtreg"; then
|
||||
# An explicit path is specified, use it.
|
||||
JT_HOME="$with_jtreg"
|
||||
else
|
||||
case "$with_jtreg" in
|
||||
*.zip )
|
||||
JTREG_SUPPORT_DIR=$CONFIGURESUPPORT_OUTPUTDIR/jtreg
|
||||
$RM -rf $JTREG_SUPPORT_DIR
|
||||
$MKDIR -p $JTREG_SUPPORT_DIR
|
||||
$UNZIP -qq -d $JTREG_SUPPORT_DIR $with_jtreg
|
||||
|
||||
# Try to find jtreg to determine JT_HOME path
|
||||
JTREG_PATH=`$FIND $JTREG_SUPPORT_DIR | $GREP "/bin/jtreg"`
|
||||
if test "x$JTREG_PATH" != x; then
|
||||
JT_HOME=$($DIRNAME $($DIRNAME $JTREG_PATH))
|
||||
fi
|
||||
;;
|
||||
* )
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
UTIL_FIXUP_PATH([JT_HOME])
|
||||
if test ! -d "$JT_HOME"; then
|
||||
AC_MSG_ERROR([jtreg home directory from --with-jtreg=$with_jtreg does not exist])
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
@ -26,18 +26,18 @@
|
||||
# Default version, product, and vendor information to use,
|
||||
# unless overridden by configure
|
||||
|
||||
DEFAULT_VERSION_FEATURE=15
|
||||
DEFAULT_VERSION_FEATURE=16
|
||||
DEFAULT_VERSION_INTERIM=0
|
||||
DEFAULT_VERSION_UPDATE=0
|
||||
DEFAULT_VERSION_PATCH=0
|
||||
DEFAULT_VERSION_EXTRA1=0
|
||||
DEFAULT_VERSION_EXTRA2=0
|
||||
DEFAULT_VERSION_EXTRA3=0
|
||||
DEFAULT_VERSION_DATE=2020-09-15
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=59 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_DATE=2021-03-16
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=60 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="14 15"
|
||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=15
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="14 15 16"
|
||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=16
|
||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||
|
||||
LAUNCHER_NAME=openjdk
|
||||
|
@ -43,7 +43,7 @@ $(eval $(call IncludeCustomExtension, common/FindTests.gmk))
|
||||
TEST_BASEDIRS += $(TOPDIR)/test $(TOPDIR)
|
||||
|
||||
# JTREG_TESTROOTS might have been set by a custom extension
|
||||
JTREG_TESTROOTS += $(addprefix $(TOPDIR)/test/, hotspot/jtreg jdk langtools jaxp)
|
||||
JTREG_TESTROOTS += $(addprefix $(TOPDIR)/test/, hotspot/jtreg jdk langtools jaxp lib-test)
|
||||
|
||||
# Extract the names of the Jtreg group files from the TEST.ROOT files. The
|
||||
# TEST.ROOT files being properties files can be interpreted as makefiles so
|
||||
|
@ -1045,10 +1045,10 @@ var getJibProfilesDependencies = function (input, common) {
|
||||
jtreg: {
|
||||
server: "jpg",
|
||||
product: "jtreg",
|
||||
version: "5.0",
|
||||
version: "5.1",
|
||||
build_number: "b01",
|
||||
checksum_file: "MD5_VALUES",
|
||||
file: "bundles/jtreg_bin-5.0.zip",
|
||||
file: "bundles/jtreg_bin-5.1.zip",
|
||||
environment_name: "JT_HOME",
|
||||
environment_path: input.get("jtreg", "home_path") + "/bin",
|
||||
configure_args: "--with-jtreg=" + input.get("jtreg", "home_path"),
|
||||
|
259
make/data/symbols/java.base-F.sym.txt
Normal file
259
make/data/symbols/java.base-F.sym.txt
Normal file
@ -0,0 +1,259 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name java/lang/Boolean
|
||||
header extends java/lang/Object implements java/io/Serializable,java/lang/Comparable,java/lang/constant/Constable flags 31 signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/Boolean;>;Ljava/lang/constant/Constable;
|
||||
method name describeConstable descriptor ()Ljava/util/Optional; flags 1 signature ()Ljava/util/Optional<Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Boolean;>;>;
|
||||
|
||||
class name java/lang/Byte
|
||||
header extends java/lang/Number implements java/lang/Comparable,java/lang/constant/Constable flags 31 signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Byte;>;Ljava/lang/constant/Constable;
|
||||
method name describeConstable descriptor ()Ljava/util/Optional; flags 1 signature ()Ljava/util/Optional<Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Byte;>;>;
|
||||
|
||||
class name java/lang/CharSequence
|
||||
method name isEmpty descriptor ()Z flags 1
|
||||
|
||||
class name java/lang/Character
|
||||
header extends java/lang/Object implements java/io/Serializable,java/lang/Comparable,java/lang/constant/Constable nestMembers java/lang/Character$UnicodeScript,java/lang/Character$UnicodeBlock,java/lang/Character$Subset flags 31 signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/Character;>;Ljava/lang/constant/Constable;
|
||||
innerclass innerClass java/lang/Character$UnicodeBlock outerClass java/lang/Character innerClassName UnicodeBlock flags 19
|
||||
innerclass innerClass java/lang/Character$UnicodeScript outerClass java/lang/Character innerClassName UnicodeScript flags 4019
|
||||
innerclass innerClass java/lang/Character$Subset outerClass java/lang/Character innerClassName Subset flags 9
|
||||
method name describeConstable descriptor ()Ljava/util/Optional; flags 1 signature ()Ljava/util/Optional<Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Character;>;>;
|
||||
|
||||
class name java/lang/Character$UnicodeBlock
|
||||
field name YEZIDI descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name CHORASMIAN descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name DIVES_AKURU descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name LISU_SUPPLEMENT descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name KHITAN_SMALL_SCRIPT descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name TANGUT_SUPPLEMENT descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name SYMBOLS_FOR_LEGACY_COMPUTING descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
field name CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||
|
||||
class name java/lang/Character$UnicodeScript
|
||||
field name YEZIDI descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||
field name CHORASMIAN descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||
field name DIVES_AKURU descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||
field name KHITAN_SMALL_SCRIPT descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||
|
||||
class name java/lang/Class
|
||||
method name isHidden descriptor ()Z flags 101 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||
method name permittedSubclasses descriptor ()[Ljava/lang/constant/ClassDesc; flags 1 classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
method name isSealed descriptor ()Z flags 1 classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
|
||||
class name java/lang/Math
|
||||
method name absExact descriptor (I)I flags 9
|
||||
method name absExact descriptor (J)J flags 9
|
||||
|
||||
class name java/lang/Short
|
||||
header extends java/lang/Number implements java/lang/Comparable,java/lang/constant/Constable flags 31 signature Ljava/lang/Number;Ljava/lang/Comparable<Ljava/lang/Short;>;Ljava/lang/constant/Constable;
|
||||
method name describeConstable descriptor ()Ljava/util/Optional; flags 1 signature ()Ljava/util/Optional<Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Short;>;>;
|
||||
|
||||
class name java/lang/StrictMath
|
||||
method name absExact descriptor (I)I flags 9
|
||||
method name absExact descriptor (J)J flags 9
|
||||
|
||||
class name java/lang/String
|
||||
-method name stripIndent descriptor ()Ljava/lang/String;
|
||||
-method name translateEscapes descriptor ()Ljava/lang/String;
|
||||
-method name formatted descriptor ([Ljava/lang/Object;)Ljava/lang/String;
|
||||
method name stripIndent descriptor ()Ljava/lang/String; flags 1
|
||||
method name translateEscapes descriptor ()Ljava/lang/String; flags 1
|
||||
method name formatted descriptor ([Ljava/lang/Object;)Ljava/lang/String; flags 81
|
||||
|
||||
class name java/lang/constant/ConstantDescs
|
||||
field name BSM_GET_STATIC_FINAL descriptor Ljava/lang/constant/DirectMethodHandleDesc; flags 19
|
||||
field name BSM_EXPLICIT_CAST descriptor Ljava/lang/constant/DirectMethodHandleDesc; flags 19
|
||||
field name TRUE descriptor Ljava/lang/constant/DynamicConstantDesc; flags 19 signature Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Boolean;>;
|
||||
field name FALSE descriptor Ljava/lang/constant/DynamicConstantDesc; flags 19 signature Ljava/lang/constant/DynamicConstantDesc<Ljava/lang/Boolean;>;
|
||||
|
||||
class name java/lang/invoke/ConstantBootstraps
|
||||
-method name <init> descriptor ()V
|
||||
method name explicitCast descriptor (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;Ljava/lang/Object;)Ljava/lang/Object; thrownTypes java/lang/ClassCastException flags 9 signature (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class<*>;Ljava/lang/Object;)Ljava/lang/Object;
|
||||
|
||||
class name java/lang/invoke/MethodHandles
|
||||
header extends java/lang/Object nestMembers java/lang/invoke/MethodHandles$Lookup,java/lang/invoke/MethodHandles$Lookup$ClassOption flags 21
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
innerclass innerClass java/lang/invoke/VarHandle$AccessMode outerClass java/lang/invoke/VarHandle innerClassName AccessMode flags 4019
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup$ClassOption outerClass java/lang/invoke/MethodHandles$Lookup innerClassName ClassOption flags 4019
|
||||
|
||||
class name java/lang/invoke/MethodHandles$Lookup
|
||||
header extends java/lang/Object nestHost java/lang/invoke/MethodHandles flags 31
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup$ClassOption outerClass java/lang/invoke/MethodHandles$Lookup innerClassName ClassOption flags 4019
|
||||
innerclass innerClass java/lang/invoke/VarHandle$AccessMode outerClass java/lang/invoke/VarHandle innerClassName AccessMode flags 4019
|
||||
method name defineHiddenClass descriptor ([BZ[Ljava/lang/invoke/MethodHandles$Lookup$ClassOption;)Ljava/lang/invoke/MethodHandles$Lookup; thrownTypes java/lang/IllegalAccessException flags 81
|
||||
method name ensureInitialized descriptor (Ljava/lang/Class;)Ljava/lang/Class; thrownTypes java/lang/IllegalAccessException flags 1 signature (Ljava/lang/Class<*>;)Ljava/lang/Class<*>;
|
||||
|
||||
class name java/lang/invoke/MethodHandles$Lookup$ClassOption
|
||||
header extends java/lang/Enum nestHost java/lang/invoke/MethodHandles flags 4031 signature Ljava/lang/Enum<Ljava/lang/invoke/MethodHandles$Lookup$ClassOption;>;
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup$ClassOption outerClass java/lang/invoke/MethodHandles$Lookup innerClassName ClassOption flags 4019
|
||||
field name NESTMATE descriptor Ljava/lang/invoke/MethodHandles$Lookup$ClassOption; flags 4019
|
||||
field name STRONG descriptor Ljava/lang/invoke/MethodHandles$Lookup$ClassOption; flags 4019
|
||||
method name values descriptor ()[Ljava/lang/invoke/MethodHandles$Lookup$ClassOption; flags 9
|
||||
method name valueOf descriptor (Ljava/lang/String;)Ljava/lang/invoke/MethodHandles$Lookup$ClassOption; flags 9
|
||||
|
||||
class name java/lang/invoke/VarHandle
|
||||
-method name varType descriptor ()Ljava/lang/Class;
|
||||
-method name coordinateTypes descriptor ()Ljava/util/List;
|
||||
-method name toMethodHandle descriptor (Ljava/lang/invoke/VarHandle$AccessMode;)Ljava/lang/invoke/MethodHandle;
|
||||
method name varType descriptor ()Ljava/lang/Class; flags 1 signature ()Ljava/lang/Class<*>;
|
||||
method name coordinateTypes descriptor ()Ljava/util/List; flags 1 signature ()Ljava/util/List<Ljava/lang/Class<*>;>;
|
||||
method name toMethodHandle descriptor (Ljava/lang/invoke/VarHandle$AccessMode;)Ljava/lang/invoke/MethodHandle; flags 1
|
||||
|
||||
class name java/lang/reflect/AnnotatedType
|
||||
method name getAnnotation descriptor (Ljava/lang/Class;)Ljava/lang/annotation/Annotation; flags 401 signature <T::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TT;>;)TT;
|
||||
method name getAnnotations descriptor ()[Ljava/lang/annotation/Annotation; flags 401
|
||||
method name getDeclaredAnnotations descriptor ()[Ljava/lang/annotation/Annotation; flags 401
|
||||
|
||||
class name java/lang/reflect/Modifier
|
||||
-method name <init> descriptor ()V
|
||||
|
||||
class name java/net/DatagramSocket
|
||||
header extends java/lang/Object implements java/io/Closeable flags 21
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
-method name bind descriptor (Ljava/net/SocketAddress;)V
|
||||
-method name receive descriptor (Ljava/net/DatagramPacket;)V
|
||||
-method name setSoTimeout descriptor (I)V
|
||||
-method name getSoTimeout descriptor ()I
|
||||
-method name setSendBufferSize descriptor (I)V
|
||||
-method name getSendBufferSize descriptor ()I
|
||||
-method name setReceiveBufferSize descriptor (I)V
|
||||
-method name getReceiveBufferSize descriptor ()I
|
||||
-method name setReuseAddress descriptor (Z)V
|
||||
-method name getReuseAddress descriptor ()Z
|
||||
-method name setBroadcast descriptor (Z)V
|
||||
-method name getBroadcast descriptor ()Z
|
||||
-method name setTrafficClass descriptor (I)V
|
||||
-method name getTrafficClass descriptor ()I
|
||||
method name bind descriptor (Ljava/net/SocketAddress;)V thrownTypes java/net/SocketException flags 1
|
||||
method name receive descriptor (Ljava/net/DatagramPacket;)V thrownTypes java/io/IOException flags 1
|
||||
method name setSoTimeout descriptor (I)V thrownTypes java/net/SocketException flags 1
|
||||
method name getSoTimeout descriptor ()I thrownTypes java/net/SocketException flags 1
|
||||
method name setSendBufferSize descriptor (I)V thrownTypes java/net/SocketException flags 1
|
||||
method name getSendBufferSize descriptor ()I thrownTypes java/net/SocketException flags 1
|
||||
method name setReceiveBufferSize descriptor (I)V thrownTypes java/net/SocketException flags 1
|
||||
method name getReceiveBufferSize descriptor ()I thrownTypes java/net/SocketException flags 1
|
||||
method name setReuseAddress descriptor (Z)V thrownTypes java/net/SocketException flags 1
|
||||
method name getReuseAddress descriptor ()Z thrownTypes java/net/SocketException flags 1
|
||||
method name setBroadcast descriptor (Z)V thrownTypes java/net/SocketException flags 1
|
||||
method name getBroadcast descriptor ()Z thrownTypes java/net/SocketException flags 1
|
||||
method name setTrafficClass descriptor (I)V thrownTypes java/net/SocketException flags 1
|
||||
method name getTrafficClass descriptor ()I thrownTypes java/net/SocketException flags 1
|
||||
|
||||
class name java/net/MulticastSocket
|
||||
-method name supportedOptions descriptor ()Ljava/util/Set;
|
||||
|
||||
class name java/nio/CharBuffer
|
||||
method name isEmpty descriptor ()Z flags 11
|
||||
|
||||
class name java/nio/channels/ServerSocketChannel
|
||||
method name open descriptor (Ljava/net/ProtocolFamily;)Ljava/nio/channels/ServerSocketChannel; thrownTypes java/io/IOException flags 9
|
||||
|
||||
class name java/nio/channels/SocketChannel
|
||||
method name open descriptor (Ljava/net/ProtocolFamily;)Ljava/nio/channels/SocketChannel; thrownTypes java/io/IOException flags 9
|
||||
|
||||
class name java/nio/channels/spi/SelectorProvider
|
||||
method name openSocketChannel descriptor (Ljava/net/ProtocolFamily;)Ljava/nio/channels/SocketChannel; thrownTypes java/io/IOException flags 1
|
||||
method name openServerSocketChannel descriptor (Ljava/net/ProtocolFamily;)Ljava/nio/channels/ServerSocketChannel; thrownTypes java/io/IOException flags 1
|
||||
|
||||
class name java/security/interfaces/EdECKey
|
||||
header extends java/lang/Object flags 601
|
||||
method name getParams descriptor ()Ljava/security/spec/NamedParameterSpec; flags 401
|
||||
|
||||
class name java/security/interfaces/EdECPrivateKey
|
||||
header extends java/lang/Object implements java/security/interfaces/EdECKey,java/security/PrivateKey flags 601
|
||||
method name getBytes descriptor ()Ljava/util/Optional; flags 401 signature ()Ljava/util/Optional<[B>;
|
||||
|
||||
class name java/security/interfaces/EdECPublicKey
|
||||
header extends java/lang/Object implements java/security/interfaces/EdECKey,java/security/PublicKey flags 601
|
||||
method name getPoint descriptor ()Ljava/security/spec/EdECPoint; flags 401
|
||||
|
||||
class name java/security/spec/EdDSAParameterSpec
|
||||
header extends java/lang/Object implements java/security/spec/AlgorithmParameterSpec flags 21
|
||||
method name <init> descriptor (Z)V flags 1
|
||||
method name <init> descriptor (Z[B)V flags 1
|
||||
method name isPrehash descriptor ()Z flags 1
|
||||
method name getContext descriptor ()Ljava/util/Optional; flags 1 signature ()Ljava/util/Optional<[B>;
|
||||
|
||||
class name java/security/spec/EdECPoint
|
||||
header extends java/lang/Object flags 31
|
||||
method name <init> descriptor (ZLjava/math/BigInteger;)V flags 1
|
||||
method name isXOdd descriptor ()Z flags 1
|
||||
method name getY descriptor ()Ljava/math/BigInteger; flags 1
|
||||
|
||||
class name java/security/spec/EdECPrivateKeySpec
|
||||
header extends java/lang/Object implements java/security/spec/KeySpec flags 31
|
||||
method name <init> descriptor (Ljava/security/spec/NamedParameterSpec;[B)V flags 1
|
||||
method name getParams descriptor ()Ljava/security/spec/NamedParameterSpec; flags 1
|
||||
method name getBytes descriptor ()[B flags 1
|
||||
|
||||
class name java/security/spec/EdECPublicKeySpec
|
||||
header extends java/lang/Object implements java/security/spec/KeySpec flags 31
|
||||
method name <init> descriptor (Ljava/security/spec/NamedParameterSpec;Ljava/security/spec/EdECPoint;)V flags 1
|
||||
method name getParams descriptor ()Ljava/security/spec/NamedParameterSpec; flags 1
|
||||
method name getPoint descriptor ()Ljava/security/spec/EdECPoint; flags 1
|
||||
|
||||
class name java/security/spec/NamedParameterSpec
|
||||
field name ED25519 descriptor Ljava/security/spec/NamedParameterSpec; flags 19
|
||||
field name ED448 descriptor Ljava/security/spec/NamedParameterSpec; flags 19
|
||||
|
||||
class name java/text/DecimalFormatSymbols
|
||||
method name getMonetaryGroupingSeparator descriptor ()C flags 1
|
||||
method name setMonetaryGroupingSeparator descriptor (C)V flags 1
|
||||
|
||||
class name java/util/NoSuchElementException
|
||||
method name <init> descriptor (Ljava/lang/String;Ljava/lang/Throwable;)V flags 1
|
||||
method name <init> descriptor (Ljava/lang/Throwable;)V flags 1
|
||||
|
||||
class name java/util/TreeMap
|
||||
method name putIfAbsent descriptor (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; flags 1 signature (TK;TV;)TV;
|
||||
method name computeIfAbsent descriptor (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object; flags 1 signature (TK;Ljava/util/function/Function<-TK;+TV;>;)TV;
|
||||
method name computeIfPresent descriptor (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; flags 1 signature (TK;Ljava/util/function/BiFunction<-TK;-TV;+TV;>;)TV;
|
||||
method name compute descriptor (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; flags 1 signature (TK;Ljava/util/function/BiFunction<-TK;-TV;+TV;>;)TV;
|
||||
method name merge descriptor (Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; flags 1 signature (TK;TV;Ljava/util/function/BiFunction<-TV;-TV;+TV;>;)TV;
|
||||
|
||||
class name java/util/concurrent/locks/StampedLock
|
||||
header extends java/lang/Object implements java/io/Serializable flags 21 classAnnotations @Ljdk/Profile+Annotation;(value=I1)
|
||||
method name tryWriteLock descriptor ()J flags 1
|
||||
method name writeLockInterruptibly descriptor ()J thrownTypes java/lang/InterruptedException flags 1
|
||||
method name tryReadLock descriptor ()J flags 1
|
||||
method name tryReadLock descriptor (JLjava/util/concurrent/TimeUnit;)J thrownTypes java/lang/InterruptedException flags 1
|
||||
method name readLockInterruptibly descriptor ()J thrownTypes java/lang/InterruptedException flags 1
|
||||
method name unlock descriptor (J)V flags 1
|
||||
-method name tryWriteLock descriptor ()J
|
||||
-method name writeLockInterruptibly descriptor ()J
|
||||
-method name tryReadLock descriptor ()J
|
||||
-method name tryReadLock descriptor (JLjava/util/concurrent/TimeUnit;)J
|
||||
-method name readLockInterruptibly descriptor ()J
|
||||
-method name unlock descriptor (J)V
|
||||
|
||||
class name javax/net/ssl/SSLSession
|
||||
-method name getPeerCertificateChain descriptor ()[Ljavax/security/cert/X509Certificate;
|
||||
method name getPeerCertificateChain descriptor ()[Ljavax/security/cert/X509Certificate; thrownTypes javax/net/ssl/SSLPeerUnverifiedException flags 1 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||
|
74
make/data/symbols/java.compiler-F.sym.txt
Normal file
74
make/data/symbols/java.compiler-F.sym.txt
Normal file
@ -0,0 +1,74 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name javax/lang/model/SourceVersion
|
||||
field name RELEASE_15 descriptor Ljavax/lang/model/SourceVersion; flags 4019
|
||||
|
||||
class name javax/lang/model/element/Element
|
||||
method name getAnnotationsByType descriptor (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation; flags 401 signature <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
|
||||
|
||||
class name javax/lang/model/element/Modifier
|
||||
header extends java/lang/Enum flags 4021 signature Ljava/lang/Enum<Ljavax/lang/model/element/Modifier;>;
|
||||
field name SEALED descriptor Ljavax/lang/model/element/Modifier; flags 4019 classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
field name NON_SEALED descriptor Ljavax/lang/model/element/Modifier; flags 4019 classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
|
||||
class name javax/lang/model/element/TypeElement
|
||||
method name getPermittedSubclasses descriptor ()Ljava/util/List; flags 1 signature ()Ljava/util/List<+Ljavax/lang/model/type/TypeMirror;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
|
||||
class name javax/lang/model/type/TypeMirror
|
||||
method name getAnnotationMirrors descriptor ()Ljava/util/List; flags 401 signature ()Ljava/util/List<+Ljavax/lang/model/element/AnnotationMirror;>;
|
||||
method name getAnnotation descriptor (Ljava/lang/Class;)Ljava/lang/annotation/Annotation; flags 401 signature <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)TA;
|
||||
method name getAnnotationsByType descriptor (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation; flags 401 signature <A::Ljava/lang/annotation/Annotation;>(Ljava/lang/Class<TA;>;)[TA;
|
||||
|
||||
class name javax/lang/model/util/AbstractAnnotationValueVisitor14
|
||||
header extends javax/lang/model/util/AbstractAnnotationValueVisitor9 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractAnnotationValueVisitor9<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/AbstractElementVisitor14
|
||||
header extends javax/lang/model/util/AbstractElementVisitor9 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractElementVisitor9<TR;TP;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;RECORDS;,essentialAPI=Zfalse) runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/AbstractTypeVisitor14
|
||||
header extends javax/lang/model/util/AbstractTypeVisitor9 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractTypeVisitor9<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/ElementKindVisitor14
|
||||
header extends javax/lang/model/util/ElementKindVisitor9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/ElementKindVisitor9<TR;TP;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;RECORDS;,essentialAPI=Zfalse) runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/ElementScanner14
|
||||
header extends javax/lang/model/util/ElementScanner9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/ElementScanner9<TR;TP;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;RECORDS;,essentialAPI=Zfalse) runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/SimpleAnnotationValueVisitor14
|
||||
header extends javax/lang/model/util/SimpleAnnotationValueVisitor9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleAnnotationValueVisitor9<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/SimpleElementVisitor14
|
||||
header extends javax/lang/model/util/SimpleElementVisitor9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleElementVisitor9<TR;TP;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;RECORDS;,essentialAPI=Zfalse) runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/SimpleTypeVisitor14
|
||||
header extends javax/lang/model/util/SimpleTypeVisitor9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleTypeVisitor9<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
||||
class name javax/lang/model/util/TypeKindVisitor14
|
||||
header extends javax/lang/model/util/TypeKindVisitor9 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/TypeKindVisitor9<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_15;)
|
||||
|
65
make/data/symbols/java.desktop-F.sym.txt
Normal file
65
make/data/symbols/java.desktop-F.sym.txt
Normal file
@ -0,0 +1,65 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name java/awt/Robot
|
||||
-method name delay descriptor (I)V
|
||||
method name delay descriptor (I)V flags 1
|
||||
|
||||
class name javax/accessibility/AccessibleBundle
|
||||
header extends java/lang/Object flags 421 classAnnotations @Ljdk/Profile+Annotation;(value=I4)
|
||||
|
||||
class name javax/sound/sampled/BooleanControl
|
||||
header extends javax/sound/sampled/Control nestMembers javax/sound/sampled/BooleanControl$Type flags 421
|
||||
innerclass innerClass javax/sound/sampled/Control$Type outerClass javax/sound/sampled/Control innerClassName Type flags 9
|
||||
innerclass innerClass javax/sound/sampled/BooleanControl$Type outerClass javax/sound/sampled/BooleanControl innerClassName Type flags 9
|
||||
|
||||
class name javax/sound/sampled/CompoundControl
|
||||
header extends javax/sound/sampled/Control nestMembers javax/sound/sampled/CompoundControl$Type flags 421
|
||||
innerclass innerClass javax/sound/sampled/Control$Type outerClass javax/sound/sampled/Control innerClassName Type flags 9
|
||||
innerclass innerClass javax/sound/sampled/CompoundControl$Type outerClass javax/sound/sampled/CompoundControl innerClassName Type flags 9
|
||||
|
||||
class name javax/sound/sampled/Control
|
||||
header extends java/lang/Object nestMembers javax/sound/sampled/Control$Type flags 421
|
||||
innerclass innerClass javax/sound/sampled/Control$Type outerClass javax/sound/sampled/Control innerClassName Type flags 9
|
||||
|
||||
class name javax/sound/sampled/LineEvent
|
||||
header extends java/util/EventObject nestMembers javax/sound/sampled/LineEvent$Type flags 21
|
||||
innerclass innerClass javax/sound/sampled/LineEvent$Type outerClass javax/sound/sampled/LineEvent innerClassName Type flags 9
|
||||
|
||||
class name javax/sound/sampled/Mixer$Info
|
||||
header extends java/lang/Object nestHost javax/sound/sampled/Mixer flags 21
|
||||
innerclass innerClass javax/sound/sampled/Mixer$Info outerClass javax/sound/sampled/Mixer innerClassName Info flags 9
|
||||
|
||||
class name javax/sound/sampled/Port$Info
|
||||
header extends javax/sound/sampled/Line$Info nestHost javax/sound/sampled/Port flags 21
|
||||
innerclass innerClass javax/sound/sampled/Line$Info outerClass javax/sound/sampled/Line innerClassName Info flags 9
|
||||
innerclass innerClass javax/sound/sampled/Port$Info outerClass javax/sound/sampled/Port innerClassName Info flags 9
|
||||
|
||||
class name javax/sound/sampled/ReverbType
|
||||
header extends java/lang/Object flags 21 classAnnotations @Ljdk/Profile+Annotation;(value=I4)
|
||||
|
31
make/data/symbols/java.management.rmi-F.sym.txt
Normal file
31
make/data/symbols/java.management.rmi-F.sym.txt
Normal file
@ -0,0 +1,31 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name javax/management/remote/rmi/RMIConnectorServer
|
||||
-field name CREDENTIAL_TYPES descriptor Ljava/lang/String;
|
||||
|
33
make/data/symbols/java.naming-F.sym.txt
Normal file
33
make/data/symbols/java.naming-F.sym.txt
Normal file
@ -0,0 +1,33 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name javax/naming/spi/NamingManager
|
||||
header extends java/lang/Object flags 21
|
||||
innerclass innerClass java/util/ServiceLoader$Provider outerClass java/util/ServiceLoader innerClassName Provider flags 609
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
|
77
make/data/symbols/java.rmi-F.sym.txt
Normal file
77
make/data/symbols/java.rmi-F.sym.txt
Normal file
@ -0,0 +1,77 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name java/rmi/activation/Activatable
|
||||
header extends java/rmi/server/RemoteServer flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivateFailedException
|
||||
header extends java/rmi/RemoteException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationDesc
|
||||
header extends java/lang/Object implements java/io/Serializable flags 31 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationException
|
||||
header extends java/lang/Exception flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
|
||||
class name java/rmi/activation/ActivationGroup
|
||||
header extends java/rmi/server/UnicastRemoteObject implements java/rmi/activation/ActivationInstantiator flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
|
||||
class name java/rmi/activation/ActivationGroupDesc
|
||||
header extends java/lang/Object implements java/io/Serializable nestMembers java/rmi/activation/ActivationGroupDesc$CommandEnvironment flags 31 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
innerclass innerClass java/rmi/activation/ActivationGroupDesc$CommandEnvironment outerClass java/rmi/activation/ActivationGroupDesc innerClassName CommandEnvironment flags 9
|
||||
|
||||
class name java/rmi/activation/ActivationGroupID
|
||||
header extends java/lang/Object implements java/io/Serializable flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationGroup_Stub
|
||||
header extends java/rmi/server/RemoteStub implements java/rmi/activation/ActivationInstantiator,java/rmi/Remote flags 31 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationID
|
||||
header extends java/lang/Object implements java/io/Serializable flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
|
||||
class name java/rmi/activation/ActivationInstantiator
|
||||
header extends java/lang/Object implements java/rmi/Remote flags 601 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationMonitor
|
||||
header extends java/lang/Object implements java/rmi/Remote flags 601 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/ActivationSystem
|
||||
header extends java/lang/Object implements java/rmi/Remote flags 601 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/Activator
|
||||
header extends java/lang/Object implements java/rmi/Remote flags 601 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/UnknownGroupException
|
||||
header extends java/rmi/activation/ActivationException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
||||
class name java/rmi/activation/UnknownObjectException
|
||||
header extends java/rmi/activation/ActivationException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")
|
||||
|
32
make/data/symbols/java.xml-F.sym.txt
Normal file
32
make/data/symbols/java.xml-F.sym.txt
Normal file
@ -0,0 +1,32 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name javax/xml/stream/XMLInputFactory
|
||||
method name newFactory descriptor ()Ljavax/xml/stream/XMLInputFactory; thrownTypes javax/xml/stream/FactoryConfigurationError flags 9
|
||||
-method name newFactory descriptor ()Ljavax/xml/stream/XMLInputFactory;
|
||||
|
34
make/data/symbols/jdk.compiler-F.sym.txt
Normal file
34
make/data/symbols/jdk.compiler-F.sym.txt
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name com/sun/source/tree/ClassTree
|
||||
method name getPermitsClause descriptor ()Ljava/util/List; flags 1 signature ()Ljava/util/List<+Lcom/sun/source/tree/Tree;>; classAnnotations @Ljdk/internal/PreviewFeature;(feature=eLjdk/internal/PreviewFeature$Feature;SEALED_CLASSES;,essentialAPI=Zfalse)
|
||||
|
||||
class name com/sun/source/util/DocTrees
|
||||
method name getType descriptor (Lcom/sun/source/util/DocTreePath;)Ljavax/lang/model/type/TypeMirror; flags 401
|
||||
|
131
make/data/symbols/jdk.incubator.foreign-F.sym.txt
Normal file
131
make/data/symbols/jdk.incubator.foreign-F.sym.txt
Normal file
@ -0,0 +1,131 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name jdk/incubator/foreign/AbstractLayout
|
||||
header extends java/lang/Object implements jdk/incubator/foreign/MemoryLayout flags 420
|
||||
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||
innerclass innerClass java/lang/constant/DirectMethodHandleDesc$Kind outerClass java/lang/constant/DirectMethodHandleDesc innerClassName Kind flags 4019
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
-method name <init> descriptor (Ljava/util/OptionalLong;JLjava/util/Optional;)V
|
||||
method name <init> descriptor (Ljava/util/OptionalLong;JLjava/util/Map;)V flags 1 signature (Ljava/util/OptionalLong;JLjava/util/Map<Ljava/lang/String;Ljava/lang/constant/Constable;>;)V
|
||||
method name attribute descriptor (Ljava/lang/String;)Ljava/util/Optional; flags 1 signature (Ljava/lang/String;)Ljava/util/Optional<Ljava/lang/constant/Constable;>;
|
||||
method name attributes descriptor ()Ljava/util/stream/Stream; flags 1 signature ()Ljava/util/stream/Stream<Ljava/lang/String;>;
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/AbstractLayout; flags 1
|
||||
method name isPadding descriptor ()Z flags 1
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/MemoryLayout; flags 1041
|
||||
|
||||
class name jdk/incubator/foreign/GroupLayout
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/GroupLayout; flags 1
|
||||
method name isPadding descriptor ()Z flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/AbstractLayout; flags 1041
|
||||
method name attributes descriptor ()Ljava/util/stream/Stream; flags 1041
|
||||
method name attribute descriptor (Ljava/lang/String;)Ljava/util/Optional; flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/MemoryLayout; flags 1041
|
||||
|
||||
class name jdk/incubator/foreign/MappedMemorySegment
|
||||
header extends java/lang/Object implements jdk/incubator/foreign/MemorySegment flags 601
|
||||
method name withAccessModes descriptor (I)Ljdk/incubator/foreign/MappedMemorySegment; flags 401
|
||||
method name asSlice descriptor (JJ)Ljdk/incubator/foreign/MappedMemorySegment; flags 401
|
||||
method name force descriptor ()V flags 401
|
||||
method name load descriptor ()V flags 401
|
||||
method name unload descriptor ()V flags 401
|
||||
method name isLoaded descriptor ()Z flags 401
|
||||
method name asSlice descriptor (JJ)Ljdk/incubator/foreign/MemorySegment; flags 1041
|
||||
method name withAccessModes descriptor (I)Ljdk/incubator/foreign/MemorySegment; flags 1041
|
||||
|
||||
class name jdk/incubator/foreign/MemoryAddress
|
||||
field name NULL descriptor Ljdk/incubator/foreign/MemoryAddress; flags 19
|
||||
-method name offset descriptor ()J
|
||||
-method name copy descriptor (Ljdk/incubator/foreign/MemoryAddress;Ljdk/incubator/foreign/MemoryAddress;J)V
|
||||
method name segmentOffset descriptor ()J flags 401
|
||||
method name toRawLongValue descriptor ()J flags 401
|
||||
method name rebase descriptor (Ljdk/incubator/foreign/MemorySegment;)Ljdk/incubator/foreign/MemoryAddress; flags 401
|
||||
method name ofLong descriptor (J)Ljdk/incubator/foreign/MemoryAddress; flags 9
|
||||
|
||||
class name jdk/incubator/foreign/MemoryHandles
|
||||
method name asAddressVarHandle descriptor (Ljava/lang/invoke/VarHandle;)Ljava/lang/invoke/VarHandle; flags 9
|
||||
method name asUnsigned descriptor (Ljava/lang/invoke/VarHandle;Ljava/lang/Class;)Ljava/lang/invoke/VarHandle; flags 9 signature (Ljava/lang/invoke/VarHandle;Ljava/lang/Class<*>;)Ljava/lang/invoke/VarHandle;
|
||||
method name filterValue descriptor (Ljava/lang/invoke/VarHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/VarHandle; flags 9
|
||||
method name filterCoordinates descriptor (Ljava/lang/invoke/VarHandle;I[Ljava/lang/invoke/MethodHandle;)Ljava/lang/invoke/VarHandle; flags 89
|
||||
method name insertCoordinates descriptor (Ljava/lang/invoke/VarHandle;I[Ljava/lang/Object;)Ljava/lang/invoke/VarHandle; flags 89
|
||||
method name permuteCoordinates descriptor (Ljava/lang/invoke/VarHandle;Ljava/util/List;[I)Ljava/lang/invoke/VarHandle; flags 89 signature (Ljava/lang/invoke/VarHandle;Ljava/util/List<Ljava/lang/Class<*>;>;[I)Ljava/lang/invoke/VarHandle;
|
||||
method name collectCoordinates descriptor (Ljava/lang/invoke/VarHandle;ILjava/lang/invoke/MethodHandle;)Ljava/lang/invoke/VarHandle; flags 9
|
||||
method name dropCoordinates descriptor (Ljava/lang/invoke/VarHandle;I[Ljava/lang/Class;)Ljava/lang/invoke/VarHandle; flags 89 signature (Ljava/lang/invoke/VarHandle;I[Ljava/lang/Class<*>;)Ljava/lang/invoke/VarHandle;
|
||||
|
||||
class name jdk/incubator/foreign/MemoryLayout
|
||||
field name LAYOUT_NAME descriptor Ljava/lang/String; constantValue layout/name flags 19
|
||||
-method name offset descriptor ([Ljdk/incubator/foreign/MemoryLayout$PathElement;)J
|
||||
method name attribute descriptor (Ljava/lang/String;)Ljava/util/Optional; flags 401 signature (Ljava/lang/String;)Ljava/util/Optional<Ljava/lang/constant/Constable;>;
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/MemoryLayout; flags 401
|
||||
method name attributes descriptor ()Ljava/util/stream/Stream; flags 401 signature ()Ljava/util/stream/Stream<Ljava/lang/String;>;
|
||||
method name bitOffset descriptor ([Ljdk/incubator/foreign/MemoryLayout$PathElement;)J flags 81
|
||||
method name byteOffset descriptor ([Ljdk/incubator/foreign/MemoryLayout$PathElement;)J flags 81
|
||||
method name isPadding descriptor ()Z flags 401
|
||||
|
||||
class name jdk/incubator/foreign/MemorySegment
|
||||
field name READ descriptor I constantValue 1 flags 19
|
||||
field name WRITE descriptor I constantValue 2 flags 19
|
||||
field name CLOSE descriptor I constantValue 4 flags 19
|
||||
field name ACQUIRE descriptor I constantValue 8 flags 19
|
||||
field name HANDOFF descriptor I constantValue 16 flags 19
|
||||
field name ALL_ACCESS descriptor I constantValue 31 flags 19
|
||||
-method name acquire descriptor ()Ljdk/incubator/foreign/MemorySegment;
|
||||
-method name asReadOnly descriptor ()Ljdk/incubator/foreign/MemorySegment;
|
||||
-method name isReadOnly descriptor ()Z
|
||||
-method name mapFromPath descriptor (Ljava/nio/file/Path;JLjava/nio/channels/FileChannel$MapMode;)Ljdk/incubator/foreign/MemorySegment;
|
||||
method name spliterator descriptor (Ljdk/incubator/foreign/MemorySegment;Ljdk/incubator/foreign/SequenceLayout;)Ljava/util/Spliterator; flags 9 signature <S::Ljdk/incubator/foreign/MemorySegment;>(TS;Ljdk/incubator/foreign/SequenceLayout;)Ljava/util/Spliterator<TS;>;
|
||||
method name withOwnerThread descriptor (Ljava/lang/Thread;)Ljdk/incubator/foreign/MemorySegment; flags 401
|
||||
method name withAccessModes descriptor (I)Ljdk/incubator/foreign/MemorySegment; flags 401
|
||||
method name hasAccessModes descriptor (I)Z flags 401
|
||||
method name accessModes descriptor ()I flags 401
|
||||
method name fill descriptor (B)Ljdk/incubator/foreign/MemorySegment; flags 401
|
||||
method name copyFrom descriptor (Ljdk/incubator/foreign/MemorySegment;)V flags 401
|
||||
method name mismatch descriptor (Ljdk/incubator/foreign/MemorySegment;)J flags 401
|
||||
method name mapFromPath descriptor (Ljava/nio/file/Path;JJLjava/nio/channels/FileChannel$MapMode;)Ljdk/incubator/foreign/MappedMemorySegment; thrownTypes java/io/IOException flags 9
|
||||
method name ofNativeRestricted descriptor (Ljdk/incubator/foreign/MemoryAddress;JLjava/lang/Thread;Ljava/lang/Runnable;Ljava/lang/Object;)Ljdk/incubator/foreign/MemorySegment; flags 9
|
||||
|
||||
class name jdk/incubator/foreign/SequenceLayout
|
||||
header extends jdk/incubator/foreign/AbstractLayout flags 31
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
method name reshape descriptor ([J)Ljdk/incubator/foreign/SequenceLayout; flags 81
|
||||
method name flatten descriptor ()Ljdk/incubator/foreign/SequenceLayout; flags 1
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/SequenceLayout; flags 1
|
||||
method name isPadding descriptor ()Z flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/AbstractLayout; flags 1041
|
||||
method name attributes descriptor ()Ljava/util/stream/Stream; flags 1041
|
||||
method name attribute descriptor (Ljava/lang/String;)Ljava/util/Optional; flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/MemoryLayout; flags 1041
|
||||
|
||||
class name jdk/incubator/foreign/ValueLayout
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/ValueLayout; flags 1
|
||||
method name isPadding descriptor ()Z flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/AbstractLayout; flags 1041
|
||||
method name attributes descriptor ()Ljava/util/stream/Stream; flags 1041
|
||||
method name attribute descriptor (Ljava/lang/String;)Ljava/util/Optional; flags 1041
|
||||
method name withAttribute descriptor (Ljava/lang/String;Ljava/lang/constant/Constable;)Ljdk/incubator/foreign/MemoryLayout; flags 1041
|
||||
|
34
make/data/symbols/jdk.jartool-F.sym.txt
Normal file
34
make/data/symbols/jdk.jartool-F.sym.txt
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name com/sun/jarsigner/ContentSigner
|
||||
header extends java/lang/Object flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||
|
||||
class name com/sun/jarsigner/ContentSignerParameters
|
||||
header extends java/lang/Object flags 601 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||
|
35
make/data/symbols/jdk.javadoc-F.sym.txt
Normal file
35
make/data/symbols/jdk.javadoc-F.sym.txt
Normal file
@ -0,0 +1,35 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name jdk/javadoc/doclet/StandardDoclet
|
||||
-method name getSupportedOptions descriptor ()Ljava/util/Set;
|
||||
method name getSupportedOptions descriptor ()Ljava/util/Set; flags 1 signature ()Ljava/util/Set<+Ljdk/javadoc/doclet/Doclet$Option;>;
|
||||
|
||||
class name jdk/javadoc/doclet/Taglet
|
||||
method name isBlockTag descriptor ()Z flags 1
|
||||
|
34
make/data/symbols/jdk.jdi-F.sym.txt
Normal file
34
make/data/symbols/jdk.jdi-F.sym.txt
Normal file
@ -0,0 +1,34 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name com/sun/jdi/VirtualMachine
|
||||
-method name canAddMethod descriptor ()Z
|
||||
-method name canUnrestrictedlyRedefineClasses descriptor ()Z
|
||||
method name canAddMethod descriptor ()Z flags 401 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(since="15")
|
||||
method name canUnrestrictedlyRedefineClasses descriptor ()Z flags 401 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(since="15")
|
||||
|
37
make/data/symbols/jdk.net-F.sym.txt
Normal file
37
make/data/symbols/jdk.net-F.sym.txt
Normal file
@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name jdk/net/ExtendedSocketOptions
|
||||
header extends java/lang/Object flags 31
|
||||
-field name SO_FLOW_SLA descriptor Ljava/net/SocketOption;
|
||||
field name SO_INCOMING_NAPI_ID descriptor Ljava/net/SocketOption; flags 19 signature Ljava/net/SocketOption<Ljava/lang/Integer;>;
|
||||
|
||||
-class name jdk/net/SocketFlow
|
||||
|
||||
-class name jdk/net/SocketFlow$Status
|
||||
|
37
make/data/symbols/jdk.nio.mapmode-F.sym.txt
Normal file
37
make/data/symbols/jdk.nio.mapmode-F.sym.txt
Normal file
@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
module name jdk.nio.mapmode
|
||||
header exports jdk/nio/mapmode requires name\u0020;java.base\u0020;flags\u0020;8000 target linux-amd64 flags 8000
|
||||
|
||||
class name jdk/nio/mapmode/ExtendedMapMode
|
||||
header extends java/lang/Object flags 21
|
||||
innerclass innerClass java/nio/channels/FileChannel$MapMode outerClass java/nio/channels/FileChannel innerClassName MapMode flags 9
|
||||
field name READ_ONLY_SYNC descriptor Ljava/nio/channels/FileChannel$MapMode; flags 19
|
||||
field name READ_WRITE_SYNC descriptor Ljava/nio/channels/FileChannel$MapMode; flags 19
|
||||
|
30
make/data/symbols/jdk.rmic-F.sym.txt
Normal file
30
make/data/symbols/jdk.rmic-F.sym.txt
Normal file
@ -0,0 +1,30 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
-module name jdk.rmic
|
||||
|
180
make/data/symbols/jdk.scripting.nashorn-F.sym.txt
Normal file
180
make/data/symbols/jdk.scripting.nashorn-F.sym.txt
Normal file
@ -0,0 +1,180 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
-module name jdk.scripting.nashorn
|
||||
|
||||
-class name jdk/nashorn/api/scripting/AbstractJSObject
|
||||
|
||||
-class name jdk/nashorn/api/scripting/ClassFilter
|
||||
|
||||
-class name jdk/nashorn/api/scripting/JSObject
|
||||
|
||||
-class name jdk/nashorn/api/scripting/NashornException
|
||||
|
||||
-class name jdk/nashorn/api/scripting/NashornScriptEngine
|
||||
|
||||
-class name jdk/nashorn/api/scripting/NashornScriptEngineFactory
|
||||
|
||||
-class name jdk/nashorn/api/scripting/ScriptObjectMirror
|
||||
|
||||
-class name jdk/nashorn/api/scripting/ScriptUtils
|
||||
|
||||
-class name jdk/nashorn/api/scripting/URLReader
|
||||
|
||||
-class name jdk/nashorn/api/tree/ArrayAccessTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ArrayLiteralTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/AssignmentTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/BinaryTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/BlockTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/BreakTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/CaseTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/CatchTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ClassDeclarationTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ClassExpressionTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/CompilationUnitTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/CompoundAssignmentTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ConditionalExpressionTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ConditionalLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ContinueTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/DebuggerTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/Diagnostic
|
||||
|
||||
-class name jdk/nashorn/api/tree/Diagnostic$Kind
|
||||
|
||||
-class name jdk/nashorn/api/tree/DiagnosticListener
|
||||
|
||||
-class name jdk/nashorn/api/tree/DoWhileLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/EmptyStatementTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ErroneousTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ExportEntryTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ExpressionStatementTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ExpressionTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ForInLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ForLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ForOfLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/FunctionCallTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/FunctionDeclarationTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/FunctionExpressionTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/GotoTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/IdentifierTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/IfTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ImportEntryTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/InstanceOfTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/LabeledStatementTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/LineMap
|
||||
|
||||
-class name jdk/nashorn/api/tree/LiteralTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/LoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/MemberSelectTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ModuleTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/NewTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ObjectLiteralTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ParenthesizedTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/Parser
|
||||
|
||||
-class name jdk/nashorn/api/tree/PropertyTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/RegExpLiteralTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ReturnTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/SimpleTreeVisitorES5_1
|
||||
|
||||
-class name jdk/nashorn/api/tree/SimpleTreeVisitorES6
|
||||
|
||||
-class name jdk/nashorn/api/tree/SpreadTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/StatementTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/SwitchTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/TemplateLiteralTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/ThrowTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/Tree
|
||||
|
||||
-class name jdk/nashorn/api/tree/Tree$Kind
|
||||
|
||||
-class name jdk/nashorn/api/tree/TreeVisitor
|
||||
|
||||
-class name jdk/nashorn/api/tree/TryTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/UnaryTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/UnknownTreeException
|
||||
|
||||
-class name jdk/nashorn/api/tree/VariableTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/WhileLoopTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/WithTree
|
||||
|
||||
-class name jdk/nashorn/api/tree/YieldTree
|
||||
|
38
make/data/symbols/jdk.unsupported-F.sym.txt
Normal file
38
make/data/symbols/jdk.unsupported-F.sym.txt
Normal file
@ -0,0 +1,38 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
# ##########################################################
|
||||
# ### THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT. ###
|
||||
# ##########################################################
|
||||
#
|
||||
class name sun/misc/Unsafe
|
||||
header extends java/lang/Object flags 31 classAnnotations @Lsun/Proprietary+Annotation;
|
||||
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||
-method name shouldBeInitialized descriptor (Ljava/lang/Class;)Z
|
||||
-method name ensureClassInitialized descriptor (Ljava/lang/Class;)V
|
||||
-method name defineAnonymousClass descriptor (Ljava/lang/Class;[B[Ljava/lang/Object;)Ljava/lang/Class;
|
||||
method name shouldBeInitialized descriptor (Ljava/lang/Class;)Z flags 1 deprecated true signature (Ljava/lang/Class<*>;)Z runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")@Ljdk/internal/vm/annotation/ForceInline;
|
||||
method name ensureClassInitialized descriptor (Ljava/lang/Class;)V flags 1 deprecated true signature (Ljava/lang/Class<*>;)V runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="15")@Ljdk/internal/vm/annotation/ForceInline;
|
||||
method name defineAnonymousClass descriptor (Ljava/lang/Class;[B[Ljava/lang/Object;)Ljava/lang/Class; flags 1 deprecated true signature (Ljava/lang/Class<*>;[B[Ljava/lang/Object;)Ljava/lang/Class<*>; runtimeAnnotations @Ljdk/internal/vm/annotation/ForceInline;@Ljava/lang/Deprecated;(forRemoval=Zfalse,since="15")
|
||||
|
@ -29,7 +29,7 @@
|
||||
#command used to generate this file:
|
||||
#build.tools.symbolgenerator.CreateSymbols build-description-incremental symbols include.list
|
||||
#
|
||||
generate platforms 7:8:9:A:B:C:D:E
|
||||
generate platforms 7:8:9:A:B:C:D:E:F
|
||||
platform version 8 files java.activation-8.sym.txt:java.base-8.sym.txt:java.compiler-8.sym.txt:java.corba-8.sym.txt:java.datatransfer-8.sym.txt:java.desktop-8.sym.txt:java.instrument-8.sym.txt:java.logging-8.sym.txt:java.management-8.sym.txt:java.management.rmi-8.sym.txt:java.naming-8.sym.txt:java.prefs-8.sym.txt:java.rmi-8.sym.txt:java.scripting-8.sym.txt:java.security.jgss-8.sym.txt:java.security.sasl-8.sym.txt:java.sql-8.sym.txt:java.sql.rowset-8.sym.txt:java.transaction-8.sym.txt:java.xml-8.sym.txt:java.xml.bind-8.sym.txt:java.xml.crypto-8.sym.txt:java.xml.ws-8.sym.txt:java.xml.ws.annotation-8.sym.txt:jdk.httpserver-8.sym.txt:jdk.management-8.sym.txt:jdk.scripting.nashorn-8.sym.txt:jdk.sctp-8.sym.txt:jdk.security.auth-8.sym.txt:jdk.security.jgss-8.sym.txt
|
||||
platform version 7 base 8 files java.base-7.sym.txt:java.compiler-7.sym.txt:java.datatransfer-7.sym.txt:java.desktop-7.sym.txt:java.logging-7.sym.txt:java.management-7.sym.txt:java.naming-7.sym.txt:java.prefs-7.sym.txt:java.rmi-7.sym.txt:java.scripting-7.sym.txt:java.security.jgss-7.sym.txt:java.security.sasl-7.sym.txt:java.sql-7.sym.txt:java.sql.rowset-7.sym.txt:java.xml-7.sym.txt:java.xml.bind-7.sym.txt:java.xml.ws.annotation-7.sym.txt:jdk.httpserver-7.sym.txt:jdk.management-7.sym.txt:jdk.scripting.nashorn-7.sym.txt:jdk.sctp-7.sym.txt:jdk.security.auth-7.sym.txt:jdk.security.jgss-7.sym.txt
|
||||
platform version 9 base 8 files java.activation-9.sym.txt:java.base-9.sym.txt:java.compiler-9.sym.txt:java.corba-9.sym.txt:java.datatransfer-9.sym.txt:java.desktop-9.sym.txt:java.instrument-9.sym.txt:java.logging-9.sym.txt:java.management-9.sym.txt:java.management.rmi-9.sym.txt:java.naming-9.sym.txt:java.prefs-9.sym.txt:java.rmi-9.sym.txt:java.scripting-9.sym.txt:java.se-9.sym.txt:java.se.ee-9.sym.txt:java.security.jgss-9.sym.txt:java.security.sasl-9.sym.txt:java.smartcardio-9.sym.txt:java.sql-9.sym.txt:java.sql.rowset-9.sym.txt:java.transaction-9.sym.txt:java.xml-9.sym.txt:java.xml.bind-9.sym.txt:java.xml.crypto-9.sym.txt:java.xml.ws-9.sym.txt:java.xml.ws.annotation-9.sym.txt:jdk.accessibility-9.sym.txt:jdk.attach-9.sym.txt:jdk.charsets-9.sym.txt:jdk.compiler-9.sym.txt:jdk.crypto.cryptoki-9.sym.txt:jdk.crypto.ec-9.sym.txt:jdk.dynalink-9.sym.txt:jdk.editpad-9.sym.txt:jdk.hotspot.agent-9.sym.txt:jdk.httpserver-9.sym.txt:jdk.incubator.httpclient-9.sym.txt:jdk.jartool-9.sym.txt:jdk.javadoc-9.sym.txt:jdk.jcmd-9.sym.txt:jdk.jconsole-9.sym.txt:jdk.jdeps-9.sym.txt:jdk.jdi-9.sym.txt:jdk.jdwp.agent-9.sym.txt:jdk.jlink-9.sym.txt:jdk.jshell-9.sym.txt:jdk.jsobject-9.sym.txt:jdk.jstatd-9.sym.txt:jdk.localedata-9.sym.txt:jdk.management-9.sym.txt:jdk.management.agent-9.sym.txt:jdk.naming.dns-9.sym.txt:jdk.naming.rmi-9.sym.txt:jdk.net-9.sym.txt:jdk.pack-9.sym.txt:jdk.policytool-9.sym.txt:jdk.rmic-9.sym.txt:jdk.scripting.nashorn-9.sym.txt:jdk.sctp-9.sym.txt:jdk.security.auth-9.sym.txt:jdk.security.jgss-9.sym.txt:jdk.unsupported-9.sym.txt:jdk.xml.dom-9.sym.txt:jdk.zipfs-9.sym.txt
|
||||
@ -38,3 +38,4 @@ platform version B base A files java.activation-B.sym.txt:java.base-B.sym.txt:ja
|
||||
platform version C base B files java.base-C.sym.txt:java.compiler-C.sym.txt:java.desktop-C.sym.txt:java.naming-C.sym.txt:java.rmi-C.sym.txt:java.xml-C.sym.txt:jdk.compiler-C.sym.txt:jdk.jfr-C.sym.txt:jdk.jsobject-C.sym.txt:jdk.unsupported-C.sym.txt
|
||||
platform version D base C files java.base-D.sym.txt:java.compiler-D.sym.txt:java.desktop-D.sym.txt:java.management-D.sym.txt:java.management.rmi-D.sym.txt:java.net.http-D.sym.txt:java.security.jgss-D.sym.txt:java.xml-D.sym.txt:java.xml.crypto-D.sym.txt:jdk.compiler-D.sym.txt:jdk.httpserver-D.sym.txt:jdk.jartool-D.sym.txt:jdk.javadoc-D.sym.txt:jdk.jlink-D.sym.txt:jdk.jshell-D.sym.txt
|
||||
platform version E base D files java.base-E.sym.txt:java.compiler-E.sym.txt:java.desktop-E.sym.txt:java.xml-E.sym.txt:jdk.compiler-E.sym.txt:jdk.httpserver-E.sym.txt:jdk.incubator.foreign-E.sym.txt:jdk.incubator.jpackage-E.sym.txt:jdk.jfr-E.sym.txt:jdk.jlink-E.sym.txt:jdk.jshell-E.sym.txt:jdk.jsobject-E.sym.txt:jdk.management-E.sym.txt:jdk.net-E.sym.txt:jdk.pack-E.sym.txt
|
||||
platform version F base E files java.base-F.sym.txt:java.compiler-F.sym.txt:java.desktop-F.sym.txt:java.management.rmi-F.sym.txt:java.naming-F.sym.txt:java.rmi-F.sym.txt:java.xml-F.sym.txt:jdk.compiler-F.sym.txt:jdk.incubator.foreign-F.sym.txt:jdk.jartool-F.sym.txt:jdk.javadoc-F.sym.txt:jdk.jdi-F.sym.txt:jdk.net-F.sym.txt:jdk.nio.mapmode-F.sym.txt:jdk.rmic-F.sym.txt:jdk.scripting.nashorn-F.sym.txt:jdk.unsupported-F.sym.txt
|
||||
|
@ -23,40 +23,24 @@
|
||||
# questions.
|
||||
#
|
||||
|
||||
################################################################################
|
||||
# Build tools needed for the JFR source code generation
|
||||
|
||||
JFR_TOOLS_SRCDIR := $(TOPDIR)/make/src/classes
|
||||
JFR_TOOLS_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/buildtools/tools_classes
|
||||
|
||||
$(eval $(call SetupJavaCompilation, BUILD_JFR_TOOLS, \
|
||||
COMPILER := bootjdk, \
|
||||
SMALL_JAVA := false, \
|
||||
SRC := $(JFR_TOOLS_SRCDIR), \
|
||||
BIN := $(JFR_TOOLS_OUTPUTDIR), \
|
||||
DISABLED_WARNINGS := try, \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_JFR_TOOLS)
|
||||
|
||||
################################################################################
|
||||
# Setup make rules for JFR gensrc file generation.
|
||||
#
|
||||
TOOL_JFR_GEN := $(JAVA_SMALL) -cp $(JFR_TOOLS_OUTPUTDIR) build.tools.jfr.GenerateJfrFiles
|
||||
|
||||
JFR_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jfrfiles
|
||||
include $(TOPDIR)/make/ToolsHotspot.gmk
|
||||
|
||||
JFR_SRCDIR := $(TOPDIR)/src/hotspot/share/jfr/metadata
|
||||
JFR_OUTPUTDIR := $(JVM_VARIANT_OUTPUTDIR)/gensrc/jfrfiles
|
||||
|
||||
# Changing these will trigger a rebuild of generated jfr files.
|
||||
METADATA_XML := $(JFR_SRCDIR)/metadata.xml
|
||||
METADATA_XSD := $(JFR_SRCDIR)/metadata.xsd
|
||||
|
||||
$(eval $(call SetupExecute, jfr_gen, \
|
||||
$(eval $(call SetupExecute, jfr_gen_headers, \
|
||||
INFO := Generating JFR header files, \
|
||||
DEPS := $(METADATA_XML) $(METADATA_XSD) $(BUILD_JFR_TOOLS), \
|
||||
DEPS := $(METADATA_XML) $(METADATA_XSD) $(BUILD_TOOLS_HOTSPOT), \
|
||||
OUTPUT_DIR := $(JFR_OUTPUTDIR), \
|
||||
COMMAND := $(TOOL_JFR_GEN) $(METADATA_XML) $(METADATA_XSD) $(JFR_OUTPUTDIR), \
|
||||
COMMAND := $(TOOL_JFR_GEN) --mode headers --xml $(METADATA_XML) --xsd $(METADATA_XSD) --output $(JFR_OUTPUTDIR), \
|
||||
))
|
||||
|
||||
JFR_FILES := $(jfr_gen_TARGET)
|
||||
TARGETS += $(JFR_FILES)
|
||||
TARGETS += $(jfr_gen_headers)
|
||||
|
@ -62,6 +62,7 @@ ifeq ($(call isTargetOs, linux), true)
|
||||
JVM_PRECOMPILED_HEADER_EXCLUDE := \
|
||||
sharedRuntimeTrig.cpp \
|
||||
sharedRuntimeTrans.cpp \
|
||||
$(OPT_SPEED_SRC) \
|
||||
#
|
||||
endif
|
||||
|
||||
@ -111,6 +112,7 @@ else ifeq ($(call isTargetOs, macosx), true)
|
||||
loopTransform.cpp \
|
||||
unsafe.cpp \
|
||||
jvmciCompilerToVM.cpp \
|
||||
$(OPT_SPEED_SRC) \
|
||||
#
|
||||
endif
|
||||
|
||||
|
@ -143,6 +143,8 @@ JVM_InternString
|
||||
JVM_Interrupt
|
||||
JVM_InvokeMethod
|
||||
JVM_IsArrayClass
|
||||
JVM_IsCDSDumpingEnabled
|
||||
JVM_IsCDSSharingEnabled
|
||||
JVM_IsConstructorIx
|
||||
JVM_IsHiddenClass
|
||||
JVM_IsInterface
|
||||
@ -155,6 +157,7 @@ JVM_IsVMGeneratedMethodIx
|
||||
JVM_LatestUserDefinedLoader
|
||||
JVM_LoadLibrary
|
||||
JVM_LookupDefineClass
|
||||
JVM_LookupLambdaProxyClassFromArchive
|
||||
JVM_MaxMemory
|
||||
JVM_MaxObjectInspectionAge
|
||||
JVM_MonitorNotify
|
||||
@ -171,6 +174,7 @@ JVM_RawMonitorCreate
|
||||
JVM_RawMonitorDestroy
|
||||
JVM_RawMonitorEnter
|
||||
JVM_RawMonitorExit
|
||||
JVM_RegisterLambdaProxyClassForArchiving
|
||||
JVM_RegisterSignal
|
||||
JVM_ReleaseUTF
|
||||
JVM_ResumeThread
|
||||
|
@ -27,14 +27,6 @@ include CopyCommon.gmk
|
||||
|
||||
################################################################################
|
||||
|
||||
$(eval $(call SetupCopyFiles, COPY_JFR_METADATA, \
|
||||
SRC := $(TOPDIR)/src/hotspot/share/jfr/metadata, \
|
||||
DEST := $(JDK_OUTPUTDIR)/modules/jdk.jfr/jdk/jfr/internal/types, \
|
||||
FILES := metadata.xml \
|
||||
))
|
||||
|
||||
TARGETS += $(COPY_JFR_METADATA)
|
||||
|
||||
JFR_CONF_DIR := $(TOPDIR)/src/jdk.jfr/share/conf/jfr
|
||||
$(eval $(call SetupCopyFiles, COPY_JFR_CONF, \
|
||||
DEST := $(LIB_DST_DIR)/jfr, \
|
||||
|
48
make/modules/jdk.jfr/Gendata.gmk
Normal file
48
make/modules/jdk.jfr/Gendata.gmk
Normal file
@ -0,0 +1,48 @@
|
||||
#
|
||||
# Copyright (c) 2020, 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.
|
||||
#
|
||||
|
||||
################################################################################
|
||||
|
||||
include ToolsHotspot.gmk
|
||||
include Execute.gmk
|
||||
|
||||
JFR_SRCDIR := $(TOPDIR)/src/hotspot/share/jfr/metadata
|
||||
JFR_DATA_OUTPUTDIR := $(OUTPUTDIR)/jdk/modules/jdk.jfr/jdk/jfr/internal/types
|
||||
JFR_DATA_OUTPUTFILE := $(JFR_DATA_OUTPUTDIR)/metadata.bin
|
||||
JFR_DATA_SUPPORTDIR := $(SUPPORT_OUTPUTDIR)/gendata/jdk.jfr
|
||||
|
||||
# Changing these will trigger a rebuild of generated jfr files.
|
||||
METADATA_XML := $(JFR_SRCDIR)/metadata.xml
|
||||
METADATA_XSD := $(JFR_SRCDIR)/metadata.xsd
|
||||
|
||||
$(eval $(call SetupExecute, jfr_gen_metadata, \
|
||||
INFO := Generating JFR metadata, \
|
||||
DEPS := $(METADATA_XML) $(METADATA_XSD) $(BUILD_TOOLS_HOTSPOT), \
|
||||
OUTPUT_FILE := $(JFR_DATA_OUTPUTFILE), \
|
||||
SUPPORT_DIR := $(JFR_DATA_SUPPORTDIR), \
|
||||
COMMAND := $(TOOL_JFR_GEN) --mode metadata --xml $(METADATA_XML) --xsd $(METADATA_XSD) --output $(JFR_DATA_OUTPUTFILE), \
|
||||
))
|
||||
|
||||
TARGETS += $(jfr_gen_metadata)
|
@ -1,16 +1,19 @@
|
||||
package build.tools.jfr;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.Closeable;
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Objects;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@ -25,94 +28,107 @@ import org.xml.sax.SAXException;
|
||||
import org.xml.sax.SAXParseException;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
/**
|
||||
* Purpose of this program is twofold:
|
||||
*
|
||||
* 1) Generate C++ classes to be used when writing native events for HotSpot.
|
||||
*
|
||||
* 2) Generate metadata (label, descriptions, field layout etc.) from XML
|
||||
* (metadata.xml) into a binary format (metadata.bin) that can be read quickly
|
||||
* during startup by the jdk.jfr module.
|
||||
*
|
||||
* INPUT FILES:
|
||||
*
|
||||
* - metadata.xml File that contains descriptions of events and types
|
||||
* - metadata.xsd Schema that verifies that metadata.xml is legit XML
|
||||
*
|
||||
* OUTPUT FILES:
|
||||
*
|
||||
* MODE: headers
|
||||
*
|
||||
* - jfrEventIds.hpp List of IDs so events can be identified from native
|
||||
* - jfrTypes.hpp List of IDs so types can be identified from native
|
||||
* - jfrPeriodic.hpp Dispatch mechanism so Java can emit native periodic events
|
||||
* - jfrEventControl.hpp Data structure for native event settings.
|
||||
* - jfrEventClasses.hpp C++ event classes that can write data into native buffers
|
||||
*
|
||||
* MODE: metadata
|
||||
*
|
||||
* - metadata.bin Binary representation of the information in metadata.xml
|
||||
*
|
||||
*/
|
||||
public class GenerateJfrFiles {
|
||||
|
||||
public static void main(String... args) throws Exception {
|
||||
if (args.length != 3) {
|
||||
System.err.println("Incorrect number of command line arguments.");
|
||||
System.err.println("Usage:");
|
||||
System.err.println("java GenerateJfrFiles[.java] <path-to-metadata.xml> <path-to-metadata.xsd> <output-directory>");
|
||||
System.exit(1);
|
||||
}
|
||||
try {
|
||||
File metadataXml = new File(args[0]);
|
||||
File metadataSchema = new File(args[1]);
|
||||
File outputDirectory = new File(args[2]);
|
||||
enum OutputMode {
|
||||
headers, metadata
|
||||
}
|
||||
|
||||
Metadata metadata = new Metadata(metadataXml, metadataSchema);
|
||||
private static void printUsage(PrintStream out) {
|
||||
out.println("Usage: java GenerateJfrFiles[.java]");
|
||||
out.println(" --mode <headers|metadata>");
|
||||
out.println(" --xml <path-to-metadata.xml> ");
|
||||
out.println(" --xsd <path-to-metadata.xsd>");
|
||||
out.println(" --output <output-file-or-directory>");
|
||||
}
|
||||
|
||||
private static String consumeOption(String option, List<String> argList) throws Exception {
|
||||
int index = argList.indexOf(option);
|
||||
if (index >= 0 && index <= argList.size() - 2) {
|
||||
String result = argList.get(index + 1);
|
||||
argList.remove(index);
|
||||
argList.remove(index);
|
||||
return result;
|
||||
}
|
||||
throw new IllegalArgumentException("missing option " + option);
|
||||
}
|
||||
|
||||
public static void main(String... args) throws Exception {
|
||||
try {
|
||||
List<String> argList = new ArrayList<>();
|
||||
argList.addAll(Arrays.asList(args));
|
||||
String mode = consumeOption("--mode", argList);
|
||||
String output = consumeOption("--output", argList);
|
||||
String xml = consumeOption("--xml", argList);
|
||||
String xsd = consumeOption("--xsd", argList);
|
||||
if (!argList.isEmpty()) {
|
||||
throw new IllegalArgumentException("unknown option " + argList);
|
||||
}
|
||||
OutputMode outputMode = OutputMode.valueOf(mode);
|
||||
File xmlFile = new File(xml);
|
||||
File xsdFile = new File(xsd);
|
||||
|
||||
Metadata metadata = new Metadata(xmlFile, xsdFile);
|
||||
metadata.verify();
|
||||
metadata.wireUpTypes();
|
||||
|
||||
TypeCounter typeCounter = new TypeCounter();
|
||||
printJfrEventIdsHpp(metadata, typeCounter, outputDirectory);
|
||||
printJfrTypesHpp(metadata, typeCounter, outputDirectory);
|
||||
printJfrPeriodicHpp(metadata, outputDirectory);
|
||||
printJfrEventControlHpp(metadata, typeCounter, outputDirectory);
|
||||
printJfrEventClassesHpp(metadata, outputDirectory);
|
||||
if (outputMode == OutputMode.headers) {
|
||||
File outputDir = new File(output);
|
||||
printJfrEventIdsHpp(metadata, new File(outputDir, "jfrEventIds.hpp"));
|
||||
printJfrTypesHpp(metadata, new File(outputDir, "jfrTypes.hpp"));
|
||||
printJfrPeriodicHpp(metadata, new File(outputDir, "jfrPeriodic.hpp"));
|
||||
printJfrEventControlHpp(metadata, new File(outputDir, "jfrEventControl.hpp"));
|
||||
printJfrEventClassesHpp(metadata, new File(outputDir, "jfrEventClasses.hpp"));
|
||||
}
|
||||
|
||||
if (outputMode == OutputMode.metadata) {
|
||||
File outputFile = new File(output);
|
||||
try (var b = new DataOutputStream(
|
||||
new BufferedOutputStream(
|
||||
new FileOutputStream(outputFile)))) {
|
||||
metadata.persist(b);
|
||||
}
|
||||
}
|
||||
System.exit(0);
|
||||
} catch (IllegalArgumentException iae) {
|
||||
System.err.println();
|
||||
System.err.println("GenerateJfrFiles: " + iae.getMessage());
|
||||
System.err.println();
|
||||
printUsage(System.err);
|
||||
System.err.println();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static class TypeCounter {
|
||||
final static long RESERVED_EVENT_COUNT = 2;
|
||||
long typeId = -1;
|
||||
long eventId = -1;
|
||||
long eventCount = 0;
|
||||
String firstTypeName;
|
||||
String lastTypeName;
|
||||
String firstEventName;
|
||||
String lastEventname;
|
||||
|
||||
public long nextEventId(String name) {
|
||||
eventCount++;
|
||||
if (eventId == -1) {
|
||||
eventId = firstEventId();
|
||||
firstEventName = lastEventname = name;
|
||||
return eventId;
|
||||
}
|
||||
lastEventname = name;
|
||||
return ++eventId;
|
||||
}
|
||||
|
||||
public long nextTypeId(String typeName) {
|
||||
if (typeId == -1) {
|
||||
lastTypeName = firstTypeName = typeName;
|
||||
typeId = lastEventId();
|
||||
}
|
||||
lastTypeName = typeName;
|
||||
return ++typeId;
|
||||
}
|
||||
|
||||
public long firstEventId() {
|
||||
return RESERVED_EVENT_COUNT;
|
||||
}
|
||||
|
||||
public long lastEventId() {
|
||||
return eventId == -1 ? firstEventId() : eventId;
|
||||
}
|
||||
|
||||
public long eventCount() {
|
||||
return eventCount;
|
||||
}
|
||||
|
||||
public String firstTypeName() {
|
||||
return firstTypeName;
|
||||
}
|
||||
|
||||
public String lastTypeName() {
|
||||
return lastTypeName;
|
||||
}
|
||||
|
||||
public String firstEventName() {
|
||||
return firstEventName;
|
||||
}
|
||||
|
||||
public String lastEventName() {
|
||||
return lastEventname;
|
||||
}
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
static class XmlType {
|
||||
@ -121,28 +137,99 @@ public class GenerateJfrFiles {
|
||||
final String parameterType;
|
||||
final String javaType;
|
||||
final boolean unsigned;
|
||||
final String contentType;
|
||||
|
||||
XmlType(String name, String fieldType, String parameterType, String javaType, boolean unsigned) {
|
||||
XmlType(String name, String fieldType, String parameterType, String javaType, String contentType,
|
||||
boolean unsigned) {
|
||||
this.name = name;
|
||||
this.fieldType = fieldType;
|
||||
this.parameterType = parameterType;
|
||||
this.javaType = javaType;
|
||||
this.unsigned = unsigned;
|
||||
this.contentType = contentType;
|
||||
}
|
||||
}
|
||||
|
||||
static class XmlContentType {
|
||||
final String name;
|
||||
final String annotation;
|
||||
|
||||
XmlContentType(String name, String annotation) {
|
||||
this.name = name;
|
||||
this.annotation = annotation;
|
||||
}
|
||||
}
|
||||
|
||||
static class TypeElement {
|
||||
List<FieldElement> fields = new ArrayList<>();
|
||||
String name;
|
||||
String fieldType;
|
||||
String parameterType;
|
||||
boolean supportStruct;
|
||||
String javaType;
|
||||
String label = "";
|
||||
String description = "";
|
||||
String category = "";
|
||||
boolean thread;
|
||||
boolean stackTrace;
|
||||
boolean startTime;
|
||||
String period = "";
|
||||
boolean cutoff;
|
||||
boolean experimental;
|
||||
long id;
|
||||
boolean isEvent;
|
||||
boolean isRelation;
|
||||
boolean supportStruct = false;
|
||||
String commitState;
|
||||
public boolean primitive;
|
||||
|
||||
public void persist(DataOutputStream pos) throws IOException {
|
||||
pos.writeInt(fields.size());
|
||||
for (FieldElement field : fields) {
|
||||
field.persist(pos);
|
||||
}
|
||||
pos.writeUTF(javaType);
|
||||
pos.writeUTF(label);
|
||||
pos.writeUTF(description);
|
||||
pos.writeUTF(category);
|
||||
pos.writeBoolean(thread);
|
||||
pos.writeBoolean(stackTrace);
|
||||
pos.writeBoolean(startTime);
|
||||
pos.writeUTF(period);
|
||||
pos.writeBoolean(cutoff);
|
||||
pos.writeBoolean(experimental);
|
||||
pos.writeLong(id);
|
||||
pos.writeBoolean(isEvent);
|
||||
pos.writeBoolean(isRelation);
|
||||
}
|
||||
}
|
||||
|
||||
static class Metadata {
|
||||
static class TypeCounter {
|
||||
final long first;
|
||||
long last = -1;
|
||||
long count = 0;
|
||||
long id = -1;
|
||||
|
||||
TypeCounter(long startId) {
|
||||
this.first = startId;
|
||||
}
|
||||
|
||||
long next() {
|
||||
id = (id == -1) ? first : id + 1;
|
||||
count++;
|
||||
last = id;
|
||||
return id;
|
||||
}
|
||||
}
|
||||
|
||||
static int RESERVED_EVENT_COUNT = 2;
|
||||
final Map<String, TypeElement> types = new LinkedHashMap<>();
|
||||
final Map<String, XmlType> xmlTypes = new LinkedHashMap<>();
|
||||
Metadata(File metadataXml, File metadataSchema) throws ParserConfigurationException, SAXException, FileNotFoundException, IOException {
|
||||
final Map<String, XmlContentType> xmlContentTypes = new LinkedHashMap<>();
|
||||
int lastEventId;
|
||||
private TypeCounter eventCounter;
|
||||
private TypeCounter typeCounter;
|
||||
|
||||
Metadata(File metadataXml, File metadataSchema)
|
||||
throws ParserConfigurationException, SAXException, FileNotFoundException, IOException {
|
||||
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
|
||||
SAXParserFactory factory = SAXParserFactory.newInstance();
|
||||
factory.setSchema(schemaFactory.newSchema(metadataSchema));
|
||||
@ -150,16 +237,19 @@ public class GenerateJfrFiles {
|
||||
sp.parse(metadataXml, new MetadataHandler(this));
|
||||
}
|
||||
|
||||
List<EventElement> getEvents() {
|
||||
return getList(t -> t.getClass() == EventElement.class);
|
||||
public void persist(DataOutputStream pos) throws IOException {
|
||||
pos.writeInt(types.values().size());
|
||||
for (TypeElement t : types.values()) {
|
||||
t.persist(pos);
|
||||
}
|
||||
}
|
||||
|
||||
List<TypeElement> getEvents() {
|
||||
return getList(t -> t.isEvent);
|
||||
}
|
||||
|
||||
List<TypeElement> getEventsAndStructs() {
|
||||
return getList(t -> t.getClass() == EventElement.class || t.supportStruct);
|
||||
}
|
||||
|
||||
List<TypeElement> getTypesAndStructs() {
|
||||
return getList(t -> t.getClass() == TypeElement.class || t.supportStruct);
|
||||
return getList(t -> t.isEvent || t.supportStruct);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@ -173,24 +263,25 @@ public class GenerateJfrFiles {
|
||||
return result;
|
||||
}
|
||||
|
||||
List<EventElement> getPeriodicEvents() {
|
||||
return getList(t -> t.getClass() == EventElement.class && ((EventElement) t).periodic);
|
||||
List<TypeElement> getPeriodicEvents() {
|
||||
return getList(t -> t.isEvent && !t.period.isEmpty());
|
||||
}
|
||||
|
||||
List<TypeElement> getTypes() {
|
||||
return getList(t -> t.getClass() == TypeElement.class);
|
||||
return getList(t -> !t.isEvent);
|
||||
}
|
||||
|
||||
List<TypeElement> getStructs() {
|
||||
return getList(t -> t.getClass() == TypeElement.class && t.supportStruct);
|
||||
return getList(t -> !t.isEvent && t.supportStruct);
|
||||
}
|
||||
|
||||
void verify() {
|
||||
void verify() {
|
||||
for (TypeElement t : types.values()) {
|
||||
for (FieldElement f : t.fields) {
|
||||
if (!xmlTypes.containsKey(f.typeName)) { // ignore primitives
|
||||
if (!types.containsKey(f.typeName)) {
|
||||
throw new IllegalStateException("Could not find definition of type '" + f.typeName + "' used by " + t.name + "#" + f.name);
|
||||
throw new IllegalStateException("Could not find definition of type '" + f.typeName
|
||||
+ "' used by " + t.name + "#" + f.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -198,26 +289,96 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
|
||||
void wireUpTypes() {
|
||||
// Add Java primitives
|
||||
for (var t : xmlTypes.entrySet()) {
|
||||
String name = t.getKey();
|
||||
XmlType xmlType = t.getValue();
|
||||
// Excludes Thread and Class
|
||||
if (!types.containsKey(name)) {
|
||||
// Excludes u8, u4, u2, u1, Ticks and Ticksspan
|
||||
if (!xmlType.javaType.isEmpty() && !xmlType.unsigned) {
|
||||
TypeElement te = new TypeElement();
|
||||
te.name = name;
|
||||
te.javaType = xmlType.javaType;
|
||||
te.primitive = true;
|
||||
types.put(te.name, te);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Setup Java fully qualified names
|
||||
for (TypeElement t : types.values()) {
|
||||
if (t.isEvent) {
|
||||
t.javaType = "jdk." + t.name;
|
||||
} else {
|
||||
XmlType xmlType = xmlTypes.get(t.name);
|
||||
if (xmlType != null && !xmlType.javaType.isEmpty()) {
|
||||
t.javaType = xmlType.javaType;
|
||||
} else {
|
||||
t.javaType = "jdk.types." + t.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Setup content type, annotation, constant pool etc. for fields.
|
||||
for (TypeElement t : types.values()) {
|
||||
for (FieldElement f : t.fields) {
|
||||
TypeElement type = types.get(f.typeName);
|
||||
XmlType xmlType = xmlTypes.get(f.typeName);
|
||||
if (type == null) {
|
||||
if (xmlType == null) {
|
||||
throw new IllegalStateException("Unknown type");
|
||||
}
|
||||
if (f.contentType.isEmpty()) {
|
||||
f.contentType = xmlType.contentType;
|
||||
}
|
||||
String javaType = xmlType.javaType;
|
||||
type = types.get(javaType);
|
||||
Objects.requireNonNull(type);
|
||||
}
|
||||
if (type.primitive) {
|
||||
f.constantPool = false;
|
||||
}
|
||||
|
||||
if (xmlType != null) {
|
||||
f.unsigned = xmlType.unsigned;
|
||||
}
|
||||
|
||||
if (f.struct) {
|
||||
f.constantPool = false;
|
||||
type.supportStruct = true;
|
||||
}
|
||||
f.type = type;
|
||||
XmlContentType xmlContentType = xmlContentTypes.get(f.contentType);
|
||||
if (xmlContentType == null) {
|
||||
f.annotations = "";
|
||||
} else {
|
||||
f.annotations = xmlContentType.annotation;
|
||||
}
|
||||
if (!f.relation.isEmpty()) {
|
||||
f.relation = "jdk.types." + f.relation;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static class EventElement extends TypeElement {
|
||||
String representation;
|
||||
boolean thread;
|
||||
boolean stackTrace;
|
||||
boolean startTime;
|
||||
boolean periodic;
|
||||
boolean cutoff;
|
||||
String commitState;
|
||||
// Low numbers for event so most of them
|
||||
// can fit in one byte with compressed integers
|
||||
eventCounter = new TypeCounter(RESERVED_EVENT_COUNT);
|
||||
for (TypeElement t : getEvents()) {
|
||||
t.id = eventCounter.next();
|
||||
}
|
||||
typeCounter = new TypeCounter(eventCounter.last + 1);
|
||||
for (TypeElement t : getTypes()) {
|
||||
t.id = typeCounter.next();
|
||||
}
|
||||
}
|
||||
|
||||
public String getName(long id) {
|
||||
for (TypeElement t : types.values()) {
|
||||
if (t.id == id) {
|
||||
return t.name;
|
||||
}
|
||||
}
|
||||
throw new IllegalStateException("Unexpected id " + id );
|
||||
}
|
||||
}
|
||||
|
||||
static class FieldElement {
|
||||
@ -225,12 +386,36 @@ public class GenerateJfrFiles {
|
||||
TypeElement type;
|
||||
String name;
|
||||
String typeName;
|
||||
boolean struct;
|
||||
boolean constantPool = true;
|
||||
public String transition;
|
||||
public String contentType;
|
||||
private String label;
|
||||
private String description;
|
||||
private String relation;
|
||||
private boolean experimental;
|
||||
private boolean unsigned;
|
||||
private boolean array;
|
||||
private String annotations;
|
||||
public boolean struct;
|
||||
|
||||
FieldElement(Metadata metadata) {
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
||||
public void persist(DataOutputStream pos) throws IOException {
|
||||
pos.writeUTF(name);
|
||||
pos.writeUTF(type.javaType);
|
||||
pos.writeUTF(label);
|
||||
pos.writeUTF(description);
|
||||
pos.writeBoolean(constantPool);
|
||||
pos.writeBoolean(array);
|
||||
pos.writeBoolean(unsigned);
|
||||
pos.writeUTF(annotations);
|
||||
pos.writeUTF(transition);
|
||||
pos.writeUTF(relation);
|
||||
pos.writeBoolean(experimental);
|
||||
}
|
||||
|
||||
String getParameterType() {
|
||||
if (struct) {
|
||||
return "const JfrStruct" + typeName + "&";
|
||||
@ -262,50 +447,75 @@ public class GenerateJfrFiles {
|
||||
final Metadata metadata;
|
||||
FieldElement currentField;
|
||||
TypeElement currentType;
|
||||
|
||||
MetadataHandler(Metadata metadata) {
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(SAXParseException e) throws SAXException {
|
||||
throw e;
|
||||
throw e;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
|
||||
public void startElement(String uri, String localName, String qName, Attributes attributes)
|
||||
throws SAXException {
|
||||
switch (qName) {
|
||||
case "XmlContentType":
|
||||
String n = attributes.getValue("name"); // mandatory
|
||||
String a = attributes.getValue("annotation"); // mandatory
|
||||
metadata.xmlContentTypes.put(n, new XmlContentType(n, a));
|
||||
break;
|
||||
case "XmlType":
|
||||
String name = attributes.getValue("name");
|
||||
String parameterType = attributes.getValue("parameterType");
|
||||
String fieldType = attributes.getValue("fieldType");
|
||||
String javaType = attributes.getValue("javaType");
|
||||
String name = attributes.getValue("name"); // mandatory
|
||||
String parameterType = attributes.getValue("parameterType"); // mandatory
|
||||
String fieldType = attributes.getValue("fieldType"); // mandatory
|
||||
String javaType = getString(attributes, "javaType");
|
||||
String contentType = getString(attributes, "contentType");
|
||||
boolean unsigned = getBoolean(attributes, "unsigned", false);
|
||||
metadata.xmlTypes.put(name, new XmlType(name, fieldType, parameterType, javaType, unsigned));
|
||||
metadata.xmlTypes.put(name,
|
||||
new XmlType(name, fieldType, parameterType, javaType, contentType, unsigned));
|
||||
break;
|
||||
case "Relation":
|
||||
case "Type":
|
||||
currentType = new TypeElement();
|
||||
currentType.name = attributes.getValue("name");
|
||||
break;
|
||||
case "Event":
|
||||
EventElement eventType = new EventElement();
|
||||
eventType.name = attributes.getValue("name");
|
||||
eventType.thread = getBoolean(attributes, "thread", false);
|
||||
eventType.stackTrace = getBoolean(attributes, "stackTrace", false);
|
||||
eventType.startTime = getBoolean(attributes, "startTime", true);
|
||||
eventType.periodic = attributes.getValue("period") != null;
|
||||
eventType.cutoff = getBoolean(attributes, "cutoff", false);
|
||||
eventType.commitState = attributes.getValue("commitState");
|
||||
currentType = eventType;
|
||||
currentType = new TypeElement();
|
||||
currentType.name = attributes.getValue("name"); // mandatory
|
||||
currentType.label = getString(attributes, "label");
|
||||
currentType.description = getString(attributes, "description");
|
||||
currentType.category = getString(attributes, "category");
|
||||
currentType.experimental = getBoolean(attributes, "experimental", false);
|
||||
currentType.thread = getBoolean(attributes, "thread", false);
|
||||
currentType.stackTrace = getBoolean(attributes, "stackTrace", false);
|
||||
currentType.startTime = getBoolean(attributes, "startTime", true);
|
||||
currentType.period = getString(attributes, "period");
|
||||
currentType.cutoff = getBoolean(attributes, "cutoff", false);
|
||||
currentType.commitState = getString(attributes, "commitState");
|
||||
currentType.isEvent = "Event".equals(qName);
|
||||
currentType.isRelation = "Relation".equals(qName);
|
||||
break;
|
||||
case "Field":
|
||||
currentField = new FieldElement(metadata);
|
||||
currentField.name = attributes.getValue("name"); // mandatory
|
||||
currentField.typeName = attributes.getValue("type"); // mandatory
|
||||
currentField.label = getString(attributes, "label");
|
||||
currentField.description = getString(attributes, "description");
|
||||
currentField.contentType = getString(attributes, "contentType");
|
||||
currentField.struct = getBoolean(attributes, "struct", false);
|
||||
currentField.name = attributes.getValue("name");
|
||||
currentField.typeName = attributes.getValue("type");
|
||||
currentField.array = getBoolean(attributes, "array", false);
|
||||
currentField.transition = getString(attributes, "transition");
|
||||
currentField.relation = getString(attributes, "relation");
|
||||
currentField.experimental = getBoolean(attributes, "experimental", false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean getBoolean(Attributes attributes, String name, boolean defaultValue) {
|
||||
private static String getString(Attributes attributes, String name) {
|
||||
String value = attributes.getValue(name);
|
||||
return value != null ? value : "";
|
||||
}
|
||||
|
||||
private static boolean getBoolean(Attributes attributes, String name, boolean defaultValue) {
|
||||
String value = attributes.getValue(name);
|
||||
return value == null ? defaultValue : Boolean.valueOf(value);
|
||||
}
|
||||
@ -327,10 +537,11 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
}
|
||||
|
||||
static class Printer implements AutoCloseable {
|
||||
static class Printer implements Closeable {
|
||||
final PrintStream out;
|
||||
Printer(File outputDirectory, String filename) throws FileNotFoundException {
|
||||
out = new PrintStream(new BufferedOutputStream(new FileOutputStream(new File(outputDirectory, filename))));
|
||||
|
||||
Printer(File outputFile) throws FileNotFoundException {
|
||||
out = new PrintStream(new BufferedOutputStream(new FileOutputStream(outputFile)));
|
||||
write("/* AUTOMATICALLY GENERATED FILE - DO NOT EDIT */");
|
||||
write("");
|
||||
}
|
||||
@ -341,13 +552,13 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws Exception {
|
||||
public void close() throws IOException {
|
||||
out.close();
|
||||
}
|
||||
}
|
||||
|
||||
private static void printJfrPeriodicHpp(Metadata metadata, File outputDirectory) throws Exception {
|
||||
try (Printer out = new Printer(outputDirectory, "jfrPeriodic.hpp")) {
|
||||
private static void printJfrPeriodicHpp(Metadata metadata, File outputFile) throws Exception {
|
||||
try (var out = new Printer(outputFile)) {
|
||||
out.write("#ifndef JFRFILES_JFRPERIODICEVENTSET_HPP");
|
||||
out.write("#define JFRFILES_JFRPERIODICEVENTSET_HPP");
|
||||
out.write("");
|
||||
@ -361,7 +572,7 @@ public class GenerateJfrFiles {
|
||||
out.write(" static void requestEvent(JfrEventId id) {");
|
||||
out.write(" switch(id) {");
|
||||
out.write(" ");
|
||||
for (EventElement e : metadata.getPeriodicEvents()) {
|
||||
for (TypeElement e : metadata.getPeriodicEvents()) {
|
||||
out.write(" case Jfr" + e.name + "Event:");
|
||||
out.write(" request" + e.name + "();");
|
||||
out.write(" break;");
|
||||
@ -374,7 +585,7 @@ public class GenerateJfrFiles {
|
||||
out.write("");
|
||||
out.write(" private:");
|
||||
out.write("");
|
||||
for (EventElement e : metadata.getPeriodicEvents()) {
|
||||
for (TypeElement e : metadata.getPeriodicEvents()) {
|
||||
out.write(" static void request" + e.name + "(void);");
|
||||
out.write("");
|
||||
}
|
||||
@ -385,8 +596,8 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
}
|
||||
|
||||
private static void printJfrEventControlHpp(Metadata metadata, TypeCounter typeCounter, File outputDirectory) throws Exception {
|
||||
try (Printer out = new Printer(outputDirectory, "jfrEventControl.hpp")) {
|
||||
private static void printJfrEventControlHpp(Metadata metadata, File outputFile) throws Exception {
|
||||
try (var out = new Printer(outputFile)) {
|
||||
out.write("#ifndef JFRFILES_JFR_NATIVE_EVENTSETTING_HPP");
|
||||
out.write("#define JFRFILES_JFR_NATIVE_EVENTSETTING_HPP");
|
||||
out.write("");
|
||||
@ -426,8 +637,8 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
}
|
||||
|
||||
private static void printJfrEventIdsHpp(Metadata metadata, TypeCounter typeCounter, File outputDirectory) throws Exception {
|
||||
try (Printer out = new Printer(outputDirectory, "jfrEventIds.hpp")) {
|
||||
private static void printJfrEventIdsHpp(Metadata metadata, File outputFile) throws Exception {
|
||||
try (var out = new Printer(outputFile)) {
|
||||
out.write("#ifndef JFRFILES_JFREVENTIDS_HPP");
|
||||
out.write("#define JFRFILES_JFREVENTIDS_HPP");
|
||||
out.write("");
|
||||
@ -438,23 +649,28 @@ public class GenerateJfrFiles {
|
||||
out.write(" JfrMetadataEvent = 0,");
|
||||
out.write(" JfrCheckpointEvent = 1,");
|
||||
for (TypeElement t : metadata.getEvents()) {
|
||||
String name = "Jfr" + t.name +"Event";
|
||||
out.write(" " + name + " = " + typeCounter.nextEventId(name) + ",");
|
||||
out.write(" " + jfrEventId(t.name) + " = " + t.id + ",");
|
||||
}
|
||||
out.write("};");
|
||||
out.write("typedef enum JfrEventId JfrEventId;");
|
||||
out.write("");
|
||||
out.write("static const JfrEventId FIRST_EVENT_ID = " + typeCounter.firstEventName() + ";");
|
||||
out.write("static const JfrEventId LAST_EVENT_ID = " + typeCounter.lastEventName() + ";");
|
||||
out.write("static const int NUMBER_OF_EVENTS = " + typeCounter.eventCount() + ";");
|
||||
out.write("static const int NUMBER_OF_RESERVED_EVENTS = " + TypeCounter.RESERVED_EVENT_COUNT + ";");
|
||||
String first = metadata.getName(metadata.eventCounter.first);
|
||||
String last = metadata.getName(metadata.eventCounter.last);
|
||||
out.write("static const JfrEventId FIRST_EVENT_ID = " + jfrEventId(first) + ";");
|
||||
out.write("static const JfrEventId LAST_EVENT_ID = " + jfrEventId(last) + ";");
|
||||
out.write("static const int NUMBER_OF_EVENTS = " + metadata.eventCounter.count + ";");
|
||||
out.write("static const int NUMBER_OF_RESERVED_EVENTS = " + Metadata.RESERVED_EVENT_COUNT + ";");
|
||||
out.write("#endif // INCLUDE_JFR");
|
||||
out.write("#endif // JFRFILES_JFREVENTIDS_HPP");
|
||||
}
|
||||
}
|
||||
|
||||
private static void printJfrTypesHpp(Metadata metadata, TypeCounter typeCounter, File outputDirectory) throws Exception {
|
||||
try (Printer out = new Printer(outputDirectory, "jfrTypes.hpp")) {
|
||||
private static String jfrEventId(String name) {
|
||||
return "Jfr" + name + "Event";
|
||||
}
|
||||
|
||||
private static void printJfrTypesHpp(Metadata metadata, File outputFile) throws Exception {
|
||||
try (var out = new Printer(outputFile)) {
|
||||
out.write("#ifndef JFRFILES_JFRTYPES_HPP");
|
||||
out.write("#define JFRFILES_JFRTYPES_HPP");
|
||||
out.write("");
|
||||
@ -465,36 +681,27 @@ public class GenerateJfrFiles {
|
||||
out.write("#include \"memory/allocation.hpp\"");
|
||||
out.write("");
|
||||
out.write("enum JfrTypeId {");
|
||||
Map<String, XmlType> javaTypes = new LinkedHashMap<>();
|
||||
for (var t : metadata.xmlTypes.entrySet()) {
|
||||
String name = t.getKey();
|
||||
XmlType xmlType = t.getValue();
|
||||
if (xmlType.javaType != null && !xmlType.unsigned) {
|
||||
String typeName = "TYPE_" + name.toUpperCase();
|
||||
long typeId = typeCounter.nextTypeId(typeName);
|
||||
out.write(" " + typeName + " = " + typeId + ",");
|
||||
javaTypes.put(name, xmlType);
|
||||
}
|
||||
}
|
||||
for (TypeElement type : metadata.getTypes()) {
|
||||
String name = type.name;
|
||||
if (!javaTypes.containsKey(name)) {
|
||||
String typeName = "TYPE_" + name.toUpperCase();
|
||||
long typeId = typeCounter.nextTypeId(typeName);
|
||||
out.write(" " + typeName + " = " + typeId + ",");
|
||||
}
|
||||
out.write(" " + jfrTypeId(type.name) + " = " + type.id + ",");
|
||||
}
|
||||
out.write("};");
|
||||
out.write("");
|
||||
out.write("static const JfrTypeId FIRST_TYPE_ID = " + typeCounter.firstTypeName() + ";");
|
||||
out.write("static const JfrTypeId LAST_TYPE_ID = " + typeCounter.lastTypeName() + ";");
|
||||
|
||||
String first = metadata.getName(metadata.typeCounter.first);
|
||||
String last = metadata.getName(metadata.typeCounter.last);
|
||||
out.write("static const JfrTypeId FIRST_TYPE_ID = " + jfrTypeId(first) + ";");
|
||||
out.write("static const JfrTypeId LAST_TYPE_ID = " + jfrTypeId(last) + ";");
|
||||
out.write("");
|
||||
out.write("class JfrType : public AllStatic {");
|
||||
out.write(" public:");
|
||||
out.write(" static jlong name_to_id(const char* type_name) {");
|
||||
for (Entry<String, XmlType> m : javaTypes.entrySet()) {
|
||||
XmlType xmlType = m.getValue();
|
||||
|
||||
Map<String, XmlType> javaTypes = new LinkedHashMap<>();
|
||||
for (XmlType xmlType : metadata.xmlTypes.values()) {
|
||||
if (!xmlType.javaType.isEmpty()) {
|
||||
javaTypes.put(xmlType.javaType, xmlType);
|
||||
}
|
||||
}
|
||||
for (XmlType xmlType : javaTypes.values()) {
|
||||
String javaName = xmlType.javaType;
|
||||
String typeName = xmlType.name.toUpperCase();
|
||||
out.write(" if (strcmp(type_name, \"" + javaName + "\") == 0) {");
|
||||
@ -508,11 +715,14 @@ public class GenerateJfrFiles {
|
||||
out.write("#endif // INCLUDE_JFR");
|
||||
out.write("#endif // JFRFILES_JFRTYPES_HPP");
|
||||
}
|
||||
;
|
||||
}
|
||||
|
||||
private static void printJfrEventClassesHpp(Metadata metadata, File outputDirectory) throws Exception {
|
||||
try (Printer out = new Printer(outputDirectory, "jfrEventClasses.hpp")) {
|
||||
private static String jfrTypeId(String name) {
|
||||
return "TYPE_" + name.toUpperCase();
|
||||
}
|
||||
|
||||
private static void printJfrEventClassesHpp(Metadata metadata, File outputFile) throws Exception {
|
||||
try (var out = new Printer(outputFile)) {
|
||||
out.write("#ifndef JFRFILES_JFREVENTCLASSES_HPP");
|
||||
out.write("#define JFRFILES_JFREVENTCLASSES_HPP");
|
||||
out.write("");
|
||||
@ -566,7 +776,7 @@ public class GenerateJfrFiles {
|
||||
printType(out, t, empty);
|
||||
out.write("");
|
||||
}
|
||||
for (EventElement e : metadata.getEvents()) {
|
||||
for (TypeElement e : metadata.getEvents()) {
|
||||
printEvent(out, e, empty);
|
||||
out.write("");
|
||||
}
|
||||
@ -576,81 +786,83 @@ public class GenerateJfrFiles {
|
||||
out.write("struct JfrStruct" + t.name);
|
||||
out.write("{");
|
||||
if (!empty) {
|
||||
out.write(" private:");
|
||||
for (FieldElement f : t.fields) {
|
||||
printField(out, f);
|
||||
}
|
||||
out.write("");
|
||||
out.write(" private:");
|
||||
for (FieldElement f : t.fields) {
|
||||
printField(out, f);
|
||||
}
|
||||
out.write("");
|
||||
}
|
||||
out.write(" public:");
|
||||
for (FieldElement f : t.fields) {
|
||||
printTypeSetter(out, f, empty);
|
||||
printTypeSetter(out, f, empty);
|
||||
}
|
||||
out.write("");
|
||||
if (!empty) {
|
||||
printWriteData(out, t.fields, null);
|
||||
printWriteData(out, t);
|
||||
}
|
||||
out.write("};");
|
||||
out.write("");
|
||||
}
|
||||
|
||||
private static void printEvent(Printer out, EventElement event, boolean empty) {
|
||||
private static void printEvent(Printer out, TypeElement event, boolean empty) {
|
||||
out.write("class Event" + event.name + " : public JfrEvent<Event" + event.name + ">");
|
||||
out.write("{");
|
||||
if (!empty) {
|
||||
out.write(" private:");
|
||||
for (FieldElement f : event.fields) {
|
||||
printField(out, f);
|
||||
}
|
||||
out.write("");
|
||||
out.write(" private:");
|
||||
for (FieldElement f : event.fields) {
|
||||
printField(out, f);
|
||||
}
|
||||
out.write("");
|
||||
}
|
||||
out.write(" public:");
|
||||
if (!empty) {
|
||||
out.write(" static const bool hasThread = " + event.thread + ";");
|
||||
out.write(" static const bool hasStackTrace = " + event.stackTrace + ";");
|
||||
out.write(" static const bool isInstant = " + !event.startTime + ";");
|
||||
out.write(" static const bool hasCutoff = " + event.cutoff + ";");
|
||||
out.write(" static const bool isRequestable = " + event.periodic + ";");
|
||||
out.write(" static const JfrEventId eventId = Jfr" + event.name + "Event;");
|
||||
out.write("");
|
||||
out.write(" static const bool hasThread = " + event.thread + ";");
|
||||
out.write(" static const bool hasStackTrace = " + event.stackTrace + ";");
|
||||
out.write(" static const bool isInstant = " + !event.startTime + ";");
|
||||
out.write(" static const bool hasCutoff = " + event.cutoff + ";");
|
||||
out.write(" static const bool isRequestable = " + !event.period.isEmpty() + ";");
|
||||
out.write(" static const JfrEventId eventId = Jfr" + event.name + "Event;");
|
||||
out.write("");
|
||||
}
|
||||
if (!empty) {
|
||||
out.write(" Event" + event.name + "(EventStartTime timing=TIMED) : JfrEvent<Event" + event.name + ">(timing) {}");
|
||||
out.write(" Event" + event.name + "(EventStartTime timing=TIMED) : JfrEvent<Event" + event.name
|
||||
+ ">(timing) {}");
|
||||
} else {
|
||||
out.write(" Event" + event.name + "(EventStartTime timing=TIMED) {}");
|
||||
out.write(" Event" + event.name + "(EventStartTime timing=TIMED) {}");
|
||||
}
|
||||
out.write("");
|
||||
int index = 0;
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" void set_" + f.name + "(" + f.getParameterType() + " " + f.getParameterName() + ") {");
|
||||
if (!empty) {
|
||||
out.write(" this->_" + f.name + " = " + f.getParameterName() + ";");
|
||||
out.write(" DEBUG_ONLY(set_field_bit(" + index++ + "));");
|
||||
out.write(" this->_" + f.name + " = " + f.getParameterName() + ";");
|
||||
out.write(" DEBUG_ONLY(set_field_bit(" + index++ + "));");
|
||||
}
|
||||
out.write(" }");
|
||||
}
|
||||
out.write("");
|
||||
if (!empty) {
|
||||
printWriteData(out, event.fields, event.commitState);
|
||||
out.write("");
|
||||
printWriteData(out, event);
|
||||
out.write("");
|
||||
}
|
||||
out.write(" using JfrEvent<Event" + event.name + ">::commit; // else commit() is hidden by overloaded versions in this class");
|
||||
out.write(" using JfrEvent<Event" + event.name
|
||||
+ ">::commit; // else commit() is hidden by overloaded versions in this class");
|
||||
printConstructor2(out, event, empty);
|
||||
printCommitMethod(out, event, empty);
|
||||
if (!empty) {
|
||||
printVerify(out, event.fields);
|
||||
printVerify(out, event.fields);
|
||||
}
|
||||
out.write("};");
|
||||
}
|
||||
|
||||
private static void printWriteData(Printer out, List<FieldElement> fields, String commitState) {
|
||||
private static void printWriteData(Printer out, TypeElement type) {
|
||||
out.write(" template <typename Writer>");
|
||||
out.write(" void writeData(Writer& w) {");
|
||||
if (("_thread_in_native").equals(commitState)) {
|
||||
if (("_thread_in_native").equals(type.commitState)) {
|
||||
out.write(" // explicit epoch synchronization check");
|
||||
out.write(" JfrEpochSynchronization sync;");
|
||||
}
|
||||
for (FieldElement field : fields) {
|
||||
for (FieldElement field : type.fields) {
|
||||
if (field.struct) {
|
||||
out.write(" _" + field.name + ".writeData(w);");
|
||||
} else {
|
||||
@ -662,9 +874,10 @@ public class GenerateJfrFiles {
|
||||
|
||||
private static void printTypeSetter(Printer out, FieldElement field, boolean empty) {
|
||||
if (!empty) {
|
||||
out.write(" void set_" + field.name + "(" + field.getParameterType() + " new_value) { this->_" + field.name + " = new_value; }");
|
||||
out.write(" void set_" + field.name + "(" + field.getParameterType() + " new_value) { this->_" + field.name
|
||||
+ " = new_value; }");
|
||||
} else {
|
||||
out.write(" void set_" + field.name + "(" + field.getParameterType() + " new_value) { }");
|
||||
out.write(" void set_" + field.name + "(" + field.getParameterType() + " new_value) { }");
|
||||
}
|
||||
}
|
||||
|
||||
@ -674,13 +887,14 @@ public class GenerateJfrFiles {
|
||||
out.write(" void verify() const {");
|
||||
int index = 0;
|
||||
for (FieldElement f : fields) {
|
||||
out.write(" assert(verify_field_bit(" + index++ + "), \"Attempting to write an uninitialized event field: %s\", \"_" + f.name + "\");");
|
||||
out.write(" assert(verify_field_bit(" + index++
|
||||
+ "), \"Attempting to write an uninitialized event field: %s\", \"_" + f.name + "\");");
|
||||
}
|
||||
out.write(" }");
|
||||
out.write("#endif");
|
||||
}
|
||||
|
||||
private static void printCommitMethod(Printer out, EventElement event, boolean empty) {
|
||||
private static void printCommitMethod(Printer out, TypeElement event, boolean empty) {
|
||||
if (event.startTime) {
|
||||
StringJoiner sj = new StringJoiner(",\n ");
|
||||
for (FieldElement f : event.fields) {
|
||||
@ -689,12 +903,12 @@ public class GenerateJfrFiles {
|
||||
out.write("");
|
||||
out.write(" void commit(" + sj.toString() + ") {");
|
||||
if (!empty) {
|
||||
out.write(" if (should_commit()) {");
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" commit();");
|
||||
out.write(" }");
|
||||
out.write(" if (should_commit()) {");
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" commit();");
|
||||
out.write(" }");
|
||||
}
|
||||
out.write(" }");
|
||||
}
|
||||
@ -715,23 +929,23 @@ public class GenerateJfrFiles {
|
||||
}
|
||||
out.write(" static void commit(" + sj.toString() + ") {");
|
||||
if (!empty) {
|
||||
out.write(" Event" + event.name + " me(UNTIMED);");
|
||||
out.write("");
|
||||
out.write(" if (me.should_commit()) {");
|
||||
if (event.startTime) {
|
||||
out.write(" me.set_starttime(startTicks);");
|
||||
out.write(" me.set_endtime(endTicks);");
|
||||
}
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" me.set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" me.commit();");
|
||||
out.write(" }");
|
||||
out.write(" Event" + event.name + " me(UNTIMED);");
|
||||
out.write("");
|
||||
out.write(" if (me.should_commit()) {");
|
||||
if (event.startTime) {
|
||||
out.write(" me.set_starttime(startTicks);");
|
||||
out.write(" me.set_endtime(endTicks);");
|
||||
}
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" me.set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" me.commit();");
|
||||
out.write(" }");
|
||||
}
|
||||
out.write(" }");
|
||||
}
|
||||
|
||||
private static void printConstructor2(Printer out, EventElement event, boolean empty) {
|
||||
private static void printConstructor2(Printer out, TypeElement event, boolean empty) {
|
||||
if (!event.startTime) {
|
||||
out.write("");
|
||||
out.write("");
|
||||
@ -744,14 +958,14 @@ public class GenerateJfrFiles {
|
||||
sj.add(f.getParameterType() + " " + f.name);
|
||||
}
|
||||
if (!empty) {
|
||||
out.write(" " + sj.toString() + ") : JfrEvent<Event" + event.name + ">(TIMED) {");
|
||||
out.write(" if (should_commit()) {");
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" }");
|
||||
out.write(" " + sj.toString() + ") : JfrEvent<Event" + event.name + ">(TIMED) {");
|
||||
out.write(" if (should_commit()) {");
|
||||
for (FieldElement f : event.fields) {
|
||||
out.write(" set_" + f.name + "(" + f.name + ");");
|
||||
}
|
||||
out.write(" }");
|
||||
} else {
|
||||
out.write(" " + sj.toString() + ") {");
|
||||
out.write(" " + sj.toString() + ") {");
|
||||
}
|
||||
out.write(" }");
|
||||
}
|
||||
|
@ -872,10 +872,8 @@ BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exesigtest := -ljvm
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_CFLAGS_exeFPRegs := -MT
|
||||
BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exejvm-test-launcher := jvm.lib
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libatExit := jvm.lib
|
||||
else
|
||||
BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exejvm-test-launcher := -ljvm
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libbootclssearch_agent += -lpthread
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libsystemclssearch_agent += -lpthread
|
||||
BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libgetsysprop001 += -lpthread
|
||||
|
94
make/test/JtregNativeLibTest.gmk
Normal file
94
make/test/JtregNativeLibTest.gmk
Normal file
@ -0,0 +1,94 @@
|
||||
#
|
||||
# Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
#
|
||||
# This code is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License version 2 only, as
|
||||
# published by the Free Software Foundation. Oracle designates this
|
||||
# particular file as subject to the "Classpath" exception as provided
|
||||
# by Oracle in the LICENSE file that accompanied this code.
|
||||
#
|
||||
# This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# version 2 for more details (a copy is included in the LICENSE file that
|
||||
# accompanied this code).
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License version
|
||||
# 2 along with this work; if not, write to the Free Software Foundation,
|
||||
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
#
|
||||
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
# or visit www.oracle.com if you need additional information or have any
|
||||
# questions.
|
||||
#
|
||||
|
||||
################################################################################
|
||||
# This file builds the native component of the JTReg tests for testlibrary.
|
||||
# It also covers the test-image part, where the built files are copied to the
|
||||
# test image.
|
||||
################################################################################
|
||||
|
||||
default: all
|
||||
|
||||
include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
include TestFilesCompilation.gmk
|
||||
|
||||
$(eval $(call IncludeCustomExtension, test/JtregNativeLibTest.gmk))
|
||||
|
||||
################################################################################
|
||||
# Targets for building the native tests themselves.
|
||||
################################################################################
|
||||
|
||||
# This might have been added to by a custom extension.
|
||||
BUILD_LIBTEST_JTREG_NATIVE_SRC += $(TOPDIR)/test/lib-test
|
||||
|
||||
BUILD_LIBTEST_JTREG_OUTPUT_DIR := $(OUTPUTDIR)/support/test/lib-test/jtreg/native
|
||||
|
||||
BUILD_LIBTEST_JTREG_IMAGE_DIR := $(TEST_IMAGE_DIR)/lib-test/jtreg
|
||||
|
||||
ifeq ($(call isTargetOs, windows), true)
|
||||
BUILD_LIBTEST_JTREG_EXECUTABLES_LIBS_exejvm-test-launcher := jvm.lib
|
||||
else
|
||||
BUILD_LIBTEST_JTREG_EXECUTABLES_LIBS_exejvm-test-launcher := -ljvm
|
||||
endif
|
||||
|
||||
# This evaluation is expensive and should only be done if this target was
|
||||
# explicitly called.
|
||||
ifneq ($(filter build-test-libtest-jtreg-native, $(MAKECMDGOALS)), )
|
||||
$(eval $(call SetupTestFilesCompilation, BUILD_LIBTEST_JTREG_LIBRARIES, \
|
||||
TYPE := LIBRARY, \
|
||||
SOURCE_DIRS := $(BUILD_LIBTEST_JTREG_NATIVE_SRC), \
|
||||
OUTPUT_DIR := $(BUILD_LIBTEST_JTREG_OUTPUT_DIR), \
|
||||
EXCLUDE := $(BUILD_LIBTEST_JTREG_EXCLUDE), \
|
||||
))
|
||||
|
||||
$(eval $(call SetupTestFilesCompilation, BUILD_LIBTEST_JTREG_EXECUTABLES, \
|
||||
TYPE := PROGRAM, \
|
||||
SOURCE_DIRS := $(BUILD_LIBTEST_JTREG_NATIVE_SRC), \
|
||||
OUTPUT_DIR := $(BUILD_LIBTEST_JTREG_OUTPUT_DIR), \
|
||||
EXCLUDE := $(BUILD_LIBTEST_JTREG_EXCLUDE), \
|
||||
))
|
||||
endif
|
||||
|
||||
build-test-libtest-jtreg-native: $(BUILD_LIBTEST_JTREG_LIBRARIES) $(BUILD_LIBTEST_JTREG_EXECUTABLES)
|
||||
|
||||
################################################################################
|
||||
# Targets for building test-image.
|
||||
################################################################################
|
||||
|
||||
# Copy to lib-test jtreg test image
|
||||
$(eval $(call SetupCopyFiles, COPY_LIBTEST_JTREG_NATIVE, \
|
||||
SRC := $(BUILD_LIBTEST_JTREG_OUTPUT_DIR), \
|
||||
DEST := $(TEST_IMAGE_DIR)/lib-test/jtreg/native, \
|
||||
FILES := $(wildcard $(addprefix $(BUILD_LIBTEST_JTREG_OUTPUT_DIR), /bin/* /lib/*)), \
|
||||
FLATTEN := true, \
|
||||
))
|
||||
|
||||
test-image-libtest-jtreg-native: $(COPY_LIBTEST_JTREG_NATIVE)
|
||||
|
||||
all: build-test-libtest-jtreg-native
|
||||
test-image: test-image-libtest-jtreg-native
|
||||
|
||||
.PHONY: default all build-test-libtest-jtreg-native test-image-libtest-jtreg-native test-image
|
@ -1330,7 +1330,7 @@ void MacroAssembler::verify_oop(Register reg, const char* s) {
|
||||
stp(rscratch2, lr, Address(pre(sp, -2 * wordSize)));
|
||||
|
||||
mov(r0, reg);
|
||||
mov(rscratch1, (address)b);
|
||||
movptr(rscratch1, (uintptr_t)(address)b);
|
||||
|
||||
// call indirectly to solve generation ordering problem
|
||||
lea(rscratch2, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
|
||||
@ -1366,7 +1366,7 @@ void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
|
||||
} else {
|
||||
ldr(r0, addr);
|
||||
}
|
||||
mov(rscratch1, (address)b);
|
||||
movptr(rscratch1, (uintptr_t)(address)b);
|
||||
|
||||
// call indirectly to solve generation ordering problem
|
||||
lea(rscratch2, ExternalAddress(StubRoutines::verify_oop_subroutine_entry_address()));
|
||||
|
@ -1129,13 +1129,11 @@ class ComputeMoveOrder: public StackObj {
|
||||
};
|
||||
|
||||
|
||||
static void rt_call(MacroAssembler* masm, address dest, int gpargs, int fpargs, int type) {
|
||||
static void rt_call(MacroAssembler* masm, address dest) {
|
||||
CodeBlob *cb = CodeCache::find_blob(dest);
|
||||
if (cb) {
|
||||
__ far_call(RuntimeAddress(dest));
|
||||
} else {
|
||||
assert((unsigned)gpargs < 256, "eek!");
|
||||
assert((unsigned)fpargs < 32, "eek!");
|
||||
__ lea(rscratch1, RuntimeAddress(dest));
|
||||
__ blr(rscratch1);
|
||||
__ maybe_isb();
|
||||
@ -1803,33 +1801,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
__ lea(rscratch2, Address(rthread, JavaThread::thread_state_offset()));
|
||||
__ stlrw(rscratch1, rscratch2);
|
||||
|
||||
{
|
||||
int return_type = 0;
|
||||
switch (ret_type) {
|
||||
case T_VOID: break;
|
||||
return_type = 0; break;
|
||||
case T_CHAR:
|
||||
case T_BYTE:
|
||||
case T_SHORT:
|
||||
case T_INT:
|
||||
case T_BOOLEAN:
|
||||
case T_LONG:
|
||||
return_type = 1; break;
|
||||
case T_ARRAY:
|
||||
case T_OBJECT:
|
||||
return_type = 1; break;
|
||||
case T_FLOAT:
|
||||
return_type = 2; break;
|
||||
case T_DOUBLE:
|
||||
return_type = 3; break;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
rt_call(masm, native_func,
|
||||
int_args + 2, // AArch64 passes up to 8 args in int registers
|
||||
float_args, // and up to 8 float args
|
||||
return_type);
|
||||
}
|
||||
rt_call(masm, native_func);
|
||||
|
||||
__ bind(native_return);
|
||||
|
||||
@ -2039,7 +2011,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
__ ldr(r19, Address(rthread, in_bytes(Thread::pending_exception_offset())));
|
||||
__ str(zr, Address(rthread, in_bytes(Thread::pending_exception_offset())));
|
||||
|
||||
rt_call(masm, CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C), 3, 0, 1);
|
||||
rt_call(masm, CAST_FROM_FN_PTR(address, SharedRuntime::complete_monitor_unlocking_C));
|
||||
|
||||
#ifdef ASSERT
|
||||
{
|
||||
@ -2066,7 +2038,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
||||
|
||||
__ bind(reguard);
|
||||
save_native_result(masm, ret_type, stack_slots);
|
||||
rt_call(masm, CAST_FROM_FN_PTR(address, SharedRuntime::reguard_yellow_pages), 0, 0, 0);
|
||||
rt_call(masm, CAST_FROM_FN_PTR(address, SharedRuntime::reguard_yellow_pages));
|
||||
restore_native_result(masm, ret_type, stack_slots);
|
||||
// and continue
|
||||
__ b(reguard_done);
|
||||
|
@ -1368,7 +1368,7 @@ void os::print_os_info_brief(outputStream* st) {
|
||||
}
|
||||
|
||||
void os::print_os_info(outputStream* st) {
|
||||
st->print("OS:");
|
||||
st->print_cr("OS:");
|
||||
|
||||
os::Posix::print_uname_info(st);
|
||||
|
||||
|
@ -36,15 +36,7 @@
|
||||
diagnostic_pd, \
|
||||
notproduct, \
|
||||
range, \
|
||||
constraint) \
|
||||
\
|
||||
product(bool, UseOprofile, false, \
|
||||
"enable support for Oprofile profiler") \
|
||||
\
|
||||
/* NB: The default value of UseBsdPosixThreadCPUClocks may be */ \
|
||||
/* overridden in Arguments::parse_each_vm_init_arg. */ \
|
||||
product(bool, UseBsdPosixThreadCPUClocks, true, \
|
||||
"enable fast Bsd Posix clocks where available") \
|
||||
constraint)
|
||||
|
||||
//
|
||||
// Defines Bsd-specific default values. The flags are available on all
|
||||
|
@ -1879,42 +1879,6 @@ int os::vm_allocation_granularity() {
|
||||
return os::Bsd::page_size();
|
||||
}
|
||||
|
||||
// Rationale behind this function:
|
||||
// current (Mon Apr 25 20:12:18 MSD 2005) oprofile drops samples without executable
|
||||
// mapping for address (see lookup_dcookie() in the kernel module), thus we cannot get
|
||||
// samples for JITted code. Here we create private executable mapping over the code cache
|
||||
// and then we can use standard (well, almost, as mapping can change) way to provide
|
||||
// info for the reporting script by storing timestamp and location of symbol
|
||||
void bsd_wrap_code(char* base, size_t size) {
|
||||
static volatile jint cnt = 0;
|
||||
|
||||
if (!UseOprofile) {
|
||||
return;
|
||||
}
|
||||
|
||||
char buf[PATH_MAX + 1];
|
||||
int num = Atomic::add(&cnt, 1);
|
||||
|
||||
snprintf(buf, PATH_MAX + 1, "%s/hs-vm-%d-%d",
|
||||
os::get_temp_directory(), os::current_process_id(), num);
|
||||
unlink(buf);
|
||||
|
||||
int fd = ::open(buf, O_CREAT | O_RDWR, S_IRWXU);
|
||||
|
||||
if (fd != -1) {
|
||||
off_t rv = ::lseek(fd, size-2, SEEK_SET);
|
||||
if (rv != (off_t)-1) {
|
||||
if (::write(fd, "", 1) == 1) {
|
||||
mmap(base, size,
|
||||
PROT_READ|PROT_WRITE|PROT_EXEC,
|
||||
MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE, fd, 0);
|
||||
}
|
||||
}
|
||||
::close(fd);
|
||||
unlink(buf);
|
||||
}
|
||||
}
|
||||
|
||||
static void warn_fail_commit_memory(char* addr, size_t size, bool exec,
|
||||
int err) {
|
||||
warning("INFO: os::commit_memory(" INTPTR_FORMAT ", " SIZE_FORMAT
|
||||
|
@ -2069,8 +2069,8 @@ static bool _print_ascii_file(const char* filename, outputStream* st, const char
|
||||
return true;
|
||||
}
|
||||
|
||||
static void _print_ascii_file_h(const char* header, const char* filename, outputStream* st) {
|
||||
st->print_cr("%s:", header);
|
||||
static void _print_ascii_file_h(const char* header, const char* filename, outputStream* st, bool same_line = true) {
|
||||
st->print("%s:%c", header, same_line ? ' ' : '\n');
|
||||
if (!_print_ascii_file(filename, st)) {
|
||||
st->print_cr("<Not Available>");
|
||||
}
|
||||
@ -2085,7 +2085,7 @@ void os::print_dll_info(outputStream *st) {
|
||||
jio_snprintf(fname, sizeof(fname), "/proc/%d/maps", pid);
|
||||
|
||||
if (!_print_ascii_file(fname, st)) {
|
||||
st->print("Can not get library information for pid = %d\n", pid);
|
||||
st->print_cr("Can not get library information for pid = %d", pid);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2137,7 +2137,7 @@ void os::print_os_info_brief(outputStream* st) {
|
||||
}
|
||||
|
||||
void os::print_os_info(outputStream* st) {
|
||||
st->print("OS:");
|
||||
st->print_cr("OS:");
|
||||
|
||||
os::Linux::print_distro_info(st);
|
||||
|
||||
@ -2147,8 +2147,7 @@ void os::print_os_info(outputStream* st) {
|
||||
|
||||
// Print warning if unsafe chroot environment detected
|
||||
if (unsafe_chroot_detected) {
|
||||
st->print("WARNING!! ");
|
||||
st->print_cr("%s", unstable_chroot_error);
|
||||
st->print_cr("WARNING!! %s", unstable_chroot_error);
|
||||
}
|
||||
|
||||
os::Linux::print_libversion_info(st);
|
||||
@ -2156,14 +2155,21 @@ void os::print_os_info(outputStream* st) {
|
||||
os::Posix::print_rlimit_info(st);
|
||||
|
||||
os::Posix::print_load_average(st);
|
||||
st->cr();
|
||||
|
||||
os::Linux::print_full_memory_info(st);
|
||||
st->cr();
|
||||
|
||||
os::Linux::print_proc_sys_info(st);
|
||||
st->cr();
|
||||
|
||||
os::Linux::print_ld_preload_file(st);
|
||||
if (os::Linux::print_ld_preload_file(st)) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
os::Linux::print_container_info(st);
|
||||
if (os::Linux::print_container_info(st)) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
VM_Version::print_platform_virtualization_info(st);
|
||||
|
||||
@ -2224,9 +2230,8 @@ void os::Linux::print_distro_info(outputStream* st) {
|
||||
st->print("Debian ");
|
||||
_print_ascii_file("/etc/debian_version", st);
|
||||
} else {
|
||||
st->print("Linux");
|
||||
st->print_cr("Linux");
|
||||
}
|
||||
st->cr();
|
||||
}
|
||||
|
||||
static void parse_os_info_helper(FILE* fp, char* distro, size_t length, bool get_first_line) {
|
||||
@ -2295,14 +2300,13 @@ void os::get_summary_os_info(char* buf, size_t buflen) {
|
||||
|
||||
void os::Linux::print_libversion_info(outputStream* st) {
|
||||
// libc, pthread
|
||||
st->print("libc:");
|
||||
st->print("libc: ");
|
||||
st->print("%s ", os::Linux::glibc_version());
|
||||
st->print("%s ", os::Linux::libpthread_version());
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::Linux::print_proc_sys_info(outputStream* st) {
|
||||
st->cr();
|
||||
_print_ascii_file_h("/proc/sys/kernel/threads-max (system-wide limit on the number of threads)",
|
||||
"/proc/sys/kernel/threads-max", st);
|
||||
_print_ascii_file_h("/proc/sys/vm/max_map_count (maximum number of memory map areas a process may have)",
|
||||
@ -2312,7 +2316,7 @@ void os::Linux::print_proc_sys_info(outputStream* st) {
|
||||
}
|
||||
|
||||
void os::Linux::print_full_memory_info(outputStream* st) {
|
||||
_print_ascii_file_h("\n/proc/meminfo", "/proc/meminfo", st);
|
||||
_print_ascii_file_h("/proc/meminfo", "/proc/meminfo", st, false);
|
||||
st->cr();
|
||||
|
||||
// some information regarding THPs; for details see
|
||||
@ -2323,9 +2327,8 @@ void os::Linux::print_full_memory_info(outputStream* st) {
|
||||
"/sys/kernel/mm/transparent_hugepage/defrag", st);
|
||||
}
|
||||
|
||||
void os::Linux::print_ld_preload_file(outputStream* st) {
|
||||
_print_ascii_file("/etc/ld.so.preload", st, "\n/etc/ld.so.preload:");
|
||||
st->cr();
|
||||
bool os::Linux::print_ld_preload_file(outputStream* st) {
|
||||
return _print_ascii_file("/etc/ld.so.preload", st, "/etc/ld.so.preload:");
|
||||
}
|
||||
|
||||
void os::Linux::print_uptime_info(outputStream* st) {
|
||||
@ -2336,97 +2339,97 @@ void os::Linux::print_uptime_info(outputStream* st) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void os::Linux::print_container_info(outputStream* st) {
|
||||
bool os::Linux::print_container_info(outputStream* st) {
|
||||
if (!OSContainer::is_containerized()) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
st->print("container (cgroup) information:\n");
|
||||
st->print_cr("container (cgroup) information:");
|
||||
|
||||
const char *p_ct = OSContainer::container_type();
|
||||
st->print("container_type: %s\n", p_ct != NULL ? p_ct : "not supported");
|
||||
st->print_cr("container_type: %s", p_ct != NULL ? p_ct : "not supported");
|
||||
|
||||
char *p = OSContainer::cpu_cpuset_cpus();
|
||||
st->print("cpu_cpuset_cpus: %s\n", p != NULL ? p : "not supported");
|
||||
st->print_cr("cpu_cpuset_cpus: %s", p != NULL ? p : "not supported");
|
||||
free(p);
|
||||
|
||||
p = OSContainer::cpu_cpuset_memory_nodes();
|
||||
st->print("cpu_memory_nodes: %s\n", p != NULL ? p : "not supported");
|
||||
st->print_cr("cpu_memory_nodes: %s", p != NULL ? p : "not supported");
|
||||
free(p);
|
||||
|
||||
int i = OSContainer::active_processor_count();
|
||||
st->print("active_processor_count: ");
|
||||
if (i > 0) {
|
||||
st->print("%d\n", i);
|
||||
st->print_cr("%d", i);
|
||||
} else {
|
||||
st->print("not supported\n");
|
||||
st->print_cr("not supported");
|
||||
}
|
||||
|
||||
i = OSContainer::cpu_quota();
|
||||
st->print("cpu_quota: ");
|
||||
if (i > 0) {
|
||||
st->print("%d\n", i);
|
||||
st->print_cr("%d", i);
|
||||
} else {
|
||||
st->print("%s\n", i == OSCONTAINER_ERROR ? "not supported" : "no quota");
|
||||
st->print_cr("%s", i == OSCONTAINER_ERROR ? "not supported" : "no quota");
|
||||
}
|
||||
|
||||
i = OSContainer::cpu_period();
|
||||
st->print("cpu_period: ");
|
||||
if (i > 0) {
|
||||
st->print("%d\n", i);
|
||||
st->print_cr("%d", i);
|
||||
} else {
|
||||
st->print("%s\n", i == OSCONTAINER_ERROR ? "not supported" : "no period");
|
||||
st->print_cr("%s", i == OSCONTAINER_ERROR ? "not supported" : "no period");
|
||||
}
|
||||
|
||||
i = OSContainer::cpu_shares();
|
||||
st->print("cpu_shares: ");
|
||||
if (i > 0) {
|
||||
st->print("%d\n", i);
|
||||
st->print_cr("%d", i);
|
||||
} else {
|
||||
st->print("%s\n", i == OSCONTAINER_ERROR ? "not supported" : "no shares");
|
||||
st->print_cr("%s", i == OSCONTAINER_ERROR ? "not supported" : "no shares");
|
||||
}
|
||||
|
||||
jlong j = OSContainer::memory_limit_in_bytes();
|
||||
st->print("memory_limit_in_bytes: ");
|
||||
if (j > 0) {
|
||||
st->print(JLONG_FORMAT "\n", j);
|
||||
st->print_cr(JLONG_FORMAT, j);
|
||||
} else {
|
||||
st->print("%s\n", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
}
|
||||
|
||||
j = OSContainer::memory_and_swap_limit_in_bytes();
|
||||
st->print("memory_and_swap_limit_in_bytes: ");
|
||||
if (j > 0) {
|
||||
st->print(JLONG_FORMAT "\n", j);
|
||||
st->print_cr(JLONG_FORMAT, j);
|
||||
} else {
|
||||
st->print("%s\n", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
}
|
||||
|
||||
j = OSContainer::memory_soft_limit_in_bytes();
|
||||
st->print("memory_soft_limit_in_bytes: ");
|
||||
if (j > 0) {
|
||||
st->print(JLONG_FORMAT "\n", j);
|
||||
st->print_cr(JLONG_FORMAT, j);
|
||||
} else {
|
||||
st->print("%s\n", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
}
|
||||
|
||||
j = OSContainer::OSContainer::memory_usage_in_bytes();
|
||||
st->print("memory_usage_in_bytes: ");
|
||||
if (j > 0) {
|
||||
st->print(JLONG_FORMAT "\n", j);
|
||||
st->print_cr(JLONG_FORMAT, j);
|
||||
} else {
|
||||
st->print("%s\n", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
}
|
||||
|
||||
j = OSContainer::OSContainer::memory_max_usage_in_bytes();
|
||||
st->print("memory_max_usage_in_bytes: ");
|
||||
if (j > 0) {
|
||||
st->print(JLONG_FORMAT "\n", j);
|
||||
st->print_cr(JLONG_FORMAT, j);
|
||||
} else {
|
||||
st->print("%s\n", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
st->print_cr("%s", j == OSCONTAINER_ERROR ? "not supported" : "unlimited");
|
||||
}
|
||||
st->cr();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void os::Linux::print_steal_info(outputStream* st) {
|
||||
@ -2556,8 +2559,9 @@ static void print_sys_devices_cpu_info(outputStream* st, char* buf, size_t bufle
|
||||
void os::pd_print_cpu_info(outputStream* st, char* buf, size_t buflen) {
|
||||
// Only print the model name if the platform provides this as a summary
|
||||
if (!print_model_name_and_flags(st, buf, buflen)) {
|
||||
_print_ascii_file_h("\n/proc/cpuinfo", "/proc/cpuinfo", st);
|
||||
_print_ascii_file_h("/proc/cpuinfo", "/proc/cpuinfo", st, false);
|
||||
}
|
||||
st->cr();
|
||||
print_sys_devices_cpu_info(st, buf, buflen);
|
||||
}
|
||||
|
||||
@ -3247,10 +3251,10 @@ bool os::Linux::libnuma_init() {
|
||||
set_numa_interleave_bitmask(_numa_get_interleave_mask());
|
||||
set_numa_membind_bitmask(_numa_get_membind());
|
||||
// Create an index -> node mapping, since nodes are not always consecutive
|
||||
_nindex_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(0, true);
|
||||
_nindex_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(0, mtInternal);
|
||||
rebuild_nindex_to_node_map();
|
||||
// Create a cpu -> node mapping
|
||||
_cpu_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(0, true);
|
||||
_cpu_to_node = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<int>(0, mtInternal);
|
||||
rebuild_cpu_to_node_map();
|
||||
return true;
|
||||
}
|
||||
|
@ -102,12 +102,12 @@ class Linux {
|
||||
static bool release_memory_special_huge_tlbfs(char* base, size_t bytes);
|
||||
|
||||
static void print_full_memory_info(outputStream* st);
|
||||
static void print_container_info(outputStream* st);
|
||||
static bool print_container_info(outputStream* st);
|
||||
static void print_steal_info(outputStream* st);
|
||||
static void print_distro_info(outputStream* st);
|
||||
static void print_libversion_info(outputStream* st);
|
||||
static void print_proc_sys_info(outputStream* st);
|
||||
static void print_ld_preload_file(outputStream* st);
|
||||
static bool print_ld_preload_file(outputStream* st);
|
||||
static void print_uptime_info(outputStream* st);
|
||||
|
||||
public:
|
||||
|
@ -396,7 +396,7 @@ struct tm* os::gmtime_pd(const time_t* clock, struct tm* res) {
|
||||
}
|
||||
|
||||
void os::Posix::print_load_average(outputStream* st) {
|
||||
st->print("load average:");
|
||||
st->print("load average: ");
|
||||
double loadavg[3];
|
||||
int res = os::loadavg(loadavg, 3);
|
||||
if (res != -1) {
|
||||
@ -490,7 +490,7 @@ void os::Posix::print_rlimit_info(outputStream* st) {
|
||||
|
||||
void os::Posix::print_uname_info(outputStream* st) {
|
||||
// kernel
|
||||
st->print("uname:");
|
||||
st->print("uname: ");
|
||||
struct utsname name;
|
||||
uname(&name);
|
||||
st->print("%s ", name.sysname);
|
||||
|
@ -71,18 +71,15 @@
|
||||
#include "utilities/decoder.hpp"
|
||||
#include "utilities/defaultStream.hpp"
|
||||
#include "utilities/events.hpp"
|
||||
#include "utilities/growableArray.hpp"
|
||||
#include "utilities/macros.hpp"
|
||||
#include "utilities/vmError.hpp"
|
||||
#include "symbolengine.hpp"
|
||||
#include "windbghelp.hpp"
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@ -1607,7 +1604,7 @@ void os::print_os_info(outputStream* st) {
|
||||
st->print("N/A ");
|
||||
}
|
||||
#endif
|
||||
st->print("OS:");
|
||||
st->print_cr("OS:");
|
||||
os::win32::print_windows_version(st);
|
||||
|
||||
os::win32::print_uptime_info(st);
|
||||
|
@ -34,8 +34,8 @@
|
||||
#include "runtime/os.inline.hpp"
|
||||
#include "runtime/timerTrace.hpp"
|
||||
|
||||
GrowableArray<AOTCodeHeap*>* AOTLoader::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<AOTCodeHeap*> (2, true);
|
||||
GrowableArray<AOTLib*>* AOTLoader::_libraries = new(ResourceObj::C_HEAP, mtCode) GrowableArray<AOTLib*> (2, true);
|
||||
GrowableArray<AOTCodeHeap*>* AOTLoader::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<AOTCodeHeap*> (2, mtCode);
|
||||
GrowableArray<AOTLib*>* AOTLoader::_libraries = new(ResourceObj::C_HEAP, mtCode) GrowableArray<AOTLib*> (2, mtCode);
|
||||
|
||||
// Iterate over all AOT CodeHeaps
|
||||
#define FOR_ALL_AOT_HEAPS(heap) for (GrowableArrayIterator<AOTCodeHeap*> heap = heaps()->begin(); heap != heaps()->end(); ++heap)
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "compiler/compileBroker.hpp"
|
||||
#include "compiler/compilerEvent.hpp"
|
||||
#include "compiler/compileLog.hpp"
|
||||
#include "compiler/compileTask.hpp"
|
||||
#include "compiler/disassembler.hpp"
|
||||
#include "gc/shared/collectedHeap.inline.hpp"
|
||||
#include "interpreter/linkResolver.hpp"
|
||||
@ -230,7 +231,7 @@ ciEnv::~ciEnv() {
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// Cache Jvmti state
|
||||
void ciEnv::cache_jvmti_state() {
|
||||
bool ciEnv::cache_jvmti_state() {
|
||||
VM_ENTRY_MARK;
|
||||
// Get Jvmti capabilities under lock to get consistant values.
|
||||
MutexLocker mu(JvmtiThreadState_lock);
|
||||
@ -240,6 +241,7 @@ void ciEnv::cache_jvmti_state() {
|
||||
_jvmti_can_post_on_exceptions = JvmtiExport::can_post_on_exceptions();
|
||||
_jvmti_can_pop_frame = JvmtiExport::can_pop_frame();
|
||||
_jvmti_can_get_owned_monitor_info = JvmtiExport::can_get_owned_monitor_info();
|
||||
return _task != NULL && _task->method()->is_old();
|
||||
}
|
||||
|
||||
bool ciEnv::jvmti_state_changed() const {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 1999, 2020, 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
|
||||
@ -341,7 +341,7 @@ public:
|
||||
void set_break_at_compile(bool z) { _break_at_compile = z; }
|
||||
|
||||
// Cache Jvmti state
|
||||
void cache_jvmti_state();
|
||||
bool cache_jvmti_state();
|
||||
bool jvmti_state_changed() const;
|
||||
bool should_retain_local_variables() const {
|
||||
return _jvmti_can_access_local_variables || _jvmti_can_pop_frame;
|
||||
|
@ -231,6 +231,9 @@ static bool trust_final_non_static_fields(ciInstanceKlass* holder) {
|
||||
// Trust final fields in all boxed classes
|
||||
if (holder->is_box_klass())
|
||||
return true;
|
||||
// Trust final fields in records
|
||||
if (holder->is_record())
|
||||
return true;
|
||||
// Trust final fields in String
|
||||
if (holder->name() == ciSymbol::java_lang_String())
|
||||
return true;
|
||||
|
@ -64,6 +64,7 @@ ciInstanceKlass::ciInstanceKlass(Klass* k) :
|
||||
_has_nonstatic_concrete_methods = ik->has_nonstatic_concrete_methods();
|
||||
_is_unsafe_anonymous = ik->is_unsafe_anonymous();
|
||||
_is_hidden = ik->is_hidden();
|
||||
_is_record = ik->is_record();
|
||||
_nonstatic_fields = NULL; // initialized lazily by compute_nonstatic_fields:
|
||||
_has_injected_fields = -1;
|
||||
_implementor = NULL; // we will fill these lazily
|
||||
@ -125,6 +126,7 @@ ciInstanceKlass::ciInstanceKlass(ciSymbol* name,
|
||||
_has_injected_fields = -1;
|
||||
_is_unsafe_anonymous = false;
|
||||
_is_hidden = false;
|
||||
_is_record = false;
|
||||
_loader = loader;
|
||||
_protection_domain = protection_domain;
|
||||
_is_shared = false;
|
||||
|
@ -57,6 +57,7 @@ private:
|
||||
bool _has_nonstatic_concrete_methods;
|
||||
bool _is_unsafe_anonymous;
|
||||
bool _is_hidden;
|
||||
bool _is_record;
|
||||
|
||||
ciFlags _flags;
|
||||
jint _nonstatic_field_size;
|
||||
@ -200,6 +201,10 @@ public:
|
||||
return _is_hidden;
|
||||
}
|
||||
|
||||
bool is_record() const {
|
||||
return _is_record;
|
||||
}
|
||||
|
||||
ciInstanceKlass* get_canonical_holder(int offset);
|
||||
ciField* get_field_by_offset(int field_offset, bool is_static);
|
||||
ciField* get_field_by_name(ciSymbol* name, ciSymbol* signature, bool is_static);
|
||||
|
@ -61,7 +61,7 @@ ciTypeFlow::JsrSet::JsrSet(Arena* arena, int default_len) {
|
||||
_set = new (arena) GrowableArray<JsrRecord*>(arena, default_len, 0, NULL);
|
||||
} else {
|
||||
// Allocate growable array in current ResourceArea.
|
||||
_set = new GrowableArray<JsrRecord*>(4, 0, NULL, false);
|
||||
_set = new GrowableArray<JsrRecord*>(4, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -132,6 +132,8 @@
|
||||
|
||||
#define JAVA_15_VERSION 59
|
||||
|
||||
#define JAVA_16_VERSION 60
|
||||
|
||||
void ClassFileParser::set_class_bad_constant_seen(short bad_constant) {
|
||||
assert((bad_constant == JVM_CONSTANT_Module ||
|
||||
bad_constant == JVM_CONSTANT_Package) && _major_version >= JAVA_9_VERSION,
|
||||
|
@ -62,7 +62,7 @@ ClassListParser::ClassListParser(const char* file) {
|
||||
vm_exit_during_initialization("Loading classlist failed", errmsg);
|
||||
}
|
||||
_line_no = 0;
|
||||
_interfaces = new (ResourceObj::C_HEAP, mtClass) GrowableArray<int>(10, true);
|
||||
_interfaces = new (ResourceObj::C_HEAP, mtClass) GrowableArray<int>(10, mtClass);
|
||||
}
|
||||
|
||||
ClassListParser::~ClassListParser() {
|
||||
|
@ -583,7 +583,7 @@ void ClassLoader::setup_patch_mod_entries() {
|
||||
int num_of_entries = patch_mod_args->length();
|
||||
|
||||
// Set up the boot loader's _patch_mod_entries list
|
||||
_patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, true);
|
||||
_patch_mod_entries = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleClassPathList*>(num_of_entries, mtModule);
|
||||
|
||||
for (int i = 0; i < num_of_entries; i++) {
|
||||
const char* module_name = (patch_mod_args->at(i))->module_name();
|
||||
@ -1528,6 +1528,19 @@ void ClassLoader::initialize_module_path(TRAPS) {
|
||||
FileMapInfo::allocate_shared_path_table();
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function used by CDS code to get the number of module path
|
||||
// entries during shared classpath setup time.
|
||||
int ClassLoader::num_module_path_entries() {
|
||||
Arguments::assert_is_dumping_archive();
|
||||
int num_entries = 0;
|
||||
ClassPathEntry* e= ClassLoader::_module_path_entries;
|
||||
while (e != NULL) {
|
||||
num_entries ++;
|
||||
e = e->next();
|
||||
}
|
||||
return num_entries;
|
||||
}
|
||||
#endif
|
||||
|
||||
jlong ClassLoader::classloader_time_ms() {
|
||||
@ -1596,7 +1609,7 @@ void ClassLoader::classLoader_init2(TRAPS) {
|
||||
// subsequently do the first class load. So, no lock is needed for this.
|
||||
assert(_exploded_entries == NULL, "Should only get initialized once");
|
||||
_exploded_entries = new (ResourceObj::C_HEAP, mtModule)
|
||||
GrowableArray<ModuleClassPathList*>(EXPLODED_ENTRY_SIZE, true);
|
||||
GrowableArray<ModuleClassPathList*>(EXPLODED_ENTRY_SIZE, mtModule);
|
||||
add_to_exploded_build_list(vmSymbols::java_base(), CHECK);
|
||||
}
|
||||
}
|
||||
|
@ -388,16 +388,7 @@ class ClassLoader: AllStatic {
|
||||
|
||||
// Helper function used by CDS code to get the number of module path
|
||||
// entries during shared classpath setup time.
|
||||
static int num_module_path_entries() {
|
||||
Arguments::assert_is_dumping_archive();
|
||||
int num_entries = 0;
|
||||
ClassPathEntry* e= ClassLoader::_module_path_entries;
|
||||
while (e != NULL) {
|
||||
num_entries ++;
|
||||
e = e->next();
|
||||
}
|
||||
return num_entries;
|
||||
}
|
||||
static int num_module_path_entries();
|
||||
static void exit_with_path_failure(const char* error, const char* message);
|
||||
static char* skip_uri_protocol(char* source);
|
||||
static void record_result(InstanceKlass* ik, const ClassFileStream* stream, TRAPS);
|
||||
|
@ -183,7 +183,7 @@ ClassLoaderData::ChunkedHandleList::~ChunkedHandleList() {
|
||||
}
|
||||
}
|
||||
|
||||
oop* ClassLoaderData::ChunkedHandleList::add(oop o) {
|
||||
OopHandle ClassLoaderData::ChunkedHandleList::add(oop o) {
|
||||
if (_head == NULL || _head->_size == Chunk::CAPACITY) {
|
||||
Chunk* next = new Chunk(_head);
|
||||
Atomic::release_store(&_head, next);
|
||||
@ -191,7 +191,7 @@ oop* ClassLoaderData::ChunkedHandleList::add(oop o) {
|
||||
oop* handle = &_head->_data[_head->_size];
|
||||
NativeAccess<IS_DEST_UNINITIALIZED>::oop_store(handle, o);
|
||||
Atomic::release_store(&_head->_size, _head->_size + 1);
|
||||
return handle;
|
||||
return OopHandle(handle);
|
||||
}
|
||||
|
||||
int ClassLoaderData::ChunkedHandleList::count() const {
|
||||
@ -776,7 +776,7 @@ ClassLoaderMetaspace* ClassLoaderData::metaspace_non_null() {
|
||||
OopHandle ClassLoaderData::add_handle(Handle h) {
|
||||
MutexLocker ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
||||
record_modified_oops();
|
||||
return OopHandle(_handles.add(h()));
|
||||
return _handles.add(h());
|
||||
}
|
||||
|
||||
void ClassLoaderData::remove_handle(OopHandle h) {
|
||||
@ -804,7 +804,7 @@ void ClassLoaderData::add_to_deallocate_list(Metadata* m) {
|
||||
if (!m->is_shared()) {
|
||||
MutexLocker ml(metaspace_lock(), Mutex::_no_safepoint_check_flag);
|
||||
if (_deallocate_list == NULL) {
|
||||
_deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, true);
|
||||
_deallocate_list = new (ResourceObj::C_HEAP, mtClass) GrowableArray<Metadata*>(100, mtClass);
|
||||
}
|
||||
_deallocate_list->append_if_missing(m);
|
||||
log_debug(class, loader, data)("deallocate added for %s", m->print_value_string());
|
||||
|
@ -90,7 +90,7 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
|
||||
// Only one thread at a time can add, guarded by ClassLoaderData::metaspace_lock().
|
||||
// However, multiple threads can execute oops_do concurrently with add.
|
||||
oop* add(oop o);
|
||||
OopHandle add(oop o);
|
||||
bool contains(oop p);
|
||||
NOT_PRODUCT(bool owner_of(oop* p);)
|
||||
void oops_do(OopClosure* f);
|
||||
|
@ -310,7 +310,7 @@ ClassPathEntry* ClassLoaderExt::find_classpath_entry_from_cache(const char* path
|
||||
// This is called from dump time so it's single threaded and there's no need for a lock.
|
||||
assert(DumpSharedSpaces, "this function is only used with -Xshare:dump");
|
||||
if (cached_path_entries == NULL) {
|
||||
cached_path_entries = new (ResourceObj::C_HEAP, mtClass) GrowableArray<CachedClassPathEntry>(20, /*c heap*/ true);
|
||||
cached_path_entries = new (ResourceObj::C_HEAP, mtClass) GrowableArray<CachedClassPathEntry>(20, mtClass);
|
||||
}
|
||||
CachedClassPathEntry ccpe;
|
||||
for (int i=0; i<cached_path_entries->length(); i++) {
|
||||
|
@ -51,7 +51,7 @@ CompactHashtableWriter::CompactHashtableWriter(int num_entries,
|
||||
_num_entries_written = 0;
|
||||
_buckets = NEW_C_HEAP_ARRAY(GrowableArray<Entry>*, _num_buckets, mtSymbol);
|
||||
for (int i=0; i<_num_buckets; i++) {
|
||||
_buckets[i] = new (ResourceObj::C_HEAP, mtSymbol) GrowableArray<Entry>(0, true, mtSymbol);
|
||||
_buckets[i] = new (ResourceObj::C_HEAP, mtSymbol) GrowableArray<Entry>(0, mtSymbol);
|
||||
}
|
||||
|
||||
_stats = stats;
|
||||
|
@ -895,7 +895,7 @@ void java_lang_Class::fixup_mirror(Klass* k, TRAPS) {
|
||||
assert(present, "Missing archived mirror for %s", k->external_name());
|
||||
return;
|
||||
} else {
|
||||
k->set_java_mirror_handle(NULL);
|
||||
k->set_java_mirror_handle(OopHandle());
|
||||
k->clear_has_raw_archived_mirror();
|
||||
}
|
||||
}
|
||||
@ -965,11 +965,11 @@ void java_lang_Class::set_mirror_module_field(Klass* k, Handle mirror, Handle mo
|
||||
// Statically allocate fixup lists because they always get created.
|
||||
void java_lang_Class::allocate_fixup_lists() {
|
||||
GrowableArray<Klass*>* mirror_list =
|
||||
new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, true);
|
||||
new (ResourceObj::C_HEAP, mtClass) GrowableArray<Klass*>(40, mtClass);
|
||||
set_fixup_mirror_list(mirror_list);
|
||||
|
||||
GrowableArray<Klass*>* module_list =
|
||||
new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, true);
|
||||
new (ResourceObj::C_HEAP, mtModule) GrowableArray<Klass*>(500, mtModule);
|
||||
set_fixup_module_field_list(module_list);
|
||||
}
|
||||
|
||||
@ -1201,7 +1201,7 @@ oop java_lang_Class::archive_mirror(Klass* k, TRAPS) {
|
||||
ik->is_shared_app_class())) {
|
||||
// Archiving mirror for classes from non-builtin loaders is not
|
||||
// supported. Clear the _java_mirror within the archived class.
|
||||
k->set_java_mirror_handle(NULL);
|
||||
k->set_java_mirror_handle(OopHandle());
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@ -3141,6 +3141,7 @@ int java_lang_reflect_Field::_name_offset;
|
||||
int java_lang_reflect_Field::_type_offset;
|
||||
int java_lang_reflect_Field::_slot_offset;
|
||||
int java_lang_reflect_Field::_modifiers_offset;
|
||||
int java_lang_reflect_Field::_trusted_final_offset;
|
||||
int java_lang_reflect_Field::_signature_offset;
|
||||
int java_lang_reflect_Field::_annotations_offset;
|
||||
|
||||
@ -3150,6 +3151,7 @@ int java_lang_reflect_Field::_annotations_offset;
|
||||
macro(_type_offset, k, vmSymbols::type_name(), class_signature, false); \
|
||||
macro(_slot_offset, k, vmSymbols::slot_name(), int_signature, false); \
|
||||
macro(_modifiers_offset, k, vmSymbols::modifiers_name(), int_signature, false); \
|
||||
macro(_trusted_final_offset, k, vmSymbols::trusted_final_name(), bool_signature, false); \
|
||||
macro(_signature_offset, k, vmSymbols::signature_name(), string_signature, false); \
|
||||
macro(_annotations_offset, k, vmSymbols::annotations_name(), byte_array_signature, false);
|
||||
|
||||
@ -3214,6 +3216,10 @@ void java_lang_reflect_Field::set_modifiers(oop field, int value) {
|
||||
field->int_field_put(_modifiers_offset, value);
|
||||
}
|
||||
|
||||
void java_lang_reflect_Field::set_trusted_final(oop field) {
|
||||
field->bool_field_put(_trusted_final_offset, true);
|
||||
}
|
||||
|
||||
void java_lang_reflect_Field::set_signature(oop field, oop value) {
|
||||
field->obj_field_put(_signature_offset, value);
|
||||
}
|
||||
|
@ -696,6 +696,7 @@ class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
|
||||
static int _type_offset;
|
||||
static int _slot_offset;
|
||||
static int _modifiers_offset;
|
||||
static int _trusted_final_offset;
|
||||
static int _signature_offset;
|
||||
static int _annotations_offset;
|
||||
|
||||
@ -723,6 +724,8 @@ class java_lang_reflect_Field : public java_lang_reflect_AccessibleObject {
|
||||
static int modifiers(oop field);
|
||||
static void set_modifiers(oop field, int value);
|
||||
|
||||
static void set_trusted_final(oop field);
|
||||
|
||||
static void set_signature(oop constructor, oop value);
|
||||
static void set_annotations(oop constructor, oop value);
|
||||
static void set_parameter_annotations(oop method, oop value);
|
||||
@ -1121,6 +1124,7 @@ class java_lang_invoke_MemberName: AllStatic {
|
||||
MN_IS_FIELD = 0x00040000, // field
|
||||
MN_IS_TYPE = 0x00080000, // nested type
|
||||
MN_CALLER_SENSITIVE = 0x00100000, // @CallerSensitive annotation detected
|
||||
MN_TRUSTED_FINAL = 0x00200000, // trusted final field
|
||||
MN_REFERENCE_KIND_SHIFT = 24, // refKind
|
||||
MN_REFERENCE_KIND_MASK = 0x0F000000 >> MN_REFERENCE_KIND_SHIFT,
|
||||
// The SEARCH_* bits are not for MN.flags but for the matchFlags argument of MHN.getMembers:
|
||||
|
@ -161,7 +161,7 @@ void ModuleEntry::add_read(ModuleEntry* m) {
|
||||
} else {
|
||||
if (_reads == NULL) {
|
||||
// Lazily create a module's reads list
|
||||
_reads = new (ResourceObj::C_HEAP, mtModule)GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, true);
|
||||
_reads = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleEntry*>(MODULE_READS_SIZE, mtModule);
|
||||
}
|
||||
|
||||
// Determine, based on this newly established read edge to module m,
|
||||
|
@ -79,9 +79,9 @@ private:
|
||||
|
||||
public:
|
||||
void init() {
|
||||
_module = NULL;
|
||||
_module = OopHandle();
|
||||
_pd = OopHandle();
|
||||
_loader_data = NULL;
|
||||
_pd = NULL;
|
||||
_reads = NULL;
|
||||
_version = NULL;
|
||||
_location = NULL;
|
||||
|
@ -53,7 +53,7 @@ void PackageEntry::add_qexport(ModuleEntry* m) {
|
||||
if (!has_qual_exports_list()) {
|
||||
// Lazily create a package's qualified exports list.
|
||||
// Initial size is small, do not anticipate export lists to be large.
|
||||
_qualified_exports = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleEntry*>(QUAL_EXP_SIZE, true);
|
||||
_qualified_exports = new (ResourceObj::C_HEAP, mtModule) GrowableArray<ModuleEntry*>(QUAL_EXP_SIZE, mtModule);
|
||||
}
|
||||
|
||||
// Determine, based on this newly established export to module m,
|
||||
|
@ -623,7 +623,7 @@ size_t StringTable::verify_and_compare_entries() {
|
||||
Thread* thr = Thread::current();
|
||||
GrowableArray<oop>* oops =
|
||||
new (ResourceObj::C_HEAP, mtInternal)
|
||||
GrowableArray<oop>((int)_current_size, true);
|
||||
GrowableArray<oop>((int)_current_size, mtInternal);
|
||||
|
||||
VerifyCompStrings vcs(oops);
|
||||
if (!_local_table->try_scan(thr, vcs)) {
|
||||
|
@ -703,7 +703,7 @@ InstanceKlass* SystemDictionary::handle_parallel_super_load(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void post_class_load_event(EventClassLoad* event, const InstanceKlass* k, const ClassLoaderData* init_cld) {
|
||||
void SystemDictionary::post_class_load_event(EventClassLoad* event, const InstanceKlass* k, const ClassLoaderData* init_cld) {
|
||||
assert(event != NULL, "invariant");
|
||||
assert(k != NULL, "invariant");
|
||||
assert(event->should_commit(), "invariant");
|
||||
@ -1232,6 +1232,7 @@ InstanceKlass* SystemDictionary::resolve_from_stream(Symbol* class_name,
|
||||
InstanceKlass* SystemDictionary::load_shared_boot_class(Symbol* class_name,
|
||||
PackageEntry* pkg_entry,
|
||||
TRAPS) {
|
||||
assert(UseSharedSpaces, "Sanity check");
|
||||
InstanceKlass* ik = SystemDictionaryShared::find_builtin_class(class_name);
|
||||
if (ik != NULL && ik->is_shared_boot_class()) {
|
||||
return load_shared_class(ik, Handle(), Handle(), NULL, pkg_entry, THREAD);
|
||||
@ -1251,18 +1252,30 @@ bool SystemDictionary::is_shared_class_visible(Symbol* class_name,
|
||||
Handle class_loader, TRAPS) {
|
||||
assert(!ModuleEntryTable::javabase_moduleEntry()->is_patched(),
|
||||
"Cannot use sharing if java.base is patched");
|
||||
ResourceMark rm(THREAD);
|
||||
int path_index = ik->shared_classpath_index();
|
||||
ClassLoaderData* loader_data = class_loader_data(class_loader);
|
||||
if (path_index < 0) {
|
||||
if (ik->shared_classpath_index() < 0) {
|
||||
// path_index < 0 indicates that the class is intended for a custom loader
|
||||
// and should not be loaded by boot/platform/app loaders
|
||||
if (loader_data->is_builtin_class_loader_data()) {
|
||||
if (is_builtin_class_loader(class_loader())) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// skip class visibility check
|
||||
if (MetaspaceShared::use_optimized_module_handling()) {
|
||||
assert(SystemDictionary::is_shared_class_visible_impl(class_name, ik, pkg_entry, class_loader, THREAD), "Optimizing module handling failed.");
|
||||
return true;
|
||||
}
|
||||
return is_shared_class_visible_impl(class_name, ik, pkg_entry, class_loader, THREAD);
|
||||
}
|
||||
|
||||
bool SystemDictionary::is_shared_class_visible_impl(Symbol* class_name,
|
||||
InstanceKlass* ik,
|
||||
PackageEntry* pkg_entry,
|
||||
Handle class_loader, TRAPS) {
|
||||
int path_index = ik->shared_classpath_index();
|
||||
ClassLoaderData* loader_data = class_loader_data(class_loader);
|
||||
SharedClassPathEntry* ent =
|
||||
(SharedClassPathEntry*)FileMapInfo::shared_path(path_index);
|
||||
if (!Universe::is_module_initialized()) {
|
||||
@ -1369,6 +1382,37 @@ bool SystemDictionary::check_shared_class_super_types(InstanceKlass* ik, Handle
|
||||
return true;
|
||||
}
|
||||
|
||||
InstanceKlass* SystemDictionary::load_shared_lambda_proxy_class(InstanceKlass* ik,
|
||||
Handle class_loader,
|
||||
Handle protection_domain,
|
||||
PackageEntry* pkg_entry,
|
||||
TRAPS) {
|
||||
InstanceKlass* shared_nest_host = SystemDictionaryShared::get_shared_nest_host(ik);
|
||||
assert(shared_nest_host->is_shared(), "nest host must be in CDS archive");
|
||||
Symbol* cn = shared_nest_host->name();
|
||||
Klass *s = resolve_or_fail(cn, class_loader, protection_domain, true, CHECK_NULL);
|
||||
if (s != shared_nest_host) {
|
||||
// The dynamically resolved nest_host is not the same as the one we used during dump time,
|
||||
// so we cannot use ik.
|
||||
return NULL;
|
||||
} else {
|
||||
assert(s->is_shared(), "must be");
|
||||
}
|
||||
|
||||
// The lambda proxy class and its nest host have the same class loader and class loader data,
|
||||
// as verified in SystemDictionaryShared::add_lambda_proxy_class()
|
||||
assert(shared_nest_host->class_loader() == class_loader(), "mismatched class loader");
|
||||
assert(shared_nest_host->class_loader_data() == ClassLoaderData::class_loader_data(class_loader()), "mismatched class loader data");
|
||||
ik->set_nest_host(shared_nest_host, THREAD);
|
||||
|
||||
InstanceKlass* loaded_ik = load_shared_class(ik, class_loader, protection_domain, NULL, pkg_entry, CHECK_NULL);
|
||||
|
||||
assert(shared_nest_host->is_same_class_package(ik),
|
||||
"lambda proxy class and its nest host must be in the same package");
|
||||
|
||||
return loaded_ik;
|
||||
}
|
||||
|
||||
InstanceKlass* SystemDictionary::load_shared_class(InstanceKlass* ik,
|
||||
Handle class_loader,
|
||||
Handle protection_domain,
|
||||
@ -1389,8 +1433,13 @@ InstanceKlass* SystemDictionary::load_shared_class(InstanceKlass* ik,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
InstanceKlass* new_ik = KlassFactory::check_shared_class_file_load_hook(
|
||||
InstanceKlass* new_ik = NULL;
|
||||
// CFLH check is skipped for VM hidden or anonymous classes (see KlassFactory::create_from_stream).
|
||||
// It will be skipped for shared VM hidden lambda proxy classes.
|
||||
if (!SystemDictionaryShared::is_hidden_lambda_proxy(ik)) {
|
||||
new_ik = KlassFactory::check_shared_class_file_load_hook(
|
||||
ik, class_name, class_loader, protection_domain, cfs, CHECK_NULL);
|
||||
}
|
||||
if (new_ik != NULL) {
|
||||
// The class is changed by CFLH. Return the new class. The shared class is
|
||||
// not used.
|
||||
@ -1560,12 +1609,14 @@ InstanceKlass* SystemDictionary::load_instance_class(Symbol* class_name, Handle
|
||||
|
||||
// Search for classes in the CDS archive.
|
||||
InstanceKlass* k = NULL;
|
||||
{
|
||||
|
||||
#if INCLUDE_CDS
|
||||
if (UseSharedSpaces)
|
||||
{
|
||||
PerfTraceTime vmtimer(ClassLoader::perf_shared_classload_time());
|
||||
k = load_shared_boot_class(class_name, pkg_entry, THREAD);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (k == NULL) {
|
||||
// Use VM class loader
|
||||
|
@ -132,6 +132,7 @@ class SymbolPropertyTable;
|
||||
class ProtectionDomainCacheTable;
|
||||
class ProtectionDomainCacheEntry;
|
||||
class GCTimer;
|
||||
class EventClassLoad;
|
||||
|
||||
#define WK_KLASS_ENUM_NAME(kname) kname##_knum
|
||||
|
||||
@ -606,6 +607,7 @@ protected:
|
||||
static LoaderConstraintTable* constraints() { return _loader_constraints; }
|
||||
static ResolutionErrorTable* resolution_errors() { return _resolution_errors; }
|
||||
static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; }
|
||||
static void post_class_load_event(EventClassLoad* event, const InstanceKlass* k, const ClassLoaderData* init_cld);
|
||||
|
||||
// Basic loading operations
|
||||
static InstanceKlass* resolve_instance_class_or_null_helper(Symbol* name,
|
||||
@ -627,11 +629,20 @@ protected:
|
||||
static bool is_shared_class_visible(Symbol* class_name, InstanceKlass* ik,
|
||||
PackageEntry* pkg_entry,
|
||||
Handle class_loader, TRAPS);
|
||||
static bool is_shared_class_visible_impl(Symbol* class_name,
|
||||
InstanceKlass* ik,
|
||||
PackageEntry* pkg_entry,
|
||||
Handle class_loader, TRAPS);
|
||||
static bool check_shared_class_super_type(InstanceKlass* child, InstanceKlass* super,
|
||||
Handle class_loader, Handle protection_domain,
|
||||
bool is_superclass, TRAPS);
|
||||
static bool check_shared_class_super_types(InstanceKlass* ik, Handle class_loader,
|
||||
Handle protection_domain, TRAPS);
|
||||
static InstanceKlass* load_shared_lambda_proxy_class(InstanceKlass* ik,
|
||||
Handle class_loader,
|
||||
Handle protection_domain,
|
||||
PackageEntry* pkg_entry,
|
||||
TRAPS);
|
||||
static InstanceKlass* load_shared_class(InstanceKlass* ik,
|
||||
Handle class_loader,
|
||||
Handle protection_domain,
|
||||
|
@ -36,9 +36,11 @@
|
||||
#include "classfile/systemDictionaryShared.hpp"
|
||||
#include "classfile/verificationType.hpp"
|
||||
#include "classfile/vmSymbols.hpp"
|
||||
#include "jfr/jfrEvents.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "memory/allocation.hpp"
|
||||
#include "memory/archiveUtils.hpp"
|
||||
#include "memory/dynamicArchive.hpp"
|
||||
#include "memory/filemap.hpp"
|
||||
#include "memory/heapShared.hpp"
|
||||
#include "memory/metadataFactory.hpp"
|
||||
@ -46,7 +48,6 @@
|
||||
#include "memory/oopFactory.hpp"
|
||||
#include "memory/resourceArea.hpp"
|
||||
#include "memory/universe.hpp"
|
||||
#include "memory/dynamicArchive.hpp"
|
||||
#include "oops/instanceKlass.hpp"
|
||||
#include "oops/klass.inline.hpp"
|
||||
#include "oops/objArrayOop.inline.hpp"
|
||||
@ -61,9 +62,9 @@
|
||||
#include "utilities/stringUtils.hpp"
|
||||
|
||||
|
||||
OopHandle SystemDictionaryShared::_shared_protection_domains = NULL;
|
||||
OopHandle SystemDictionaryShared::_shared_jar_urls = NULL;
|
||||
OopHandle SystemDictionaryShared::_shared_jar_manifests = NULL;
|
||||
OopHandle SystemDictionaryShared::_shared_protection_domains;
|
||||
OopHandle SystemDictionaryShared::_shared_jar_urls;
|
||||
OopHandle SystemDictionaryShared::_shared_jar_manifests;
|
||||
DEBUG_ONLY(bool SystemDictionaryShared::_no_class_loading_should_happen = false;)
|
||||
|
||||
class DumpTimeSharedClassInfo: public CHeapObj<mtClass> {
|
||||
@ -96,6 +97,7 @@ public:
|
||||
|
||||
InstanceKlass* _klass;
|
||||
bool _failed_verification;
|
||||
bool _is_archived_lambda_proxy;
|
||||
int _id;
|
||||
int _clsfile_size;
|
||||
int _clsfile_crc32;
|
||||
@ -106,6 +108,7 @@ public:
|
||||
DumpTimeSharedClassInfo() {
|
||||
_klass = NULL;
|
||||
_failed_verification = false;
|
||||
_is_archived_lambda_proxy = false;
|
||||
_id = -1;
|
||||
_clsfile_size = -1;
|
||||
_clsfile_crc32 = -1;
|
||||
@ -242,6 +245,159 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class LambdaProxyClassKey {
|
||||
template <typename T> static void original_to_target(T& field) {
|
||||
if (field != NULL) {
|
||||
field = DynamicArchive::original_to_target(field);
|
||||
ArchivePtrMarker::mark_pointer(&field);
|
||||
}
|
||||
}
|
||||
|
||||
InstanceKlass* _caller_ik;
|
||||
Symbol* _invoked_name;
|
||||
Symbol* _invoked_type;
|
||||
Symbol* _method_type;
|
||||
Method* _member_method;
|
||||
Symbol* _instantiated_method_type;
|
||||
|
||||
public:
|
||||
LambdaProxyClassKey(InstanceKlass* caller_ik,
|
||||
Symbol* invoked_name,
|
||||
Symbol* invoked_type,
|
||||
Symbol* method_type,
|
||||
Method* member_method,
|
||||
Symbol* instantiated_method_type) :
|
||||
_caller_ik(caller_ik),
|
||||
_invoked_name(invoked_name),
|
||||
_invoked_type(invoked_type),
|
||||
_method_type(method_type),
|
||||
_member_method(member_method),
|
||||
_instantiated_method_type(instantiated_method_type) {}
|
||||
|
||||
void original_to_target() {
|
||||
original_to_target(_caller_ik);
|
||||
original_to_target(_instantiated_method_type);
|
||||
original_to_target(_invoked_name);
|
||||
original_to_target(_invoked_type);
|
||||
original_to_target(_member_method);
|
||||
original_to_target(_method_type);
|
||||
}
|
||||
|
||||
bool equals(LambdaProxyClassKey const& other) const {
|
||||
return _caller_ik == other._caller_ik &&
|
||||
_invoked_name == other._invoked_name &&
|
||||
_invoked_type == other._invoked_type &&
|
||||
_method_type == other._method_type &&
|
||||
_member_method == other._member_method &&
|
||||
_instantiated_method_type == other._instantiated_method_type;
|
||||
}
|
||||
|
||||
unsigned int hash() const {
|
||||
return SystemDictionaryShared::hash_for_shared_dictionary(_caller_ik) +
|
||||
SystemDictionaryShared::hash_for_shared_dictionary(_invoked_name) +
|
||||
SystemDictionaryShared::hash_for_shared_dictionary(_invoked_type) +
|
||||
SystemDictionaryShared::hash_for_shared_dictionary(_method_type) +
|
||||
SystemDictionaryShared::hash_for_shared_dictionary(_instantiated_method_type);
|
||||
}
|
||||
|
||||
unsigned int dumptime_hash() const {
|
||||
return primitive_hash<InstanceKlass*>(_caller_ik) +
|
||||
primitive_hash<Symbol*>(_invoked_name) +
|
||||
primitive_hash<Symbol*>(_invoked_type) +
|
||||
primitive_hash<Symbol*>(_method_type) +
|
||||
primitive_hash<Symbol*>(_instantiated_method_type);
|
||||
}
|
||||
|
||||
static inline unsigned int DUMPTIME_HASH(LambdaProxyClassKey const& key) {
|
||||
return (key.dumptime_hash());
|
||||
}
|
||||
|
||||
static inline bool DUMPTIME_EQUALS(
|
||||
LambdaProxyClassKey const& k1, LambdaProxyClassKey const& k2) {
|
||||
return (k1.equals(k2));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class DumpTimeLambdaProxyClassInfo {
|
||||
public:
|
||||
GrowableArray<InstanceKlass*>* _proxy_klasses;
|
||||
DumpTimeLambdaProxyClassInfo() : _proxy_klasses(NULL) {}
|
||||
void add_proxy_klass(InstanceKlass* proxy_klass) {
|
||||
if (_proxy_klasses == NULL) {
|
||||
_proxy_klasses = new (ResourceObj::C_HEAP, mtClassShared)GrowableArray<InstanceKlass*>(5, mtClassShared);
|
||||
}
|
||||
assert(_proxy_klasses != NULL, "sanity");
|
||||
_proxy_klasses->append(proxy_klass);
|
||||
}
|
||||
};
|
||||
|
||||
class RunTimeLambdaProxyClassInfo {
|
||||
LambdaProxyClassKey _key;
|
||||
InstanceKlass* _proxy_klass_head;
|
||||
public:
|
||||
RunTimeLambdaProxyClassInfo(LambdaProxyClassKey key, InstanceKlass* proxy_klass) :
|
||||
_key(key), _proxy_klass_head(proxy_klass) {}
|
||||
|
||||
InstanceKlass* proxy_klass_head() const { return _proxy_klass_head; }
|
||||
|
||||
// Used by LambdaProxyClassDictionary to implement OffsetCompactHashtable::EQUALS
|
||||
static inline bool EQUALS(
|
||||
const RunTimeLambdaProxyClassInfo* value, LambdaProxyClassKey* key, int len_unused) {
|
||||
return (value->_key.equals(*key));
|
||||
}
|
||||
void init(LambdaProxyClassKey& key, DumpTimeLambdaProxyClassInfo& info) {
|
||||
_key = key;
|
||||
_key.original_to_target();
|
||||
_proxy_klass_head = DynamicArchive::original_to_target(info._proxy_klasses->at(0));
|
||||
ArchivePtrMarker::mark_pointer(&_proxy_klass_head);
|
||||
}
|
||||
|
||||
unsigned int hash() const {
|
||||
return _key.hash();
|
||||
}
|
||||
};
|
||||
|
||||
class LambdaProxyClassDictionary : public OffsetCompactHashtable<
|
||||
LambdaProxyClassKey*,
|
||||
const RunTimeLambdaProxyClassInfo*,
|
||||
RunTimeLambdaProxyClassInfo::EQUALS> {};
|
||||
|
||||
LambdaProxyClassDictionary _lambda_proxy_class_dictionary;
|
||||
|
||||
class DumpTimeLambdaProxyClassDictionary
|
||||
: public ResourceHashtable<LambdaProxyClassKey,
|
||||
DumpTimeLambdaProxyClassInfo,
|
||||
LambdaProxyClassKey::DUMPTIME_HASH,
|
||||
LambdaProxyClassKey::DUMPTIME_EQUALS,
|
||||
137, // prime number
|
||||
ResourceObj::C_HEAP> {
|
||||
public:
|
||||
int _count;
|
||||
};
|
||||
|
||||
DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary = NULL;
|
||||
|
||||
static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey key,
|
||||
InstanceKlass* proxy_klass) {
|
||||
assert(DumpTimeTable_lock->owned_by_self(), "sanity");
|
||||
if (_dumptime_lambda_proxy_class_dictionary == NULL) {
|
||||
_dumptime_lambda_proxy_class_dictionary =
|
||||
new (ResourceObj::C_HEAP, mtClass)DumpTimeLambdaProxyClassDictionary();
|
||||
}
|
||||
DumpTimeLambdaProxyClassInfo* lambda_info = _dumptime_lambda_proxy_class_dictionary->get(key);
|
||||
if (lambda_info == NULL) {
|
||||
DumpTimeLambdaProxyClassInfo info;
|
||||
info.add_proxy_klass(proxy_klass);
|
||||
_dumptime_lambda_proxy_class_dictionary->put(key, info);
|
||||
//lambda_info = _dumptime_lambda_proxy_class_dictionary->get(key);
|
||||
//assert(lambda_info->_proxy_klass == proxy_klass, "must be"); // debug only -- remove
|
||||
++_dumptime_lambda_proxy_class_dictionary->_count;
|
||||
} else {
|
||||
lambda_info->add_proxy_klass(proxy_klass);
|
||||
}
|
||||
}
|
||||
|
||||
class RunTimeSharedClassInfo {
|
||||
public:
|
||||
struct CrcInfo {
|
||||
@ -272,6 +428,7 @@ public:
|
||||
int _num_loader_constraints;
|
||||
|
||||
// optional CrcInfo _crc; (only for UNREGISTERED classes)
|
||||
// optional InstanceKlass* _nest_host
|
||||
// optional RTLoaderConstraint _loader_constraint_types[_num_loader_constraints]
|
||||
// optional RTVerifierConstraint _verifier_constraints[_num_verifier_constraints]
|
||||
// optional char _verifier_constraint_flags[_num_verifier_constraints]
|
||||
@ -296,11 +453,19 @@ private:
|
||||
static size_t loader_constraints_size(int num_loader_constraints) {
|
||||
return sizeof(RTLoaderConstraint) * num_loader_constraints;
|
||||
}
|
||||
static size_t nest_host_size(InstanceKlass* klass) {
|
||||
if (klass->is_hidden()) {
|
||||
return sizeof(InstanceKlass*);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static size_t byte_size(InstanceKlass* klass, int num_verifier_constraints, int num_loader_constraints) {
|
||||
return header_size_size() +
|
||||
crc_size(klass) +
|
||||
nest_host_size(klass) +
|
||||
loader_constraints_size(num_loader_constraints) +
|
||||
verifier_constraints_size(num_verifier_constraints) +
|
||||
verifier_constraint_flags_size(num_verifier_constraints);
|
||||
@ -311,8 +476,12 @@ private:
|
||||
return header_size_size();
|
||||
}
|
||||
|
||||
size_t nest_host_offset() const {
|
||||
return crc_offset() + crc_size(_klass);
|
||||
}
|
||||
|
||||
size_t loader_constraints_offset() const {
|
||||
return crc_offset() + crc_size(_klass);
|
||||
return nest_host_offset() + nest_host_size(_klass);
|
||||
}
|
||||
size_t verifier_constraints_offset() const {
|
||||
return loader_constraints_offset() + loader_constraints_size(_num_loader_constraints);
|
||||
@ -348,6 +517,18 @@ public:
|
||||
return (char*)(address(this) + verifier_constraint_flags_offset());
|
||||
}
|
||||
|
||||
InstanceKlass** nest_host_addr() {
|
||||
assert(_klass->is_hidden(), "sanity");
|
||||
return (InstanceKlass**)(address(this) + nest_host_offset());
|
||||
}
|
||||
InstanceKlass* nest_host() {
|
||||
return *nest_host_addr();
|
||||
}
|
||||
void set_nest_host(InstanceKlass* k) {
|
||||
*nest_host_addr() = k;
|
||||
ArchivePtrMarker::mark_pointer((address*)nest_host_addr());
|
||||
}
|
||||
|
||||
RTLoaderConstraint* loader_constraints() {
|
||||
assert(_num_loader_constraints > 0, "sanity");
|
||||
return (RTLoaderConstraint*)(address(this) + loader_constraints_offset());
|
||||
@ -396,6 +577,12 @@ public:
|
||||
}
|
||||
}
|
||||
if (DynamicDumpSharedSpaces) {
|
||||
if (_klass->is_hidden()) {
|
||||
Thread* THREAD = Thread::current();
|
||||
InstanceKlass* n_h = _klass->nest_host(THREAD);
|
||||
n_h = DynamicArchive::original_to_target(n_h);
|
||||
set_nest_host(n_h);
|
||||
}
|
||||
_klass = DynamicArchive::original_to_target(info._klass);
|
||||
}
|
||||
ArchivePtrMarker::mark_pointer(&_klass);
|
||||
@ -426,6 +613,7 @@ private:
|
||||
|
||||
public:
|
||||
static RunTimeSharedClassInfo* get_for(InstanceKlass* klass) {
|
||||
assert(klass->is_shared(), "don't call for non-shared class");
|
||||
return *info_pointer_addr(klass);
|
||||
}
|
||||
static void set_for(InstanceKlass* klass, RunTimeSharedClassInfo* record) {
|
||||
@ -1148,16 +1336,32 @@ bool SystemDictionaryShared::is_jfr_event_class(InstanceKlass *k) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SystemDictionaryShared::is_registered_lambda_proxy_class(InstanceKlass* ik) {
|
||||
DumpTimeSharedClassInfo* info = _dumptime_table->get(ik);
|
||||
return (info != NULL) ? info->_is_archived_lambda_proxy : false;
|
||||
}
|
||||
|
||||
bool SystemDictionaryShared::is_hidden_lambda_proxy(InstanceKlass* ik) {
|
||||
assert(ik->is_shared(), "applicable to only a shared class");
|
||||
if (ik->is_hidden()) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::warn_excluded(InstanceKlass* k, const char* reason) {
|
||||
ResourceMark rm;
|
||||
log_warning(cds)("Skipping %s: %s", k->name()->as_C_string(), reason);
|
||||
}
|
||||
|
||||
bool SystemDictionaryShared::should_be_excluded(InstanceKlass* k) {
|
||||
if (k->is_hidden() || k->is_unsafe_anonymous()) {
|
||||
warn_excluded(k, "Hidden or Unsafe anonymous class");
|
||||
return true; // hidden and unsafe anonymous classes are not archived, skip
|
||||
|
||||
if (k->is_unsafe_anonymous()) {
|
||||
warn_excluded(k, "Unsafe anonymous class");
|
||||
return true; // unsafe anonymous classes are not archived, skip
|
||||
}
|
||||
|
||||
if (k->is_in_error_state()) {
|
||||
warn_excluded(k, "In error state");
|
||||
return true;
|
||||
@ -1166,7 +1370,7 @@ bool SystemDictionaryShared::should_be_excluded(InstanceKlass* k) {
|
||||
warn_excluded(k, "Has been redefined");
|
||||
return true;
|
||||
}
|
||||
if (k->shared_classpath_index() < 0 && is_builtin(k)) {
|
||||
if (!k->is_hidden() && k->shared_classpath_index() < 0 && is_builtin(k)) {
|
||||
// These are classes loaded from unsupported locations (such as those loaded by JVMTI native
|
||||
// agent during dump time).
|
||||
warn_excluded(k, "Unsupported location");
|
||||
@ -1219,6 +1423,11 @@ bool SystemDictionaryShared::should_be_excluded(InstanceKlass* k) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (k->is_hidden() && !is_registered_lambda_proxy_class(k)) {
|
||||
warn_excluded(k, "Hidden class");
|
||||
return true;
|
||||
}
|
||||
|
||||
Array<InstanceKlass*>* interfaces = k->local_interfaces();
|
||||
int len = interfaces->length();
|
||||
for (int i = 0; i < len; i++) {
|
||||
@ -1241,8 +1450,12 @@ void SystemDictionaryShared::validate_before_archiving(InstanceKlass* k) {
|
||||
guarantee(info != NULL, "Class %s must be entered into _dumptime_table", name);
|
||||
guarantee(!info->is_excluded(), "Should not attempt to archive excluded class %s", name);
|
||||
if (is_builtin(k)) {
|
||||
if (k->is_hidden()) {
|
||||
assert(is_registered_lambda_proxy_class(k), "unexpected hidden class %s", name);
|
||||
}
|
||||
guarantee(!k->is_shared_unregistered_class(),
|
||||
"Class loader type must be set for BUILTIN class %s", name);
|
||||
|
||||
} else {
|
||||
guarantee(k->is_shared_unregistered_class(),
|
||||
"Class loader type must not be set for UNREGISTERED class %s", name);
|
||||
@ -1334,10 +1547,10 @@ bool SystemDictionaryShared::add_verification_constraint(InstanceKlass* k, Symbo
|
||||
void DumpTimeSharedClassInfo::add_verification_constraint(InstanceKlass* k, Symbol* name,
|
||||
Symbol* from_name, bool from_field_is_protected, bool from_is_array, bool from_is_object) {
|
||||
if (_verifier_constraints == NULL) {
|
||||
_verifier_constraints = new(ResourceObj::C_HEAP, mtClass) GrowableArray<DTVerifierConstraint>(4, true, mtClass);
|
||||
_verifier_constraints = new(ResourceObj::C_HEAP, mtClass) GrowableArray<DTVerifierConstraint>(4, mtClass);
|
||||
}
|
||||
if (_verifier_constraint_flags == NULL) {
|
||||
_verifier_constraint_flags = new(ResourceObj::C_HEAP, mtClass) GrowableArray<char>(4, true, mtClass);
|
||||
_verifier_constraint_flags = new(ResourceObj::C_HEAP, mtClass) GrowableArray<char>(4, mtClass);
|
||||
}
|
||||
GrowableArray<DTVerifierConstraint>* vc_array = _verifier_constraints;
|
||||
for (int i = 0; i < vc_array->length(); i++) {
|
||||
@ -1358,12 +1571,138 @@ void DumpTimeSharedClassInfo::add_verification_constraint(InstanceKlass* k, Symb
|
||||
|
||||
if (log_is_enabled(Trace, cds, verification)) {
|
||||
ResourceMark rm;
|
||||
log_trace(cds, verification)("add_verification_constraint: %s: %s must be subclass of %s [0x%x]",
|
||||
log_trace(cds, verification)("add_verification_constraint: %s: %s must be subclass of %s [0x%x] array len %d flags len %d",
|
||||
k->external_name(), from_name->as_klass_external_name(),
|
||||
name->as_klass_external_name(), c);
|
||||
name->as_klass_external_name(), c, vc_array->length(), vcflags_array->length());
|
||||
}
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::add_lambda_proxy_class(InstanceKlass* caller_ik,
|
||||
InstanceKlass* lambda_ik,
|
||||
Symbol* invoked_name,
|
||||
Symbol* invoked_type,
|
||||
Symbol* method_type,
|
||||
Method* member_method,
|
||||
Symbol* instantiated_method_type) {
|
||||
|
||||
assert(caller_ik->class_loader() == lambda_ik->class_loader(), "mismatched class loader");
|
||||
assert(caller_ik->class_loader_data() == lambda_ik->class_loader_data(), "mismatched class loader data");
|
||||
assert(java_lang_Class::class_data(lambda_ik->java_mirror()) == NULL, "must not have class data");
|
||||
|
||||
MutexLocker ml(DumpTimeTable_lock, Mutex::_no_safepoint_check_flag);
|
||||
|
||||
lambda_ik->assign_class_loader_type();
|
||||
lambda_ik->set_shared_classpath_index(caller_ik->shared_classpath_index());
|
||||
|
||||
DumpTimeSharedClassInfo* info = _dumptime_table->get(lambda_ik);
|
||||
if (info != NULL && !lambda_ik->is_non_strong_hidden() && is_builtin(lambda_ik) && is_builtin(caller_ik)) {
|
||||
// Set _is_archived_lambda_proxy in DumpTimeSharedClassInfo so that the lambda_ik
|
||||
// won't be excluded during dumping of shared archive. See ExcludeDumpTimeSharedClasses.
|
||||
info->_is_archived_lambda_proxy = true;
|
||||
|
||||
LambdaProxyClassKey key(caller_ik,
|
||||
invoked_name,
|
||||
invoked_type,
|
||||
method_type,
|
||||
member_method,
|
||||
instantiated_method_type);
|
||||
add_to_dump_time_lambda_proxy_class_dictionary(key, lambda_ik);
|
||||
}
|
||||
}
|
||||
|
||||
InstanceKlass* SystemDictionaryShared::get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
|
||||
Symbol* invoked_name,
|
||||
Symbol* invoked_type,
|
||||
Symbol* method_type,
|
||||
Method* member_method,
|
||||
Symbol* instantiated_method_type) {
|
||||
MutexLocker ml(CDSLambda_lock, Mutex::_no_safepoint_check_flag);
|
||||
LambdaProxyClassKey key(caller_ik, invoked_name, invoked_type,
|
||||
method_type, member_method, instantiated_method_type);
|
||||
const RunTimeLambdaProxyClassInfo* info = _lambda_proxy_class_dictionary.lookup(&key, key.hash(), 0);
|
||||
InstanceKlass* proxy_klass = NULL;
|
||||
if (info != NULL) {
|
||||
InstanceKlass* curr_klass = info->proxy_klass_head();
|
||||
InstanceKlass* prev_klass = curr_klass;
|
||||
if (curr_klass->lambda_proxy_is_available()) {
|
||||
while (curr_klass->next_link() != NULL) {
|
||||
prev_klass = curr_klass;
|
||||
curr_klass = InstanceKlass::cast(curr_klass->next_link());
|
||||
}
|
||||
assert(curr_klass->is_hidden(), "must be");
|
||||
assert(curr_klass->lambda_proxy_is_available(), "must be");
|
||||
|
||||
prev_klass->set_next_link(NULL);
|
||||
proxy_klass = curr_klass;
|
||||
proxy_klass->clear_lambda_proxy_is_available();
|
||||
if (log_is_enabled(Debug, cds)) {
|
||||
ResourceMark rm;
|
||||
log_debug(cds)("Loaded lambda proxy: %s", proxy_klass->external_name());
|
||||
}
|
||||
} else {
|
||||
if (log_is_enabled(Debug, cds)) {
|
||||
ResourceMark rm;
|
||||
log_debug(cds)("Used all archived lambda proxy classes for: %s %s%s",
|
||||
caller_ik->external_name(), invoked_name->as_C_string(), invoked_type->as_C_string());
|
||||
}
|
||||
}
|
||||
}
|
||||
return proxy_klass;
|
||||
}
|
||||
|
||||
InstanceKlass* SystemDictionaryShared::get_shared_nest_host(InstanceKlass* lambda_ik) {
|
||||
assert(!DumpSharedSpaces && UseSharedSpaces, "called at run time with CDS enabled only");
|
||||
RunTimeSharedClassInfo* record = RunTimeSharedClassInfo::get_for(lambda_ik);
|
||||
return record->nest_host();
|
||||
}
|
||||
|
||||
InstanceKlass* SystemDictionaryShared::prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
|
||||
InstanceKlass* caller_ik,
|
||||
bool initialize, TRAPS) {
|
||||
Handle class_loader(THREAD, caller_ik->class_loader());
|
||||
Handle protection_domain;
|
||||
PackageEntry* pkg_entry = get_package_entry_from_class_name(class_loader, caller_ik->name());
|
||||
if (caller_ik->class_loader() != NULL) {
|
||||
protection_domain = SystemDictionaryShared::init_security_info(class_loader, caller_ik, pkg_entry, CHECK_NULL);
|
||||
}
|
||||
|
||||
InstanceKlass* shared_nest_host = get_shared_nest_host(lambda_ik);
|
||||
assert(shared_nest_host != NULL, "unexpected NULL _nest_host");
|
||||
|
||||
InstanceKlass* loaded_lambda =
|
||||
SystemDictionary::load_shared_lambda_proxy_class(lambda_ik, class_loader, protection_domain, pkg_entry, CHECK_NULL);
|
||||
|
||||
// Ensures the nest host is the same as the lambda proxy's
|
||||
// nest host recorded at dump time.
|
||||
InstanceKlass* nest_host = caller_ik->nest_host(THREAD);
|
||||
assert(nest_host == shared_nest_host, "mismatched nest host");
|
||||
|
||||
EventClassLoad class_load_start_event;
|
||||
{
|
||||
MutexLocker mu_r(THREAD, Compile_lock);
|
||||
|
||||
// Add to class hierarchy, initialize vtables, and do possible
|
||||
// deoptimizations.
|
||||
SystemDictionary::add_to_hierarchy(loaded_lambda, CHECK_NULL); // No exception, but can block
|
||||
// But, do not add to dictionary.
|
||||
}
|
||||
loaded_lambda->link_class(CHECK_NULL);
|
||||
// notify jvmti
|
||||
if (JvmtiExport::should_post_class_load()) {
|
||||
assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
|
||||
JvmtiExport::post_class_load((JavaThread *) THREAD, loaded_lambda);
|
||||
}
|
||||
if (class_load_start_event.should_commit()) {
|
||||
SystemDictionary::post_class_load_event(&class_load_start_event, loaded_lambda, ClassLoaderData::class_loader_data(class_loader()));
|
||||
}
|
||||
|
||||
if (initialize) {
|
||||
loaded_lambda->initialize(CHECK_NULL);
|
||||
}
|
||||
|
||||
return loaded_lambda;
|
||||
}
|
||||
|
||||
static char get_loader_type_by(oop loader) {
|
||||
assert(SystemDictionary::is_builtin_class_loader(loader), "Must be built-in loader");
|
||||
if (SystemDictionary::is_boot_class_loader(loader)) {
|
||||
@ -1391,7 +1730,7 @@ void DumpTimeSharedClassInfo::record_linking_constraint(Symbol* name, Handle loa
|
||||
assert(loader1 != loader2, "sanity");
|
||||
LogTarget(Info, class, loader, constraints) log;
|
||||
if (_loader_constraints == NULL) {
|
||||
_loader_constraints = new (ResourceObj::C_HEAP, mtClass) GrowableArray<DTLoaderConstraint>(4, true, mtClass);
|
||||
_loader_constraints = new (ResourceObj::C_HEAP, mtClass) GrowableArray<DTLoaderConstraint>(4, mtClass);
|
||||
}
|
||||
char lt1 = get_loader_type_by(loader1());
|
||||
char lt2 = get_loader_type_by(loader2());
|
||||
@ -1594,11 +1933,67 @@ public:
|
||||
size_t SystemDictionaryShared::estimate_size_for_archive() {
|
||||
EstimateSizeForArchive est;
|
||||
_dumptime_table->iterate(&est);
|
||||
return est.total() +
|
||||
size_t total_size = est.total() +
|
||||
CompactHashtableWriter::estimate_size(_dumptime_table->count_of(true)) +
|
||||
CompactHashtableWriter::estimate_size(_dumptime_table->count_of(false));
|
||||
if (_dumptime_lambda_proxy_class_dictionary != NULL) {
|
||||
total_size +=
|
||||
(sizeof(RunTimeLambdaProxyClassInfo) * _dumptime_lambda_proxy_class_dictionary->_count) +
|
||||
CompactHashtableWriter::estimate_size(_dumptime_lambda_proxy_class_dictionary->_count);
|
||||
} else {
|
||||
total_size += CompactHashtableWriter::estimate_size(0);
|
||||
}
|
||||
return total_size;
|
||||
}
|
||||
|
||||
class CopyLambdaProxyClassInfoToArchive : StackObj {
|
||||
CompactHashtableWriter* _writer;
|
||||
public:
|
||||
CopyLambdaProxyClassInfoToArchive(CompactHashtableWriter* writer)
|
||||
: _writer(writer) {}
|
||||
bool do_entry(LambdaProxyClassKey& key, DumpTimeLambdaProxyClassInfo& info) {
|
||||
if (SystemDictionaryShared::is_excluded_class(info._proxy_klasses->at(0))) {
|
||||
return true;
|
||||
}
|
||||
ResourceMark rm;
|
||||
log_info(cds,dynamic)("Archiving hidden %s", info._proxy_klasses->at(0)->external_name());
|
||||
size_t byte_size = sizeof(RunTimeLambdaProxyClassInfo);
|
||||
RunTimeLambdaProxyClassInfo* runtime_info =
|
||||
(RunTimeLambdaProxyClassInfo*)MetaspaceShared::read_only_space_alloc(byte_size);
|
||||
runtime_info->init(key, info);
|
||||
unsigned int hash = runtime_info->hash(); // Fields in runtime_info->_key already point to target space.
|
||||
u4 delta = MetaspaceShared::object_delta_u4(DynamicArchive::buffer_to_target(runtime_info));
|
||||
_writer->add(hash, delta);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class AdjustLambdaProxyClassInfo : StackObj {
|
||||
public:
|
||||
AdjustLambdaProxyClassInfo() {}
|
||||
bool do_entry(LambdaProxyClassKey& key, DumpTimeLambdaProxyClassInfo& info) {
|
||||
if (SystemDictionaryShared::is_excluded_class(info._proxy_klasses->at(0))) {
|
||||
return true;
|
||||
}
|
||||
int len = info._proxy_klasses->length();
|
||||
if (len > 1) {
|
||||
for (int i = 0; i < len-1; i++) {
|
||||
InstanceKlass* ok0 = info._proxy_klasses->at(i+0); // this is original klass
|
||||
InstanceKlass* ok1 = info._proxy_klasses->at(i+1); // this is original klass
|
||||
InstanceKlass* bk0 = DynamicArchive::original_to_buffer(ok0);
|
||||
InstanceKlass* bk1 = DynamicArchive::original_to_buffer(ok1);
|
||||
assert(bk0->next_link() == 0, "must be called after Klass::remove_unshareable_info()");
|
||||
assert(bk1->next_link() == 0, "must be called after Klass::remove_unshareable_info()");
|
||||
bk0->set_next_link(bk1);
|
||||
bk1->set_lambda_proxy_is_available();
|
||||
ArchivePtrMarker::mark_pointer(bk0->next_link_addr());
|
||||
}
|
||||
}
|
||||
DynamicArchive::original_to_buffer(info._proxy_klasses->at(0))->set_lambda_proxy_is_available();
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class CopySharedClassInfoToArchive : StackObj {
|
||||
CompactHashtableWriter* _writer;
|
||||
bool _is_builtin;
|
||||
@ -1627,7 +2022,11 @@ public:
|
||||
} else {
|
||||
delta = MetaspaceShared::object_delta_u4(record);
|
||||
}
|
||||
_writer->add(hash, delta);
|
||||
if (_is_builtin && info._klass->is_hidden()) {
|
||||
// skip
|
||||
} else {
|
||||
_writer->add(hash, delta);
|
||||
}
|
||||
if (log_is_enabled(Trace, cds, hashtables)) {
|
||||
ResourceMark rm;
|
||||
log_trace(cds,hashtables)("%s dictionary: %s", (_is_builtin ? "builtin" : "unregistered"), info._klass->external_name());
|
||||
@ -1640,6 +2039,15 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
void SystemDictionaryShared::write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary *dictionary) {
|
||||
CompactHashtableStats stats;
|
||||
dictionary->reset();
|
||||
CompactHashtableWriter writer(_dumptime_lambda_proxy_class_dictionary->_count, &stats);
|
||||
CopyLambdaProxyClassInfoToArchive copy(&writer);
|
||||
_dumptime_lambda_proxy_class_dictionary->iterate(©);
|
||||
writer.dump(dictionary, "lambda proxy class dictionary");
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::write_dictionary(RunTimeSharedDictionary* dictionary,
|
||||
bool is_builtin,
|
||||
bool is_static_archive) {
|
||||
@ -1659,6 +2067,16 @@ void SystemDictionaryShared::write_to_archive(bool is_static_archive) {
|
||||
write_dictionary(&_dynamic_builtin_dictionary, true);
|
||||
write_dictionary(&_dynamic_unregistered_dictionary, false);
|
||||
}
|
||||
if (_dumptime_lambda_proxy_class_dictionary != NULL) {
|
||||
write_lambda_proxy_class_dictionary(&_lambda_proxy_class_dictionary);
|
||||
}
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::adjust_lambda_proxy_class_dictionary() {
|
||||
if (_dumptime_lambda_proxy_class_dictionary != NULL) {
|
||||
AdjustLambdaProxyClassInfo adjuster;
|
||||
_dumptime_lambda_proxy_class_dictionary->iterate(&adjuster);
|
||||
}
|
||||
}
|
||||
|
||||
void SystemDictionaryShared::serialize_dictionary_headers(SerializeClosure* soc,
|
||||
@ -1669,6 +2087,7 @@ void SystemDictionaryShared::serialize_dictionary_headers(SerializeClosure* soc,
|
||||
} else {
|
||||
_dynamic_builtin_dictionary.serialize_header(soc);
|
||||
_dynamic_unregistered_dictionary.serialize_header(soc);
|
||||
_lambda_proxy_class_dictionary.serialize_header(soc);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1703,6 +2122,7 @@ SystemDictionaryShared::find_record(RunTimeSharedDictionary* static_dict, RunTim
|
||||
InstanceKlass* SystemDictionaryShared::find_builtin_class(Symbol* name) {
|
||||
const RunTimeSharedClassInfo* record = find_record(&_builtin_dictionary, &_dynamic_builtin_dictionary, name);
|
||||
if (record != NULL) {
|
||||
assert(!record->_klass->is_hidden(), "hidden class cannot be looked up by name");
|
||||
return record->_klass;
|
||||
} else {
|
||||
return NULL;
|
||||
@ -1727,6 +2147,23 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
class SharedLambdaDictionaryPrinter : StackObj {
|
||||
outputStream* _st;
|
||||
int _index;
|
||||
public:
|
||||
SharedLambdaDictionaryPrinter(outputStream* st) : _st(st), _index(0) {}
|
||||
|
||||
void do_value(const RunTimeLambdaProxyClassInfo* record) {
|
||||
ResourceMark rm;
|
||||
_st->print_cr("%4d: %s", (_index++), record->proxy_klass_head()->external_name());
|
||||
Klass* k = record->proxy_klass_head()->next_link();
|
||||
while (k != NULL) {
|
||||
_st->print_cr("%4d: %s", (_index++), k->external_name());
|
||||
k = k->next_link();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void SystemDictionaryShared::print_on(outputStream* st) {
|
||||
if (UseSharedSpaces) {
|
||||
st->print_cr("Shared Dictionary");
|
||||
@ -1736,6 +2173,11 @@ void SystemDictionaryShared::print_on(outputStream* st) {
|
||||
if (DynamicArchive::is_mapped()) {
|
||||
_dynamic_builtin_dictionary.iterate(&p);
|
||||
_unregistered_dictionary.iterate(&p);
|
||||
if (!_lambda_proxy_class_dictionary.empty()) {
|
||||
st->print_cr("Shared Lambda Dictionary");
|
||||
SharedLambdaDictionaryPrinter ldp(st);
|
||||
_lambda_proxy_class_dictionary.iterate(&ldp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1747,6 +2189,7 @@ void SystemDictionaryShared::print_table_statistics(outputStream* st) {
|
||||
if (DynamicArchive::is_mapped()) {
|
||||
_dynamic_builtin_dictionary.print_table_statistics(st, "Dynamic Builtin Shared Dictionary");
|
||||
_dynamic_unregistered_dictionary.print_table_statistics(st, "Unregistered Shared Dictionary");
|
||||
_lambda_proxy_class_dictionary.print_table_statistics(st, "Lambda Shared Dictionary");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -105,6 +105,7 @@
|
||||
class ClassFileStream;
|
||||
class DumpTimeSharedClassInfo;
|
||||
class DumpTimeSharedClassTable;
|
||||
class LambdaProxyClassDictionary;
|
||||
class RunTimeSharedClassInfo;
|
||||
class RunTimeSharedDictionary;
|
||||
|
||||
@ -178,7 +179,6 @@ private:
|
||||
TRAPS);
|
||||
static Handle get_shared_protection_domain(Handle class_loader,
|
||||
ModuleEntry* mod, TRAPS);
|
||||
static Handle init_security_info(Handle class_loader, InstanceKlass* ik, PackageEntry* pkg_entry, TRAPS);
|
||||
|
||||
static void atomic_set_array_index(OopHandle array, int index, oop o) {
|
||||
// Benign race condition: array.obj_at(index) may already be filled in.
|
||||
@ -213,13 +213,17 @@ private:
|
||||
static void write_dictionary(RunTimeSharedDictionary* dictionary,
|
||||
bool is_builtin,
|
||||
bool is_static_archive = true);
|
||||
static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);
|
||||
static bool is_jfr_event_class(InstanceKlass *k);
|
||||
static bool is_registered_lambda_proxy_class(InstanceKlass* ik);
|
||||
static void warn_excluded(InstanceKlass* k, const char* reason);
|
||||
static bool should_be_excluded(InstanceKlass* k);
|
||||
|
||||
DEBUG_ONLY(static bool _no_class_loading_should_happen;)
|
||||
|
||||
public:
|
||||
static bool is_hidden_lambda_proxy(InstanceKlass* ik);
|
||||
static Handle init_security_info(Handle class_loader, InstanceKlass* ik, PackageEntry* pkg_entry, TRAPS);
|
||||
static InstanceKlass* find_builtin_class(Symbol* class_name);
|
||||
|
||||
static const RunTimeSharedClassInfo* find_record(RunTimeSharedDictionary* static_dict,
|
||||
@ -284,6 +288,23 @@ public:
|
||||
TRAPS) NOT_CDS_RETURN;
|
||||
static void set_class_has_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN;
|
||||
static bool has_class_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN_(false);
|
||||
static void add_lambda_proxy_class(InstanceKlass* caller_ik,
|
||||
InstanceKlass* lambda_ik,
|
||||
Symbol* invoked_name,
|
||||
Symbol* invoked_type,
|
||||
Symbol* method_type,
|
||||
Method* member_method,
|
||||
Symbol* instantiated_method_type) NOT_CDS_RETURN;
|
||||
static InstanceKlass* get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
|
||||
Symbol* invoked_name,
|
||||
Symbol* invoked_type,
|
||||
Symbol* method_type,
|
||||
Method* member_method,
|
||||
Symbol* instantiated_method_type) NOT_CDS_RETURN_(NULL);
|
||||
static InstanceKlass* get_shared_nest_host(InstanceKlass* lambda_ik) NOT_CDS_RETURN_(NULL);
|
||||
static InstanceKlass* prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
|
||||
InstanceKlass* caller_ik,
|
||||
bool initialize, TRAPS) NOT_CDS_RETURN_(NULL);
|
||||
static bool check_linking_constraints(InstanceKlass* klass, TRAPS) NOT_CDS_RETURN_(false);
|
||||
static void record_linking_constraint(Symbol* name, InstanceKlass* klass,
|
||||
Handle loader1, Handle loader2, TRAPS) NOT_CDS_RETURN;
|
||||
@ -296,6 +317,7 @@ public:
|
||||
static void dumptime_classes_do(class MetaspaceClosure* it);
|
||||
static size_t estimate_size_for_archive();
|
||||
static void write_to_archive(bool is_static_archive = true);
|
||||
static void adjust_lambda_proxy_class_dictionary();
|
||||
static void serialize_dictionary_headers(class SerializeClosure* soc,
|
||||
bool is_static_archive = true);
|
||||
static void serialize_well_known_klasses(class SerializeClosure* soc);
|
||||
|
@ -134,8 +134,15 @@ void Verifier::trace_class_resolution(Klass* resolve_class, InstanceKlass* verif
|
||||
void Verifier::log_end_verification(outputStream* st, const char* klassName, Symbol* exception_name, TRAPS) {
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
st->print("Verification for %s has", klassName);
|
||||
st->print_cr(" exception pending %s ",
|
||||
oop message = java_lang_Throwable::message(PENDING_EXCEPTION);
|
||||
if (message != NULL) {
|
||||
char* ex_msg = java_lang_String::as_utf8_string(message);
|
||||
st->print_cr(" exception pending '%s %s'",
|
||||
PENDING_EXCEPTION->klass()->external_name(), ex_msg);
|
||||
} else {
|
||||
st->print_cr(" exception pending %s ",
|
||||
PENDING_EXCEPTION->klass()->external_name());
|
||||
}
|
||||
} else if (exception_name != NULL) {
|
||||
st->print_cr("Verification for %s failed", klassName);
|
||||
}
|
||||
|
@ -266,6 +266,7 @@
|
||||
template(returnType_name, "returnType") \
|
||||
template(signature_name, "signature") \
|
||||
template(slot_name, "slot") \
|
||||
template(trusted_final_name, "trustedFinal") \
|
||||
\
|
||||
/* Support for annotations (JDK 1.5 and above) */ \
|
||||
\
|
||||
@ -598,12 +599,6 @@
|
||||
template(createGCNotification_name, "createGCNotification") \
|
||||
template(createGCNotification_signature, "(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/sun/management/GcInfo;)V") \
|
||||
template(createDiagnosticFrameworkNotification_name, "createDiagnosticFrameworkNotification") \
|
||||
template(createMemoryPoolMBean_name, "createMemoryPoolMBean") \
|
||||
template(createMemoryManagerMBean_name, "createMemoryManagerMBean") \
|
||||
template(createGarbageCollectorMBean_name, "createGarbageCollectorMBean") \
|
||||
template(createMemoryPoolMBean_signature, "(Ljava/lang/String;ZJJ)Ljava/lang/management/MemoryPoolMBean;") \
|
||||
template(createMemoryManagerMBean_signature, "(Ljava/lang/String;)Ljava/lang/management/MemoryManagerMBean;") \
|
||||
template(createGarbageCollectorMBean_signature, "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/management/GarbageCollectorMBean;") \
|
||||
template(trigger_name, "trigger") \
|
||||
template(clear_name, "clear") \
|
||||
template(trigger_method_signature, "(ILjava/lang/management/MemoryUsage;)V") \
|
||||
|
@ -150,10 +150,10 @@ int CodeCache::_number_of_nmethods_with_dependencies = 0;
|
||||
ExceptionCache* volatile CodeCache::_exception_cache_purge_list = NULL;
|
||||
|
||||
// Initialize arrays of CodeHeap subsets
|
||||
GrowableArray<CodeHeap*>* CodeCache::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_compiled_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_nmethod_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_allocable_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, mtCode);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_compiled_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, mtCode);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_nmethod_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, mtCode);
|
||||
GrowableArray<CodeHeap*>* CodeCache::_allocable_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, mtCode);
|
||||
|
||||
void CodeCache::check_heap_sizes(size_t non_nmethod_size, size_t profiled_size, size_t non_profiled_size, size_t cache_size, bool all_set) {
|
||||
size_t total_size = non_nmethod_size + profiled_size + non_profiled_size;
|
||||
@ -1043,7 +1043,7 @@ static GrowableArray<CompiledMethod*>* old_compiled_method_table = NULL;
|
||||
|
||||
static void add_to_old_table(CompiledMethod* c) {
|
||||
if (old_compiled_method_table == NULL) {
|
||||
old_compiled_method_table = new (ResourceObj::C_HEAP, mtCode) GrowableArray<CompiledMethod*>(100, true);
|
||||
old_compiled_method_table = new (ResourceObj::C_HEAP, mtCode) GrowableArray<CompiledMethod*>(100, mtCode);
|
||||
}
|
||||
old_compiled_method_table->push(c);
|
||||
}
|
||||
|
@ -687,7 +687,7 @@ void CompileBroker::compilation_init_phase1(Thread* THREAD) {
|
||||
// Start the compiler thread(s) and the sweeper thread
|
||||
init_compiler_sweeper_threads();
|
||||
// totalTime performance counter is always created as it is required
|
||||
// by the implementation of java.lang.management.CompilationMBean.
|
||||
// by the implementation of java.lang.management.CompilationMXBean.
|
||||
{
|
||||
// Ensure OOM leads to vm_exit_during_initialization.
|
||||
EXCEPTION_MARK;
|
||||
@ -2149,14 +2149,14 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||
|
||||
TraceTime t1("compilation", &time);
|
||||
EventCompilation event;
|
||||
JVMCICompileState compile_state(task);
|
||||
|
||||
// Skip redefined methods
|
||||
if (target_handle->is_old()) {
|
||||
if (compile_state.target_method_is_old()) {
|
||||
failure_reason = "redefined method";
|
||||
retry_message = "not retryable";
|
||||
compilable = ciEnv::MethodCompilable_never;
|
||||
} else {
|
||||
JVMCICompileState compile_state(task);
|
||||
JVMCIEnv env(thread, &compile_state, __FILE__, __LINE__);
|
||||
methodHandle method(thread, target_handle);
|
||||
env.runtime()->compile_method(&env, jvmci, method, osr_bci);
|
||||
@ -2193,7 +2193,12 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||
// The thread-env() field is cleared in ~CompileTaskWrapper.
|
||||
|
||||
// Cache Jvmti state
|
||||
ci_env.cache_jvmti_state();
|
||||
bool method_is_old = ci_env.cache_jvmti_state();
|
||||
|
||||
// Skip redefined methods
|
||||
if (method_is_old) {
|
||||
ci_env.record_method_not_compilable("redefined method", true);
|
||||
}
|
||||
|
||||
// Cache DTrace flags
|
||||
ci_env.cache_dtrace_flags();
|
||||
@ -2205,7 +2210,7 @@ void CompileBroker::invoke_compiler_on_method(CompileTask* task) {
|
||||
|
||||
if (comp == NULL) {
|
||||
ci_env.record_method_not_compilable("no compiler", !TieredCompilation);
|
||||
} else {
|
||||
} else if (!ci_env.failing()) {
|
||||
if (WhiteBoxAPI && WhiteBox::compilation_locked) {
|
||||
MonitorLocker locker(Compilation_lock, Mutex::_no_safepoint_check_flag);
|
||||
while (WhiteBox::compilation_locked) {
|
||||
@ -2473,7 +2478,7 @@ void CompileBroker::collect_statistics(CompilerThread* thread, elapsedTimer time
|
||||
// Compilation succeeded
|
||||
|
||||
// update compilation ticks - used by the implementation of
|
||||
// java.lang.management.CompilationMBean
|
||||
// java.lang.management.CompilationMXBean
|
||||
_perf_total_compilation->inc(time.ticks());
|
||||
_peak_compilation_time = time.milliseconds() > _peak_compilation_time ? time.milliseconds() : _peak_compilation_time;
|
||||
|
||||
|
@ -507,8 +507,8 @@ void CompilerConfig::ergo_initialize() {
|
||||
if (!IncrementalInline) {
|
||||
AlwaysIncrementalInline = false;
|
||||
}
|
||||
if (PrintIdealGraphLevel > 0) {
|
||||
FLAG_SET_ERGO(PrintIdealGraph, true);
|
||||
if (FLAG_IS_CMDLINE(PrintIdealGraph) && !PrintIdealGraph) {
|
||||
FLAG_SET_ERGO(PrintIdealGraphLevel, -1);
|
||||
}
|
||||
#endif
|
||||
if (!UseTypeSpeculation && FLAG_IS_DEFAULT(TypeProfileLevel)) {
|
||||
|
@ -79,7 +79,7 @@ int CompilerEvent::PhaseEvent::register_phases(GrowableArray<const char*>* new_p
|
||||
{
|
||||
PhaseTypeGuard guard;
|
||||
if (phase_names == NULL) {
|
||||
phase_names = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<const char*>(100, true);
|
||||
phase_names = new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<const char*>(100, mtCompiler);
|
||||
register_jfr_serializer = true;
|
||||
}
|
||||
idx = phase_names->length();
|
||||
|
@ -266,7 +266,7 @@ void decode_env::print_hook_comments(address pc, bool newline) {
|
||||
}
|
||||
_cached_src_lines->clear();
|
||||
} else {
|
||||
_cached_src_lines = new (ResourceObj::C_HEAP, mtCode)GrowableArray<const char*>(0, true);
|
||||
_cached_src_lines = new (ResourceObj::C_HEAP, mtCode)GrowableArray<const char*>(0, mtCode);
|
||||
}
|
||||
|
||||
if ((fp = fopen(file, "r")) == NULL) {
|
||||
|
@ -257,7 +257,7 @@ public:
|
||||
_allocation_region(NULL),
|
||||
_allocated_regions((ResourceObj::set_allocation_type((address) &_allocated_regions,
|
||||
ResourceObj::C_HEAP),
|
||||
2), true /* C_Heap */),
|
||||
2), mtGC),
|
||||
_summary_bytes_used(0),
|
||||
_bottom(NULL),
|
||||
_top(NULL),
|
||||
|
@ -2555,7 +2555,10 @@ void G1CollectedHeap::print_extended_on(outputStream* st) const {
|
||||
print_on(st);
|
||||
|
||||
// Print the per-region information.
|
||||
print_regions_on(st);
|
||||
if (_hrm != NULL) {
|
||||
st->cr();
|
||||
print_regions_on(st);
|
||||
}
|
||||
}
|
||||
|
||||
void G1CollectedHeap::print_on_error(outputStream* st) const {
|
||||
|
@ -32,7 +32,7 @@ G1FullGCCompactionPoint::G1FullGCCompactionPoint() :
|
||||
_current_region(NULL),
|
||||
_threshold(NULL),
|
||||
_compaction_top(NULL) {
|
||||
_compaction_regions = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapRegion*>(32, true, mtGC);
|
||||
_compaction_regions = new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapRegion*>(32, mtGC);
|
||||
_compaction_region_iterator = _compaction_regions->begin();
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2020, 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
|
||||
@ -326,7 +326,7 @@ void G1HeapVerifier::verify_ready_for_archiving() {
|
||||
if (cl.has_holes()) {
|
||||
log_warning(gc, verify)("All free regions should be at the top end of the heap, but"
|
||||
" we found holes. This is probably caused by (unmovable) humongous"
|
||||
" allocations, and may lead to fragmentation while"
|
||||
" allocations or active GCLocker, and may lead to fragmentation while"
|
||||
" writing archive heap memory regions.");
|
||||
}
|
||||
if (cl.has_humongous()) {
|
||||
@ -334,7 +334,6 @@ void G1HeapVerifier::verify_ready_for_archiving() {
|
||||
" may lead to fragmentation while"
|
||||
" writing archive heap memory regions.");
|
||||
}
|
||||
assert(!cl.has_unexpected_holes(), "all holes should have been caused by humongous regions");
|
||||
}
|
||||
|
||||
class VerifyArchivePointerRegionClosure: public HeapRegionClosure {
|
||||
|
@ -24,29 +24,29 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "gc/g1/g1InitLogger.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "gc/shared/gcLogPrecious.hpp"
|
||||
#include "runtime/globals.hpp"
|
||||
#include "utilities/globalDefinitions.hpp"
|
||||
|
||||
void G1InitLogger::print_heap() {
|
||||
log_info(gc, init)("Heap Region Size: " SIZE_FORMAT "M", G1HeapRegionSize / M);
|
||||
log_info_p(gc, init)("Heap Region Size: " SIZE_FORMAT "M", G1HeapRegionSize / M);
|
||||
GCInitLogger::print_heap();
|
||||
}
|
||||
|
||||
void G1InitLogger::print_workers() {
|
||||
GCInitLogger::print_workers();
|
||||
if (G1ConcRefinementThreads > 0) {
|
||||
log_info(gc, init)("Concurrent Refinement Workers: %u", G1ConcRefinementThreads);
|
||||
log_info_p(gc, init)("Concurrent Refinement Workers: %u", G1ConcRefinementThreads);
|
||||
}
|
||||
}
|
||||
|
||||
void G1InitLogger::print_gc_specific() {
|
||||
// Print a message about periodic GC configuration.
|
||||
if (G1PeriodicGCInterval != 0) {
|
||||
log_info(gc, init)("Periodic GC: Enabled");
|
||||
log_info(gc, init)("Periodic GC Interval: " UINTX_FORMAT "ms", G1PeriodicGCInterval);
|
||||
log_info_p(gc, init)("Periodic GC: Enabled");
|
||||
log_info_p(gc, init)("Periodic GC Interval: " UINTX_FORMAT "ms", G1PeriodicGCInterval);
|
||||
} else {
|
||||
log_info(gc, init)("Periodic GC: Disabled");
|
||||
log_info_p(gc, init)("Periodic GC: Disabled");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
#include "utilities/debug.hpp"
|
||||
|
||||
G1SurvivorRegions::G1SurvivorRegions() :
|
||||
_regions(new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapRegion*>(8, true, mtGC)),
|
||||
_regions(new (ResourceObj::C_HEAP, mtGC) GrowableArray<HeapRegion*>(8, mtGC)),
|
||||
_used_bytes(0),
|
||||
_regions_on_node() {}
|
||||
|
||||
|
@ -34,7 +34,7 @@
|
||||
#include "utilities/align.hpp"
|
||||
|
||||
MutableNUMASpace::MutableNUMASpace(size_t alignment) : MutableSpace(alignment), _must_use_large_pages(false) {
|
||||
_lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray<LGRPSpace*>(0, true);
|
||||
_lgrp_spaces = new (ResourceObj::C_HEAP, mtGC) GrowableArray<LGRPSpace*>(0, mtGC);
|
||||
_page_size = os::vm_page_size();
|
||||
_adaptation_cycles = 0;
|
||||
_samples_count = 0;
|
||||
|
@ -95,7 +95,7 @@ void ParCompactionManager::initialize(ParMarkBitMap* mbm) {
|
||||
assert(ParallelScavengeHeap::heap()->workers().total_workers() != 0,
|
||||
"Not initialized?");
|
||||
|
||||
_shadow_region_array = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<size_t >(10, true);
|
||||
_shadow_region_array = new (ResourceObj::C_HEAP, mtGC) GrowableArray<size_t >(10, mtGC);
|
||||
|
||||
_shadow_region_monitor = new Monitor(Mutex::barrier, "CompactionManager monitor",
|
||||
Mutex::_allow_vm_block_flag, Monitor::_safepoint_check_never);
|
||||
|
@ -240,6 +240,7 @@ void CollectedHeap::collect_as_vm_thread(GCCause::Cause cause) {
|
||||
do_full_collection(false); // don't clear all soft refs
|
||||
break;
|
||||
}
|
||||
case GCCause::_archive_time_gc:
|
||||
case GCCause::_metadata_GC_clear_soft_refs: {
|
||||
HandleMark hm;
|
||||
do_full_collection(true); // do clear all soft refs
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "precompiled.hpp"
|
||||
#include "gc/shared/gcInitLogger.hpp"
|
||||
#include "gc/shared/gcLogPrecious.hpp"
|
||||
#include "logging/log.hpp"
|
||||
#include "oops/compressedOops.hpp"
|
||||
#include "runtime/globals.hpp"
|
||||
@ -54,56 +55,56 @@ void GCInitLogger::print_version() {
|
||||
}
|
||||
|
||||
void GCInitLogger::print_cpu() {
|
||||
log_info(gc, init)("CPUs: %u total, %u available",
|
||||
os::processor_count(),
|
||||
os::initial_active_processor_count());
|
||||
log_info_p(gc, init)("CPUs: %u total, %u available",
|
||||
os::processor_count(),
|
||||
os::initial_active_processor_count());
|
||||
}
|
||||
|
||||
void GCInitLogger::print_memory() {
|
||||
julong memory = os::physical_memory();
|
||||
log_info(gc, init)("Memory: " JULONG_FORMAT "%s",
|
||||
byte_size_in_proper_unit(memory), proper_unit_for_byte_size(memory));
|
||||
log_info_p(gc, init)("Memory: " JULONG_FORMAT "%s",
|
||||
byte_size_in_proper_unit(memory), proper_unit_for_byte_size(memory));
|
||||
}
|
||||
|
||||
void GCInitLogger::print_large_pages() {
|
||||
log_info(gc, init)("Large Page Support: %s", large_pages_support());
|
||||
log_info_p(gc, init)("Large Page Support: %s", large_pages_support());
|
||||
}
|
||||
|
||||
void GCInitLogger::print_numa() {
|
||||
if (UseNUMA) {
|
||||
log_info(gc, init)("NUMA Support: Enabled");
|
||||
log_info(gc, init)("NUMA Nodes: " SIZE_FORMAT, os::numa_get_groups_num());
|
||||
log_info_p(gc, init)("NUMA Support: Enabled");
|
||||
log_info_p(gc, init)("NUMA Nodes: " SIZE_FORMAT, os::numa_get_groups_num());
|
||||
} else {
|
||||
log_info(gc, init)("NUMA Support: Disabled");
|
||||
log_info_p(gc, init)("NUMA Support: Disabled");
|
||||
}
|
||||
}
|
||||
|
||||
void GCInitLogger::print_compressed_oops() {
|
||||
if (UseCompressedOops) {
|
||||
log_info(gc, init)("Compressed Oops: Enabled (%s)",
|
||||
CompressedOops::mode_to_string(CompressedOops::mode()));
|
||||
log_info_p(gc, init)("Compressed Oops: Enabled (%s)",
|
||||
CompressedOops::mode_to_string(CompressedOops::mode()));
|
||||
} else {
|
||||
log_info(gc, init)("Compressed Oops: Disabled");
|
||||
log_info_p(gc, init)("Compressed Oops: Disabled");
|
||||
}
|
||||
}
|
||||
|
||||
void GCInitLogger::print_heap() {
|
||||
log_info(gc, init)("Heap Min Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(MinHeapSize), exact_unit_for_byte_size(MinHeapSize));
|
||||
log_info(gc, init)("Heap Initial Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(InitialHeapSize), exact_unit_for_byte_size(InitialHeapSize));
|
||||
log_info(gc, init)("Heap Max Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(MaxHeapSize), exact_unit_for_byte_size(MaxHeapSize));
|
||||
log_info_p(gc, init)("Heap Min Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(MinHeapSize), exact_unit_for_byte_size(MinHeapSize));
|
||||
log_info_p(gc, init)("Heap Initial Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(InitialHeapSize), exact_unit_for_byte_size(InitialHeapSize));
|
||||
log_info_p(gc, init)("Heap Max Capacity: " SIZE_FORMAT "%s",
|
||||
byte_size_in_exact_unit(MaxHeapSize), exact_unit_for_byte_size(MaxHeapSize));
|
||||
|
||||
log_info(gc, init)("Pre-touch: %s", AlwaysPreTouch ? "Enabled" : "Disabled");
|
||||
log_info_p(gc, init)("Pre-touch: %s", AlwaysPreTouch ? "Enabled" : "Disabled");
|
||||
}
|
||||
|
||||
void GCInitLogger::print_workers() {
|
||||
if (ParallelGCThreads > 0) {
|
||||
log_info(gc, init)("Parallel Workers: %u", ParallelGCThreads);
|
||||
log_info_p(gc, init)("Parallel Workers: %u", ParallelGCThreads);
|
||||
}
|
||||
if (ConcGCThreads > 0) {
|
||||
log_info(gc, init)("Concurrent Workers: %u", ConcGCThreads);
|
||||
log_info_p(gc, init)("Concurrent Workers: %u", ConcGCThreads);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,7 +113,7 @@ GCPhase::PhaseType TimePartitions::current_phase_type() const {
|
||||
}
|
||||
|
||||
TimePartitions::TimePartitions() {
|
||||
_phases = new (ResourceObj::C_HEAP, mtGC) GrowableArray<GCPhase>(INITIAL_CAPACITY, true, mtGC);
|
||||
_phases = new (ResourceObj::C_HEAP, mtGC) GrowableArray<GCPhase>(INITIAL_CAPACITY, mtGC);
|
||||
clear();
|
||||
}
|
||||
|
||||
|
@ -94,6 +94,17 @@ void AbstractWorkGang::threads_do(ThreadClosure* tc) const {
|
||||
}
|
||||
}
|
||||
|
||||
static void run_foreground_task_if_needed(AbstractGangTask* task, uint num_workers,
|
||||
bool add_foreground_work) {
|
||||
if (add_foreground_work) {
|
||||
log_develop_trace(gc, workgang)("Running work gang: %s task: %s worker: foreground",
|
||||
Thread::current()->name(), task->name());
|
||||
task->work(num_workers);
|
||||
log_develop_trace(gc, workgang)("Finished work gang: %s task: %s worker: foreground "
|
||||
"thread: " PTR_FORMAT, Thread::current()->name(), task->name(), p2i(Thread::current()));
|
||||
}
|
||||
}
|
||||
|
||||
// WorkGang dispatcher implemented with semaphores.
|
||||
//
|
||||
// Semaphores don't require the worker threads to re-claim the lock when they wake up.
|
||||
@ -124,7 +135,7 @@ public:
|
||||
delete _end_semaphore;
|
||||
}
|
||||
|
||||
void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers) {
|
||||
void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers, bool add_foreground_work) {
|
||||
// No workers are allowed to read the state variables until they have been signaled.
|
||||
_task = task;
|
||||
_not_finished = num_workers;
|
||||
@ -132,6 +143,8 @@ public:
|
||||
// Dispatch 'num_workers' number of tasks.
|
||||
_start_semaphore->signal(num_workers);
|
||||
|
||||
run_foreground_task_if_needed(task, num_workers, add_foreground_work);
|
||||
|
||||
// Wait for the last worker to signal the coordinator.
|
||||
_end_semaphore->wait();
|
||||
|
||||
@ -188,7 +201,7 @@ class MutexGangTaskDispatcher : public GangTaskDispatcher {
|
||||
delete _monitor;
|
||||
}
|
||||
|
||||
void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers) {
|
||||
void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers, bool add_foreground_work) {
|
||||
MonitorLocker ml(_monitor, Mutex::_no_safepoint_check_flag);
|
||||
|
||||
_task = task;
|
||||
@ -197,6 +210,8 @@ class MutexGangTaskDispatcher : public GangTaskDispatcher {
|
||||
// Tell the workers to get to work.
|
||||
_monitor->notify_all();
|
||||
|
||||
run_foreground_task_if_needed(task, num_workers, add_foreground_work);
|
||||
|
||||
// Wait for them to finish.
|
||||
while (_finished < _num_workers) {
|
||||
ml.wait();
|
||||
@ -263,14 +278,14 @@ void WorkGang::run_task(AbstractGangTask* task) {
|
||||
run_task(task, active_workers());
|
||||
}
|
||||
|
||||
void WorkGang::run_task(AbstractGangTask* task, uint num_workers) {
|
||||
void WorkGang::run_task(AbstractGangTask* task, uint num_workers, bool add_foreground_work) {
|
||||
guarantee(num_workers <= total_workers(),
|
||||
"Trying to execute task %s with %u workers which is more than the amount of total workers %u.",
|
||||
task->name(), num_workers, total_workers());
|
||||
guarantee(num_workers > 0, "Trying to execute task %s with zero workers", task->name());
|
||||
uint old_num_workers = _active_workers;
|
||||
update_active_workers(num_workers);
|
||||
_dispatcher->coordinator_execute_on_workers(task, num_workers);
|
||||
_dispatcher->coordinator_execute_on_workers(task, num_workers, add_foreground_work);
|
||||
update_active_workers(old_num_workers);
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,8 @@ class GangTaskDispatcher : public CHeapObj<mtGC> {
|
||||
|
||||
// Distributes the task out to num_workers workers.
|
||||
// Returns when the task has been completed by all workers.
|
||||
virtual void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers) = 0;
|
||||
virtual void coordinator_execute_on_workers(AbstractGangTask* task, uint num_workers,
|
||||
bool add_foreground_work) = 0;
|
||||
|
||||
// Worker API.
|
||||
|
||||
@ -215,8 +216,9 @@ public:
|
||||
// Run a task with the given number of workers, returns
|
||||
// when the task is done. The number of workers must be at most the number of
|
||||
// active workers. Additional workers may be created if an insufficient
|
||||
// number currently exists.
|
||||
void run_task(AbstractGangTask* task, uint num_workers);
|
||||
// number currently exists. If the add_foreground_work flag is true, the current thread
|
||||
// is used to run the task too.
|
||||
void run_task(AbstractGangTask* task, uint num_workers, bool add_foreground_work = false);
|
||||
|
||||
protected:
|
||||
virtual AbstractGangWorker* allocate_worker(uint which);
|
||||
|
@ -67,6 +67,7 @@ void ShenandoahAsserts::print_obj(ShenandoahMessageBuffer& msg, oop obj) {
|
||||
|
||||
msg.append(" " PTR_FORMAT " - klass " PTR_FORMAT " %s\n", p2i(obj), p2i(obj->klass()), obj->klass()->external_name());
|
||||
msg.append(" %3s allocated after mark start\n", ctx->allocated_after_mark_start(obj) ? "" : "not");
|
||||
msg.append(" %3s after update watermark\n", cast_from_oop<HeapWord*>(obj) >= r->get_update_watermark() ? "" : "not");
|
||||
msg.append(" %3s marked \n", ctx->is_marked(obj) ? "" : "not");
|
||||
msg.append(" %3s in collection set\n", heap->in_collection_set(obj) ? "" : "not");
|
||||
msg.append(" mark:%s\n", mw_ss.as_string());
|
||||
|
@ -53,6 +53,9 @@ ShenandoahControlThread::ShenandoahControlThread() :
|
||||
create_and_start(ShenandoahCriticalControlThreadPriority ? CriticalPriority : NearMaxPriority);
|
||||
_periodic_task.enroll();
|
||||
_periodic_satb_flush_task.enroll();
|
||||
if (ShenandoahPacing) {
|
||||
_periodic_pacer_notify_task.enroll();
|
||||
}
|
||||
}
|
||||
|
||||
ShenandoahControlThread::~ShenandoahControlThread() {
|
||||
@ -68,6 +71,11 @@ void ShenandoahPeriodicSATBFlushTask::task() {
|
||||
ShenandoahHeap::heap()->force_satb_flush_all_threads();
|
||||
}
|
||||
|
||||
void ShenandoahPeriodicPacerNotify::task() {
|
||||
assert(ShenandoahPacing, "Should not be here otherwise");
|
||||
ShenandoahHeap::heap()->pacer()->notify_waiters();
|
||||
}
|
||||
|
||||
void ShenandoahControlThread::run_service() {
|
||||
ShenandoahHeap* heap = ShenandoahHeap::heap();
|
||||
|
||||
|
@ -52,6 +52,13 @@ public:
|
||||
virtual void task();
|
||||
};
|
||||
|
||||
// Periodic task to notify blocked paced waiters.
|
||||
class ShenandoahPeriodicPacerNotify : public PeriodicTask {
|
||||
public:
|
||||
ShenandoahPeriodicPacerNotify() : PeriodicTask(PeriodicTask::min_interval) {}
|
||||
virtual void task();
|
||||
};
|
||||
|
||||
class ShenandoahControlThread: public ConcurrentGCThread {
|
||||
friend class VMStructs;
|
||||
|
||||
@ -70,6 +77,7 @@ private:
|
||||
Monitor _gc_waiters_lock;
|
||||
ShenandoahPeriodicTask _periodic_task;
|
||||
ShenandoahPeriodicSATBFlushTask _periodic_satb_flush_task;
|
||||
ShenandoahPeriodicPacerNotify _periodic_pacer_notify_task;
|
||||
|
||||
public:
|
||||
void run_service();
|
||||
|
@ -1297,11 +1297,16 @@ void ShenandoahHeap::object_iterate(ObjectClosure* cl) {
|
||||
|
||||
Stack<oop,mtGC> oop_stack;
|
||||
|
||||
// First, we process GC roots according to current GC cycle. This populates the work stack with initial objects.
|
||||
ShenandoahHeapIterationRootScanner rp;
|
||||
ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
|
||||
|
||||
rp.roots_do(&oops);
|
||||
{
|
||||
// First, we process GC roots according to current GC cycle.
|
||||
// This populates the work stack with initial objects.
|
||||
// It is important to relinquish the associated locks before diving
|
||||
// into heap dumper.
|
||||
ShenandoahHeapIterationRootScanner rp;
|
||||
rp.roots_do(&oops);
|
||||
}
|
||||
|
||||
// Work through the oop stack to traverse heap.
|
||||
while (! oop_stack.is_empty()) {
|
||||
|
@ -207,8 +207,7 @@ void ShenandoahNMethod::heal_nmethod(nmethod* nm) {
|
||||
}
|
||||
|
||||
#ifdef ASSERT
|
||||
void ShenandoahNMethod::assert_alive_and_correct() {
|
||||
assert(_nm->is_alive(), "only alive nmethods here");
|
||||
void ShenandoahNMethod::assert_correct() {
|
||||
ShenandoahHeap* heap = ShenandoahHeap::heap();
|
||||
for (int c = 0; c < _oops_count; c++) {
|
||||
oop *loc = _oops[c];
|
||||
@ -490,14 +489,14 @@ void ShenandoahNMethodTable::log_flush_nmethod(nmethod* nm) {
|
||||
}
|
||||
|
||||
#ifdef ASSERT
|
||||
void ShenandoahNMethodTable::assert_nmethods_alive_and_correct() {
|
||||
void ShenandoahNMethodTable::assert_nmethods_correct() {
|
||||
assert_locked_or_safepoint(CodeCache_lock);
|
||||
|
||||
for (int index = 0; index < length(); index ++) {
|
||||
ShenandoahNMethod* m = _list->at(index);
|
||||
// Concurrent unloading may have dead nmethods to be cleaned by sweeper
|
||||
if (m->is_unregistered()) continue;
|
||||
m->assert_alive_and_correct();
|
||||
m->assert_correct();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -563,8 +562,11 @@ void ShenandoahNMethodTableSnapshot::parallel_blobs_do(CodeBlobClosure *f) {
|
||||
continue;
|
||||
}
|
||||
|
||||
nmr->assert_alive_and_correct();
|
||||
f->do_code_blob(nmr->nm());
|
||||
// A nmethod can become a zombie before it is unregistered.
|
||||
if (nmr->nm()->is_alive()) {
|
||||
nmr->assert_correct();
|
||||
f->do_code_blob(nmr->nm());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -73,7 +73,7 @@ public:
|
||||
static inline ShenandoahNMethod* gc_data(nmethod* nm);
|
||||
static inline void attach_gc_data(nmethod* nm, ShenandoahNMethod* gc_data);
|
||||
|
||||
void assert_alive_and_correct() NOT_DEBUG_RETURN;
|
||||
void assert_correct() NOT_DEBUG_RETURN;
|
||||
void assert_same_oops(bool allow_dead = false) NOT_DEBUG_RETURN;
|
||||
static void assert_no_oops(nmethod* nm, bool allow_dea = false) NOT_DEBUG_RETURN;
|
||||
|
||||
@ -160,7 +160,7 @@ public:
|
||||
ShenandoahNMethodTableSnapshot* snapshot_for_iteration();
|
||||
void finish_iteration(ShenandoahNMethodTableSnapshot* snapshot);
|
||||
|
||||
void assert_nmethods_alive_and_correct() NOT_DEBUG_RETURN;
|
||||
void assert_nmethods_correct() NOT_DEBUG_RETURN;
|
||||
private:
|
||||
// Rebuild table and replace current one
|
||||
void rebuild(int size);
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "gc/shenandoah/shenandoahHeap.inline.hpp"
|
||||
#include "gc/shenandoah/shenandoahPacer.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/mutexLocker.hpp"
|
||||
|
||||
/*
|
||||
* In normal concurrent cycle, we have to pace the application to let GC finish.
|
||||
@ -49,12 +50,8 @@
|
||||
* notion of progress is clear: we get reported the "used" size from the processed regions
|
||||
* and use the global heap-used as the baseline.
|
||||
*
|
||||
* The allocatable space when GC is running is "free" at the start of cycle, but the
|
||||
* The allocatable space when GC is running is "free" at the start of phase, but the
|
||||
* accounted budget is based on "used". So, we need to adjust the tax knowing that.
|
||||
* Also, since we effectively count the used space three times (mark, evac, update-refs),
|
||||
* we need to multiply the tax by 3. Example: for 10 MB free and 90 MB used, GC would
|
||||
* come back with 3*90 MB budget, and thus for each 1 MB of allocation, we have to pay
|
||||
* 3*90 / 10 MBs. In the end, we would pay back the entire budget.
|
||||
*/
|
||||
|
||||
void ShenandoahPacer::setup_for_mark() {
|
||||
@ -67,7 +64,7 @@ void ShenandoahPacer::setup_for_mark() {
|
||||
size_t taxable = free - non_taxable;
|
||||
|
||||
double tax = 1.0 * live / taxable; // base tax for available free space
|
||||
tax *= 3; // mark is phase 1 of 3, claim 1/3 of free for it
|
||||
tax *= 1; // mark can succeed with immediate garbage, claim all available space
|
||||
tax *= ShenandoahPacingSurcharge; // additional surcharge to help unclutter heap
|
||||
|
||||
restart_with(non_taxable, tax);
|
||||
@ -90,7 +87,7 @@ void ShenandoahPacer::setup_for_evac() {
|
||||
size_t taxable = free - non_taxable;
|
||||
|
||||
double tax = 1.0 * used / taxable; // base tax for available free space
|
||||
tax *= 2; // evac is phase 2 of 3, claim 1/2 of remaining free
|
||||
tax *= 2; // evac is followed by update-refs, claim 1/2 of remaining free
|
||||
tax = MAX2<double>(1, tax); // never allocate more than GC processes during the phase
|
||||
tax *= ShenandoahPacingSurcharge; // additional surcharge to help unclutter heap
|
||||
|
||||
@ -114,7 +111,7 @@ void ShenandoahPacer::setup_for_updaterefs() {
|
||||
size_t taxable = free - non_taxable;
|
||||
|
||||
double tax = 1.0 * used / taxable; // base tax for available free space
|
||||
tax *= 1; // update-refs is phase 3 of 3, claim the remaining free
|
||||
tax *= 1; // update-refs is the last phase, claim the remaining free
|
||||
tax = MAX2<double>(1, tax); // never allocate more than GC processes during the phase
|
||||
tax *= ShenandoahPacingSurcharge; // additional surcharge to help unclutter heap
|
||||
|
||||
@ -194,6 +191,9 @@ void ShenandoahPacer::restart_with(size_t non_taxable_bytes, double tax_rate) {
|
||||
Atomic::xchg(&_budget, (intptr_t)initial);
|
||||
Atomic::store(&_tax_rate, tax_rate);
|
||||
Atomic::inc(&_epoch);
|
||||
|
||||
// Shake up stalled waiters after budget update.
|
||||
_need_notify_waiters.try_set();
|
||||
}
|
||||
|
||||
bool ShenandoahPacer::claim_for_alloc(size_t words, bool force) {
|
||||
@ -222,8 +222,8 @@ void ShenandoahPacer::unpace_for_alloc(intptr_t epoch, size_t words) {
|
||||
return;
|
||||
}
|
||||
|
||||
intptr_t tax = MAX2<intptr_t>(1, words * Atomic::load(&_tax_rate));
|
||||
Atomic::add(&_budget, tax);
|
||||
size_t tax = MAX2<size_t>(1, words * Atomic::load(&_tax_rate));
|
||||
add_budget(tax);
|
||||
}
|
||||
|
||||
intptr_t ShenandoahPacer::epoch() {
|
||||
@ -234,58 +234,63 @@ void ShenandoahPacer::pace_for_alloc(size_t words) {
|
||||
assert(ShenandoahPacing, "Only be here when pacing is enabled");
|
||||
|
||||
// Fast path: try to allocate right away
|
||||
if (claim_for_alloc(words, false)) {
|
||||
bool claimed = claim_for_alloc(words, false);
|
||||
if (claimed) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Forcefully claim the budget: it may go negative at this point, and
|
||||
// GC should replenish for this and subsequent allocations. After this claim,
|
||||
// we would wait a bit until our claim is matched by additional progress,
|
||||
// or the time budget depletes.
|
||||
claimed = claim_for_alloc(words, true);
|
||||
assert(claimed, "Should always succeed");
|
||||
|
||||
// Threads that are attaching should not block at all: they are not
|
||||
// fully initialized yet. Calling sleep() on them would be awkward.
|
||||
// fully initialized yet. Blocking them would be awkward.
|
||||
// This is probably the path that allocates the thread oop itself.
|
||||
// Forcefully claim without waiting.
|
||||
if (JavaThread::current()->is_attaching_via_jni()) {
|
||||
claim_for_alloc(words, true);
|
||||
return;
|
||||
}
|
||||
|
||||
size_t max = ShenandoahPacingMaxDelay;
|
||||
double start = os::elapsedTime();
|
||||
|
||||
size_t total = 0;
|
||||
size_t cur = 0;
|
||||
size_t max_ms = ShenandoahPacingMaxDelay;
|
||||
size_t total_ms = 0;
|
||||
|
||||
while (true) {
|
||||
// We could instead assist GC, but this would suffice for now.
|
||||
// This code should also participate in safepointing.
|
||||
// Perform the exponential backoff, limited by max.
|
||||
|
||||
cur = cur * 2;
|
||||
if (total + cur > max) {
|
||||
cur = (max > total) ? (max - total) : 0;
|
||||
}
|
||||
cur = MAX2<size_t>(1, cur);
|
||||
|
||||
JavaThread::current()->sleep(cur);
|
||||
size_t cur_ms = (max_ms > total_ms) ? (max_ms - total_ms) : 1;
|
||||
wait(cur_ms);
|
||||
|
||||
double end = os::elapsedTime();
|
||||
total = (size_t)((end - start) * 1000);
|
||||
total_ms = (size_t)((end - start) * 1000);
|
||||
|
||||
if (total > max) {
|
||||
// Spent local time budget to wait for enough GC progress.
|
||||
// Breaking out and allocating anyway, which may mean we outpace GC,
|
||||
// and start Degenerated GC cycle.
|
||||
_delays.add(total);
|
||||
|
||||
// Forcefully claim the budget: it may go negative at this point, and
|
||||
// GC should replenish for this and subsequent allocations
|
||||
claim_for_alloc(words, true);
|
||||
if (total_ms > max_ms || Atomic::load(&_budget) >= 0) {
|
||||
// Exiting if either:
|
||||
// a) Spent local time budget to wait for enough GC progress.
|
||||
// Breaking out and allocating anyway, which may mean we outpace GC,
|
||||
// and start Degenerated GC cycle.
|
||||
// b) The budget had been replenished, which means our claim is satisfied.
|
||||
_delays.add(total_ms);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (claim_for_alloc(words, false)) {
|
||||
// Acquired enough permit, nice. Can allocate now.
|
||||
_delays.add(total);
|
||||
break;
|
||||
}
|
||||
void ShenandoahPacer::wait(size_t time_ms) {
|
||||
// Perform timed wait. It works like like sleep(), except without modifying
|
||||
// the thread interruptible status. MonitorLocker also checks for safepoints.
|
||||
assert(time_ms > 0, "Should not call this with zero argument, as it would stall until notify");
|
||||
assert(time_ms <= LONG_MAX, "Sanity");
|
||||
MonitorLocker locker(_wait_monitor);
|
||||
_wait_monitor->wait((long)time_ms);
|
||||
}
|
||||
|
||||
void ShenandoahPacer::notify_waiters() {
|
||||
if (_need_notify_waiters.try_unset()) {
|
||||
MonitorLocker locker(_wait_monitor);
|
||||
_wait_monitor->notify_all();
|
||||
}
|
||||
}
|
||||
|
||||
|
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