This commit is contained in:
Phil Race 2020-06-22 15:55:57 -07:00
commit 2c868d6101
703 changed files with 17742 additions and 4652 deletions
.hgtags
make
src/hotspot

@ -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

@ -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"),

@ -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")

@ -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;)

@ -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)

@ -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;

@ -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

@ -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")

@ -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;

@ -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

@ -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

@ -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")

@ -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

@ -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")

@ -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

@ -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

@ -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

@ -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

@ -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, \

@ -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

@ -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(&copy);
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