Merge
This commit is contained in:
commit
b870874d22
.hgtags
make
autoconf
data/symbols
java.base-D.sym.txtjava.compiler-D.sym.txtjava.desktop-D.sym.txtjava.management-D.sym.txtjava.management.rmi-D.sym.txtjava.net.http-D.sym.txtjava.xml-D.sym.txtjava.xml.crypto-D.sym.txtjdk.compiler-D.sym.txtjdk.httpserver-D.sym.txtjdk.javadoc-D.sym.txtjdk.jlink-D.sym.txtjdk.jshell-D.sym.txtsymbols
jdk/src/classes/build/tools/generatecacerts
lib
src/hotspot
cpu
aarch64
aarch64-asmtest.pyaarch64.adassembler_aarch64.cppassembler_aarch64.hppc1_LIRAssembler_aarch64.cppc1_LIRGenerator_aarch64.cppframe_aarch64.cpp
gc/z
interp_masm_aarch64.hppmacroAssembler_aarch64.cppmacroAssembler_aarch64_log.cppmacroAssembler_aarch64_trig.cppregister_aarch64.hppstubGenerator_aarch64.cppvm_version_aarch64.cppppc
c1_LIRAssembler_ppc.cppinterp_masm_ppc.hppinterp_masm_ppc_64.cppmacroAssembler_ppc.cppmacroAssembler_ppc.hppppc.adsharedRuntime_ppc.cpptemplateTable_ppc_64.cppvm_version_ppc.hpp
s390
os
os_cpu/linux_aarch64
atomic_linux_aarch64.hppcopy_linux_aarch64.s
gc/z
zArguments_linux_aarch64.cppzBackingFile_linux_aarch64.cppzBackingFile_linux_aarch64.hppzBackingPath_linux_aarch64.cppzBackingPath_linux_aarch64.hppzGlobals_linux_aarch64.cppzGlobals_linux_aarch64.hppzPhysicalMemoryBacking_linux_aarch64.cppzPhysicalMemoryBacking_linux_aarch64.hpp
os_linux_aarch64.cppshare
3
.hgtags
3
.hgtags
@ -562,3 +562,6 @@ f2f11d7f7f4e7128f8aba6ffa576cfa76fbf7d1a jdk-13+21
|
|||||||
181986c5476468bc2dd4532af49599003ee8af37 jdk-13+22
|
181986c5476468bc2dd4532af49599003ee8af37 jdk-13+22
|
||||||
b034d2dee5fc93d42a81b65e58ce3f91e42586ff jdk-13+23
|
b034d2dee5fc93d42a81b65e58ce3f91e42586ff jdk-13+23
|
||||||
7e2238451585029680f126ccbb46d01f2ff5607f jdk-13+24
|
7e2238451585029680f126ccbb46d01f2ff5607f jdk-13+24
|
||||||
|
22b3b7983adab54e318f75aeb94471f7a4429c1e jdk-14+0
|
||||||
|
22b3b7983adab54e318f75aeb94471f7a4429c1e jdk-13+25
|
||||||
|
2f4e214781a1d597ed36bf5a36f20928c6c82996 jdk-14+1
|
||||||
|
@ -350,7 +350,8 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES],
|
|||||||
|
|
||||||
# Only enable ZGC on supported platforms
|
# Only enable ZGC on supported platforms
|
||||||
AC_MSG_CHECKING([if zgc can be built])
|
AC_MSG_CHECKING([if zgc can be built])
|
||||||
if test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then
|
if (test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xx86_64") || \
|
||||||
|
(test "x$OPENJDK_TARGET_OS" = "xlinux" && test "x$OPENJDK_TARGET_CPU" = "xaarch64"); then
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
else
|
else
|
||||||
DISABLED_JVM_FEATURES="$DISABLED_JVM_FEATURES zgc"
|
DISABLED_JVM_FEATURES="$DISABLED_JVM_FEATURES zgc"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -25,18 +25,18 @@
|
|||||||
|
|
||||||
# Default version numbers to use unless overridden by configure
|
# Default version numbers to use unless overridden by configure
|
||||||
|
|
||||||
DEFAULT_VERSION_FEATURE=13
|
DEFAULT_VERSION_FEATURE=14
|
||||||
DEFAULT_VERSION_INTERIM=0
|
DEFAULT_VERSION_INTERIM=0
|
||||||
DEFAULT_VERSION_UPDATE=0
|
DEFAULT_VERSION_UPDATE=0
|
||||||
DEFAULT_VERSION_PATCH=0
|
DEFAULT_VERSION_PATCH=0
|
||||||
DEFAULT_VERSION_EXTRA1=0
|
DEFAULT_VERSION_EXTRA1=0
|
||||||
DEFAULT_VERSION_EXTRA2=0
|
DEFAULT_VERSION_EXTRA2=0
|
||||||
DEFAULT_VERSION_EXTRA3=0
|
DEFAULT_VERSION_EXTRA3=0
|
||||||
DEFAULT_VERSION_DATE=2019-09-17
|
DEFAULT_VERSION_DATE=2020-03-17
|
||||||
DEFAULT_VERSION_CLASSFILE_MAJOR=57 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
DEFAULT_VERSION_CLASSFILE_MAJOR=58 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="12 13"
|
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="12 13 14"
|
||||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=13
|
DEFAULT_JDK_SOURCE_TARGET_VERSION=14
|
||||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||||
|
|
||||||
LAUNCHER_NAME=openjdk
|
LAUNCHER_NAME=openjdk
|
||||||
|
638
make/data/symbols/java.base-D.sym.txt
Normal file
638
make/data/symbols/java.base-D.sym.txt
Normal file
@ -0,0 +1,638 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/io/ObjectInputStream
|
||||||
|
header extends java/io/InputStream implements java/io/ObjectInput,java/io/ObjectStreamConstants nestMembers java/io/ObjectInputStream$GetField flags 21
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$Config outerClass java/io/ObjectInputFilter innerClassName Config flags 19
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$FilterInfo outerClass java/io/ObjectInputFilter innerClassName FilterInfo flags 609
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$Status outerClass java/io/ObjectInputFilter innerClassName Status flags 4019
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/CharSequence
|
||||||
|
header extends java/lang/Object flags 601
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfInt outerClass java/util/PrimitiveIterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/Character
|
||||||
|
header extends java/lang/Object implements java/io/Serializable,java/lang/Comparable 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;>;
|
||||||
|
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
|
||||||
|
|
||||||
|
class name java/lang/Character$UnicodeBlock
|
||||||
|
header extends java/lang/Character$Subset nestHost java/lang/Character flags 31
|
||||||
|
innerclass innerClass java/lang/Character$Subset outerClass java/lang/Character innerClassName Subset flags 9
|
||||||
|
innerclass innerClass java/lang/Character$UnicodeBlock outerClass java/lang/Character innerClassName UnicodeBlock flags 19
|
||||||
|
field name ELYMAIC descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name NANDINAGARI descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name TAMIL_SUPPLEMENT descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name SMALL_KANA_EXTENSION descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name NYIAKENG_PUACHUE_HMONG descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name WANCHO descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name OTTOMAN_SIYAQ_NUMBERS descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
field name SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A descriptor Ljava/lang/Character$UnicodeBlock; flags 19
|
||||||
|
|
||||||
|
class name java/lang/Character$UnicodeScript
|
||||||
|
field name ELYMAIC descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||||
|
field name NANDINAGARI descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||||
|
field name NYIAKENG_PUACHUE_HMONG descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||||
|
field name WANCHO descriptor Ljava/lang/Character$UnicodeScript; flags 4019
|
||||||
|
|
||||||
|
class name java/lang/Math
|
||||||
|
-method name abs descriptor (I)I
|
||||||
|
-method name abs descriptor (J)J
|
||||||
|
-method name abs descriptor (F)F
|
||||||
|
-method name max descriptor (FF)F
|
||||||
|
-method name max descriptor (DD)D
|
||||||
|
-method name min descriptor (FF)F
|
||||||
|
-method name min descriptor (DD)D
|
||||||
|
method name abs descriptor (I)I flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name abs descriptor (J)J flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name abs descriptor (F)F flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name max descriptor (FF)F flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name max descriptor (DD)D flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name min descriptor (FF)F flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name min descriptor (DD)D flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
|
||||||
|
class name java/lang/Process
|
||||||
|
header extends java/lang/Object flags 421
|
||||||
|
innerclass innerClass java/util/concurrent/ForkJoinPool$ManagedBlocker outerClass java/util/concurrent/ForkJoinPool innerClassName ManagedBlocker flags 609
|
||||||
|
innerclass innerClass java/lang/ProcessHandle$Info outerClass java/lang/ProcessHandle innerClassName Info flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/StrictMath
|
||||||
|
-method name max descriptor (FF)F
|
||||||
|
-method name max descriptor (DD)D
|
||||||
|
-method name min descriptor (FF)F
|
||||||
|
-method name min descriptor (DD)D
|
||||||
|
method name max descriptor (FF)F flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name max descriptor (DD)D flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name min descriptor (FF)F flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
method name min descriptor (DD)D flags 9 runtimeAnnotations @Ljdk/internal/HotSpotIntrinsicCandidate;
|
||||||
|
|
||||||
|
class name java/lang/String
|
||||||
|
header extends java/lang/Object implements java/io/Serializable,java/lang/Comparable,java/lang/CharSequence,java/lang/constant/Constable,java/lang/constant/ConstantDesc flags 31 signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Comparable<Ljava/lang/String;>;Ljava/lang/CharSequence;Ljava/lang/constant/Constable;Ljava/lang/constant/ConstantDesc;
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/System
|
||||||
|
header extends java/lang/Object nestMembers java/lang/System$LoggerFinder,java/lang/System$Logger,java/lang/System$Logger$Level flags 31
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$LoggerFinder outerClass java/lang/System innerClassName LoggerFinder flags 409
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/constant/DynamicConstantDesc
|
||||||
|
header extends java/lang/Object implements java/lang/constant/ConstantDesc flags 421 signature <T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/lang/constant/ConstantDesc;
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
innerclass innerClass java/lang/Enum$EnumDesc outerClass java/lang/Enum innerClassName EnumDesc flags 19
|
||||||
|
innerclass innerClass java/lang/invoke/VarHandle$VarHandleDesc outerClass java/lang/invoke/VarHandle innerClassName VarHandleDesc flags 19
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
|
||||||
|
class name java/lang/constant/MethodTypeDesc
|
||||||
|
header extends java/lang/Object implements java/lang/constant/ConstantDesc,java/lang/invoke/TypeDescriptor$OfMethod flags 601 signature Ljava/lang/Object;Ljava/lang/constant/ConstantDesc;Ljava/lang/invoke/TypeDescriptor$OfMethod<Ljava/lang/constant/ClassDesc;Ljava/lang/constant/MethodTypeDesc;>;
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfMethod outerClass java/lang/invoke/TypeDescriptor innerClassName OfMethod flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfField outerClass java/lang/invoke/TypeDescriptor innerClassName OfField flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/invoke/MethodType
|
||||||
|
header extends java/lang/Object implements java/lang/constant/Constable,java/lang/invoke/TypeDescriptor$OfMethod,java/io/Serializable flags 31 signature Ljava/lang/Object;Ljava/lang/constant/Constable;Ljava/lang/invoke/TypeDescriptor$OfMethod<Ljava/lang/Class<*>;Ljava/lang/invoke/MethodType;>;Ljava/io/Serializable;
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfMethod outerClass java/lang/invoke/TypeDescriptor innerClassName OfMethod flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfField outerClass java/lang/invoke/TypeDescriptor innerClassName OfField flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/invoke/TypeDescriptor$OfMethod
|
||||||
|
header extends java/lang/Object implements java/lang/invoke/TypeDescriptor nestHost java/lang/invoke/TypeDescriptor flags 601 signature <F::Ljava/lang/invoke/TypeDescriptor$OfField<TF;>;M::Ljava/lang/invoke/TypeDescriptor$OfMethod<TF;TM;>;>Ljava/lang/Object;Ljava/lang/invoke/TypeDescriptor;
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfMethod outerClass java/lang/invoke/TypeDescriptor innerClassName OfMethod flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/TypeDescriptor$OfField outerClass java/lang/invoke/TypeDescriptor innerClassName OfField flags 609
|
||||||
|
|
||||||
|
class name java/lang/invoke/VarHandle
|
||||||
|
header extends java/lang/Object implements java/lang/constant/Constable nestMembers java/lang/invoke/VarHandle$VarHandleDesc,java/lang/invoke/VarHandle$AccessMode flags 421
|
||||||
|
innerclass innerClass java/lang/invoke/VarHandle$AccessMode outerClass java/lang/invoke/VarHandle innerClassName AccessMode flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/VarHandle$VarHandleDesc outerClass java/lang/invoke/VarHandle innerClassName VarHandleDesc flags 19
|
||||||
|
|
||||||
|
class name java/lang/module/ModuleDescriptor
|
||||||
|
header extends java/lang/Object implements java/lang/Comparable nestMembers java/lang/module/ModuleDescriptor$Builder,java/lang/module/ModuleDescriptor$Version,java/lang/module/ModuleDescriptor$Provides,java/lang/module/ModuleDescriptor$Opens,java/lang/module/ModuleDescriptor$Opens$Modifier,java/lang/module/ModuleDescriptor$Exports,java/lang/module/ModuleDescriptor$Exports$Modifier,java/lang/module/ModuleDescriptor$Requires,java/lang/module/ModuleDescriptor$Requires$Modifier,java/lang/module/ModuleDescriptor$Modifier flags 21 signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/lang/module/ModuleDescriptor;>;
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Version outerClass java/lang/module/ModuleDescriptor innerClassName Version flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Modifier outerClass java/lang/module/ModuleDescriptor innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Builder outerClass java/lang/module/ModuleDescriptor innerClassName Builder flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Provides outerClass java/lang/module/ModuleDescriptor innerClassName Provides flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Opens outerClass java/lang/module/ModuleDescriptor innerClassName Opens flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Exports outerClass java/lang/module/ModuleDescriptor innerClassName Exports flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires outerClass java/lang/module/ModuleDescriptor innerClassName Requires flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Opens$Modifier outerClass java/lang/module/ModuleDescriptor$Opens innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Exports$Modifier outerClass java/lang/module/ModuleDescriptor$Exports innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires$Modifier outerClass java/lang/module/ModuleDescriptor$Requires innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/module/ModuleDescriptor$Builder
|
||||||
|
header extends java/lang/Object nestHost java/lang/module/ModuleDescriptor flags 31
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Builder outerClass java/lang/module/ModuleDescriptor innerClassName Builder flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Modifier outerClass java/lang/module/ModuleDescriptor innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires outerClass java/lang/module/ModuleDescriptor innerClassName Requires flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Version outerClass java/lang/module/ModuleDescriptor innerClassName Version flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires$Modifier outerClass java/lang/module/ModuleDescriptor$Requires innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Exports outerClass java/lang/module/ModuleDescriptor innerClassName Exports flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Opens outerClass java/lang/module/ModuleDescriptor innerClassName Opens flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Provides outerClass java/lang/module/ModuleDescriptor innerClassName Provides flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Exports$Modifier outerClass java/lang/module/ModuleDescriptor$Exports innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Opens$Modifier outerClass java/lang/module/ModuleDescriptor$Opens innerClassName Modifier flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/lang/module/ModuleDescriptor$Requires
|
||||||
|
header extends java/lang/Object implements java/lang/Comparable nestHost java/lang/module/ModuleDescriptor flags 31 signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/lang/module/ModuleDescriptor$Requires;>;
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires outerClass java/lang/module/ModuleDescriptor innerClassName Requires flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Version outerClass java/lang/module/ModuleDescriptor innerClassName Version flags 19
|
||||||
|
innerclass innerClass java/lang/module/ModuleDescriptor$Requires$Modifier outerClass java/lang/module/ModuleDescriptor$Requires innerClassName Modifier flags 4019
|
||||||
|
|
||||||
|
class name java/net/Socket
|
||||||
|
header extends java/lang/Object implements java/io/Closeable flags 21
|
||||||
|
innerclass innerClass java/net/Proxy$Type outerClass java/net/Proxy innerClassName Type flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/net/SocketImpl
|
||||||
|
header extends java/lang/Object implements java/net/SocketOptions flags 421
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/net/URL
|
||||||
|
header extends java/lang/Object implements java/io/Serializable flags 31
|
||||||
|
innerclass innerClass java/net/Proxy$Type outerClass java/net/Proxy innerClassName Type flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
|
||||||
|
class name java/nio/Buffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 401
|
||||||
|
|
||||||
|
class name java/nio/ByteBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/ByteBuffer; flags 401
|
||||||
|
method name get descriptor (I[BII)Ljava/nio/ByteBuffer; flags 1
|
||||||
|
method name get descriptor (I[B)Ljava/nio/ByteBuffer; flags 1
|
||||||
|
method name put descriptor (I[BII)Ljava/nio/ByteBuffer; flags 1
|
||||||
|
method name put descriptor (I[B)Ljava/nio/ByteBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/CharBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/CharBuffer; flags 401
|
||||||
|
method name get descriptor (I[CII)Ljava/nio/CharBuffer; flags 1
|
||||||
|
method name get descriptor (I[C)Ljava/nio/CharBuffer; flags 1
|
||||||
|
method name put descriptor (I[CII)Ljava/nio/CharBuffer; flags 1
|
||||||
|
method name put descriptor (I[C)Ljava/nio/CharBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/DoubleBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/DoubleBuffer; flags 401
|
||||||
|
method name get descriptor (I[DII)Ljava/nio/DoubleBuffer; flags 1
|
||||||
|
method name get descriptor (I[D)Ljava/nio/DoubleBuffer; flags 1
|
||||||
|
method name put descriptor (I[DII)Ljava/nio/DoubleBuffer; flags 1
|
||||||
|
method name put descriptor (I[D)Ljava/nio/DoubleBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/FloatBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/FloatBuffer; flags 401
|
||||||
|
method name get descriptor (I[FII)Ljava/nio/FloatBuffer; flags 1
|
||||||
|
method name get descriptor (I[F)Ljava/nio/FloatBuffer; flags 1
|
||||||
|
method name put descriptor (I[FII)Ljava/nio/FloatBuffer; flags 1
|
||||||
|
method name put descriptor (I[F)Ljava/nio/FloatBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/IntBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/IntBuffer; flags 401
|
||||||
|
method name get descriptor (I[III)Ljava/nio/IntBuffer; flags 1
|
||||||
|
method name get descriptor (I[I)Ljava/nio/IntBuffer; flags 1
|
||||||
|
method name put descriptor (I[III)Ljava/nio/IntBuffer; flags 1
|
||||||
|
method name put descriptor (I[I)Ljava/nio/IntBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/LongBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/LongBuffer; flags 401
|
||||||
|
method name get descriptor (I[JII)Ljava/nio/LongBuffer; flags 1
|
||||||
|
method name get descriptor (I[J)Ljava/nio/LongBuffer; flags 1
|
||||||
|
method name put descriptor (I[JII)Ljava/nio/LongBuffer; flags 1
|
||||||
|
method name put descriptor (I[J)Ljava/nio/LongBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/MappedByteBuffer
|
||||||
|
method name force descriptor (II)Ljava/nio/MappedByteBuffer; flags 11
|
||||||
|
|
||||||
|
class name java/nio/ShortBuffer
|
||||||
|
method name slice descriptor (II)Ljava/nio/ShortBuffer; flags 401
|
||||||
|
method name get descriptor (I[SII)Ljava/nio/ShortBuffer; flags 1
|
||||||
|
method name get descriptor (I[S)Ljava/nio/ShortBuffer; flags 1
|
||||||
|
method name put descriptor (I[SII)Ljava/nio/ShortBuffer; flags 1
|
||||||
|
method name put descriptor (I[S)Ljava/nio/ShortBuffer; flags 1
|
||||||
|
method name slice descriptor (II)Ljava/nio/Buffer; flags 1041
|
||||||
|
|
||||||
|
class name java/nio/file/FileSystems
|
||||||
|
method name newFileSystem descriptor (Ljava/nio/file/Path;Ljava/util/Map;)Ljava/nio/file/FileSystem; thrownTypes java/io/IOException flags 9 signature (Ljava/nio/file/Path;Ljava/util/Map<Ljava/lang/String;*>;)Ljava/nio/file/FileSystem;
|
||||||
|
method name newFileSystem descriptor (Ljava/nio/file/Path;)Ljava/nio/file/FileSystem; thrownTypes java/io/IOException flags 9
|
||||||
|
method name newFileSystem descriptor (Ljava/nio/file/Path;Ljava/util/Map;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem; thrownTypes java/io/IOException flags 9 signature (Ljava/nio/file/Path;Ljava/util/Map<Ljava/lang/String;*>;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;
|
||||||
|
|
||||||
|
class name java/nio/file/Path
|
||||||
|
header extends java/lang/Object implements java/lang/Comparable,java/lang/Iterable,java/nio/file/Watchable flags 601 signature Ljava/lang/Object;Ljava/lang/Comparable<Ljava/nio/file/Path;>;Ljava/lang/Iterable<Ljava/nio/file/Path;>;Ljava/nio/file/Watchable;
|
||||||
|
innerclass innerClass java/nio/file/WatchEvent$Modifier outerClass java/nio/file/WatchEvent innerClassName Modifier flags 609
|
||||||
|
innerclass innerClass java/nio/file/WatchEvent$Kind outerClass java/nio/file/WatchEvent innerClassName Kind flags 609
|
||||||
|
|
||||||
|
class name java/security/DomainLoadStoreParameter
|
||||||
|
header extends java/lang/Object implements java/security/KeyStore$LoadStoreParameter flags 31
|
||||||
|
innerclass innerClass java/security/KeyStore$LoadStoreParameter outerClass java/security/KeyStore innerClassName LoadStoreParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$ProtectionParameter outerClass java/security/KeyStore innerClassName ProtectionParameter flags 609
|
||||||
|
|
||||||
|
class name java/security/DrbgParameters
|
||||||
|
header extends java/lang/Object nestMembers java/security/DrbgParameters$Reseed,java/security/DrbgParameters$NextBytes,java/security/DrbgParameters$Instantiation,java/security/DrbgParameters$Capability flags 21
|
||||||
|
innerclass innerClass java/security/DrbgParameters$Instantiation outerClass java/security/DrbgParameters innerClassName Instantiation flags 19
|
||||||
|
innerclass innerClass java/security/DrbgParameters$Capability outerClass java/security/DrbgParameters innerClassName Capability flags 4019
|
||||||
|
innerclass innerClass java/security/DrbgParameters$NextBytes outerClass java/security/DrbgParameters innerClassName NextBytes flags 19
|
||||||
|
innerclass innerClass java/security/DrbgParameters$Reseed outerClass java/security/DrbgParameters innerClassName Reseed flags 19
|
||||||
|
|
||||||
|
class name java/security/DrbgParameters$Instantiation
|
||||||
|
header extends java/lang/Object implements java/security/SecureRandomParameters nestHost java/security/DrbgParameters flags 31
|
||||||
|
innerclass innerClass java/security/DrbgParameters$Instantiation outerClass java/security/DrbgParameters innerClassName Instantiation flags 19
|
||||||
|
innerclass innerClass java/security/DrbgParameters$Capability outerClass java/security/DrbgParameters innerClassName Capability flags 4019
|
||||||
|
|
||||||
|
class name java/security/KeyStore
|
||||||
|
header extends java/lang/Object nestMembers java/security/KeyStore$Builder,java/security/KeyStore$TrustedCertificateEntry,java/security/KeyStore$SecretKeyEntry,java/security/KeyStore$PrivateKeyEntry,java/security/KeyStore$Entry,java/security/KeyStore$Entry$Attribute,java/security/KeyStore$CallbackHandlerProtection,java/security/KeyStore$PasswordProtection,java/security/KeyStore$ProtectionParameter,java/security/KeyStore$LoadStoreParameter flags 21
|
||||||
|
innerclass innerClass java/security/KeyStore$LoadStoreParameter outerClass java/security/KeyStore innerClassName LoadStoreParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$ProtectionParameter outerClass java/security/KeyStore innerClassName ProtectionParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry outerClass java/security/KeyStore innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$Builder outerClass java/security/KeyStore innerClassName Builder flags 409
|
||||||
|
innerclass innerClass java/security/KeyStore$TrustedCertificateEntry outerClass java/security/KeyStore innerClassName TrustedCertificateEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$SecretKeyEntry outerClass java/security/KeyStore innerClassName SecretKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$PrivateKeyEntry outerClass java/security/KeyStore innerClassName PrivateKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$CallbackHandlerProtection outerClass java/security/KeyStore innerClassName CallbackHandlerProtection flags 9
|
||||||
|
innerclass innerClass java/security/KeyStore$PasswordProtection outerClass java/security/KeyStore innerClassName PasswordProtection flags 9
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry$Attribute outerClass java/security/KeyStore$Entry innerClassName Attribute flags 609
|
||||||
|
|
||||||
|
class name java/security/KeyStore$LoadStoreParameter
|
||||||
|
header extends java/lang/Object nestHost java/security/KeyStore flags 601
|
||||||
|
innerclass innerClass java/security/KeyStore$LoadStoreParameter outerClass java/security/KeyStore innerClassName LoadStoreParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$ProtectionParameter outerClass java/security/KeyStore innerClassName ProtectionParameter flags 609
|
||||||
|
|
||||||
|
class name java/security/KeyStore$PrivateKeyEntry
|
||||||
|
header extends java/lang/Object implements java/security/KeyStore$Entry nestHost java/security/KeyStore flags 31
|
||||||
|
innerclass innerClass java/security/KeyStore$PrivateKeyEntry outerClass java/security/KeyStore innerClassName PrivateKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry outerClass java/security/KeyStore innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry$Attribute outerClass java/security/KeyStore$Entry innerClassName Attribute flags 609
|
||||||
|
|
||||||
|
class name java/security/KeyStore$SecretKeyEntry
|
||||||
|
header extends java/lang/Object implements java/security/KeyStore$Entry nestHost java/security/KeyStore flags 31
|
||||||
|
innerclass innerClass java/security/KeyStore$SecretKeyEntry outerClass java/security/KeyStore innerClassName SecretKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry outerClass java/security/KeyStore innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry$Attribute outerClass java/security/KeyStore$Entry innerClassName Attribute flags 609
|
||||||
|
|
||||||
|
class name java/security/KeyStore$TrustedCertificateEntry
|
||||||
|
header extends java/lang/Object implements java/security/KeyStore$Entry nestHost java/security/KeyStore flags 31
|
||||||
|
innerclass innerClass java/security/KeyStore$TrustedCertificateEntry outerClass java/security/KeyStore innerClassName TrustedCertificateEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry outerClass java/security/KeyStore innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry$Attribute outerClass java/security/KeyStore$Entry innerClassName Attribute flags 609
|
||||||
|
|
||||||
|
class name java/security/KeyStoreSpi
|
||||||
|
header extends java/lang/Object flags 421
|
||||||
|
innerclass innerClass java/security/KeyStore$LoadStoreParameter outerClass java/security/KeyStore innerClassName LoadStoreParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$ProtectionParameter outerClass java/security/KeyStore innerClassName ProtectionParameter flags 609
|
||||||
|
innerclass innerClass java/security/KeyStore$PasswordProtection outerClass java/security/KeyStore innerClassName PasswordProtection flags 9
|
||||||
|
innerclass innerClass java/security/KeyStore$CallbackHandlerProtection outerClass java/security/KeyStore innerClassName CallbackHandlerProtection flags 9
|
||||||
|
innerclass innerClass java/security/KeyStore$TrustedCertificateEntry outerClass java/security/KeyStore innerClassName TrustedCertificateEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$PrivateKeyEntry outerClass java/security/KeyStore innerClassName PrivateKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$SecretKeyEntry outerClass java/security/KeyStore innerClassName SecretKeyEntry flags 19
|
||||||
|
innerclass innerClass java/security/KeyStore$Entry outerClass java/security/KeyStore innerClassName Entry flags 609
|
||||||
|
|
||||||
|
class name java/security/Permissions
|
||||||
|
header extends java/security/PermissionCollection implements java/io/Serializable flags 31
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
|
||||||
|
class name java/security/PrivilegedAction
|
||||||
|
header extends java/lang/Object flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object; runtimeAnnotations @Ljava/lang/FunctionalInterface;
|
||||||
|
|
||||||
|
class name java/security/PrivilegedExceptionAction
|
||||||
|
header extends java/lang/Object flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object; runtimeAnnotations @Ljava/lang/FunctionalInterface;
|
||||||
|
|
||||||
|
class name java/security/Provider
|
||||||
|
header extends java/util/Properties nestMembers java/security/Provider$Service flags 421
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/Provider$Service outerClass java/security/Provider innerClassName Service flags 9
|
||||||
|
|
||||||
|
class name java/security/cert/PKIXRevocationChecker
|
||||||
|
header extends java/security/cert/PKIXCertPathChecker nestMembers java/security/cert/PKIXRevocationChecker$Option flags 421
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/security/cert/PKIXRevocationChecker$Option outerClass java/security/cert/PKIXRevocationChecker innerClassName Option flags 4019
|
||||||
|
|
||||||
|
class name java/text/AttributedString
|
||||||
|
header extends java/lang/Object flags 21
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/text/AttributedCharacterIterator$Attribute outerClass java/text/AttributedCharacterIterator innerClassName Attribute flags 9
|
||||||
|
|
||||||
|
class name java/text/CompactNumberFormat
|
||||||
|
header extends java/text/NumberFormat flags 31
|
||||||
|
innerclass innerClass java/text/NumberFormat$Field outerClass java/text/NumberFormat innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/DateFormat
|
||||||
|
header extends java/text/Format nestMembers java/text/DateFormat$Field flags 421
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/text/DateFormat$Field outerClass java/text/DateFormat innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/DecimalFormat
|
||||||
|
header extends java/text/NumberFormat flags 21
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/text/NumberFormat$Field outerClass java/text/NumberFormat innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/DecimalFormatSymbols
|
||||||
|
header extends java/lang/Object implements java/lang/Cloneable,java/io/Serializable flags 21
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/text/Format
|
||||||
|
header extends java/lang/Object implements java/io/Serializable,java/lang/Cloneable nestMembers java/text/Format$Field flags 421
|
||||||
|
innerclass innerClass java/text/AttributedCharacterIterator$Attribute outerClass java/text/AttributedCharacterIterator innerClassName Attribute flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/Format$Field
|
||||||
|
header extends java/text/AttributedCharacterIterator$Attribute nestHost java/text/Format flags 21
|
||||||
|
innerclass innerClass java/text/AttributedCharacterIterator$Attribute outerClass java/text/AttributedCharacterIterator innerClassName Attribute flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/MessageFormat
|
||||||
|
header extends java/text/Format nestMembers java/text/MessageFormat$Field flags 21
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/text/MessageFormat$Field outerClass java/text/MessageFormat innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/AttributedCharacterIterator$Attribute outerClass java/text/AttributedCharacterIterator innerClassName Attribute flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/MessageFormat$Field
|
||||||
|
header extends java/text/Format$Field nestHost java/text/MessageFormat flags 21
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/MessageFormat$Field outerClass java/text/MessageFormat innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/NumberFormat
|
||||||
|
header extends java/text/Format nestMembers java/text/NumberFormat$Style,java/text/NumberFormat$Field flags 421
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/text/NumberFormat$Style outerClass java/text/NumberFormat innerClassName Style flags 4019
|
||||||
|
innerclass innerClass java/text/NumberFormat$Field outerClass java/text/NumberFormat innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/NumberFormat$Field
|
||||||
|
header extends java/text/Format$Field nestHost java/text/NumberFormat flags 21
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/NumberFormat$Field outerClass java/text/NumberFormat innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/text/SimpleDateFormat
|
||||||
|
header extends java/text/DateFormat flags 21
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/text/DateFormat$Field outerClass java/text/DateFormat innerClassName Field flags 9
|
||||||
|
innerclass innerClass java/text/Format$Field outerClass java/text/Format innerClassName Field flags 9
|
||||||
|
|
||||||
|
class name java/time/chrono/JapaneseEra
|
||||||
|
field name REIWA descriptor Ljava/time/chrono/JapaneseEra; flags 19
|
||||||
|
|
||||||
|
class name java/util/AbstractMap
|
||||||
|
header extends java/lang/Object implements java/util/Map nestMembers java/util/AbstractMap$SimpleImmutableEntry,java/util/AbstractMap$SimpleEntry flags 421 signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/Map<TK;TV;>;
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/util/AbstractMap$SimpleImmutableEntry outerClass java/util/AbstractMap innerClassName SimpleImmutableEntry flags 9
|
||||||
|
innerclass innerClass java/util/AbstractMap$SimpleEntry outerClass java/util/AbstractMap innerClassName SimpleEntry flags 9
|
||||||
|
|
||||||
|
class name java/util/Base64
|
||||||
|
header extends java/lang/Object nestMembers java/util/Base64$Decoder,java/util/Base64$Encoder flags 21
|
||||||
|
innerclass innerClass java/util/Base64$Encoder outerClass java/util/Base64 innerClassName Encoder flags 9
|
||||||
|
innerclass innerClass java/util/Base64$Decoder outerClass java/util/Base64 innerClassName Decoder flags 9
|
||||||
|
|
||||||
|
class name java/util/Calendar
|
||||||
|
header extends java/lang/Object implements java/io/Serializable,java/lang/Cloneable,java/lang/Comparable nestMembers java/util/Calendar$Builder flags 421 signature Ljava/lang/Object;Ljava/io/Serializable;Ljava/lang/Cloneable;Ljava/lang/Comparable<Ljava/util/Calendar;>;
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/util/Calendar$Builder outerClass java/util/Calendar innerClassName Builder flags 9
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/Formatter
|
||||||
|
header extends java/lang/Object implements java/io/Closeable,java/io/Flushable nestMembers java/util/Formatter$BigDecimalLayoutForm flags 31
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/util/Formatter$BigDecimalLayoutForm outerClass java/util/Formatter innerClassName BigDecimalLayoutForm flags 4019
|
||||||
|
|
||||||
|
class name java/util/Locale
|
||||||
|
header extends java/lang/Object implements java/lang/Cloneable,java/io/Serializable nestMembers java/util/Locale$LanguageRange,java/util/Locale$FilteringMode,java/util/Locale$Builder,java/util/Locale$Category,java/util/Locale$IsoCountryCode flags 31
|
||||||
|
innerclass innerClass java/util/Locale$Category outerClass java/util/Locale innerClassName Category flags 4019
|
||||||
|
innerclass innerClass java/util/Locale$IsoCountryCode outerClass java/util/Locale innerClassName IsoCountryCode flags 4409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/util/Locale$FilteringMode outerClass java/util/Locale innerClassName FilteringMode flags 4019
|
||||||
|
innerclass innerClass java/util/Locale$LanguageRange outerClass java/util/Locale innerClassName LanguageRange flags 19
|
||||||
|
innerclass innerClass java/util/Locale$Builder outerClass java/util/Locale innerClassName Builder flags 19
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/Random
|
||||||
|
header extends java/lang/Object implements java/io/Serializable flags 21
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfLong outerClass java/util/Spliterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfDouble outerClass java/util/Spliterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
|
||||||
|
class name java/util/Spliterators
|
||||||
|
header extends java/lang/Object nestMembers java/util/Spliterators$AbstractDoubleSpliterator,java/util/Spliterators$AbstractLongSpliterator,java/util/Spliterators$AbstractIntSpliterator,java/util/Spliterators$AbstractSpliterator flags 31
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfLong outerClass java/util/Spliterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfDouble outerClass java/util/Spliterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfInt outerClass java/util/PrimitiveIterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfLong outerClass java/util/PrimitiveIterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfDouble outerClass java/util/PrimitiveIterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractDoubleSpliterator outerClass java/util/Spliterators innerClassName AbstractDoubleSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractLongSpliterator outerClass java/util/Spliterators innerClassName AbstractLongSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractIntSpliterator outerClass java/util/Spliterators innerClassName AbstractIntSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractSpliterator outerClass java/util/Spliterators innerClassName AbstractSpliterator flags 409
|
||||||
|
|
||||||
|
class name java/util/Spliterators$AbstractDoubleSpliterator
|
||||||
|
header extends java/lang/Object implements java/util/Spliterator$OfDouble nestHost java/util/Spliterators flags 421
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractSpliterator outerClass java/util/Spliterators innerClassName AbstractSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractDoubleSpliterator outerClass java/util/Spliterators innerClassName AbstractDoubleSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterator$OfDouble outerClass java/util/Spliterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfPrimitive outerClass java/util/Spliterator innerClassName OfPrimitive flags 609
|
||||||
|
|
||||||
|
class name java/util/Spliterators$AbstractIntSpliterator
|
||||||
|
header extends java/lang/Object implements java/util/Spliterator$OfInt nestHost java/util/Spliterators flags 421
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractSpliterator outerClass java/util/Spliterators innerClassName AbstractSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractIntSpliterator outerClass java/util/Spliterators innerClassName AbstractIntSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfPrimitive outerClass java/util/Spliterator innerClassName OfPrimitive flags 609
|
||||||
|
|
||||||
|
class name java/util/Spliterators$AbstractLongSpliterator
|
||||||
|
header extends java/lang/Object implements java/util/Spliterator$OfLong nestHost java/util/Spliterators flags 421
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractSpliterator outerClass java/util/Spliterators innerClassName AbstractSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterators$AbstractLongSpliterator outerClass java/util/Spliterators innerClassName AbstractLongSpliterator flags 409
|
||||||
|
innerclass innerClass java/util/Spliterator$OfLong outerClass java/util/Spliterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfPrimitive outerClass java/util/Spliterator innerClassName OfPrimitive flags 609
|
||||||
|
|
||||||
|
class name java/util/concurrent/CompletableFuture
|
||||||
|
header extends java/lang/Object implements java/util/concurrent/Future,java/util/concurrent/CompletionStage nestMembers java/util/concurrent/CompletableFuture$AsynchronousCompletionTask flags 21 signature <T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/concurrent/Future<TT;>;Ljava/util/concurrent/CompletionStage<TT;>;
|
||||||
|
innerclass innerClass java/util/concurrent/ForkJoinPool$ManagedBlocker outerClass java/util/concurrent/ForkJoinPool innerClassName ManagedBlocker flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
innerclass innerClass java/util/concurrent/CompletableFuture$AsynchronousCompletionTask outerClass java/util/concurrent/CompletableFuture innerClassName AsynchronousCompletionTask flags 609
|
||||||
|
|
||||||
|
class name java/util/concurrent/ConcurrentHashMap
|
||||||
|
header extends java/util/AbstractMap implements java/util/concurrent/ConcurrentMap,java/io/Serializable nestMembers java/util/concurrent/ConcurrentHashMap$KeySetView,java/util/concurrent/ConcurrentHashMap$CollectionView flags 21 signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/AbstractMap<TK;TV;>;Ljava/util/concurrent/ConcurrentMap<TK;TV;>;Ljava/io/Serializable;
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/ConcurrentHashMap$KeySetView outerClass java/util/concurrent/ConcurrentHashMap innerClassName KeySetView flags 9
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/util/AbstractMap$SimpleImmutableEntry outerClass java/util/AbstractMap innerClassName SimpleImmutableEntry flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/ConcurrentHashMap$CollectionView outerClass java/util/concurrent/ConcurrentHashMap innerClassName CollectionView flags 408
|
||||||
|
|
||||||
|
class name java/util/concurrent/ConcurrentHashMap$KeySetView
|
||||||
|
header extends java/util/concurrent/ConcurrentHashMap$CollectionView implements java/util/Set,java/io/Serializable nestHost java/util/concurrent/ConcurrentHashMap flags 21 signature <K:Ljava/lang/Object;V:Ljava/lang/Object;>Ljava/util/concurrent/ConcurrentHashMap$CollectionView<TK;TV;TK;>;Ljava/util/Set<TK;>;Ljava/io/Serializable;
|
||||||
|
innerclass innerClass java/util/concurrent/ConcurrentHashMap$CollectionView outerClass java/util/concurrent/ConcurrentHashMap innerClassName CollectionView flags 408
|
||||||
|
innerclass innerClass java/util/concurrent/ConcurrentHashMap$KeySetView outerClass java/util/concurrent/ConcurrentHashMap innerClassName KeySetView flags 9
|
||||||
|
|
||||||
|
class name java/util/concurrent/Flow$Processor
|
||||||
|
header extends java/lang/Object implements java/util/concurrent/Flow$Subscriber,java/util/concurrent/Flow$Publisher nestHost java/util/concurrent/Flow flags 601 signature <T:Ljava/lang/Object;R:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/concurrent/Flow$Subscriber<TT;>;Ljava/util/concurrent/Flow$Publisher<TR;>;
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Processor outerClass java/util/concurrent/Flow innerClassName Processor flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
|
||||||
|
class name java/util/concurrent/Flow$Publisher
|
||||||
|
header extends java/lang/Object nestHost java/util/concurrent/Flow flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object; runtimeAnnotations @Ljava/lang/FunctionalInterface;
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
|
||||||
|
class name java/util/concurrent/Flow$Subscriber
|
||||||
|
header extends java/lang/Object nestHost java/util/concurrent/Flow flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object;
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscription outerClass java/util/concurrent/Flow innerClassName Subscription flags 609
|
||||||
|
|
||||||
|
class name java/util/concurrent/ForkJoinPool
|
||||||
|
header extends java/util/concurrent/AbstractExecutorService nestMembers java/util/concurrent/ForkJoinPool$ManagedBlocker,java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/ForkJoinPool$ForkJoinWorkerThreadFactory outerClass java/util/concurrent/ForkJoinPool innerClassName ForkJoinWorkerThreadFactory flags 609
|
||||||
|
innerclass innerClass java/lang/Thread$UncaughtExceptionHandler outerClass java/lang/Thread innerClassName UncaughtExceptionHandler flags 609
|
||||||
|
innerclass innerClass java/lang/Thread$State outerClass java/lang/Thread innerClassName State flags 4019
|
||||||
|
innerclass innerClass java/util/concurrent/ForkJoinPool$ManagedBlocker outerClass java/util/concurrent/ForkJoinPool innerClassName ManagedBlocker flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/concurrent/Phaser
|
||||||
|
header extends java/lang/Object flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/ForkJoinPool$ManagedBlocker outerClass java/util/concurrent/ForkJoinPool innerClassName ManagedBlocker flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/concurrent/ThreadLocalRandom
|
||||||
|
header extends java/util/Random flags 21
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfLong outerClass java/util/Spliterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/Spliterator$OfDouble outerClass java/util/Spliterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
|
||||||
|
class name java/util/concurrent/ThreadPoolExecutor
|
||||||
|
header extends java/util/concurrent/AbstractExecutorService nestMembers java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy,java/util/concurrent/ThreadPoolExecutor$DiscardPolicy,java/util/concurrent/ThreadPoolExecutor$AbortPolicy,java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy flags 21
|
||||||
|
innerclass innerClass java/lang/Thread$State outerClass java/lang/Thread innerClassName State flags 4019
|
||||||
|
innerclass innerClass java/util/concurrent/ThreadPoolExecutor$AbortPolicy outerClass java/util/concurrent/ThreadPoolExecutor innerClassName AbortPolicy flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/ThreadPoolExecutor$DiscardOldestPolicy outerClass java/util/concurrent/ThreadPoolExecutor innerClassName DiscardOldestPolicy flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/ThreadPoolExecutor$DiscardPolicy outerClass java/util/concurrent/ThreadPoolExecutor innerClassName DiscardPolicy flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/ThreadPoolExecutor$CallerRunsPolicy outerClass java/util/concurrent/ThreadPoolExecutor innerClassName CallerRunsPolicy flags 9
|
||||||
|
|
||||||
|
class name java/util/concurrent/locks/ReentrantReadWriteLock
|
||||||
|
header extends java/lang/Object implements java/util/concurrent/locks/ReadWriteLock,java/io/Serializable nestMembers java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock,java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/locks/ReentrantReadWriteLock$ReadLock outerClass java/util/concurrent/locks/ReentrantReadWriteLock innerClassName ReadLock flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/locks/ReentrantReadWriteLock$WriteLock outerClass java/util/concurrent/locks/ReentrantReadWriteLock innerClassName WriteLock flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject outerClass java/util/concurrent/locks/AbstractQueuedSynchronizer innerClassName ConditionObject flags 1
|
||||||
|
|
||||||
|
class name java/util/jar/Pack200
|
||||||
|
header extends java/lang/Object nestMembers java/util/jar/Pack200$Unpacker,java/util/jar/Pack200$Packer flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="11")
|
||||||
|
innerclass innerClass java/util/jar/Pack200$Packer outerClass java/util/jar/Pack200 innerClassName Packer flags 609
|
||||||
|
innerclass innerClass java/util/jar/Pack200$Unpacker outerClass java/util/jar/Pack200 innerClassName Unpacker flags 609
|
||||||
|
|
||||||
|
class name java/util/stream/DoubleStream
|
||||||
|
header extends java/lang/Object implements java/util/stream/BaseStream nestMembers java/util/stream/DoubleStream$Builder flags 601 signature Ljava/lang/Object;Ljava/util/stream/BaseStream<Ljava/lang/Double;Ljava/util/stream/DoubleStream;>;
|
||||||
|
innerclass innerClass java/util/Spliterator$OfDouble outerClass java/util/Spliterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfDouble outerClass java/util/PrimitiveIterator innerClassName OfDouble flags 609
|
||||||
|
innerclass innerClass java/util/stream/DoubleStream$Builder outerClass java/util/stream/DoubleStream innerClassName Builder flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/stream/IntStream
|
||||||
|
header extends java/lang/Object implements java/util/stream/BaseStream nestMembers java/util/stream/IntStream$Builder flags 601 signature Ljava/lang/Object;Ljava/util/stream/BaseStream<Ljava/lang/Integer;Ljava/util/stream/IntStream;>;
|
||||||
|
innerclass innerClass java/util/Spliterator$OfInt outerClass java/util/Spliterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfInt outerClass java/util/PrimitiveIterator innerClassName OfInt flags 609
|
||||||
|
innerclass innerClass java/util/stream/IntStream$Builder outerClass java/util/stream/IntStream innerClassName Builder flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/util/stream/LongStream
|
||||||
|
header extends java/lang/Object implements java/util/stream/BaseStream nestMembers java/util/stream/LongStream$Builder flags 601 signature Ljava/lang/Object;Ljava/util/stream/BaseStream<Ljava/lang/Long;Ljava/util/stream/LongStream;>;
|
||||||
|
innerclass innerClass java/util/Spliterator$OfLong outerClass java/util/Spliterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/PrimitiveIterator$OfLong outerClass java/util/PrimitiveIterator innerClassName OfLong flags 609
|
||||||
|
innerclass innerClass java/util/stream/LongStream$Builder outerClass java/util/stream/LongStream innerClassName Builder flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/net/ssl/HandshakeCompletedEvent
|
||||||
|
-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")
|
||||||
|
|
||||||
|
class name javax/net/ssl/SSLContext
|
||||||
|
header extends java/lang/Object flags 21
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
-method name getDefault descriptor ()Ljavax/net/ssl/SSLContext;
|
||||||
|
-method name setDefault descriptor (Ljavax/net/ssl/SSLContext;)V
|
||||||
|
method name getDefault descriptor ()Ljavax/net/ssl/SSLContext; thrownTypes java/security/NoSuchAlgorithmException flags 9
|
||||||
|
method name setDefault descriptor (Ljavax/net/ssl/SSLContext;)V flags 9
|
||||||
|
|
||||||
|
class name javax/net/ssl/SSLEngineResult
|
||||||
|
header extends java/lang/Object nestMembers javax/net/ssl/SSLEngineResult$HandshakeStatus,javax/net/ssl/SSLEngineResult$Status flags 21
|
||||||
|
innerclass innerClass javax/net/ssl/SSLEngineResult$Status outerClass javax/net/ssl/SSLEngineResult innerClassName Status flags 4019
|
||||||
|
innerclass innerClass javax/net/ssl/SSLEngineResult$HandshakeStatus outerClass javax/net/ssl/SSLEngineResult innerClassName HandshakeStatus flags 4019
|
||||||
|
|
||||||
|
class name javax/net/ssl/SSLServerSocketFactory
|
||||||
|
-method name getDefault descriptor ()Ljavax/net/ServerSocketFactory;
|
||||||
|
method name getDefault descriptor ()Ljavax/net/ServerSocketFactory; flags 9
|
||||||
|
|
||||||
|
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 401 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/net/ssl/SSLSocketFactory
|
||||||
|
-method name getDefault descriptor ()Ljavax/net/SocketFactory;
|
||||||
|
method name getDefault descriptor ()Ljavax/net/SocketFactory; flags 9
|
||||||
|
|
||||||
|
class name javax/security/cert/Certificate
|
||||||
|
header extends java/lang/Object flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/CertificateEncodingException
|
||||||
|
header extends javax/security/cert/CertificateException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/CertificateException
|
||||||
|
header extends java/lang/Exception flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/CertificateExpiredException
|
||||||
|
header extends javax/security/cert/CertificateException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/CertificateNotYetValidException
|
||||||
|
header extends javax/security/cert/CertificateException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/CertificateParsingException
|
||||||
|
header extends javax/security/cert/CertificateException flags 21 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
||||||
|
class name javax/security/cert/X509Certificate
|
||||||
|
header extends javax/security/cert/Certificate flags 421 deprecated true runtimeAnnotations @Ljava/lang/Deprecated;(forRemoval=Ztrue,since="9")
|
||||||
|
|
107
make/data/symbols/java.compiler-D.sym.txt
Normal file
107
make/data/symbols/java.compiler-D.sym.txt
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/annotation/processing/ProcessingEnvironment
|
||||||
|
method name isPreviewEnabled descriptor ()Z flags 1
|
||||||
|
|
||||||
|
class name javax/lang/model/SourceVersion
|
||||||
|
header extends java/lang/Enum flags 4031 signature Ljava/lang/Enum<Ljavax/lang/model/SourceVersion;>;
|
||||||
|
innerclass innerClass java/lang/Runtime$Version outerClass java/lang/Runtime innerClassName Version flags 19
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
field name RELEASE_13 descriptor Ljavax/lang/model/SourceVersion; flags 4019
|
||||||
|
|
||||||
|
class name javax/lang/model/element/ExecutableElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/element/ModuleElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/element/ModuleElement$Directive
|
||||||
|
header extends java/lang/Object nestHost javax/lang/model/element/ModuleElement flags 601
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$Directive outerClass javax/lang/model/element/ModuleElement innerClassName Directive flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$DirectiveKind outerClass javax/lang/model/element/ModuleElement innerClassName DirectiveKind flags 4019
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$DirectiveVisitor outerClass javax/lang/model/element/ModuleElement innerClassName DirectiveVisitor flags 609
|
||||||
|
|
||||||
|
class name javax/lang/model/element/PackageElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/element/TypeElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/element/TypeParameterElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/element/VariableElement
|
||||||
|
method name asType descriptor ()Ljavax/lang/model/type/TypeMirror; flags 401
|
||||||
|
|
||||||
|
class name javax/lang/model/util/AbstractAnnotationValueVisitor9
|
||||||
|
header extends javax/lang/model/util/AbstractAnnotationValueVisitor8 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractAnnotationValueVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/AbstractElementVisitor9
|
||||||
|
header extends javax/lang/model/util/AbstractElementVisitor8 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractElementVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/AbstractTypeVisitor9
|
||||||
|
header extends javax/lang/model/util/AbstractTypeVisitor8 flags 421 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/AbstractTypeVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/ElementFilter
|
||||||
|
header extends java/lang/Object flags 21
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$DirectiveKind outerClass javax/lang/model/element/ModuleElement innerClassName DirectiveKind flags 4019
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$ExportsDirective outerClass javax/lang/model/element/ModuleElement innerClassName ExportsDirective flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$OpensDirective outerClass javax/lang/model/element/ModuleElement innerClassName OpensDirective flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$ProvidesDirective outerClass javax/lang/model/element/ModuleElement innerClassName ProvidesDirective flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$RequiresDirective outerClass javax/lang/model/element/ModuleElement innerClassName RequiresDirective flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$UsesDirective outerClass javax/lang/model/element/ModuleElement innerClassName UsesDirective flags 609
|
||||||
|
innerclass innerClass javax/lang/model/element/ModuleElement$Directive outerClass javax/lang/model/element/ModuleElement innerClassName Directive flags 609
|
||||||
|
|
||||||
|
class name javax/lang/model/util/ElementKindVisitor9
|
||||||
|
header extends javax/lang/model/util/ElementKindVisitor8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/ElementKindVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/ElementScanner9
|
||||||
|
header extends javax/lang/model/util/ElementScanner8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/ElementScanner8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/SimpleAnnotationValueVisitor9
|
||||||
|
header extends javax/lang/model/util/SimpleAnnotationValueVisitor8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleAnnotationValueVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/SimpleElementVisitor9
|
||||||
|
header extends javax/lang/model/util/SimpleElementVisitor8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleElementVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/SimpleTypeVisitor9
|
||||||
|
header extends javax/lang/model/util/SimpleTypeVisitor8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/SimpleTypeVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/lang/model/util/TypeKindVisitor9
|
||||||
|
header extends javax/lang/model/util/TypeKindVisitor8 flags 21 signature <R:Ljava/lang/Object;P:Ljava/lang/Object;>Ljavax/lang/model/util/TypeKindVisitor8<TR;TP;>; runtimeAnnotations @Ljavax/annotation/processing/SupportedSourceVersion;(value=eLjavax/lang/model/SourceVersion;RELEASE_13;)
|
||||||
|
|
||||||
|
class name javax/tools/StandardJavaFileManager
|
||||||
|
header extends java/lang/Object implements javax/tools/JavaFileManager nestMembers javax/tools/StandardJavaFileManager$PathFactory flags 601
|
||||||
|
innerclass innerClass javax/tools/JavaFileManager$Location outerClass javax/tools/JavaFileManager innerClassName Location flags 609
|
||||||
|
innerclass innerClass javax/tools/StandardJavaFileManager$PathFactory outerClass javax/tools/StandardJavaFileManager innerClassName PathFactory flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
-method name getJavaFileObjectsFromPaths descriptor (Ljava/lang/Iterable;)Ljava/lang/Iterable;
|
||||||
|
method name getJavaFileObjectsFromPaths descriptor (Ljava/util/Collection;)Ljava/lang/Iterable; flags 1 signature (Ljava/util/Collection<+Ljava/nio/file/Path;>;)Ljava/lang/Iterable<+Ljavax/tools/JavaFileObject;>;
|
||||||
|
method name getJavaFileObjectsFromPaths descriptor (Ljava/lang/Iterable;)Ljava/lang/Iterable; flags 1 deprecated true signature (Ljava/lang/Iterable<+Ljava/nio/file/Path;>;)Ljava/lang/Iterable<+Ljavax/tools/JavaFileObject;>; runtimeAnnotations @Ljava/lang/Deprecated;(since="13")
|
||||||
|
|
1402
make/data/symbols/java.desktop-D.sym.txt
Normal file
1402
make/data/symbols/java.desktop-D.sym.txt
Normal file
File diff suppressed because it is too large
Load Diff
102
make/data/symbols/java.management-D.sym.txt
Normal file
102
make/data/symbols/java.management-D.sym.txt
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/modelmbean/DescriptorSupport
|
||||||
|
header extends java/lang/Object implements javax/management/Descriptor flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/modelmbean/ModelMBeanAttributeInfo
|
||||||
|
header extends javax/management/MBeanAttributeInfo implements javax/management/DescriptorAccess flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/modelmbean/ModelMBeanConstructorInfo
|
||||||
|
header extends javax/management/MBeanConstructorInfo implements javax/management/DescriptorAccess flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/modelmbean/ModelMBeanInfoSupport
|
||||||
|
header extends javax/management/MBeanInfo implements javax/management/modelmbean/ModelMBeanInfo flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/modelmbean/ModelMBeanNotificationInfo
|
||||||
|
header extends javax/management/MBeanNotificationInfo implements javax/management/DescriptorAccess flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/modelmbean/ModelMBeanOperationInfo
|
||||||
|
header extends javax/management/MBeanOperationInfo implements javax/management/DescriptorAccess flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/relation/MBeanServerNotificationFilter
|
||||||
|
header extends javax/management/NotificationFilterSupport flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/relation/RelationService
|
||||||
|
header extends javax/management/NotificationBroadcasterSupport implements javax/management/relation/RelationServiceMBean,javax/management/MBeanRegistration,javax/management/NotificationListener flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name javax/management/relation/RelationTypeSupport
|
||||||
|
header extends java/lang/Object implements javax/management/relation/RelationType flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputStream$GetField outerClass java/io/ObjectInputStream innerClassName GetField flags 409
|
||||||
|
innerclass innerClass java/io/ObjectOutputStream$PutField outerClass java/io/ObjectOutputStream innerClassName PutField flags 409
|
||||||
|
|
||||||
|
class name javax/management/timer/Timer
|
||||||
|
header extends javax/management/NotificationBroadcasterSupport implements javax/management/timer/TimerMBean,javax/management/MBeanRegistration flags 21
|
||||||
|
innerclass innerClass java/lang/System$Logger outerClass java/lang/System innerClassName Logger flags 609
|
||||||
|
innerclass innerClass java/lang/System$Logger$Level outerClass java/lang/System$Logger innerClassName Level flags 4019
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
35
make/data/symbols/java.management.rmi-D.sym.txt
Normal file
35
make/data/symbols/java.management.rmi-D.sym.txt
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/RMIJRMPServerImpl
|
||||||
|
header extends javax/management/remote/rmi/RMIServerImpl flags 21
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$Config outerClass java/io/ObjectInputFilter innerClassName Config flags 19
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$Status outerClass java/io/ObjectInputFilter innerClassName Status flags 4019
|
||||||
|
innerclass innerClass java/io/ObjectInputFilter$FilterInfo outerClass java/io/ObjectInputFilter innerClassName FilterInfo flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
89
make/data/symbols/java.net.http-D.sym.txt
Normal file
89
make/data/symbols/java.net.http-D.sym.txt
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/net/http/HttpClient
|
||||||
|
header extends java/lang/Object nestMembers java/net/http/HttpClient$Redirect,java/net/http/HttpClient$Version,java/net/http/HttpClient$Builder flags 421
|
||||||
|
innerclass innerClass java/net/http/HttpClient$Builder outerClass java/net/http/HttpClient innerClassName Builder flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpClient$Redirect outerClass java/net/http/HttpClient innerClassName Redirect flags 4019
|
||||||
|
innerclass innerClass java/net/http/HttpClient$Version outerClass java/net/http/HttpClient innerClassName Version flags 4019
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodyHandler outerClass java/net/http/HttpResponse innerClassName BodyHandler flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$PushPromiseHandler outerClass java/net/http/HttpResponse innerClassName PushPromiseHandler flags 609
|
||||||
|
innerclass innerClass java/net/http/WebSocket$Builder outerClass java/net/http/WebSocket innerClassName Builder flags 609
|
||||||
|
|
||||||
|
class name java/net/http/HttpRequest$BodyPublisher
|
||||||
|
header extends java/lang/Object implements java/util/concurrent/Flow$Publisher nestHost java/net/http/HttpRequest flags 601 signature Ljava/lang/Object;Ljava/util/concurrent/Flow$Publisher<Ljava/nio/ByteBuffer;>;
|
||||||
|
innerclass innerClass java/net/http/HttpRequest$BodyPublisher outerClass java/net/http/HttpRequest innerClassName BodyPublisher flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
|
||||||
|
class name java/net/http/HttpRequest$BodyPublishers
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpRequest flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpRequest$BodyPublishers outerClass java/net/http/HttpRequest innerClassName BodyPublishers flags 9
|
||||||
|
innerclass innerClass java/net/http/HttpRequest$BodyPublisher outerClass java/net/http/HttpRequest innerClassName BodyPublisher flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$BodyHandler
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpResponse flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object; runtimeAnnotations @Ljava/lang/FunctionalInterface;
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodyHandler outerClass java/net/http/HttpResponse innerClassName BodyHandler flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$ResponseInfo outerClass java/net/http/HttpResponse innerClassName ResponseInfo flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscriber outerClass java/net/http/HttpResponse innerClassName BodySubscriber flags 609
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$BodyHandlers
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpResponse flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodyHandler outerClass java/net/http/HttpResponse innerClassName BodyHandler flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodyHandlers outerClass java/net/http/HttpResponse innerClassName BodyHandlers flags 9
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$ResponseInfo outerClass java/net/http/HttpResponse innerClassName ResponseInfo flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscriber outerClass java/net/http/HttpResponse innerClassName BodySubscriber flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscribers outerClass java/net/http/HttpResponse innerClassName BodySubscribers flags 9
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$BodySubscriber
|
||||||
|
header extends java/lang/Object implements java/util/concurrent/Flow$Subscriber nestHost java/net/http/HttpResponse flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object;Ljava/util/concurrent/Flow$Subscriber<Ljava/util/List<Ljava/nio/ByteBuffer;>;>;
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscriber outerClass java/net/http/HttpResponse innerClassName BodySubscriber flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$BodySubscribers
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpResponse flags 21
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Subscriber outerClass java/util/concurrent/Flow innerClassName Subscriber flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscribers outerClass java/net/http/HttpResponse innerClassName BodySubscribers flags 9
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodySubscriber outerClass java/net/http/HttpResponse innerClassName BodySubscriber flags 609
|
||||||
|
innerclass innerClass java/util/concurrent/Flow$Publisher outerClass java/util/concurrent/Flow innerClassName Publisher flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$PushPromiseHandler
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpResponse flags 601 signature <T:Ljava/lang/Object;>Ljava/lang/Object;
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$PushPromiseHandler outerClass java/net/http/HttpResponse innerClassName PushPromiseHandler flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$BodyHandler outerClass java/net/http/HttpResponse innerClassName BodyHandler flags 609
|
||||||
|
|
||||||
|
class name java/net/http/HttpResponse$ResponseInfo
|
||||||
|
header extends java/lang/Object nestHost java/net/http/HttpResponse flags 601
|
||||||
|
innerclass innerClass java/net/http/HttpResponse$ResponseInfo outerClass java/net/http/HttpResponse innerClassName ResponseInfo flags 609
|
||||||
|
innerclass innerClass java/net/http/HttpClient$Version outerClass java/net/http/HttpClient innerClassName Version flags 4019
|
||||||
|
|
47
make/data/symbols/java.xml-D.sym.txt
Normal file
47
make/data/symbols/java.xml-D.sym.txt
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/catalog/CatalogFeatures$Builder
|
||||||
|
header extends java/lang/Object nestHost javax/xml/catalog/CatalogFeatures flags 21
|
||||||
|
innerclass innerClass javax/xml/catalog/CatalogFeatures$Builder outerClass javax/xml/catalog/CatalogFeatures innerClassName Builder flags 9
|
||||||
|
innerclass innerClass javax/xml/catalog/CatalogFeatures$Feature outerClass javax/xml/catalog/CatalogFeatures innerClassName Feature flags 4019
|
||||||
|
|
||||||
|
class name javax/xml/parsers/DocumentBuilderFactory
|
||||||
|
method name newDefaultNSInstance descriptor ()Ljavax/xml/parsers/DocumentBuilderFactory; flags 9
|
||||||
|
method name newNSInstance descriptor ()Ljavax/xml/parsers/DocumentBuilderFactory; flags 9
|
||||||
|
method name newNSInstance descriptor (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/DocumentBuilderFactory; flags 9
|
||||||
|
|
||||||
|
class name javax/xml/parsers/SAXParserFactory
|
||||||
|
method name newDefaultNSInstance descriptor ()Ljavax/xml/parsers/SAXParserFactory; flags 9
|
||||||
|
method name newNSInstance descriptor ()Ljavax/xml/parsers/SAXParserFactory; flags 9
|
||||||
|
method name newNSInstance descriptor (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljavax/xml/parsers/SAXParserFactory; flags 9
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
35
make/data/symbols/java.xml.crypto-D.sym.txt
Normal file
35
make/data/symbols/java.xml.crypto-D.sym.txt
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/crypto/dsig/CanonicalizationMethod
|
||||||
|
field name INCLUSIVE_11 descriptor Ljava/lang/String; constantValue http://www.w3.org/2006/12/xml-c14n11 flags 19
|
||||||
|
field name INCLUSIVE_11_WITH_COMMENTS descriptor Ljava/lang/String; constantValue http://www.w3.org/2006/12/xml-c14n11#WithComments flags 19
|
||||||
|
|
||||||
|
class name javax/xml/crypto/dsig/keyinfo/KeyValue
|
||||||
|
field name EC_TYPE descriptor Ljava/lang/String; constantValue http://www.w3.org/2009/xmldsig11#ECKeyValue flags 19
|
||||||
|
|
35
make/data/symbols/jdk.compiler-D.sym.txt
Normal file
35
make/data/symbols/jdk.compiler-D.sym.txt
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/util/JavacTask
|
||||||
|
method name setParameterNameProvider descriptor (Lcom/sun/source/util/ParameterNameProvider;)V flags 1
|
||||||
|
|
||||||
|
class name com/sun/source/util/ParameterNameProvider
|
||||||
|
header extends java/lang/Object flags 601
|
||||||
|
method name getParameterName descriptor (Ljavax/lang/model/element/VariableElement;)Ljava/lang/CharSequence; flags 401
|
||||||
|
|
52
make/data/symbols/jdk.httpserver-D.sym.txt
Normal file
52
make/data/symbols/jdk.httpserver-D.sym.txt
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/net/httpserver/Authenticator$Failure
|
||||||
|
header extends com/sun/net/httpserver/Authenticator$Result nestHost com/sun/net/httpserver/Authenticator flags 21
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Result outerClass com/sun/net/httpserver/Authenticator innerClassName Result flags 409
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Failure outerClass com/sun/net/httpserver/Authenticator innerClassName Failure flags 9
|
||||||
|
|
||||||
|
class name com/sun/net/httpserver/Authenticator$Retry
|
||||||
|
header extends com/sun/net/httpserver/Authenticator$Result nestHost com/sun/net/httpserver/Authenticator flags 21
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Result outerClass com/sun/net/httpserver/Authenticator innerClassName Result flags 409
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Retry outerClass com/sun/net/httpserver/Authenticator innerClassName Retry flags 9
|
||||||
|
|
||||||
|
class name com/sun/net/httpserver/Authenticator$Success
|
||||||
|
header extends com/sun/net/httpserver/Authenticator$Result nestHost com/sun/net/httpserver/Authenticator flags 21
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Result outerClass com/sun/net/httpserver/Authenticator innerClassName Result flags 409
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Success outerClass com/sun/net/httpserver/Authenticator innerClassName Success flags 9
|
||||||
|
|
||||||
|
class name com/sun/net/httpserver/BasicAuthenticator
|
||||||
|
header extends com/sun/net/httpserver/Authenticator flags 421
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Retry outerClass com/sun/net/httpserver/Authenticator innerClassName Retry flags 9
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Failure outerClass com/sun/net/httpserver/Authenticator innerClassName Failure flags 9
|
||||||
|
innerclass innerClass java/util/Base64$Decoder outerClass java/util/Base64 innerClassName Decoder flags 9
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Success outerClass com/sun/net/httpserver/Authenticator innerClassName Success flags 9
|
||||||
|
innerclass innerClass com/sun/net/httpserver/Authenticator$Result outerClass com/sun/net/httpserver/Authenticator innerClassName Result flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
93
make/data/symbols/jdk.javadoc-D.sym.txt
Normal file
93
make/data/symbols/jdk.javadoc-D.sym.txt
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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.javadoc
|
||||||
|
header exports jdk/javadoc/doclet requires name\u0020;java.base\u0020;flags\u0020;8000,name\u0020;java.xml\u0020;flags\u0020;0,name\u0020;java.compiler\u0020;flags\u0020;20,name\u0020;jdk.compiler\u0020;flags\u0020;20 provides interface\u0020;java/util/spi/ToolProvider\u0020;impls\u0020;jdk/javadoc/internal/tool/JavadocToolProvider,interface\u0020;javax/tools/DocumentationTool\u0020;impls\u0020;jdk/javadoc/internal/api/JavadocTool,interface\u0020;javax/tools/Tool\u0020;impls\u0020;jdk/javadoc/internal/api/JavadocTool target linux-amd64 flags 8000
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotatedType
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotationDesc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotationDesc$ElementValuePair
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotationTypeDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotationTypeElementDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/AnnotationValue
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ClassDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ConstructorDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/Doc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/DocErrorReporter
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/Doclet
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ExecutableMemberDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/FieldDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/LanguageVersion
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/MemberDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/MethodDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/PackageDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ParamTag
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/Parameter
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ParameterizedType
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ProgramElementDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/RootDoc
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/SeeTag
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/SerialFieldTag
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/SourcePosition
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/Tag
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/ThrowsTag
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/Type
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/TypeVariable
|
||||||
|
|
||||||
|
-class name com/sun/javadoc/WildcardType
|
||||||
|
|
||||||
|
-class name com/sun/tools/javadoc/Main
|
||||||
|
|
31
make/data/symbols/jdk.jlink-D.sym.txt
Normal file
31
make/data/symbols/jdk.jlink-D.sym.txt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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.jlink
|
||||||
|
header requires name\u0020;java.base\u0020;flags\u0020;8000,name\u0020;jdk.internal.opt\u0020;flags\u0020;0,name\u0020;jdk.jdeps\u0020;flags\u0020;0 uses jdk/tools/jlink/plugin/Plugin provides interface\u0020;java/util/spi/ToolProvider\u0020;impls\u0020;jdk/tools/jmod/Main$JmodToolProvider\u005C;u002C;jdk/tools/jlink/internal/Main$JlinkToolProvider,interface\u0020;jdk/tools/jlink/plugin/Plugin\u0020;impls\u0020;jdk/tools/jlink/internal/plugins/DefaultStripDebugPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/StripJavaDebugAttributesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/ExcludePlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/ExcludeFilesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/ExcludeJmodSectionPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/LegalNoticeFilePlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/SystemModulesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/StripNativeCommandsPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/OrderResourcesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/DefaultCompressPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/ExcludeVMPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/IncludeLocalesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/GenerateJLIClassesPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/ReleaseInfoPlugin\u005C;u002C;jdk/tools/jlink/internal/plugins/StripNativeDebugSymbolsPlugin target linux-amd64 flags 8000
|
||||||
|
|
148
make/data/symbols/jdk.jshell-D.sym.txt
Normal file
148
make/data/symbols/jdk.jshell-D.sym.txt
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2019, 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/jshell/ErroneousSnippet
|
||||||
|
header extends jdk/jshell/Snippet flags 21
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$SubKind outerClass jdk/jshell/Snippet innerClassName SubKind flags 4019
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Kind outerClass jdk/jshell/Snippet innerClassName Kind flags 4019
|
||||||
|
|
||||||
|
class name jdk/jshell/JShell
|
||||||
|
header extends java/lang/Object implements java/lang/AutoCloseable nestMembers jdk/jshell/JShell$Subscription,jdk/jshell/JShell$Builder flags 21
|
||||||
|
innerclass innerClass jdk/jshell/JShell$Builder outerClass jdk/jshell/JShell innerClassName Builder flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Status outerClass jdk/jshell/Snippet innerClassName Status flags 4019
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/JShell$Subscription outerClass jdk/jshell/JShell innerClassName Subscription flags 1
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Kind outerClass jdk/jshell/Snippet innerClassName Kind flags 4019
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/Snippet
|
||||||
|
header extends java/lang/Object nestMembers jdk/jshell/Snippet$Status,jdk/jshell/Snippet$SubKind,jdk/jshell/Snippet$Kind flags 421
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$SubKind outerClass jdk/jshell/Snippet innerClassName SubKind flags 4019
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Status outerClass jdk/jshell/Snippet innerClassName Status flags 4019
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Kind outerClass jdk/jshell/Snippet innerClassName Kind flags 4019
|
||||||
|
|
||||||
|
class name jdk/jshell/SourceCodeAnalysis$CompletionInfo
|
||||||
|
header extends java/lang/Object nestHost jdk/jshell/SourceCodeAnalysis flags 601
|
||||||
|
innerclass innerClass jdk/jshell/SourceCodeAnalysis$CompletionInfo outerClass jdk/jshell/SourceCodeAnalysis innerClassName CompletionInfo flags 609
|
||||||
|
innerclass innerClass jdk/jshell/SourceCodeAnalysis$Completeness outerClass jdk/jshell/SourceCodeAnalysis innerClassName Completeness flags 4019
|
||||||
|
|
||||||
|
class name jdk/jshell/SourceCodeAnalysis$SnippetWrapper
|
||||||
|
header extends java/lang/Object nestHost jdk/jshell/SourceCodeAnalysis flags 601
|
||||||
|
innerclass innerClass jdk/jshell/SourceCodeAnalysis$SnippetWrapper outerClass jdk/jshell/SourceCodeAnalysis innerClassName SnippetWrapper flags 609
|
||||||
|
innerclass innerClass jdk/jshell/Snippet$Kind outerClass jdk/jshell/Snippet innerClassName Kind flags 4019
|
||||||
|
|
||||||
|
class name jdk/jshell/execution/DirectExecutionControl
|
||||||
|
header extends java/lang/Object implements jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassBytecodes outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassBytecodes flags 19
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$NotImplementedException outerClass jdk/jshell/spi/ExecutionControl innerClassName NotImplementedException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$InternalException outerClass jdk/jshell/spi/ExecutionControl innerClassName InternalException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ResolutionException outerClass jdk/jshell/spi/ExecutionControl innerClassName ResolutionException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$UserException outerClass jdk/jshell/spi/ExecutionControl innerClassName UserException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassInstallException outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassInstallException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/execution/JdiExecutionControl
|
||||||
|
header extends jdk/jshell/execution/StreamingExecutionControl implements jdk/jshell/spi/ExecutionControl flags 421
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassInstallException outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassInstallException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassBytecodes outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassBytecodes flags 19
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$NotImplementedException outerClass jdk/jshell/spi/ExecutionControl innerClassName NotImplementedException flags 9
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/execution/JdiInitiator
|
||||||
|
header extends java/lang/Object flags 21
|
||||||
|
innerclass innerClass java/util/Map$Entry outerClass java/util/Map innerClassName Entry flags 609
|
||||||
|
innerclass innerClass com/sun/jdi/connect/Connector$Argument outerClass com/sun/jdi/connect/Connector innerClassName Argument flags 609
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/execution/LocalExecutionControl
|
||||||
|
header extends jdk/jshell/execution/DirectExecutionControl flags 21
|
||||||
|
innerclass innerClass java/lang/Thread$UncaughtExceptionHandler outerClass java/lang/Thread innerClassName UncaughtExceptionHandler flags 609
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$StoppedException outerClass jdk/jshell/spi/ExecutionControl innerClassName StoppedException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$InternalException outerClass jdk/jshell/spi/ExecutionControl innerClassName InternalException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/execution/StreamingExecutionControl
|
||||||
|
header extends java/lang/Object implements jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$NotImplementedException outerClass jdk/jshell/spi/ExecutionControl innerClassName NotImplementedException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$InternalException outerClass jdk/jshell/spi/ExecutionControl innerClassName InternalException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassInstallException outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassInstallException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$UserException outerClass jdk/jshell/spi/ExecutionControl innerClassName UserException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ResolutionException outerClass jdk/jshell/spi/ExecutionControl innerClassName ResolutionException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$StoppedException outerClass jdk/jshell/spi/ExecutionControl innerClassName StoppedException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassBytecodes outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassBytecodes flags 19
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$ClassInstallException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$ExecutionControlException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ClassInstallException outerClass jdk/jshell/spi/ExecutionControl innerClassName ClassInstallException flags 9
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$EngineTerminationException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$ExecutionControlException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$EngineTerminationException outerClass jdk/jshell/spi/ExecutionControl innerClassName EngineTerminationException flags 9
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$InternalException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$ExecutionControlException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$InternalException outerClass jdk/jshell/spi/ExecutionControl innerClassName InternalException flags 9
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$NotImplementedException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$InternalException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$InternalException outerClass jdk/jshell/spi/ExecutionControl innerClassName InternalException flags 9
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$NotImplementedException outerClass jdk/jshell/spi/ExecutionControl innerClassName NotImplementedException flags 9
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$ResolutionException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$RunException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ResolutionException outerClass jdk/jshell/spi/ExecutionControl innerClassName ResolutionException flags 9
|
||||||
|
innerclass innerClass java/lang/invoke/MethodHandles$Lookup outerClass java/lang/invoke/MethodHandles innerClassName Lookup flags 19
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$RunException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$ExecutionControlException nestHost jdk/jshell/spi/ExecutionControl flags 421
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$ExecutionControlException outerClass jdk/jshell/spi/ExecutionControl innerClassName ExecutionControlException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$StoppedException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$RunException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$StoppedException outerClass jdk/jshell/spi/ExecutionControl innerClassName StoppedException flags 9
|
||||||
|
|
||||||
|
class name jdk/jshell/spi/ExecutionControl$UserException
|
||||||
|
header extends jdk/jshell/spi/ExecutionControl$RunException nestHost jdk/jshell/spi/ExecutionControl flags 21
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$RunException outerClass jdk/jshell/spi/ExecutionControl innerClassName RunException flags 409
|
||||||
|
innerclass innerClass jdk/jshell/spi/ExecutionControl$UserException outerClass jdk/jshell/spi/ExecutionControl innerClassName UserException flags 9
|
||||||
|
|
@ -29,10 +29,11 @@
|
|||||||
#command used to generate this file:
|
#command used to generate this file:
|
||||||
#build.tools.symbolgenerator.CreateSymbols build-description-incremental symbols include.list
|
#build.tools.symbolgenerator.CreateSymbols build-description-incremental symbols include.list
|
||||||
#
|
#
|
||||||
generate platforms 7:8:9:A:B:C
|
generate platforms 7:8:9:A:B:C:D
|
||||||
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 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 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
|
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
|
||||||
platform version A base 9 files java.activation-A.sym.txt:java.base-A.sym.txt:java.compiler-A.sym.txt:java.corba-A.sym.txt:java.datatransfer-A.sym.txt:java.desktop-A.sym.txt:java.instrument-A.sym.txt:java.logging-A.sym.txt:java.management-A.sym.txt:java.management.rmi-A.sym.txt:java.naming-A.sym.txt:java.prefs-A.sym.txt:java.rmi-A.sym.txt:java.scripting-A.sym.txt:java.se-A.sym.txt:java.se.ee-A.sym.txt:java.security.jgss-A.sym.txt:java.security.sasl-A.sym.txt:java.smartcardio-A.sym.txt:java.sql-A.sym.txt:java.sql.rowset-A.sym.txt:java.transaction-A.sym.txt:java.xml-A.sym.txt:java.xml.bind-A.sym.txt:java.xml.crypto-A.sym.txt:java.xml.ws-A.sym.txt:java.xml.ws.annotation-A.sym.txt:jdk.accessibility-A.sym.txt:jdk.attach-A.sym.txt:jdk.charsets-A.sym.txt:jdk.compiler-A.sym.txt:jdk.crypto.cryptoki-A.sym.txt:jdk.crypto.ec-A.sym.txt:jdk.dynalink-A.sym.txt:jdk.editpad-A.sym.txt:jdk.hotspot.agent-A.sym.txt:jdk.httpserver-A.sym.txt:jdk.incubator.httpclient-A.sym.txt:jdk.jartool-A.sym.txt:jdk.javadoc-A.sym.txt:jdk.jcmd-A.sym.txt:jdk.jconsole-A.sym.txt:jdk.jdeps-A.sym.txt:jdk.jdi-A.sym.txt:jdk.jdwp.agent-A.sym.txt:jdk.jlink-A.sym.txt:jdk.jshell-A.sym.txt:jdk.jsobject-A.sym.txt:jdk.jstatd-A.sym.txt:jdk.localedata-A.sym.txt:jdk.management-A.sym.txt:jdk.management.agent-A.sym.txt:jdk.naming.dns-A.sym.txt:jdk.naming.rmi-A.sym.txt:jdk.net-A.sym.txt:jdk.pack-A.sym.txt:jdk.policytool-A.sym.txt:jdk.rmic-A.sym.txt:jdk.scripting.nashorn-A.sym.txt:jdk.sctp-A.sym.txt:jdk.security.auth-A.sym.txt:jdk.security.jgss-A.sym.txt:jdk.unsupported-A.sym.txt:jdk.xml.dom-A.sym.txt:jdk.zipfs-A.sym.txt
|
platform version A base 9 files java.activation-A.sym.txt:java.base-A.sym.txt:java.compiler-A.sym.txt:java.corba-A.sym.txt:java.datatransfer-A.sym.txt:java.desktop-A.sym.txt:java.instrument-A.sym.txt:java.logging-A.sym.txt:java.management-A.sym.txt:java.management.rmi-A.sym.txt:java.naming-A.sym.txt:java.prefs-A.sym.txt:java.rmi-A.sym.txt:java.scripting-A.sym.txt:java.se-A.sym.txt:java.se.ee-A.sym.txt:java.security.jgss-A.sym.txt:java.security.sasl-A.sym.txt:java.smartcardio-A.sym.txt:java.sql-A.sym.txt:java.sql.rowset-A.sym.txt:java.transaction-A.sym.txt:java.xml-A.sym.txt:java.xml.bind-A.sym.txt:java.xml.crypto-A.sym.txt:java.xml.ws-A.sym.txt:java.xml.ws.annotation-A.sym.txt:jdk.accessibility-A.sym.txt:jdk.attach-A.sym.txt:jdk.charsets-A.sym.txt:jdk.compiler-A.sym.txt:jdk.crypto.cryptoki-A.sym.txt:jdk.crypto.ec-A.sym.txt:jdk.dynalink-A.sym.txt:jdk.editpad-A.sym.txt:jdk.hotspot.agent-A.sym.txt:jdk.httpserver-A.sym.txt:jdk.incubator.httpclient-A.sym.txt:jdk.jartool-A.sym.txt:jdk.javadoc-A.sym.txt:jdk.jcmd-A.sym.txt:jdk.jconsole-A.sym.txt:jdk.jdeps-A.sym.txt:jdk.jdi-A.sym.txt:jdk.jdwp.agent-A.sym.txt:jdk.jlink-A.sym.txt:jdk.jshell-A.sym.txt:jdk.jsobject-A.sym.txt:jdk.jstatd-A.sym.txt:jdk.localedata-A.sym.txt:jdk.management-A.sym.txt:jdk.management.agent-A.sym.txt:jdk.naming.dns-A.sym.txt:jdk.naming.rmi-A.sym.txt:jdk.net-A.sym.txt:jdk.pack-A.sym.txt:jdk.policytool-A.sym.txt:jdk.rmic-A.sym.txt:jdk.scripting.nashorn-A.sym.txt:jdk.sctp-A.sym.txt:jdk.security.auth-A.sym.txt:jdk.security.jgss-A.sym.txt:jdk.unsupported-A.sym.txt:jdk.xml.dom-A.sym.txt:jdk.zipfs-A.sym.txt
|
||||||
platform version B base A files java.activation-B.sym.txt:java.base-B.sym.txt:java.compiler-B.sym.txt:java.corba-B.sym.txt:java.datatransfer-B.sym.txt:java.desktop-B.sym.txt:java.instrument-B.sym.txt:java.logging-B.sym.txt:java.management-B.sym.txt:java.management.rmi-B.sym.txt:java.naming-B.sym.txt:java.net.http-B.sym.txt:java.prefs-B.sym.txt:java.rmi-B.sym.txt:java.scripting-B.sym.txt:java.se-B.sym.txt:java.se.ee-B.sym.txt:java.security.jgss-B.sym.txt:java.security.sasl-B.sym.txt:java.smartcardio-B.sym.txt:java.sql-B.sym.txt:java.sql.rowset-B.sym.txt:java.transaction-B.sym.txt:java.transaction.xa-B.sym.txt:java.xml-B.sym.txt:java.xml.bind-B.sym.txt:java.xml.crypto-B.sym.txt:java.xml.ws-B.sym.txt:java.xml.ws.annotation-B.sym.txt:jdk.accessibility-B.sym.txt:jdk.attach-B.sym.txt:jdk.charsets-B.sym.txt:jdk.compiler-B.sym.txt:jdk.crypto.cryptoki-B.sym.txt:jdk.crypto.ec-B.sym.txt:jdk.dynalink-B.sym.txt:jdk.editpad-B.sym.txt:jdk.hotspot.agent-B.sym.txt:jdk.httpserver-B.sym.txt:jdk.incubator.httpclient-B.sym.txt:jdk.jartool-B.sym.txt:jdk.javadoc-B.sym.txt:jdk.jcmd-B.sym.txt:jdk.jconsole-B.sym.txt:jdk.jdeps-B.sym.txt:jdk.jdi-B.sym.txt:jdk.jdwp.agent-B.sym.txt:jdk.jfr-B.sym.txt:jdk.jlink-B.sym.txt:jdk.jshell-B.sym.txt:jdk.jsobject-B.sym.txt:jdk.jstatd-B.sym.txt:jdk.localedata-B.sym.txt:jdk.management-B.sym.txt:jdk.management.agent-B.sym.txt:jdk.management.jfr-B.sym.txt:jdk.naming.dns-B.sym.txt:jdk.naming.rmi-B.sym.txt:jdk.net-B.sym.txt:jdk.pack-B.sym.txt:jdk.rmic-B.sym.txt:jdk.scripting.nashorn-B.sym.txt:jdk.sctp-B.sym.txt:jdk.security.auth-B.sym.txt:jdk.security.jgss-B.sym.txt:jdk.unsupported-B.sym.txt:jdk.xml.dom-B.sym.txt:jdk.zipfs-B.sym.txt
|
platform version B base A files java.activation-B.sym.txt:java.base-B.sym.txt:java.compiler-B.sym.txt:java.corba-B.sym.txt:java.datatransfer-B.sym.txt:java.desktop-B.sym.txt:java.instrument-B.sym.txt:java.logging-B.sym.txt:java.management-B.sym.txt:java.management.rmi-B.sym.txt:java.naming-B.sym.txt:java.net.http-B.sym.txt:java.prefs-B.sym.txt:java.rmi-B.sym.txt:java.scripting-B.sym.txt:java.se-B.sym.txt:java.se.ee-B.sym.txt:java.security.jgss-B.sym.txt:java.security.sasl-B.sym.txt:java.smartcardio-B.sym.txt:java.sql-B.sym.txt:java.sql.rowset-B.sym.txt:java.transaction-B.sym.txt:java.transaction.xa-B.sym.txt:java.xml-B.sym.txt:java.xml.bind-B.sym.txt:java.xml.crypto-B.sym.txt:java.xml.ws-B.sym.txt:java.xml.ws.annotation-B.sym.txt:jdk.accessibility-B.sym.txt:jdk.attach-B.sym.txt:jdk.charsets-B.sym.txt:jdk.compiler-B.sym.txt:jdk.crypto.cryptoki-B.sym.txt:jdk.crypto.ec-B.sym.txt:jdk.dynalink-B.sym.txt:jdk.editpad-B.sym.txt:jdk.hotspot.agent-B.sym.txt:jdk.httpserver-B.sym.txt:jdk.incubator.httpclient-B.sym.txt:jdk.jartool-B.sym.txt:jdk.javadoc-B.sym.txt:jdk.jcmd-B.sym.txt:jdk.jconsole-B.sym.txt:jdk.jdeps-B.sym.txt:jdk.jdi-B.sym.txt:jdk.jdwp.agent-B.sym.txt:jdk.jfr-B.sym.txt:jdk.jlink-B.sym.txt:jdk.jshell-B.sym.txt:jdk.jsobject-B.sym.txt:jdk.jstatd-B.sym.txt:jdk.localedata-B.sym.txt:jdk.management-B.sym.txt:jdk.management.agent-B.sym.txt:jdk.management.jfr-B.sym.txt:jdk.naming.dns-B.sym.txt:jdk.naming.rmi-B.sym.txt:jdk.net-B.sym.txt:jdk.pack-B.sym.txt:jdk.rmic-B.sym.txt:jdk.scripting.nashorn-B.sym.txt:jdk.sctp-B.sym.txt:jdk.security.auth-B.sym.txt:jdk.security.jgss-B.sym.txt:jdk.unsupported-B.sym.txt:jdk.xml.dom-B.sym.txt:jdk.zipfs-B.sym.txt
|
||||||
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 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.xml-D.sym.txt:java.xml.crypto-D.sym.txt:jdk.compiler-D.sym.txt:jdk.httpserver-D.sym.txt:jdk.javadoc-D.sym.txt:jdk.jlink-D.sym.txt:jdk.jshell-D.sym.txt
|
||||||
|
@ -25,12 +25,23 @@
|
|||||||
|
|
||||||
package build.tools.generatecacerts;
|
package build.tools.generatecacerts;
|
||||||
|
|
||||||
|
import java.io.DataOutputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.security.KeyStore;
|
import java.security.DigestOutputStream;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.cert.CertificateException;
|
||||||
import java.security.cert.CertificateFactory;
|
import java.security.cert.CertificateFactory;
|
||||||
|
import java.security.cert.X509Certificate;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate cacerts
|
* Generate cacerts
|
||||||
@ -39,23 +50,99 @@ import java.security.cert.CertificateFactory;
|
|||||||
*/
|
*/
|
||||||
public class GenerateCacerts {
|
public class GenerateCacerts {
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
KeyStore ks = KeyStore.getInstance("JKS");
|
|
||||||
ks.load(null, null);
|
|
||||||
CertificateFactory cf = CertificateFactory.getInstance("X509");
|
|
||||||
Files.list(Path.of(args[0]))
|
|
||||||
.filter(p -> !p.getFileName().toString().equals("README"))
|
|
||||||
.forEach(p -> {
|
|
||||||
try {
|
|
||||||
String alias = p.getFileName().toString() + " [jdk]";
|
|
||||||
try (InputStream fis = Files.newInputStream(p)) {
|
|
||||||
ks.setCertificateEntry(alias, cf.generateCertificate(fis));
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
try (FileOutputStream fos = new FileOutputStream(args[1])) {
|
try (FileOutputStream fos = new FileOutputStream(args[1])) {
|
||||||
ks.store(fos, "changeit".toCharArray());
|
store(args[0], fos, "changeit".toCharArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The following code are copied from JavaKeyStore.java.
|
||||||
|
|
||||||
|
private static final int MAGIC = 0xfeedfeed;
|
||||||
|
private static final int VERSION_2 = 0x02;
|
||||||
|
|
||||||
|
// This method is a simplified version of JavaKeyStore::engineStore.
|
||||||
|
// A new "dir" argument is added. All cert names in "dir" is collected into
|
||||||
|
// a sorted array. Each cert is stored with a creation date set to its
|
||||||
|
// notBefore value. Thus the output is determined as long as the certs
|
||||||
|
// are the same.
|
||||||
|
public static void store(String dir, OutputStream stream, char[] password)
|
||||||
|
throws IOException, NoSuchAlgorithmException, CertificateException
|
||||||
|
{
|
||||||
|
byte[] encoded; // the certificate encoding
|
||||||
|
CertificateFactory cf = CertificateFactory.getInstance("X509");
|
||||||
|
|
||||||
|
MessageDigest md = getPreKeyedHash(password);
|
||||||
|
DataOutputStream dos
|
||||||
|
= new DataOutputStream(new DigestOutputStream(stream, md));
|
||||||
|
|
||||||
|
dos.writeInt(MAGIC);
|
||||||
|
// always write the latest version
|
||||||
|
dos.writeInt(VERSION_2);
|
||||||
|
|
||||||
|
// All file names in dir sorted.
|
||||||
|
// README is excluded. Name starting with "." excluded.
|
||||||
|
List<String> entries = Files.list(Path.of(dir))
|
||||||
|
.map(p -> p.getFileName().toString())
|
||||||
|
.filter(s -> !s.equals("README") && !s.startsWith("."))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
entries.sort(String::compareTo);
|
||||||
|
|
||||||
|
dos.writeInt(entries.size());
|
||||||
|
|
||||||
|
for (String entry : entries) {
|
||||||
|
|
||||||
|
String alias = entry + " [jdk]";
|
||||||
|
X509Certificate cert;
|
||||||
|
try (InputStream fis = Files.newInputStream(Path.of(dir, entry))) {
|
||||||
|
cert = (X509Certificate) cf.generateCertificate(fis);
|
||||||
|
}
|
||||||
|
|
||||||
|
dos.writeInt(2);
|
||||||
|
|
||||||
|
// Write the alias
|
||||||
|
dos.writeUTF(alias);
|
||||||
|
|
||||||
|
// Write the (entry creation) date, which is notBefore of the cert
|
||||||
|
dos.writeLong(cert.getNotBefore().getTime());
|
||||||
|
|
||||||
|
// Write the trusted certificate
|
||||||
|
encoded = cert.getEncoded();
|
||||||
|
dos.writeUTF(cert.getType());
|
||||||
|
dos.writeInt(encoded.length);
|
||||||
|
dos.write(encoded);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write the keyed hash which is used to detect tampering with
|
||||||
|
* the keystore (such as deleting or modifying key or
|
||||||
|
* certificate entries).
|
||||||
|
*/
|
||||||
|
byte[] digest = md.digest();
|
||||||
|
|
||||||
|
dos.write(digest);
|
||||||
|
dos.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MessageDigest getPreKeyedHash(char[] password)
|
||||||
|
throws NoSuchAlgorithmException, UnsupportedEncodingException
|
||||||
|
{
|
||||||
|
|
||||||
|
MessageDigest md = MessageDigest.getInstance("SHA");
|
||||||
|
byte[] passwdBytes = convertToBytes(password);
|
||||||
|
md.update(passwdBytes);
|
||||||
|
Arrays.fill(passwdBytes, (byte) 0x00);
|
||||||
|
md.update("Mighty Aphrodite".getBytes("UTF8"));
|
||||||
|
return md;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] convertToBytes(char[] password) {
|
||||||
|
int i, j;
|
||||||
|
byte[] passwdBytes = new byte[password.length * 2];
|
||||||
|
for (i=0, j=0; i<password.length; i++) {
|
||||||
|
passwdBytes[j++] = (byte)(password[i] >> 8);
|
||||||
|
passwdBytes[j++] = (byte)password[i];
|
||||||
|
}
|
||||||
|
return passwdBytes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -57,6 +57,17 @@ ifneq ($(BUILD_CRYPTO), false)
|
|||||||
))
|
))
|
||||||
|
|
||||||
TARGETS += $(BUILD_LIBW2K_LSA_AUTH)
|
TARGETS += $(BUILD_LIBW2K_LSA_AUTH)
|
||||||
|
|
||||||
|
$(eval $(call SetupJdkLibrary, BUILD_LIBSSPI_BRIDGE, \
|
||||||
|
NAME := sspi_bridge, \
|
||||||
|
OPTIMIZATION := LOW, \
|
||||||
|
CFLAGS := $(CFLAGS_JDKLIB) \
|
||||||
|
-I$(TOPDIR)/src/java.security.jgss/share/native/libj2gss, \
|
||||||
|
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||||
|
$(call SET_SHARED_LIBRARY_ORIGIN) \
|
||||||
|
))
|
||||||
|
|
||||||
|
TARGETS += $(BUILD_LIBSSPI_BRIDGE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(call isTargetOs, macosx), true)
|
ifeq ($(call isTargetOs, macosx), true)
|
||||||
|
1177
src/hotspot/cpu/aarch64/aarch64-asmtest.py
Normal file
1177
src/hotspot/cpu/aarch64/aarch64-asmtest.py
Normal file
File diff suppressed because it is too large
Load Diff
@ -957,6 +957,146 @@ reg_class v3_reg(
|
|||||||
V3, V3_H
|
V3, V3_H
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v4
|
||||||
|
reg_class v4_reg(
|
||||||
|
V4, V4_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v5
|
||||||
|
reg_class v5_reg(
|
||||||
|
V5, V5_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v6
|
||||||
|
reg_class v6_reg(
|
||||||
|
V6, V6_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v7
|
||||||
|
reg_class v7_reg(
|
||||||
|
V7, V7_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v8
|
||||||
|
reg_class v8_reg(
|
||||||
|
V8, V8_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v9
|
||||||
|
reg_class v9_reg(
|
||||||
|
V9, V9_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v10
|
||||||
|
reg_class v10_reg(
|
||||||
|
V10, V10_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v11
|
||||||
|
reg_class v11_reg(
|
||||||
|
V11, V11_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v12
|
||||||
|
reg_class v12_reg(
|
||||||
|
V12, V12_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v13
|
||||||
|
reg_class v13_reg(
|
||||||
|
V13, V13_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v14
|
||||||
|
reg_class v14_reg(
|
||||||
|
V14, V14_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v15
|
||||||
|
reg_class v15_reg(
|
||||||
|
V15, V15_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v16
|
||||||
|
reg_class v16_reg(
|
||||||
|
V16, V16_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v17
|
||||||
|
reg_class v17_reg(
|
||||||
|
V17, V17_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v18
|
||||||
|
reg_class v18_reg(
|
||||||
|
V18, V18_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v19
|
||||||
|
reg_class v19_reg(
|
||||||
|
V19, V19_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v20
|
||||||
|
reg_class v20_reg(
|
||||||
|
V20, V20_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v21
|
||||||
|
reg_class v21_reg(
|
||||||
|
V21, V21_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v22
|
||||||
|
reg_class v22_reg(
|
||||||
|
V22, V22_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v23
|
||||||
|
reg_class v23_reg(
|
||||||
|
V23, V23_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v24
|
||||||
|
reg_class v24_reg(
|
||||||
|
V24, V24_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v25
|
||||||
|
reg_class v25_reg(
|
||||||
|
V25, V25_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v26
|
||||||
|
reg_class v26_reg(
|
||||||
|
V26, V26_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v27
|
||||||
|
reg_class v27_reg(
|
||||||
|
V27, V27_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v28
|
||||||
|
reg_class v28_reg(
|
||||||
|
V28, V28_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v29
|
||||||
|
reg_class v29_reg(
|
||||||
|
V29, V29_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v30
|
||||||
|
reg_class v30_reg(
|
||||||
|
V30, V30_H
|
||||||
|
);
|
||||||
|
|
||||||
|
// Class for 128 bit register v31
|
||||||
|
reg_class v31_reg(
|
||||||
|
V31, V31_H
|
||||||
|
);
|
||||||
|
|
||||||
// Singleton class for condition codes
|
// Singleton class for condition codes
|
||||||
reg_class int_flags(RFLAGS);
|
reg_class int_flags(RFLAGS);
|
||||||
|
|
||||||
@ -4774,6 +4914,258 @@ operand vRegD_V3()
|
|||||||
interface(REG_INTER);
|
interface(REG_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V4()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v4_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V5()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v5_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V6()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v6_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V7()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v7_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V8()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v8_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V9()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v9_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V10()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v10_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V11()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v11_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V12()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v12_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V13()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v13_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V14()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v14_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V15()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v15_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V16()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v16_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V17()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v17_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V18()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v18_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V19()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v19_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V20()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v20_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V21()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v21_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V22()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v22_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V23()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v23_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V24()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v24_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V25()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v25_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V26()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v26_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V27()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v27_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V28()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v28_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V29()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v29_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V30()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v30_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
|
operand vRegD_V31()
|
||||||
|
%{
|
||||||
|
constraint(ALLOC_IN_RC(v31_reg));
|
||||||
|
match(RegD);
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(REG_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
// Flags register, used as output of signed compare instructions
|
// Flags register, used as output of signed compare instructions
|
||||||
|
|
||||||
// note that on AArch64 we also use this register as the output for
|
// note that on AArch64 we also use this register as the output for
|
||||||
@ -13863,7 +14255,7 @@ instruct compF_reg_zero(rFlagsReg cr, vRegF src1, immF0 src2)
|
|||||||
format %{ "fcmps $src1, 0.0" %}
|
format %{ "fcmps $src1, 0.0" %}
|
||||||
|
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
__ fcmps(as_FloatRegister($src1$$reg), 0.0D);
|
__ fcmps(as_FloatRegister($src1$$reg), 0.0);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
ins_pipe(pipe_class_compare);
|
ins_pipe(pipe_class_compare);
|
||||||
@ -13892,7 +14284,7 @@ instruct compD_reg_zero(rFlagsReg cr, vRegD src1, immD0 src2)
|
|||||||
format %{ "fcmpd $src1, 0.0" %}
|
format %{ "fcmpd $src1, 0.0" %}
|
||||||
|
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
__ fcmpd(as_FloatRegister($src1$$reg), 0.0D);
|
__ fcmpd(as_FloatRegister($src1$$reg), 0.0);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
ins_pipe(pipe_class_compare);
|
ins_pipe(pipe_class_compare);
|
||||||
@ -13968,7 +14360,7 @@ instruct compF3_reg_immF0(iRegINoSp dst, vRegF src1, immF0 zero, rFlagsReg cr)
|
|||||||
Label done;
|
Label done;
|
||||||
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
||||||
Register d = as_Register($dst$$reg);
|
Register d = as_Register($dst$$reg);
|
||||||
__ fcmps(s1, 0.0D);
|
__ fcmps(s1, 0.0);
|
||||||
// installs 0 if EQ else -1
|
// installs 0 if EQ else -1
|
||||||
__ csinvw(d, zr, zr, Assembler::EQ);
|
__ csinvw(d, zr, zr, Assembler::EQ);
|
||||||
// keeps -1 if less or unordered else installs 1
|
// keeps -1 if less or unordered else installs 1
|
||||||
@ -13995,7 +14387,7 @@ instruct compD3_reg_immD0(iRegINoSp dst, vRegD src1, immD0 zero, rFlagsReg cr)
|
|||||||
Label done;
|
Label done;
|
||||||
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
||||||
Register d = as_Register($dst$$reg);
|
Register d = as_Register($dst$$reg);
|
||||||
__ fcmpd(s1, 0.0D);
|
__ fcmpd(s1, 0.0);
|
||||||
// installs 0 if EQ else -1
|
// installs 0 if EQ else -1
|
||||||
__ csinvw(d, zr, zr, Assembler::EQ);
|
__ csinvw(d, zr, zr, Assembler::EQ);
|
||||||
// keeps -1 if less or unordered else installs 1
|
// keeps -1 if less or unordered else installs 1
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -276,7 +276,7 @@ public:
|
|||||||
unsigned get(int msb = 31, int lsb = 0) {
|
unsigned get(int msb = 31, int lsb = 0) {
|
||||||
int nbits = msb - lsb + 1;
|
int nbits = msb - lsb + 1;
|
||||||
unsigned mask = ((1U << nbits) - 1) << lsb;
|
unsigned mask = ((1U << nbits) - 1) << lsb;
|
||||||
assert_cond(bits & mask == mask);
|
assert_cond((bits & mask) == mask);
|
||||||
return (insn & mask) >> lsb;
|
return (insn & mask) >> lsb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,10 +306,12 @@ public:
|
|||||||
};
|
};
|
||||||
class Post : public PrePost {
|
class Post : public PrePost {
|
||||||
Register _idx;
|
Register _idx;
|
||||||
|
bool _is_postreg;
|
||||||
public:
|
public:
|
||||||
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; }
|
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; _is_postreg = false; }
|
||||||
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; }
|
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; _is_postreg = true; }
|
||||||
Register idx_reg() { return _idx; }
|
Register idx_reg() { return _idx; }
|
||||||
|
bool is_postreg() {return _is_postreg; }
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace ext
|
namespace ext
|
||||||
@ -393,7 +395,7 @@ class Address {
|
|||||||
: _base(p.reg()), _offset(p.offset()), _mode(pre) { }
|
: _base(p.reg()), _offset(p.offset()), _mode(pre) { }
|
||||||
Address(Post p)
|
Address(Post p)
|
||||||
: _base(p.reg()), _index(p.idx_reg()), _offset(p.offset()),
|
: _base(p.reg()), _index(p.idx_reg()), _offset(p.offset()),
|
||||||
_mode(p.idx_reg() == NULL ? post : post_reg), _target(0) { }
|
_mode(p.is_postreg() ? post_reg : post), _target(0) { }
|
||||||
Address(address target, RelocationHolder const& rspec)
|
Address(address target, RelocationHolder const& rspec)
|
||||||
: _mode(literal),
|
: _mode(literal),
|
||||||
_rspec(rspec),
|
_rspec(rspec),
|
||||||
@ -807,32 +809,34 @@ public:
|
|||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
// Bitfield
|
// Bitfield
|
||||||
#define INSN(NAME, opcode) \
|
#define INSN(NAME, opcode, size) \
|
||||||
void NAME(Register Rd, Register Rn, unsigned immr, unsigned imms) { \
|
void NAME(Register Rd, Register Rn, unsigned immr, unsigned imms) { \
|
||||||
starti; \
|
starti; \
|
||||||
|
guarantee(size == 1 || (immr < 32 && imms < 32), "incorrect immr/imms");\
|
||||||
f(opcode, 31, 22), f(immr, 21, 16), f(imms, 15, 10); \
|
f(opcode, 31, 22), f(immr, 21, 16), f(imms, 15, 10); \
|
||||||
zrf(Rn, 5), rf(Rd, 0); \
|
zrf(Rn, 5), rf(Rd, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
INSN(sbfmw, 0b0001001100);
|
INSN(sbfmw, 0b0001001100, 0);
|
||||||
INSN(bfmw, 0b0011001100);
|
INSN(bfmw, 0b0011001100, 0);
|
||||||
INSN(ubfmw, 0b0101001100);
|
INSN(ubfmw, 0b0101001100, 0);
|
||||||
INSN(sbfm, 0b1001001101);
|
INSN(sbfm, 0b1001001101, 1);
|
||||||
INSN(bfm, 0b1011001101);
|
INSN(bfm, 0b1011001101, 1);
|
||||||
INSN(ubfm, 0b1101001101);
|
INSN(ubfm, 0b1101001101, 1);
|
||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
// Extract
|
// Extract
|
||||||
#define INSN(NAME, opcode) \
|
#define INSN(NAME, opcode, size) \
|
||||||
void NAME(Register Rd, Register Rn, Register Rm, unsigned imms) { \
|
void NAME(Register Rd, Register Rn, Register Rm, unsigned imms) { \
|
||||||
starti; \
|
starti; \
|
||||||
|
guarantee(size == 1 || imms < 32, "incorrect imms"); \
|
||||||
f(opcode, 31, 21), f(imms, 15, 10); \
|
f(opcode, 31, 21), f(imms, 15, 10); \
|
||||||
rf(Rm, 16), rf(Rn, 5), rf(Rd, 0); \
|
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
INSN(extrw, 0b00010011100);
|
INSN(extrw, 0b00010011100, 0);
|
||||||
INSN(extr, 0b10010011110);
|
INSN(extr, 0b10010011110, 1);
|
||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
@ -1126,7 +1130,7 @@ public:
|
|||||||
Register Rn, enum operand_size sz, int op, bool ordered) {
|
Register Rn, enum operand_size sz, int op, bool ordered) {
|
||||||
starti;
|
starti;
|
||||||
f(sz, 31, 30), f(0b001000, 29, 24), f(op, 23, 21);
|
f(sz, 31, 30), f(0b001000, 29, 24), f(op, 23, 21);
|
||||||
rf(Rs, 16), f(ordered, 15), rf(Rt2, 10), srf(Rn, 5), zrf(Rt1, 0);
|
rf(Rs, 16), f(ordered, 15), zrf(Rt2, 10), srf(Rn, 5), zrf(Rt1, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_exclusive(Register dst, Register addr,
|
void load_exclusive(Register dst, Register addr,
|
||||||
@ -1255,7 +1259,7 @@ public:
|
|||||||
enum operand_size sz, int op1, int op2, bool a, bool r) {
|
enum operand_size sz, int op1, int op2, bool a, bool r) {
|
||||||
starti;
|
starti;
|
||||||
f(sz, 31, 30), f(0b111000, 29, 24), f(a, 23), f(r, 22), f(1, 21);
|
f(sz, 31, 30), f(0b111000, 29, 24), f(a, 23), f(r, 22), f(1, 21);
|
||||||
rf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), srf(Rn, 5), zrf(Rt, 0);
|
zrf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), srf(Rn, 5), zrf(Rt, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INSN(NAME, NAME_A, NAME_L, NAME_AL, op1, op2) \
|
#define INSN(NAME, NAME_A, NAME_L, NAME_AL, op1, op2) \
|
||||||
@ -1477,6 +1481,7 @@ public:
|
|||||||
void NAME(Register Rd, Register Rn, Register Rm, \
|
void NAME(Register Rd, Register Rn, Register Rm, \
|
||||||
enum shift_kind kind = LSL, unsigned shift = 0) { \
|
enum shift_kind kind = LSL, unsigned shift = 0) { \
|
||||||
starti; \
|
starti; \
|
||||||
|
guarantee(size == 1 || shift < 32, "incorrect shift"); \
|
||||||
f(N, 21); \
|
f(N, 21); \
|
||||||
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
||||||
op_shifted_reg(0b01010, kind, shift, size, op); \
|
op_shifted_reg(0b01010, kind, shift, size, op); \
|
||||||
@ -1539,6 +1544,7 @@ void mvnw(Register Rd, Register Rm,
|
|||||||
starti; \
|
starti; \
|
||||||
f(0, 21); \
|
f(0, 21); \
|
||||||
assert_cond(kind != ROR); \
|
assert_cond(kind != ROR); \
|
||||||
|
guarantee(size == 1 || shift < 32, "incorrect shift");\
|
||||||
zrf(Rd, 0), zrf(Rn, 5), zrf(Rm, 16); \
|
zrf(Rd, 0), zrf(Rn, 5), zrf(Rm, 16); \
|
||||||
op_shifted_reg(0b01011, kind, shift, size, op); \
|
op_shifted_reg(0b01011, kind, shift, size, op); \
|
||||||
}
|
}
|
||||||
@ -1567,7 +1573,7 @@ void mvnw(Register Rd, Register Rm,
|
|||||||
void add_sub_extended_reg(unsigned op, unsigned decode,
|
void add_sub_extended_reg(unsigned op, unsigned decode,
|
||||||
Register Rd, Register Rn, Register Rm,
|
Register Rd, Register Rn, Register Rm,
|
||||||
unsigned opt, ext::operation option, unsigned imm) {
|
unsigned opt, ext::operation option, unsigned imm) {
|
||||||
guarantee(imm <= 4, "shift amount must be < 4");
|
guarantee(imm <= 4, "shift amount must be <= 4");
|
||||||
f(op, 31, 29), f(decode, 28, 24), f(opt, 23, 22), f(1, 21);
|
f(op, 31, 29), f(decode, 28, 24), f(opt, 23, 22), f(1, 21);
|
||||||
f(option, 15, 13), f(imm, 12, 10);
|
f(option, 15, 13), f(imm, 12, 10);
|
||||||
}
|
}
|
||||||
@ -1652,7 +1658,7 @@ void mvnw(Register Rd, Register Rm,
|
|||||||
f(o2, 10);
|
f(o2, 10);
|
||||||
f(o3, 4);
|
f(o3, 4);
|
||||||
f(nzcv, 3, 0);
|
f(nzcv, 3, 0);
|
||||||
f(imm5, 20, 16), rf(Rn, 5);
|
f(imm5, 20, 16), zrf(Rn, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define INSN(NAME, op) \
|
#define INSN(NAME, op) \
|
||||||
@ -2121,7 +2127,12 @@ public:
|
|||||||
}
|
}
|
||||||
void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
|
void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
|
||||||
int imm, int op1, int op2, int regs) {
|
int imm, int op1, int op2, int regs) {
|
||||||
guarantee(T <= T1Q && imm == SIMD_Size_in_bytes[T] * regs, "bad offset");
|
|
||||||
|
bool replicate = op2 >> 2 == 3;
|
||||||
|
// post-index value (imm) is formed differently for replicate/non-replicate ld* instructions
|
||||||
|
int expectedImmediate = replicate ? regs * (1 << (T >> 1)) : SIMD_Size_in_bytes[T] * regs;
|
||||||
|
guarantee(T < T1Q , "incorrect arrangement");
|
||||||
|
guarantee(imm == expectedImmediate, "bad offset");
|
||||||
starti;
|
starti;
|
||||||
f(0,31), f((int)T & 1, 30);
|
f(0,31), f((int)T & 1, 30);
|
||||||
f(op1 | 0b100, 29, 21), f(0b11111, 20, 16), f(op2, 15, 12);
|
f(op1 | 0b100, 29, 21), f(0b11111, 20, 16), f(op2, 15, 12);
|
||||||
@ -2228,42 +2239,47 @@ public:
|
|||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
#define INSN(NAME, opc, opc2) \
|
#define INSN(NAME, opc, opc2, acceptT2D) \
|
||||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
||||||
|
guarantee(T != T1Q && T != T1D, "incorrect arrangement"); \
|
||||||
|
if (!acceptT2D) guarantee(T != T2D, "incorrect arrangement"); \
|
||||||
starti; \
|
starti; \
|
||||||
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
||||||
f((int)T >> 1, 23, 22), f(1, 21), rf(Vm, 16), f(opc2, 15, 10); \
|
f((int)T >> 1, 23, 22), f(1, 21), rf(Vm, 16), f(opc2, 15, 10); \
|
||||||
rf(Vn, 5), rf(Vd, 0); \
|
rf(Vn, 5), rf(Vd, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
INSN(addv, 0, 0b100001);
|
INSN(addv, 0, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||||
INSN(subv, 1, 0b100001);
|
INSN(subv, 1, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||||
INSN(mulv, 0, 0b100111);
|
INSN(mulv, 0, 0b100111, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||||
INSN(mlav, 0, 0b100101);
|
INSN(mlav, 0, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||||
INSN(mlsv, 1, 0b100101);
|
INSN(mlsv, 1, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||||
INSN(sshl, 0, 0b010001);
|
INSN(sshl, 0, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||||
INSN(ushl, 1, 0b010001);
|
INSN(ushl, 1, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||||
INSN(umullv, 1, 0b110000);
|
INSN(umullv, 1, 0b110000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||||
INSN(umlalv, 1, 0b100000);
|
INSN(umlalv, 1, 0b100000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
#define INSN(NAME, opc, opc2) \
|
#define INSN(NAME, opc, opc2, accepted) \
|
||||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) { \
|
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) { \
|
||||||
|
guarantee(T != T1Q && T != T1D, "incorrect arrangement"); \
|
||||||
|
if (accepted < 2) guarantee(T != T2S && T != T2D, "incorrect arrangement"); \
|
||||||
|
if (accepted == 0) guarantee(T == T8B || T == T16B, "incorrect arrangement"); \
|
||||||
starti; \
|
starti; \
|
||||||
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
||||||
f((int)T >> 1, 23, 22), f(opc2, 21, 10); \
|
f((int)T >> 1, 23, 22), f(opc2, 21, 10); \
|
||||||
rf(Vn, 5), rf(Vd, 0); \
|
rf(Vn, 5), rf(Vd, 0); \
|
||||||
}
|
}
|
||||||
|
|
||||||
INSN(absr, 0, 0b100000101110);
|
INSN(absr, 0, 0b100000101110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||||
INSN(negr, 1, 0b100000101110);
|
INSN(negr, 1, 0b100000101110, 2); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||||
INSN(notr, 1, 0b100000010110);
|
INSN(notr, 1, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||||
INSN(addv, 0, 0b110001101110);
|
INSN(addv, 0, 0b110001101110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||||
INSN(cls, 0, 0b100000010010);
|
INSN(cls, 0, 0b100000010010, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||||
INSN(clz, 1, 0b100000010010);
|
INSN(clz, 1, 0b100000010010, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||||
INSN(cnt, 0, 0b100000010110);
|
INSN(cnt, 0, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||||
INSN(uaddlv, 1, 0b110000001110);
|
INSN(uaddlv, 1, 0b110000001110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
@ -2287,7 +2303,7 @@ public:
|
|||||||
starti; \
|
starti; \
|
||||||
assert(lsl == 0 || \
|
assert(lsl == 0 || \
|
||||||
((T == T4H || T == T8H) && lsl == 8) || \
|
((T == T4H || T == T8H) && lsl == 8) || \
|
||||||
((T == T2S || T == T4S) && ((lsl >> 3) < 4)), "invalid shift"); \
|
((T == T2S || T == T4S) && ((lsl >> 3) < 4) && ((lsl & 7) == 0)), "invalid shift");\
|
||||||
cmode |= lsl >> 2; \
|
cmode |= lsl >> 2; \
|
||||||
if (T == T4H || T == T8H) cmode |= 0b1000; \
|
if (T == T4H || T == T8H) cmode |= 0b1000; \
|
||||||
if (!(T == T4H || T == T8H || T == T2S || T == T4S)) { \
|
if (!(T == T4H || T == T8H || T == T2S || T == T4S)) { \
|
||||||
@ -2448,7 +2464,8 @@ public:
|
|||||||
|
|
||||||
#undef INSN
|
#undef INSN
|
||||||
|
|
||||||
void ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
private:
|
||||||
|
void _ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||||
starti;
|
starti;
|
||||||
/* The encodings for the immh:immb fields (bits 22:16) are
|
/* The encodings for the immh:immb fields (bits 22:16) are
|
||||||
* 0001 xxx 8H, 8B/16b shift = xxx
|
* 0001 xxx 8H, 8B/16b shift = xxx
|
||||||
@ -2461,8 +2478,16 @@ public:
|
|||||||
f(0, 31), f(Tb & 1, 30), f(0b1011110, 29, 23), f((1 << ((Tb>>1)+3))|shift, 22, 16);
|
f(0, 31), f(Tb & 1, 30), f(0b1011110, 29, 23), f((1 << ((Tb>>1)+3))|shift, 22, 16);
|
||||||
f(0b101001, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
f(0b101001, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||||
|
assert(Tb == T8B || Tb == T4H || Tb == T2S, "invalid arrangement");
|
||||||
|
_ushll(Vd, Ta, Vn, Tb, shift);
|
||||||
|
}
|
||||||
|
|
||||||
void ushll2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
void ushll2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||||
ushll(Vd, Ta, Vn, Tb, shift);
|
assert(Tb == T16B || Tb == T8H || Tb == T4S, "invalid arrangement");
|
||||||
|
_ushll(Vd, Ta, Vn, Tb, shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move from general purpose register
|
// Move from general purpose register
|
||||||
@ -2470,19 +2495,21 @@ public:
|
|||||||
void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
|
void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
|
||||||
starti;
|
starti;
|
||||||
f(0b01001110000, 31, 21), f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
f(0b01001110000, 31, 21), f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
||||||
f(0b000111, 15, 10), rf(Xn, 5), rf(Vd, 0);
|
f(0b000111, 15, 10), zrf(Xn, 5), rf(Vd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Move to general purpose register
|
// Move to general purpose register
|
||||||
// mov Rd, Vn.T[index]
|
// mov Rd, Vn.T[index]
|
||||||
void mov(Register Xd, FloatRegister Vn, SIMD_Arrangement T, int index) {
|
void mov(Register Xd, FloatRegister Vn, SIMD_Arrangement T, int index) {
|
||||||
|
guarantee(T >= T2S && T < T1Q, "only D and S arrangements are supported");
|
||||||
starti;
|
starti;
|
||||||
f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
|
f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
|
||||||
f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
||||||
f(0b001111, 15, 10), rf(Vn, 5), rf(Xd, 0);
|
f(0b001111, 15, 10), rf(Vn, 5), rf(Xd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
private:
|
||||||
|
void _pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||||
starti;
|
starti;
|
||||||
assert((Ta == T1Q && (Tb == T1D || Tb == T2D)) ||
|
assert((Ta == T1Q && (Tb == T1D || Tb == T2D)) ||
|
||||||
(Ta == T8H && (Tb == T8B || Tb == T16B)), "Invalid Size specifier");
|
(Ta == T8H && (Tb == T8B || Tb == T16B)), "Invalid Size specifier");
|
||||||
@ -2490,9 +2517,16 @@ public:
|
|||||||
f(0, 31), f(Tb & 1, 30), f(0b001110, 29, 24), f(size, 23, 22);
|
f(0, 31), f(Tb & 1, 30), f(0b001110, 29, 24), f(size, 23, 22);
|
||||||
f(1, 21), rf(Vm, 16), f(0b111000, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
f(1, 21), rf(Vm, 16), f(0b111000, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||||
|
assert(Tb == T1D || Tb == T8B, "pmull assumes T1D or T8B as the second size specifier");
|
||||||
|
_pmull(Vd, Ta, Vn, Vm, Tb);
|
||||||
|
}
|
||||||
|
|
||||||
void pmull2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
void pmull2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||||
assert(Tb == T2D || Tb == T16B, "pmull2 assumes T2D or T16B as the second size specifier");
|
assert(Tb == T2D || Tb == T16B, "pmull2 assumes T2D or T16B as the second size specifier");
|
||||||
pmull(Vd, Ta, Vn, Vm, Tb);
|
_pmull(Vd, Ta, Vn, Vm, Tb);
|
||||||
}
|
}
|
||||||
|
|
||||||
void uqxtn(FloatRegister Vd, SIMD_Arrangement Tb, FloatRegister Vn, SIMD_Arrangement Ta) {
|
void uqxtn(FloatRegister Vd, SIMD_Arrangement Tb, FloatRegister Vn, SIMD_Arrangement Ta) {
|
||||||
@ -2509,7 +2543,7 @@ public:
|
|||||||
starti;
|
starti;
|
||||||
assert(T != T1D, "reserved encoding");
|
assert(T != T1D, "reserved encoding");
|
||||||
f(0,31), f((int)T & 1, 30), f(0b001110000, 29, 21);
|
f(0,31), f((int)T & 1, 30), f(0b001110000, 29, 21);
|
||||||
f((1 << (T >> 1)), 20, 16), f(0b000011, 15, 10), rf(Xs, 5), rf(Vd, 0);
|
f((1 << (T >> 1)), 20, 16), f(0b000011, 15, 10), zrf(Xs, 5), rf(Vd, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dup(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, int index = 0)
|
void dup(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, int index = 0)
|
||||||
@ -2524,6 +2558,7 @@ public:
|
|||||||
// AdvSIMD ZIP/UZP/TRN
|
// AdvSIMD ZIP/UZP/TRN
|
||||||
#define INSN(NAME, opcode) \
|
#define INSN(NAME, opcode) \
|
||||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
||||||
|
guarantee(T != T1D && T != T1Q, "invalid arrangement"); \
|
||||||
starti; \
|
starti; \
|
||||||
f(0, 31), f(0b001110, 29, 24), f(0, 21), f(0, 15); \
|
f(0, 31), f(0b001110, 29, 24), f(0, 21), f(0, 15); \
|
||||||
f(opcode, 14, 12), f(0b10, 11, 10); \
|
f(opcode, 14, 12), f(0b10, 11, 10); \
|
||||||
@ -2609,7 +2644,7 @@ public:
|
|||||||
// RBIT only allows T8B and T16B but encodes them oddly. Argh...
|
// RBIT only allows T8B and T16B but encodes them oddly. Argh...
|
||||||
void rbit(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
|
void rbit(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
|
||||||
assert((ASSERTION), MSG);
|
assert((ASSERTION), MSG);
|
||||||
_rbit(Vd, SIMD_Arrangement(T & 1 | 0b010), Vn);
|
_rbit(Vd, SIMD_Arrangement((T & 1) | 0b010), Vn);
|
||||||
}
|
}
|
||||||
#undef ASSERTION
|
#undef ASSERTION
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -1015,7 +1015,11 @@ void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_Patch
|
|||||||
if (UseCompressedOops && !wide) {
|
if (UseCompressedOops && !wide) {
|
||||||
__ decode_heap_oop(dest->as_register());
|
__ decode_heap_oop(dest->as_register());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!UseZGC) {
|
||||||
|
// Load barrier has not yet been applied, so ZGC can't verify the oop here
|
||||||
__ verify_oop(dest->as_register());
|
__ verify_oop(dest->as_register());
|
||||||
|
}
|
||||||
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
|
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
|
||||||
if (UseCompressedClassPointers) {
|
if (UseCompressedClassPointers) {
|
||||||
__ decode_klass_not_null(dest->as_register());
|
__ decode_klass_not_null(dest->as_register());
|
||||||
@ -1074,8 +1078,8 @@ void LIR_Assembler::emit_opBranch(LIR_OpBranch* op) {
|
|||||||
// Assembler::EQ does not permit unordered branches, so we add
|
// Assembler::EQ does not permit unordered branches, so we add
|
||||||
// another branch here. Likewise, Assembler::NE does not permit
|
// another branch here. Likewise, Assembler::NE does not permit
|
||||||
// ordered branches.
|
// ordered branches.
|
||||||
if (is_unordered && op->cond() == lir_cond_equal
|
if ((is_unordered && op->cond() == lir_cond_equal)
|
||||||
|| !is_unordered && op->cond() == lir_cond_notEqual)
|
|| (!is_unordered && op->cond() == lir_cond_notEqual))
|
||||||
__ br(Assembler::VS, *(op->ublock()->label()));
|
__ br(Assembler::VS, *(op->ublock()->label()));
|
||||||
switch(op->cond()) {
|
switch(op->cond()) {
|
||||||
case lir_cond_equal: acond = Assembler::EQ; break;
|
case lir_cond_equal: acond = Assembler::EQ; break;
|
||||||
@ -1785,18 +1789,22 @@ void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr
|
|||||||
switch (code) {
|
switch (code) {
|
||||||
case lir_add: __ fadds (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
case lir_add: __ fadds (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
||||||
case lir_sub: __ fsubs (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
case lir_sub: __ fsubs (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
||||||
|
case lir_mul_strictfp: // fall through
|
||||||
case lir_mul: __ fmuls (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
case lir_mul: __ fmuls (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
||||||
|
case lir_div_strictfp: // fall through
|
||||||
case lir_div: __ fdivs (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
case lir_div: __ fdivs (dest->as_float_reg(), left->as_float_reg(), right->as_float_reg()); break;
|
||||||
default:
|
default:
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
}
|
}
|
||||||
} else if (left->is_double_fpu()) {
|
} else if (left->is_double_fpu()) {
|
||||||
if (right->is_double_fpu()) {
|
if (right->is_double_fpu()) {
|
||||||
// cpu register - cpu register
|
// fpu register - fpu register
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case lir_add: __ faddd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
case lir_add: __ faddd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
||||||
case lir_sub: __ fsubd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
case lir_sub: __ fsubd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
||||||
|
case lir_mul_strictfp: // fall through
|
||||||
case lir_mul: __ fmuld (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
case lir_mul: __ fmuld (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
||||||
|
case lir_div_strictfp: // fall through
|
||||||
case lir_div: __ fdivd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
case lir_div: __ fdivd (dest->as_double_reg(), left->as_double_reg(), right->as_double_reg()); break;
|
||||||
default:
|
default:
|
||||||
ShouldNotReachHere();
|
ShouldNotReachHere();
|
||||||
@ -2869,7 +2877,11 @@ void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest, LIR_Opr tmp) {
|
|||||||
|
|
||||||
|
|
||||||
void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
|
void LIR_Assembler::leal(LIR_Opr addr, LIR_Opr dest, LIR_PatchCode patch_code, CodeEmitInfo* info) {
|
||||||
assert(patch_code == lir_patch_none, "Patch code not supported");
|
if (patch_code != lir_patch_none) {
|
||||||
|
deoptimize_trap(info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
__ lea(dest->as_register_lo(), as_Address(addr->as_address_ptr()));
|
__ lea(dest->as_register_lo(), as_Address(addr->as_address_ptr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -426,7 +426,7 @@ void LIRGenerator::do_ArithmeticOp_FPU(ArithmeticOp* x) {
|
|||||||
tmp = new_register(T_DOUBLE);
|
tmp = new_register(T_DOUBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
arithmetic_op_fpu(x->op(), reg, left.result(), right.result(), NULL);
|
arithmetic_op_fpu(x->op(), reg, left.result(), right.result(), x->is_strictfp());
|
||||||
|
|
||||||
set_result(x, round_item(reg));
|
set_result(x, round_item(reg));
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -768,11 +768,13 @@ extern "C" void npf() {
|
|||||||
|
|
||||||
extern "C" void pf(unsigned long sp, unsigned long fp, unsigned long pc,
|
extern "C" void pf(unsigned long sp, unsigned long fp, unsigned long pc,
|
||||||
unsigned long bcx, unsigned long thread) {
|
unsigned long bcx, unsigned long thread) {
|
||||||
RegisterMap map((JavaThread*)thread, false);
|
|
||||||
if (!reg_map) {
|
if (!reg_map) {
|
||||||
reg_map = (RegisterMap*)os::malloc(sizeof map, mtNone);
|
reg_map = NEW_C_HEAP_OBJ(RegisterMap, mtNone);
|
||||||
|
::new (reg_map) RegisterMap((JavaThread*)thread, false);
|
||||||
|
} else {
|
||||||
|
*reg_map = RegisterMap((JavaThread*)thread, false);
|
||||||
}
|
}
|
||||||
memcpy(reg_map, &map, sizeof map);
|
|
||||||
{
|
{
|
||||||
CodeBlob *cb = CodeCache::find_blob((address)pc);
|
CodeBlob *cb = CodeCache::find_blob((address)pc);
|
||||||
if (cb && cb->frame_size())
|
if (cb && cb->frame_size())
|
||||||
|
407
src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp
Normal file
407
src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp
Normal file
@ -0,0 +1,407 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "asm/macroAssembler.inline.hpp"
|
||||||
|
#include "code/codeBlob.hpp"
|
||||||
|
#include "gc/z/zBarrier.inline.hpp"
|
||||||
|
#include "gc/z/zBarrierSet.hpp"
|
||||||
|
#include "gc/z/zBarrierSetAssembler.hpp"
|
||||||
|
#include "gc/z/zBarrierSetRuntime.hpp"
|
||||||
|
#include "memory/resourceArea.hpp"
|
||||||
|
#ifdef COMPILER1
|
||||||
|
#include "c1/c1_LIRAssembler.hpp"
|
||||||
|
#include "c1/c1_MacroAssembler.hpp"
|
||||||
|
#include "gc/z/c1/zBarrierSetC1.hpp"
|
||||||
|
#endif // COMPILER1
|
||||||
|
|
||||||
|
#include "gc/z/zThreadLocalData.hpp"
|
||||||
|
|
||||||
|
ZBarrierSetAssembler::ZBarrierSetAssembler() :
|
||||||
|
_load_barrier_slow_stub(),
|
||||||
|
_load_barrier_weak_slow_stub() {}
|
||||||
|
|
||||||
|
#ifdef PRODUCT
|
||||||
|
#define BLOCK_COMMENT(str) /* nothing */
|
||||||
|
#else
|
||||||
|
#define BLOCK_COMMENT(str) __ block_comment(str)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
#define __ masm->
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
BasicType type,
|
||||||
|
Register dst,
|
||||||
|
Address src,
|
||||||
|
Register tmp1,
|
||||||
|
Register tmp_thread) {
|
||||||
|
if (!ZBarrierSet::barrier_needed(decorators, type)) {
|
||||||
|
// Barrier not needed
|
||||||
|
BarrierSetAssembler::load_at(masm, decorators, type, dst, src, tmp1, tmp_thread);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rscratch1 can be passed as src or dst, so don't use it.
|
||||||
|
RegSet savedRegs = RegSet::of(rscratch2, rheapbase);
|
||||||
|
|
||||||
|
Label done;
|
||||||
|
assert_different_registers(rheapbase, rscratch2, dst);
|
||||||
|
assert_different_registers(rheapbase, rscratch2, src.base());
|
||||||
|
|
||||||
|
__ push(savedRegs, sp);
|
||||||
|
|
||||||
|
// Load bad mask into scratch register.
|
||||||
|
__ ldr(rheapbase, address_bad_mask_from_thread(rthread));
|
||||||
|
__ lea(rscratch2, src);
|
||||||
|
__ ldr(dst, src);
|
||||||
|
|
||||||
|
// Test reference against bad mask. If mask bad, then we need to fix it up.
|
||||||
|
__ tst(dst, rheapbase);
|
||||||
|
__ br(Assembler::EQ, done);
|
||||||
|
|
||||||
|
__ enter();
|
||||||
|
|
||||||
|
__ push(RegSet::range(r0,r28) - RegSet::of(dst), sp);
|
||||||
|
|
||||||
|
if (c_rarg0 != dst) {
|
||||||
|
__ mov(c_rarg0, dst);
|
||||||
|
}
|
||||||
|
__ mov(c_rarg1, rscratch2);
|
||||||
|
|
||||||
|
int step = 4 * wordSize;
|
||||||
|
__ mov(rscratch1, -step);
|
||||||
|
__ sub(sp, sp, step);
|
||||||
|
|
||||||
|
for (int i = 28; i >= 4; i -= 4) {
|
||||||
|
__ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
|
||||||
|
as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
|
||||||
|
|
||||||
|
for (int i = 0; i <= 28; i += 4) {
|
||||||
|
__ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
|
||||||
|
as_FloatRegister(i+3), __ T1D, Address(__ post(sp, step)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure dst has the return value.
|
||||||
|
if (dst != r0) {
|
||||||
|
__ mov(dst, r0);
|
||||||
|
}
|
||||||
|
|
||||||
|
__ pop(RegSet::range(r0,r28) - RegSet::of(dst), sp);
|
||||||
|
__ leave();
|
||||||
|
|
||||||
|
__ bind(done);
|
||||||
|
|
||||||
|
// Restore tmps
|
||||||
|
__ pop(savedRegs, sp);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::store_at(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
BasicType type,
|
||||||
|
Address dst,
|
||||||
|
Register val,
|
||||||
|
Register tmp1,
|
||||||
|
Register tmp2) {
|
||||||
|
// Verify value
|
||||||
|
if (type == T_OBJECT || type == T_ARRAY) {
|
||||||
|
// Note that src could be noreg, which means we
|
||||||
|
// are storing null and can skip verification.
|
||||||
|
if (val != noreg) {
|
||||||
|
Label done;
|
||||||
|
|
||||||
|
// tmp1 and tmp2 are often set to noreg.
|
||||||
|
RegSet savedRegs = RegSet::of(rscratch1);
|
||||||
|
__ push(savedRegs, sp);
|
||||||
|
|
||||||
|
__ ldr(rscratch1, address_bad_mask_from_thread(rthread));
|
||||||
|
__ tst(val, rscratch1);
|
||||||
|
__ br(Assembler::EQ, done);
|
||||||
|
__ stop("Verify oop store failed");
|
||||||
|
__ should_not_reach_here();
|
||||||
|
__ bind(done);
|
||||||
|
__ pop(savedRegs, sp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Store value
|
||||||
|
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // ASSERT
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
bool is_oop,
|
||||||
|
Register src,
|
||||||
|
Register dst,
|
||||||
|
Register count,
|
||||||
|
RegSet saved_regs) {
|
||||||
|
if (!is_oop) {
|
||||||
|
// Barrier not needed
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BLOCK_COMMENT("ZBarrierSetAssembler::arraycopy_prologue {");
|
||||||
|
|
||||||
|
assert_different_registers(src, count, rscratch1);
|
||||||
|
|
||||||
|
__ pusha();
|
||||||
|
|
||||||
|
if (count == c_rarg0) {
|
||||||
|
if (src == c_rarg1) {
|
||||||
|
// exactly backwards!!
|
||||||
|
__ mov(rscratch1, c_rarg0);
|
||||||
|
__ mov(c_rarg0, c_rarg1);
|
||||||
|
__ mov(c_rarg1, rscratch1);
|
||||||
|
} else {
|
||||||
|
__ mov(c_rarg1, count);
|
||||||
|
__ mov(c_rarg0, src);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
__ mov(c_rarg0, src);
|
||||||
|
__ mov(c_rarg1, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_array_addr(), 2);
|
||||||
|
|
||||||
|
__ popa();
|
||||||
|
BLOCK_COMMENT("} ZBarrierSetAssembler::arraycopy_prologue");
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm,
|
||||||
|
Register jni_env,
|
||||||
|
Register robj,
|
||||||
|
Register tmp,
|
||||||
|
Label& slowpath) {
|
||||||
|
BLOCK_COMMENT("ZBarrierSetAssembler::try_resolve_jobject_in_native {");
|
||||||
|
|
||||||
|
assert_different_registers(jni_env, robj, tmp);
|
||||||
|
|
||||||
|
// Resolve jobject
|
||||||
|
BarrierSetAssembler::try_resolve_jobject_in_native(masm, jni_env, robj, tmp, slowpath);
|
||||||
|
|
||||||
|
// The Address offset is too large to direct load - -784. Our range is +127, -128.
|
||||||
|
__ mov(tmp, (long int)(in_bytes(ZThreadLocalData::address_bad_mask_offset()) -
|
||||||
|
in_bytes(JavaThread::jni_environment_offset())));
|
||||||
|
// Load address bad mask
|
||||||
|
__ add(tmp, jni_env, tmp);
|
||||||
|
__ ldr(tmp, Address(tmp));
|
||||||
|
|
||||||
|
// Check address bad mask
|
||||||
|
__ tst(robj, tmp);
|
||||||
|
__ br(Assembler::NE, slowpath);
|
||||||
|
|
||||||
|
BLOCK_COMMENT("} ZBarrierSetAssembler::try_resolve_jobject_in_native");
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef COMPILER1
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
#define __ ce->masm()->
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::generate_c1_load_barrier_test(LIR_Assembler* ce,
|
||||||
|
LIR_Opr ref) const {
|
||||||
|
assert_different_registers(rheapbase, rthread, ref->as_register());
|
||||||
|
|
||||||
|
__ ldr(rheapbase, address_bad_mask_from_thread(rthread));
|
||||||
|
__ tst(ref->as_register(), rheapbase);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::generate_c1_load_barrier_stub(LIR_Assembler* ce,
|
||||||
|
ZLoadBarrierStubC1* stub) const {
|
||||||
|
// Stub entry
|
||||||
|
__ bind(*stub->entry());
|
||||||
|
|
||||||
|
Register ref = stub->ref()->as_register();
|
||||||
|
Register ref_addr = noreg;
|
||||||
|
Register tmp = noreg;
|
||||||
|
|
||||||
|
if (stub->tmp()->is_valid()) {
|
||||||
|
// Load address into tmp register
|
||||||
|
ce->leal(stub->ref_addr(), stub->tmp());
|
||||||
|
ref_addr = tmp = stub->tmp()->as_pointer_register();
|
||||||
|
} else {
|
||||||
|
// Address already in register
|
||||||
|
ref_addr = stub->ref_addr()->as_address_ptr()->base()->as_pointer_register();
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_different_registers(ref, ref_addr, noreg);
|
||||||
|
|
||||||
|
// Save r0 unless it is the result or tmp register
|
||||||
|
// Set up SP to accomodate parameters and maybe r0..
|
||||||
|
if (ref != r0 && tmp != r0) {
|
||||||
|
__ sub(sp, sp, 32);
|
||||||
|
__ str(r0, Address(sp, 16));
|
||||||
|
} else {
|
||||||
|
__ sub(sp, sp, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup arguments and call runtime stub
|
||||||
|
ce->store_parameter(ref_addr, 1);
|
||||||
|
ce->store_parameter(ref, 0);
|
||||||
|
|
||||||
|
__ far_call(stub->runtime_stub());
|
||||||
|
|
||||||
|
// Verify result
|
||||||
|
__ verify_oop(r0, "Bad oop");
|
||||||
|
|
||||||
|
// Move result into place
|
||||||
|
if (ref != r0) {
|
||||||
|
__ mov(ref, r0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restore r0 unless it is the result or tmp register
|
||||||
|
if (ref != r0 && tmp != r0) {
|
||||||
|
__ ldr(r0, Address(sp, 16));
|
||||||
|
__ add(sp, sp, 32);
|
||||||
|
} else {
|
||||||
|
__ add(sp, sp, 16);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stub exit
|
||||||
|
__ b(*stub->continuation());
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
#define __ sasm->
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler* sasm,
|
||||||
|
DecoratorSet decorators) const {
|
||||||
|
__ prologue("zgc_load_barrier stub", false);
|
||||||
|
|
||||||
|
// We don't use push/pop_clobbered_registers() - we need to pull out the result from r0.
|
||||||
|
for (int i = 0; i < 32; i +=2) {
|
||||||
|
__ stpd(as_FloatRegister(i), as_FloatRegister(i+1), Address(__ pre(sp,-16)));
|
||||||
|
}
|
||||||
|
|
||||||
|
RegSet saveRegs = RegSet::range(r0,r28) - RegSet::of(r0);
|
||||||
|
__ push(saveRegs, sp);
|
||||||
|
|
||||||
|
// Setup arguments
|
||||||
|
__ load_parameter(0, c_rarg0);
|
||||||
|
__ load_parameter(1, c_rarg1);
|
||||||
|
|
||||||
|
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
|
||||||
|
|
||||||
|
__ pop(saveRegs, sp);
|
||||||
|
|
||||||
|
for (int i = 30; i >0; i -=2) {
|
||||||
|
__ ldpd(as_FloatRegister(i), as_FloatRegister(i+1), Address(__ post(sp, 16)));
|
||||||
|
}
|
||||||
|
|
||||||
|
__ epilogue();
|
||||||
|
}
|
||||||
|
#endif // COMPILER1
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
#define __ cgen->assembler()->
|
||||||
|
|
||||||
|
// Generates a register specific stub for calling
|
||||||
|
// ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded() or
|
||||||
|
// ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded().
|
||||||
|
//
|
||||||
|
// The raddr register serves as both input and output for this stub. When the stub is
|
||||||
|
// called the raddr register contains the object field address (oop*) where the bad oop
|
||||||
|
// was loaded from, which caused the slow path to be taken. On return from the stub the
|
||||||
|
// raddr register contains the good/healed oop returned from
|
||||||
|
// ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded() or
|
||||||
|
// ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded().
|
||||||
|
static address generate_load_barrier_stub(StubCodeGenerator* cgen, Register raddr, DecoratorSet decorators) {
|
||||||
|
// Don't generate stub for invalid registers
|
||||||
|
if (raddr == zr || raddr == r29 || raddr == r30) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create stub name
|
||||||
|
char name[64];
|
||||||
|
const bool weak = (decorators & ON_WEAK_OOP_REF) != 0;
|
||||||
|
os::snprintf(name, sizeof(name), "zgc_load_barrier%s_stub_%s", weak ? "_weak" : "", raddr->name());
|
||||||
|
|
||||||
|
__ align(CodeEntryAlignment);
|
||||||
|
StubCodeMark mark(cgen, "StubRoutines", os::strdup(name, mtCode));
|
||||||
|
address start = __ pc();
|
||||||
|
|
||||||
|
// Save live registers
|
||||||
|
RegSet savedRegs = RegSet::range(r0,r18) - RegSet::of(raddr);
|
||||||
|
|
||||||
|
__ enter();
|
||||||
|
__ push(savedRegs, sp);
|
||||||
|
|
||||||
|
// Setup arguments
|
||||||
|
if (raddr != c_rarg1) {
|
||||||
|
__ mov(c_rarg1, raddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
__ ldr(c_rarg0, Address(raddr));
|
||||||
|
|
||||||
|
// Call barrier function
|
||||||
|
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), c_rarg0, c_rarg1);
|
||||||
|
|
||||||
|
// Move result returned in r0 to raddr, if needed
|
||||||
|
if (raddr != r0) {
|
||||||
|
__ mov(raddr, r0);
|
||||||
|
}
|
||||||
|
|
||||||
|
__ pop(savedRegs, sp);
|
||||||
|
__ leave();
|
||||||
|
__ ret(lr);
|
||||||
|
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef __
|
||||||
|
|
||||||
|
static void barrier_stubs_init_inner(const char* label, const DecoratorSet decorators, address* stub) {
|
||||||
|
const int nregs = 28; // Exclude FP, XZR, SP from calculation.
|
||||||
|
const int code_size = nregs * 254; // Rough estimate of code size
|
||||||
|
|
||||||
|
ResourceMark rm;
|
||||||
|
|
||||||
|
CodeBuffer buf(BufferBlob::create(label, code_size));
|
||||||
|
StubCodeGenerator cgen(&buf);
|
||||||
|
|
||||||
|
for (int i = 0; i < nregs; i++) {
|
||||||
|
const Register reg = as_Register(i);
|
||||||
|
stub[i] = generate_load_barrier_stub(&cgen, reg, decorators);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZBarrierSetAssembler::barrier_stubs_init() {
|
||||||
|
barrier_stubs_init_inner("zgc_load_barrier_stubs", ON_STRONG_OOP_REF, _load_barrier_slow_stub);
|
||||||
|
barrier_stubs_init_inner("zgc_load_barrier_weak_stubs", ON_WEAK_OOP_REF, _load_barrier_weak_slow_stub);
|
||||||
|
}
|
||||||
|
|
||||||
|
address ZBarrierSetAssembler::load_barrier_slow_stub(Register reg) {
|
||||||
|
return _load_barrier_slow_stub[reg->encoding()];
|
||||||
|
}
|
||||||
|
|
||||||
|
address ZBarrierSetAssembler::load_barrier_weak_slow_stub(Register reg) {
|
||||||
|
return _load_barrier_weak_slow_stub[reg->encoding()];
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef CPU_AARCH64_GC_Z_ZBARRIERSETASSEMBLER_AARCH64_HPP
|
||||||
|
#define CPU_AARCH64_GC_Z_ZBARRIERSETASSEMBLER_AARCH64_HPP
|
||||||
|
|
||||||
|
#ifdef COMPILER1
|
||||||
|
class LIR_Assembler;
|
||||||
|
class LIR_OprDesc;
|
||||||
|
typedef LIR_OprDesc* LIR_Opr;
|
||||||
|
class StubAssembler;
|
||||||
|
class ZLoadBarrierStubC1;
|
||||||
|
#endif // COMPILER1
|
||||||
|
|
||||||
|
class ZBarrierSetAssembler : public ZBarrierSetAssemblerBase {
|
||||||
|
private:
|
||||||
|
address _load_barrier_slow_stub[RegisterImpl::number_of_registers];
|
||||||
|
address _load_barrier_weak_slow_stub[RegisterImpl::number_of_registers];
|
||||||
|
|
||||||
|
public:
|
||||||
|
ZBarrierSetAssembler();
|
||||||
|
|
||||||
|
virtual void load_at(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
BasicType type,
|
||||||
|
Register dst,
|
||||||
|
Address src,
|
||||||
|
Register tmp1,
|
||||||
|
Register tmp_thread);
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
|
virtual void store_at(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
BasicType type,
|
||||||
|
Address dst,
|
||||||
|
Register val,
|
||||||
|
Register tmp1,
|
||||||
|
Register tmp2);
|
||||||
|
#endif // ASSERT
|
||||||
|
|
||||||
|
virtual void arraycopy_prologue(MacroAssembler* masm,
|
||||||
|
DecoratorSet decorators,
|
||||||
|
bool is_oop,
|
||||||
|
Register src,
|
||||||
|
Register dst,
|
||||||
|
Register count,
|
||||||
|
RegSet saved_regs);
|
||||||
|
|
||||||
|
virtual void try_resolve_jobject_in_native(MacroAssembler* masm,
|
||||||
|
Register jni_env,
|
||||||
|
Register robj,
|
||||||
|
Register tmp,
|
||||||
|
Label& slowpath);
|
||||||
|
|
||||||
|
#ifdef COMPILER1
|
||||||
|
void generate_c1_load_barrier_test(LIR_Assembler* ce,
|
||||||
|
LIR_Opr ref) const;
|
||||||
|
|
||||||
|
void generate_c1_load_barrier_stub(LIR_Assembler* ce,
|
||||||
|
ZLoadBarrierStubC1* stub) const;
|
||||||
|
|
||||||
|
void generate_c1_load_barrier_runtime_stub(StubAssembler* sasm,
|
||||||
|
DecoratorSet decorators) const;
|
||||||
|
#endif // COMPILER1
|
||||||
|
|
||||||
|
virtual void barrier_stubs_init();
|
||||||
|
|
||||||
|
address load_barrier_slow_stub(Register reg);
|
||||||
|
address load_barrier_weak_slow_stub(Register reg);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CPU_AARCH64_GC_Z_ZBARRIERSETASSEMBLER_AARCH64_HPP
|
174
src/hotspot/cpu/aarch64/gc/z/z_aarch64.ad
Normal file
174
src/hotspot/cpu/aarch64/gc/z/z_aarch64.ad
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
//
|
||||||
|
// This code is free software; you can redistribute it and/or modify it
|
||||||
|
// under the terms of the GNU General Public License version 2 only, as
|
||||||
|
// published by the Free Software Foundation.
|
||||||
|
//
|
||||||
|
// This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
// version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
// accompanied this code).
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License version
|
||||||
|
// 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
// Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
// or visit www.oracle.com if you need additional information or have any
|
||||||
|
// questions.
|
||||||
|
//
|
||||||
|
|
||||||
|
source_hpp %{
|
||||||
|
|
||||||
|
#include "gc/z/c2/zBarrierSetC2.hpp"
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
source %{
|
||||||
|
|
||||||
|
#include "gc/z/zBarrierSetAssembler.hpp"
|
||||||
|
|
||||||
|
static void z_load_barrier_slow_reg(MacroAssembler& _masm, Register dst,
|
||||||
|
Register base, int index, int scale,
|
||||||
|
int disp, bool weak) {
|
||||||
|
const address stub = weak ? ZBarrierSet::assembler()->load_barrier_weak_slow_stub(dst)
|
||||||
|
: ZBarrierSet::assembler()->load_barrier_slow_stub(dst);
|
||||||
|
|
||||||
|
if (index == -1) {
|
||||||
|
if (disp != 0) {
|
||||||
|
__ lea(dst, Address(base, disp));
|
||||||
|
} else {
|
||||||
|
__ mov(dst, base);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Register index_reg = as_Register(index);
|
||||||
|
if (disp == 0) {
|
||||||
|
__ lea(dst, Address(base, index_reg, Address::lsl(scale)));
|
||||||
|
} else {
|
||||||
|
__ lea(dst, Address(base, disp));
|
||||||
|
__ lea(dst, Address(dst, index_reg, Address::lsl(scale)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__ far_call(RuntimeAddress(stub));
|
||||||
|
}
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Execute ZGC load barrier (strong) slow path
|
||||||
|
//
|
||||||
|
instruct loadBarrierSlowReg(iRegP dst, memory mem, rFlagsReg cr,
|
||||||
|
vRegD_V0 v0, vRegD_V1 v1, vRegD_V2 v2, vRegD_V3 v3, vRegD_V4 v4,
|
||||||
|
vRegD_V5 v5, vRegD_V6 v6, vRegD_V7 v7, vRegD_V8 v8, vRegD_V9 v9,
|
||||||
|
vRegD_V10 v10, vRegD_V11 v11, vRegD_V12 v12, vRegD_V13 v13, vRegD_V14 v14,
|
||||||
|
vRegD_V15 v15, vRegD_V16 v16, vRegD_V17 v17, vRegD_V18 v18, vRegD_V19 v19,
|
||||||
|
vRegD_V20 v20, vRegD_V21 v21, vRegD_V22 v22, vRegD_V23 v23, vRegD_V24 v24,
|
||||||
|
vRegD_V25 v25, vRegD_V26 v26, vRegD_V27 v27, vRegD_V28 v28, vRegD_V29 v29,
|
||||||
|
vRegD_V30 v30, vRegD_V31 v31) %{
|
||||||
|
match(Set dst (LoadBarrierSlowReg mem));
|
||||||
|
predicate(!n->as_LoadBarrierSlowReg()->is_weak());
|
||||||
|
|
||||||
|
effect(DEF dst, KILL cr,
|
||||||
|
KILL v0, KILL v1, KILL v2, KILL v3, KILL v4, KILL v5, KILL v6, KILL v7,
|
||||||
|
KILL v8, KILL v9, KILL v10, KILL v11, KILL v12, KILL v13, KILL v14,
|
||||||
|
KILL v15, KILL v16, KILL v17, KILL v18, KILL v19, KILL v20, KILL v21,
|
||||||
|
KILL v22, KILL v23, KILL v24, KILL v25, KILL v26, KILL v27, KILL v28,
|
||||||
|
KILL v29, KILL v30, KILL v31);
|
||||||
|
|
||||||
|
format %{"LoadBarrierSlowReg $dst, $mem" %}
|
||||||
|
ins_encode %{
|
||||||
|
z_load_barrier_slow_reg(_masm, $dst$$Register, $mem$$base$$Register,
|
||||||
|
$mem$$index, $mem$$scale, $mem$$disp, false);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Execute ZGC load barrier (weak) slow path
|
||||||
|
//
|
||||||
|
instruct loadBarrierWeakSlowReg(iRegP dst, memory mem, rFlagsReg cr,
|
||||||
|
vRegD_V0 v0, vRegD_V1 v1, vRegD_V2 v2, vRegD_V3 v3, vRegD_V4 v4,
|
||||||
|
vRegD_V5 v5, vRegD_V6 v6, vRegD_V7 v7, vRegD_V8 v8, vRegD_V9 v9,
|
||||||
|
vRegD_V10 v10, vRegD_V11 v11, vRegD_V12 v12, vRegD_V13 v13, vRegD_V14 v14,
|
||||||
|
vRegD_V15 v15, vRegD_V16 v16, vRegD_V17 v17, vRegD_V18 v18, vRegD_V19 v19,
|
||||||
|
vRegD_V20 v20, vRegD_V21 v21, vRegD_V22 v22, vRegD_V23 v23, vRegD_V24 v24,
|
||||||
|
vRegD_V25 v25, vRegD_V26 v26, vRegD_V27 v27, vRegD_V28 v28, vRegD_V29 v29,
|
||||||
|
vRegD_V30 v30, vRegD_V31 v31) %{
|
||||||
|
match(Set dst (LoadBarrierSlowReg mem));
|
||||||
|
predicate(n->as_LoadBarrierSlowReg()->is_weak());
|
||||||
|
|
||||||
|
effect(DEF dst, KILL cr,
|
||||||
|
KILL v0, KILL v1, KILL v2, KILL v3, KILL v4, KILL v5, KILL v6, KILL v7,
|
||||||
|
KILL v8, KILL v9, KILL v10, KILL v11, KILL v12, KILL v13, KILL v14,
|
||||||
|
KILL v15, KILL v16, KILL v17, KILL v18, KILL v19, KILL v20, KILL v21,
|
||||||
|
KILL v22, KILL v23, KILL v24, KILL v25, KILL v26, KILL v27, KILL v28,
|
||||||
|
KILL v29, KILL v30, KILL v31);
|
||||||
|
|
||||||
|
format %{"LoadBarrierWeakSlowReg $dst, $mem" %}
|
||||||
|
ins_encode %{
|
||||||
|
z_load_barrier_slow_reg(_masm, $dst$$Register, $mem$$base$$Register,
|
||||||
|
$mem$$index, $mem$$scale, $mem$$disp, true);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
// Specialized versions of compareAndExchangeP that adds a keepalive that is consumed
|
||||||
|
// but doesn't affect output.
|
||||||
|
|
||||||
|
instruct z_compareAndExchangeP(iRegPNoSp res, indirect mem,
|
||||||
|
iRegP oldval, iRegP newval, iRegP keepalive,
|
||||||
|
rFlagsReg cr) %{
|
||||||
|
match(Set res (ZCompareAndExchangeP (Binary mem keepalive) (Binary oldval newval)));
|
||||||
|
ins_cost(2 * VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg $res = $mem, $oldval, $newval\t# (ptr, weak) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct z_compareAndSwapP(iRegINoSp res,
|
||||||
|
indirect mem,
|
||||||
|
iRegP oldval, iRegP newval, iRegP keepalive,
|
||||||
|
rFlagsReg cr) %{
|
||||||
|
|
||||||
|
match(Set res (ZCompareAndSwapP (Binary mem keepalive) (Binary oldval newval)));
|
||||||
|
match(Set res (ZWeakCompareAndSwapP (Binary mem keepalive) (Binary oldval newval)));
|
||||||
|
|
||||||
|
ins_cost(2 * VOLATILE_REF_COST);
|
||||||
|
|
||||||
|
effect(KILL cr);
|
||||||
|
|
||||||
|
format %{
|
||||||
|
"cmpxchg $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"cset $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
|
||||||
|
ins_encode(aarch64_enc_cmpxchg(mem, oldval, newval),
|
||||||
|
aarch64_enc_cset_eq(res));
|
||||||
|
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
instruct z_get_and_setP(indirect mem, iRegP newv, iRegPNoSp prev,
|
||||||
|
iRegP keepalive) %{
|
||||||
|
match(Set prev (ZGetAndSetP mem (Binary newv keepalive)));
|
||||||
|
|
||||||
|
ins_cost(2 * VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg $prev, $newv, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchg($prev$$Register, $newv$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
@ -38,8 +38,6 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
protected:
|
protected:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
using MacroAssembler::call_VM_leaf_base;
|
|
||||||
|
|
||||||
// Interpreter specific version of call_VM_base
|
// Interpreter specific version of call_VM_base
|
||||||
using MacroAssembler::call_VM_leaf_base;
|
using MacroAssembler::call_VM_leaf_base;
|
||||||
|
|
||||||
|
@ -2681,7 +2681,7 @@ Address MacroAssembler::spill_address(int size, int offset, Register tmp)
|
|||||||
if ((offset & (size-1)) && offset >= (1<<8)) {
|
if ((offset & (size-1)) && offset >= (1<<8)) {
|
||||||
add(tmp, base, offset & ((1<<12)-1));
|
add(tmp, base, offset & ((1<<12)-1));
|
||||||
base = tmp;
|
base = tmp;
|
||||||
offset &= -1<<12;
|
offset &= -1u<<12;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (offset >= (1<<12) * size) {
|
if (offset >= (1<<12) * size) {
|
||||||
|
@ -286,7 +286,7 @@ void MacroAssembler::fast_log(FloatRegister vtmp0, FloatRegister vtmp1,
|
|||||||
frecpe(vtmp5, vtmp5, S); // vtmp5 ~= 1/vtmp5
|
frecpe(vtmp5, vtmp5, S); // vtmp5 ~= 1/vtmp5
|
||||||
lsr(tmp2, rscratch1, 48);
|
lsr(tmp2, rscratch1, 48);
|
||||||
movz(tmp4, 0x77f0, 48);
|
movz(tmp4, 0x77f0, 48);
|
||||||
fmovd(vtmp4, 1.0d);
|
fmovd(vtmp4, 1.0);
|
||||||
movz(tmp1, INF_OR_NAN_PREFIX, 48);
|
movz(tmp1, INF_OR_NAN_PREFIX, 48);
|
||||||
bfm(tmp4, rscratch1, 0, 51); // tmp4 = 0x77F0 << 48 | mantissa(X)
|
bfm(tmp4, rscratch1, 0, 51); // tmp4 = 0x77F0 << 48 | mantissa(X)
|
||||||
// vtmp1 = AS_DOUBLE_BITS(0x77F0 << 48 | mantissa(X)) == mx
|
// vtmp1 = AS_DOUBLE_BITS(0x77F0 << 48 | mantissa(X)) == mx
|
||||||
@ -358,7 +358,7 @@ void MacroAssembler::fast_log(FloatRegister vtmp0, FloatRegister vtmp1,
|
|||||||
br(GE, DONE);
|
br(GE, DONE);
|
||||||
cmp(rscratch1, tmp2);
|
cmp(rscratch1, tmp2);
|
||||||
br(NE, CHECKED_CORNER_CASES);
|
br(NE, CHECKED_CORNER_CASES);
|
||||||
fmovd(v0, 0.0d);
|
fmovd(v0, 0.0);
|
||||||
}
|
}
|
||||||
bind(DONE);
|
bind(DONE);
|
||||||
ret(lr);
|
ret(lr);
|
||||||
|
@ -381,11 +381,11 @@ void MacroAssembler::generate__ieee754_rem_pio2(address npio2_hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
block_comment("nx calculation with unrolled while(tx[nx-1]==zeroA) nx--;"); {
|
block_comment("nx calculation with unrolled while(tx[nx-1]==zeroA) nx--;"); {
|
||||||
fcmpd(v26, 0.0d); // if NE then jx == 2. else it's 1 or 0
|
fcmpd(v26, 0.0); // if NE then jx == 2. else it's 1 or 0
|
||||||
add(iqBase, sp, 480); // base of iq[]
|
add(iqBase, sp, 480); // base of iq[]
|
||||||
fmuld(v3, v26, v10);
|
fmuld(v3, v26, v10);
|
||||||
br(NE, NX_SET);
|
br(NE, NX_SET);
|
||||||
fcmpd(v7, 0.0d); // v7 == 0 => jx = 0. Else jx = 1
|
fcmpd(v7, 0.0); // v7 == 0 => jx = 0. Else jx = 1
|
||||||
csetw(jx, NE);
|
csetw(jx, NE);
|
||||||
}
|
}
|
||||||
bind(NX_SET);
|
bind(NX_SET);
|
||||||
@ -696,7 +696,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
cmpw(jv, zr);
|
cmpw(jv, zr);
|
||||||
addw(tmp4, jx, 4); // tmp4 = m = jx + jk = jx + 4. jx is in {0,1,2} so m is in [4,5,6]
|
addw(tmp4, jx, 4); // tmp4 = m = jx + jk = jx + 4. jx is in {0,1,2} so m is in [4,5,6]
|
||||||
cselw(jv, jv, zr, GE);
|
cselw(jv, jv, zr, GE);
|
||||||
fmovd(v26, 0.0d);
|
fmovd(v26, 0.0);
|
||||||
addw(tmp5, jv, 1); // jv+1
|
addw(tmp5, jv, 1); // jv+1
|
||||||
subsw(j, jv, jx);
|
subsw(j, jv, jx);
|
||||||
add(qBase, sp, 320); // base of q[]
|
add(qBase, sp, 320); // base of q[]
|
||||||
@ -819,8 +819,8 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
movw(jz, 4);
|
movw(jz, 4);
|
||||||
fmovd(v17, i); // v17 = twon24
|
fmovd(v17, i); // v17 = twon24
|
||||||
fmovd(v30, tmp5); // 2^q0
|
fmovd(v30, tmp5); // 2^q0
|
||||||
fmovd(v21, 0.125d);
|
fmovd(v21, 0.125);
|
||||||
fmovd(v20, 8.0d);
|
fmovd(v20, 8.0);
|
||||||
fmovd(v22, tmp4); // 2^-q0
|
fmovd(v22, tmp4); // 2^-q0
|
||||||
|
|
||||||
block_comment("recompute loop"); {
|
block_comment("recompute loop"); {
|
||||||
@ -877,7 +877,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
lsr(ih, tmp2, 23); // ih = iq[z-1] >> 23
|
lsr(ih, tmp2, 23); // ih = iq[z-1] >> 23
|
||||||
b(Q0_ZERO_CMP_DONE);
|
b(Q0_ZERO_CMP_DONE);
|
||||||
bind(Q0_ZERO_CMP_LT);
|
bind(Q0_ZERO_CMP_LT);
|
||||||
fmovd(v4, 0.5d);
|
fmovd(v4, 0.5);
|
||||||
fcmpd(v18, v4);
|
fcmpd(v18, v4);
|
||||||
cselw(ih, zr, ih, LT); // if (z<0.5) ih = 0
|
cselw(ih, zr, ih, LT); // if (z<0.5) ih = 0
|
||||||
}
|
}
|
||||||
@ -924,7 +924,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
br(NE, IH_HANDLED);
|
br(NE, IH_HANDLED);
|
||||||
|
|
||||||
block_comment("if(ih==2) {"); {
|
block_comment("if(ih==2) {"); {
|
||||||
fmovd(v25, 1.0d);
|
fmovd(v25, 1.0);
|
||||||
fsubd(v18, v25, v18); // z = one - z;
|
fsubd(v18, v25, v18); // z = one - z;
|
||||||
cbzw(rscratch2, IH_HANDLED);
|
cbzw(rscratch2, IH_HANDLED);
|
||||||
fsubd(v18, v18, v30); // z -= scalbnA(one,q0);
|
fsubd(v18, v18, v30); // z -= scalbnA(one,q0);
|
||||||
@ -932,7 +932,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
}
|
}
|
||||||
bind(IH_HANDLED);
|
bind(IH_HANDLED);
|
||||||
// check if recomputation is needed
|
// check if recomputation is needed
|
||||||
fcmpd(v18, 0.0d);
|
fcmpd(v18, 0.0);
|
||||||
br(NE, RECOMP_CHECK_DONE_NOT_ZERO);
|
br(NE, RECOMP_CHECK_DONE_NOT_ZERO);
|
||||||
|
|
||||||
block_comment("if(z==zeroB) {"); {
|
block_comment("if(z==zeroB) {"); {
|
||||||
@ -994,7 +994,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
}
|
}
|
||||||
bind(RECOMP_CHECK_DONE);
|
bind(RECOMP_CHECK_DONE);
|
||||||
// chop off zero terms
|
// chop off zero terms
|
||||||
fcmpd(v18, 0.0d);
|
fcmpd(v18, 0.0);
|
||||||
br(EQ, Z_IS_ZERO);
|
br(EQ, Z_IS_ZERO);
|
||||||
|
|
||||||
block_comment("else block of if(z==0.0) {"); {
|
block_comment("else block of if(z==0.0) {"); {
|
||||||
@ -1053,7 +1053,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
movw(tmp2, zr); // tmp2 will keep jz - i == 0 at start
|
movw(tmp2, zr); // tmp2 will keep jz - i == 0 at start
|
||||||
bind(COMP_FOR);
|
bind(COMP_FOR);
|
||||||
// for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
|
// for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
|
||||||
fmovd(v30, 0.0d);
|
fmovd(v30, 0.0);
|
||||||
add(tmp5, qBase, i, LSL, 3); // address of q[i+k] for k==0
|
add(tmp5, qBase, i, LSL, 3); // address of q[i+k] for k==0
|
||||||
movw(tmp3, 4);
|
movw(tmp3, 4);
|
||||||
movw(tmp4, zr); // used as k
|
movw(tmp4, zr); // used as k
|
||||||
@ -1081,7 +1081,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
|||||||
// remember prec == 2
|
// remember prec == 2
|
||||||
|
|
||||||
block_comment("for (i=jz;i>=0;i--) fw += fq[i];"); {
|
block_comment("for (i=jz;i>=0;i--) fw += fq[i];"); {
|
||||||
fmovd(v4, 0.0d);
|
fmovd(v4, 0.0);
|
||||||
mov(i, jz);
|
mov(i, jz);
|
||||||
bind(FW_FOR1);
|
bind(FW_FOR1);
|
||||||
ldrd(v1, Address(rscratch2, i, Address::lsl(3)));
|
ldrd(v1, Address(rscratch2, i, Address::lsl(3)));
|
||||||
@ -1319,7 +1319,7 @@ void MacroAssembler::generate_kernel_cos(FloatRegister x, address dcos_coef) {
|
|||||||
ld1(C1, C2, C3, C4, T1D, Address(rscratch2)); // load C1..C3\4
|
ld1(C1, C2, C3, C4, T1D, Address(rscratch2)); // load C1..C3\4
|
||||||
block_comment("calculate r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))))"); {
|
block_comment("calculate r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))))"); {
|
||||||
fmaddd(r, z, C6, C5);
|
fmaddd(r, z, C6, C5);
|
||||||
fmovd(half, 0.5d);
|
fmovd(half, 0.5);
|
||||||
fmaddd(r, z, r, C4);
|
fmaddd(r, z, r, C4);
|
||||||
fmuld(y, x, y);
|
fmuld(y, x, y);
|
||||||
fmaddd(r, z, r, C3);
|
fmaddd(r, z, r, C3);
|
||||||
@ -1329,7 +1329,7 @@ void MacroAssembler::generate_kernel_cos(FloatRegister x, address dcos_coef) {
|
|||||||
fmaddd(r, z, r, C1); // r = C1+z(C2+z(C4+z(C5+z*C6)))
|
fmaddd(r, z, r, C1); // r = C1+z(C2+z(C4+z(C5+z*C6)))
|
||||||
}
|
}
|
||||||
// need to multiply r by z to have "final" r value
|
// need to multiply r by z to have "final" r value
|
||||||
fmovd(one, 1.0d);
|
fmovd(one, 1.0);
|
||||||
cmp(ix, rscratch1);
|
cmp(ix, rscratch1);
|
||||||
br(GT, IX_IS_LARGE);
|
br(GT, IX_IS_LARGE);
|
||||||
block_comment("if(ix < 0x3FD33333) return one - (0.5*z - (z*r - x*y))"); {
|
block_comment("if(ix < 0x3FD33333) return one - (0.5*z - (z*r - x*y))"); {
|
||||||
@ -1352,7 +1352,7 @@ void MacroAssembler::generate_kernel_cos(FloatRegister x, address dcos_coef) {
|
|||||||
b(QX_SET);
|
b(QX_SET);
|
||||||
bind(SET_QX_CONST);
|
bind(SET_QX_CONST);
|
||||||
block_comment("if(ix > 0x3fe90000) qx = 0.28125;"); {
|
block_comment("if(ix > 0x3fe90000) qx = 0.28125;"); {
|
||||||
fmovd(qx, 0.28125d);
|
fmovd(qx, 0.28125);
|
||||||
}
|
}
|
||||||
bind(QX_SET);
|
bind(QX_SET);
|
||||||
fnmsub(C6, x, r, y); // z*r - xy
|
fnmsub(C6, x, r, y); // z*r - xy
|
||||||
@ -1443,7 +1443,7 @@ void MacroAssembler::generate_dsin_dcos(bool isCos, address npio2_hw,
|
|||||||
block_comment("kernel_sin/kernel_cos: if(ix<0x3e400000) {<fast return>}"); {
|
block_comment("kernel_sin/kernel_cos: if(ix<0x3e400000) {<fast return>}"); {
|
||||||
bind(TINY_X);
|
bind(TINY_X);
|
||||||
if (isCos) {
|
if (isCos) {
|
||||||
fmovd(v0, 1.0d);
|
fmovd(v0, 1.0);
|
||||||
}
|
}
|
||||||
ret(lr);
|
ret(lr);
|
||||||
}
|
}
|
||||||
|
@ -136,7 +136,7 @@ class FloatRegisterImpl: public AbstractRegisterImpl {
|
|||||||
VMReg as_VMReg();
|
VMReg as_VMReg();
|
||||||
|
|
||||||
// derived registers, offsets, and addresses
|
// derived registers, offsets, and addresses
|
||||||
FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
|
FloatRegister successor() const { return as_FloatRegister((encoding() + 1) % 32); }
|
||||||
|
|
||||||
// accessors
|
// accessors
|
||||||
int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
|
int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
|
||||||
|
@ -46,6 +46,9 @@
|
|||||||
#ifdef COMPILER2
|
#ifdef COMPILER2
|
||||||
#include "opto/runtime.hpp"
|
#include "opto/runtime.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
#if INCLUDE_ZGC
|
||||||
|
#include "gc/z/zThreadLocalData.hpp"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef BUILTIN_SIM
|
#ifdef BUILTIN_SIM
|
||||||
#include "../../../../../../simulator/simulator.hpp"
|
#include "../../../../../../simulator/simulator.hpp"
|
||||||
@ -580,6 +583,16 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// make sure object is 'reasonable'
|
// make sure object is 'reasonable'
|
||||||
__ cbz(r0, exit); // if obj is NULL it is OK
|
__ cbz(r0, exit); // if obj is NULL it is OK
|
||||||
|
|
||||||
|
#if INCLUDE_ZGC
|
||||||
|
if (UseZGC) {
|
||||||
|
// Check if mask is good.
|
||||||
|
// verifies that ZAddressBadMask & r0 == 0
|
||||||
|
__ ldr(c_rarg3, Address(rthread, ZThreadLocalData::address_bad_mask_offset()));
|
||||||
|
__ andr(c_rarg2, r0, c_rarg3);
|
||||||
|
__ cbnz(c_rarg2, error);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Check if the oop is in the right area of memory
|
// Check if the oop is in the right area of memory
|
||||||
__ mov(c_rarg3, (intptr_t) Universe::verify_oop_mask());
|
__ mov(c_rarg3, (intptr_t) Universe::verify_oop_mask());
|
||||||
__ andr(c_rarg2, r0, c_rarg3);
|
__ andr(c_rarg2, r0, c_rarg3);
|
||||||
|
@ -177,7 +177,7 @@ void VM_Version::get_processor_features() {
|
|||||||
if (FILE *f = fopen("/proc/cpuinfo", "r")) {
|
if (FILE *f = fopen("/proc/cpuinfo", "r")) {
|
||||||
char buf[128], *p;
|
char buf[128], *p;
|
||||||
while (fgets(buf, sizeof (buf), f) != NULL) {
|
while (fgets(buf, sizeof (buf), f) != NULL) {
|
||||||
if (p = strchr(buf, ':')) {
|
if ((p = strchr(buf, ':')) != NULL) {
|
||||||
long v = strtol(p+1, NULL, 0);
|
long v = strtol(p+1, NULL, 0);
|
||||||
if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
|
if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
|
||||||
_cpu = v;
|
_cpu = v;
|
||||||
|
@ -80,7 +80,19 @@ int LIR_Assembler::check_icache() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LIR_Assembler::clinit_barrier(ciMethod* method) {
|
void LIR_Assembler::clinit_barrier(ciMethod* method) {
|
||||||
ShouldNotReachHere(); // not implemented
|
assert(!method->holder()->is_not_initialized(), "initialization should have been started");
|
||||||
|
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = R20;
|
||||||
|
|
||||||
|
metadata2reg(method->holder()->constant_encoding(), klass);
|
||||||
|
__ clinit_barrier(klass, R16_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub(), R0);
|
||||||
|
__ mtctr(klass);
|
||||||
|
__ bctr();
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LIR_Assembler::osr_entry() {
|
void LIR_Assembler::osr_entry() {
|
||||||
|
@ -82,6 +82,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
// load cpool->resolved_klass_at(index)
|
// load cpool->resolved_klass_at(index)
|
||||||
void load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass);
|
void load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass);
|
||||||
|
|
||||||
|
void load_resolved_method_at_index(int byte_no, Register cache, Register method);
|
||||||
|
|
||||||
void load_receiver(Register Rparam_count, Register Rrecv_dst);
|
void load_receiver(Register Rparam_count, Register Rrecv_dst);
|
||||||
|
|
||||||
// helpers for expression stack
|
// helpers for expression stack
|
||||||
|
@ -516,6 +516,18 @@ void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool, R
|
|||||||
ldx(Rklass, Rklass, Roffset);
|
ldx(Rklass, Rklass, Roffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterpreterMacroAssembler::load_resolved_method_at_index(int byte_no,
|
||||||
|
Register cache,
|
||||||
|
Register method) {
|
||||||
|
const int method_offset = in_bytes(
|
||||||
|
ConstantPoolCache::base_offset() +
|
||||||
|
((byte_no == TemplateTable::f2_byte)
|
||||||
|
? ConstantPoolCacheEntry::f2_offset()
|
||||||
|
: ConstantPoolCacheEntry::f1_offset()));
|
||||||
|
|
||||||
|
ld(method, method_offset, cache); // get f1 Method*
|
||||||
|
}
|
||||||
|
|
||||||
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
|
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
|
||||||
// a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2.
|
// a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2.
|
||||||
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Register Rsuper_klass, Register Rtmp1,
|
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass, Register Rsuper_klass, Register Rtmp1,
|
||||||
|
@ -2011,6 +2011,35 @@ void MacroAssembler::check_klass_subtype(Register sub_klass,
|
|||||||
bind(L_failure); // Fallthru if not successful.
|
bind(L_failure); // Fallthru if not successful.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
|
||||||
|
assert(L_fast_path != NULL || L_slow_path != NULL, "at least one is required");
|
||||||
|
|
||||||
|
Label L_fallthrough;
|
||||||
|
if (L_fast_path == NULL) {
|
||||||
|
L_fast_path = &L_fallthrough;
|
||||||
|
} else if (L_slow_path == NULL) {
|
||||||
|
L_slow_path = &L_fallthrough;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fast path check: class is fully initialized
|
||||||
|
lbz(R0, in_bytes(InstanceKlass::init_state_offset()), klass);
|
||||||
|
cmpwi(CCR0, R0, InstanceKlass::fully_initialized);
|
||||||
|
beq(CCR0, *L_fast_path);
|
||||||
|
|
||||||
|
// Fast path check: current thread is initializer thread
|
||||||
|
ld(R0, in_bytes(InstanceKlass::init_thread_offset()), klass);
|
||||||
|
cmpd(CCR0, thread, R0);
|
||||||
|
if (L_slow_path == &L_fallthrough) {
|
||||||
|
beq(CCR0, *L_fast_path);
|
||||||
|
} else if (L_fast_path == &L_fallthrough) {
|
||||||
|
bne(CCR0, *L_slow_path);
|
||||||
|
} else {
|
||||||
|
Unimplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
bind(L_fallthrough);
|
||||||
|
}
|
||||||
|
|
||||||
void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
|
void MacroAssembler::check_method_handle_type(Register mtype_reg, Register mh_reg,
|
||||||
Register temp_reg,
|
Register temp_reg,
|
||||||
Label& wrong_method_type) {
|
Label& wrong_method_type) {
|
||||||
@ -3194,6 +3223,12 @@ void MacroAssembler::load_mirror_from_const_method(Register mirror, Register con
|
|||||||
resolve_oop_handle(mirror);
|
resolve_oop_handle(mirror);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroAssembler::load_method_holder(Register holder, Register method) {
|
||||||
|
ld(holder, in_bytes(Method::const_offset()), method);
|
||||||
|
ld(holder, in_bytes(ConstMethod::constants_offset()), holder);
|
||||||
|
ld(holder, ConstantPool::pool_holder_offset_in_bytes(), holder);
|
||||||
|
}
|
||||||
|
|
||||||
// Clear Array
|
// Clear Array
|
||||||
// For very short arrays. tmp == R0 is allowed.
|
// For very short arrays. tmp == R0 is allowed.
|
||||||
void MacroAssembler::clear_memory_unrolled(Register base_ptr, int cnt_dwords, Register tmp, int offset) {
|
void MacroAssembler::clear_memory_unrolled(Register base_ptr, int cnt_dwords, Register tmp, int offset) {
|
||||||
|
@ -559,6 +559,11 @@ class MacroAssembler: public Assembler {
|
|||||||
Register temp2_reg,
|
Register temp2_reg,
|
||||||
Label& L_success);
|
Label& L_success);
|
||||||
|
|
||||||
|
void clinit_barrier(Register klass,
|
||||||
|
Register thread,
|
||||||
|
Label* L_fast_path = NULL,
|
||||||
|
Label* L_slow_path = NULL);
|
||||||
|
|
||||||
// Method handle support (JSR 292).
|
// Method handle support (JSR 292).
|
||||||
void check_method_handle_type(Register mtype_reg, Register mh_reg, Register temp_reg, Label& wrong_method_type);
|
void check_method_handle_type(Register mtype_reg, Register mh_reg, Register temp_reg, Label& wrong_method_type);
|
||||||
|
|
||||||
@ -722,6 +727,7 @@ class MacroAssembler: public Assembler {
|
|||||||
|
|
||||||
void resolve_oop_handle(Register result);
|
void resolve_oop_handle(Register result);
|
||||||
void load_mirror_from_const_method(Register mirror, Register const_method);
|
void load_mirror_from_const_method(Register mirror, Register const_method);
|
||||||
|
void load_method_holder(Register holder, Register method);
|
||||||
|
|
||||||
static int instr_size_for_decode_klass_not_null();
|
static int instr_size_for_decode_klass_not_null();
|
||||||
void decode_klass_not_null(Register dst, Register src = noreg);
|
void decode_klass_not_null(Register dst, Register src = noreg);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
// Copyright (c) 2012, 2018 SAP SE. All rights reserved.
|
// Copyright (c) 2012, 2019 SAP SE. All rights reserved.
|
||||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
//
|
//
|
||||||
// This code is free software; you can redistribute it and/or modify it
|
// This code is free software; you can redistribute it and/or modify it
|
||||||
@ -1400,6 +1400,24 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
|||||||
___(mflr) mflr(return_pc);
|
___(mflr) mflr(return_pc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (C->clinit_barrier_on_entry()) {
|
||||||
|
assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started");
|
||||||
|
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = toc_temp;
|
||||||
|
|
||||||
|
// Notify OOP recorder (don't need the relocation)
|
||||||
|
AddressLiteral md = __ constant_metadata_address(C->method()->holder()->constant_encoding());
|
||||||
|
__ load_const_optimized(klass, md.value(), R0);
|
||||||
|
__ clinit_barrier(klass, R16_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub(), R0);
|
||||||
|
__ mtctr(klass);
|
||||||
|
__ bctr();
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
// Calls to C2R adapters often do not accept exceptional returns.
|
// Calls to C2R adapters often do not accept exceptional returns.
|
||||||
// We require that their callers must bang for them. But be
|
// We require that their callers must bang for them. But be
|
||||||
// careful, because some VM calls (such as call site linkage) can
|
// careful, because some VM calls (such as call site linkage) can
|
||||||
@ -4631,6 +4649,16 @@ operand immD() %{
|
|||||||
interface(CONST_INTER);
|
interface(CONST_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
|
// Double Immediate: +0.0d.
|
||||||
|
operand immD_0() %{
|
||||||
|
predicate(jlong_cast(n->getd()) == 0);
|
||||||
|
match(ConD);
|
||||||
|
|
||||||
|
op_cost(0);
|
||||||
|
format %{ %}
|
||||||
|
interface(CONST_INTER);
|
||||||
|
%}
|
||||||
|
|
||||||
// Integer Register Operands
|
// Integer Register Operands
|
||||||
// Integer Destination Register
|
// Integer Destination Register
|
||||||
// See definition of reg_class bits32_reg_rw.
|
// See definition of reg_class bits32_reg_rw.
|
||||||
@ -14009,7 +14037,7 @@ instruct repl4S_reg_Ex(iRegLdst dst, iRegIsrc src) %{
|
|||||||
instruct repl4S_immI0(iRegLdst dst, immI_0 zero) %{
|
instruct repl4S_immI0(iRegLdst dst, immI_0 zero) %{
|
||||||
match(Set dst (ReplicateS zero));
|
match(Set dst (ReplicateS zero));
|
||||||
predicate(n->as_Vector()->length() == 4);
|
predicate(n->as_Vector()->length() == 4);
|
||||||
format %{ "LI $dst, #0 \t// replicate4C" %}
|
format %{ "LI $dst, #0 \t// replicate4S" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||||
@ -14021,7 +14049,7 @@ instruct repl4S_immI0(iRegLdst dst, immI_0 zero) %{
|
|||||||
instruct repl4S_immIminus1(iRegLdst dst, immI_minus1 src) %{
|
instruct repl4S_immIminus1(iRegLdst dst, immI_minus1 src) %{
|
||||||
match(Set dst (ReplicateS src));
|
match(Set dst (ReplicateS src));
|
||||||
predicate(n->as_Vector()->length() == 4);
|
predicate(n->as_Vector()->length() == 4);
|
||||||
format %{ "LI $dst, -1 \t// replicate4C" %}
|
format %{ "LI $dst, -1 \t// replicate4S" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||||
@ -14062,7 +14090,7 @@ instruct repl8S_immIminus1(vecX dst, immI_minus1 src) %{
|
|||||||
match(Set dst (ReplicateS src));
|
match(Set dst (ReplicateS src));
|
||||||
predicate(n->as_Vector()->length() == 8);
|
predicate(n->as_Vector()->length() == 8);
|
||||||
|
|
||||||
format %{ "XXLEQV $dst, $src \t// replicate16B" %}
|
format %{ "XXLEQV $dst, $src \t// replicate8S" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
||||||
@ -14083,7 +14111,7 @@ instruct repl2I_reg_Ex(iRegLdst dst, iRegIsrc src) %{
|
|||||||
instruct repl2I_immI0(iRegLdst dst, immI_0 zero) %{
|
instruct repl2I_immI0(iRegLdst dst, immI_0 zero) %{
|
||||||
match(Set dst (ReplicateI zero));
|
match(Set dst (ReplicateI zero));
|
||||||
predicate(n->as_Vector()->length() == 2);
|
predicate(n->as_Vector()->length() == 2);
|
||||||
format %{ "LI $dst, #0 \t// replicate4C" %}
|
format %{ "LI $dst, #0 \t// replicate2I" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||||
@ -14095,7 +14123,7 @@ instruct repl2I_immI0(iRegLdst dst, immI_0 zero) %{
|
|||||||
instruct repl2I_immIminus1(iRegLdst dst, immI_minus1 src) %{
|
instruct repl2I_immIminus1(iRegLdst dst, immI_minus1 src) %{
|
||||||
match(Set dst (ReplicateI src));
|
match(Set dst (ReplicateI src));
|
||||||
predicate(n->as_Vector()->length() == 2);
|
predicate(n->as_Vector()->length() == 2);
|
||||||
format %{ "LI $dst, -1 \t// replicate4C" %}
|
format %{ "LI $dst, -1 \t// replicate2I" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||||
@ -14669,7 +14697,7 @@ instruct repl2D_reg_Ex(vecX dst, regD src) %{
|
|||||||
ins_pipe(pipe_class_default);
|
ins_pipe(pipe_class_default);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct repl2D_immI0(vecX dst, immI_0 zero) %{
|
instruct repl2D_immD0(vecX dst, immD_0 zero) %{
|
||||||
match(Set dst (ReplicateD zero));
|
match(Set dst (ReplicateD zero));
|
||||||
predicate(n->as_Vector()->length() == 2);
|
predicate(n->as_Vector()->length() == 2);
|
||||||
|
|
||||||
@ -14681,18 +14709,6 @@ instruct repl2D_immI0(vecX dst, immI_0 zero) %{
|
|||||||
ins_pipe(pipe_class_default);
|
ins_pipe(pipe_class_default);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
instruct repl2D_immIminus1(vecX dst, immI_minus1 src) %{
|
|
||||||
match(Set dst (ReplicateD src));
|
|
||||||
predicate(n->as_Vector()->length() == 2);
|
|
||||||
|
|
||||||
format %{ "XXLEQV $dst, $src \t// replicate16B" %}
|
|
||||||
size(4);
|
|
||||||
ins_encode %{
|
|
||||||
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
|
||||||
%}
|
|
||||||
ins_pipe(pipe_class_default);
|
|
||||||
%}
|
|
||||||
|
|
||||||
instruct mtvsrd(vecX dst, iRegLsrc src) %{
|
instruct mtvsrd(vecX dst, iRegLsrc src) %{
|
||||||
predicate(false);
|
predicate(false);
|
||||||
effect(DEF dst, USE src);
|
effect(DEF dst, USE src);
|
||||||
@ -14754,7 +14770,7 @@ instruct repl2L_immIminus1(vecX dst, immI_minus1 src) %{
|
|||||||
match(Set dst (ReplicateL src));
|
match(Set dst (ReplicateL src));
|
||||||
predicate(n->as_Vector()->length() == 2);
|
predicate(n->as_Vector()->length() == 2);
|
||||||
|
|
||||||
format %{ "XXLEQV $dst, $src \t// replicate16B" %}
|
format %{ "XXLEQV $dst, $src \t// replicate2L" %}
|
||||||
size(4);
|
size(4);
|
||||||
ins_encode %{
|
ins_encode %{
|
||||||
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
||||||
|
@ -1274,7 +1274,30 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
|||||||
|
|
||||||
// entry: c2i
|
// entry: c2i
|
||||||
|
|
||||||
c2i_entry = gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, call_interpreter, ientry);
|
c2i_entry = __ pc();
|
||||||
|
|
||||||
|
// Class initialization barrier for static methods
|
||||||
|
if (VM_Version::supports_fast_class_init_checks()) {
|
||||||
|
Label L_skip_barrier;
|
||||||
|
|
||||||
|
{ // Bypass the barrier for non-static methods
|
||||||
|
__ lwz(R0, in_bytes(Method::access_flags_offset()), R19_method);
|
||||||
|
__ andi_(R0, R0, JVM_ACC_STATIC);
|
||||||
|
__ beq(CCR0, L_skip_barrier); // non-static
|
||||||
|
}
|
||||||
|
|
||||||
|
Register klass = R11_scratch1;
|
||||||
|
__ load_method_holder(klass, R19_method);
|
||||||
|
__ clinit_barrier(klass, R16_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub(), R0);
|
||||||
|
__ mtctr(klass);
|
||||||
|
__ bctr();
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, call_interpreter, ientry);
|
||||||
|
|
||||||
return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
|
return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
|
||||||
}
|
}
|
||||||
@ -2106,6 +2129,21 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
|||||||
__ tabort_();
|
__ tabort_();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) {
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = r_temp_1;
|
||||||
|
// Notify OOP recorder (don't need the relocation)
|
||||||
|
AddressLiteral md = __ constant_metadata_address(method->method_holder());
|
||||||
|
__ load_const_optimized(klass, md.value(), R0);
|
||||||
|
__ clinit_barrier(klass, R16_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub(), R0);
|
||||||
|
__ mtctr(klass);
|
||||||
|
__ bctr();
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
__ save_LR_CR(r_temp_1);
|
__ save_LR_CR(r_temp_1);
|
||||||
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
|
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
|
||||||
__ mr(r_callers_sp, R1_SP); // Remember frame pointer.
|
__ mr(r_callers_sp, R1_SP); // Remember frame pointer.
|
||||||
|
@ -2232,7 +2232,7 @@ void TemplateTable::_return(TosState state) {
|
|||||||
void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register Rscratch, size_t index_size) {
|
void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Register Rscratch, size_t index_size) {
|
||||||
|
|
||||||
__ get_cache_and_index_at_bcp(Rcache, 1, index_size);
|
__ get_cache_and_index_at_bcp(Rcache, 1, index_size);
|
||||||
Label Lresolved, Ldone;
|
Label Lresolved, Ldone, L_clinit_barrier_slow;
|
||||||
|
|
||||||
Bytecodes::Code code = bytecode();
|
Bytecodes::Code code = bytecode();
|
||||||
switch (code) {
|
switch (code) {
|
||||||
@ -2253,6 +2253,9 @@ void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Regist
|
|||||||
__ cmpdi(CCR0, Rscratch, (int)code);
|
__ cmpdi(CCR0, Rscratch, (int)code);
|
||||||
__ beq(CCR0, Lresolved);
|
__ beq(CCR0, Lresolved);
|
||||||
|
|
||||||
|
// Class initialization barrier slow path lands here as well.
|
||||||
|
__ bind(L_clinit_barrier_slow);
|
||||||
|
|
||||||
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
|
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
|
||||||
__ li(R4_ARG2, code);
|
__ li(R4_ARG2, code);
|
||||||
__ call_VM(noreg, entry, R4_ARG2, true);
|
__ call_VM(noreg, entry, R4_ARG2, true);
|
||||||
@ -2263,6 +2266,17 @@ void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Regist
|
|||||||
|
|
||||||
__ bind(Lresolved);
|
__ bind(Lresolved);
|
||||||
__ isync(); // Order load wrt. succeeding loads.
|
__ isync(); // Order load wrt. succeeding loads.
|
||||||
|
|
||||||
|
// Class initialization barrier for static methods
|
||||||
|
if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
|
||||||
|
const Register method = Rscratch;
|
||||||
|
const Register klass = Rscratch;
|
||||||
|
|
||||||
|
__ load_resolved_method_at_index(byte_no, Rcache, method);
|
||||||
|
__ load_method_holder(klass, method);
|
||||||
|
__ clinit_barrier(klass, R16_thread, NULL /*L_fast_path*/, &L_clinit_barrier_slow);
|
||||||
|
}
|
||||||
|
|
||||||
__ bind(Ldone);
|
__ bind(Ldone);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2329,7 +2343,7 @@ void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
|
|||||||
// Already resolved.
|
// Already resolved.
|
||||||
__ get_cache_and_index_at_bcp(Rcache, 1);
|
__ get_cache_and_index_at_bcp(Rcache, 1);
|
||||||
} else {
|
} else {
|
||||||
resolve_cache_and_index(byte_no, Rcache, R0, is_invokedynamic ? sizeof(u4) : sizeof(u2));
|
resolve_cache_and_index(byte_no, Rcache, /* temp */ Rmethod, is_invokedynamic ? sizeof(u4) : sizeof(u2));
|
||||||
}
|
}
|
||||||
|
|
||||||
__ ld(Rmethod, method_offset, Rcache);
|
__ ld(Rmethod, method_offset, Rcache);
|
||||||
@ -3634,9 +3648,7 @@ void TemplateTable::invokeinterface(int byte_no) {
|
|||||||
// Find entry point to call.
|
// Find entry point to call.
|
||||||
|
|
||||||
// Get declaring interface class from method
|
// Get declaring interface class from method
|
||||||
__ ld(Rinterface_klass, in_bytes(Method::const_offset()), Rmethod);
|
__ load_method_holder(Rinterface_klass, Rmethod);
|
||||||
__ ld(Rinterface_klass, in_bytes(ConstMethod::constants_offset()), Rinterface_klass);
|
|
||||||
__ ld(Rinterface_klass, ConstantPool::pool_holder_offset_in_bytes(), Rinterface_klass);
|
|
||||||
|
|
||||||
// Get itable index from method
|
// Get itable index from method
|
||||||
__ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod);
|
__ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod);
|
||||||
|
@ -95,6 +95,9 @@ public:
|
|||||||
// Override Abstract_VM_Version implementation
|
// Override Abstract_VM_Version implementation
|
||||||
static bool use_biased_locking();
|
static bool use_biased_locking();
|
||||||
|
|
||||||
|
// PPC64 supports fast class initialization checks for static methods.
|
||||||
|
static bool supports_fast_class_init_checks() { return true; }
|
||||||
|
|
||||||
static bool is_determine_features_test_running() { return _is_determine_features_test_running; }
|
static bool is_determine_features_test_running() { return _is_determine_features_test_running; }
|
||||||
// CPU instruction support
|
// CPU instruction support
|
||||||
static bool has_fsqrt() { return (_features & fsqrt_m) != 0; }
|
static bool has_fsqrt() { return (_features & fsqrt_m) != 0; }
|
||||||
|
@ -82,7 +82,18 @@ int LIR_Assembler::check_icache() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void LIR_Assembler::clinit_barrier(ciMethod* method) {
|
void LIR_Assembler::clinit_barrier(ciMethod* method) {
|
||||||
ShouldNotReachHere(); // not implemented
|
assert(!method->holder()->is_not_initialized(), "initialization should have been started");
|
||||||
|
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = Z_R1_scratch;
|
||||||
|
|
||||||
|
metadata2reg(method->holder()->constant_encoding(), klass);
|
||||||
|
__ clinit_barrier(klass, Z_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub());
|
||||||
|
__ z_br(klass);
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LIR_Assembler::osr_entry() {
|
void LIR_Assembler::osr_entry() {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016, 2018 SAP SE. All rights reserved.
|
* Copyright (c) 2016, 2019 SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -414,6 +414,19 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
|
|||||||
BLOCK_COMMENT("}");
|
BLOCK_COMMENT("}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterpreterMacroAssembler::load_resolved_method_at_index(int byte_no,
|
||||||
|
Register cache,
|
||||||
|
Register cpe_offset,
|
||||||
|
Register method) {
|
||||||
|
const int method_offset = in_bytes(
|
||||||
|
ConstantPoolCache::base_offset() +
|
||||||
|
((byte_no == TemplateTable::f2_byte)
|
||||||
|
? ConstantPoolCacheEntry::f2_offset()
|
||||||
|
: ConstantPoolCacheEntry::f1_offset()));
|
||||||
|
|
||||||
|
z_lg(method, Address(cache, cpe_offset, method_offset)); // get f1 Method*
|
||||||
|
}
|
||||||
|
|
||||||
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
|
// Generate a subtype check: branch to ok_is_subtype if sub_klass is
|
||||||
// a subtype of super_klass. Blows registers Rsuper_klass, Rsub_klass, tmp1, tmp2.
|
// a subtype of super_klass. Blows registers Rsuper_klass, Rsub_klass, tmp1, tmp2.
|
||||||
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
|
void InterpreterMacroAssembler::gen_subtype_check(Register Rsub_klass,
|
||||||
@ -2175,7 +2188,7 @@ void InterpreterMacroAssembler::pop_interpreter_frame(Register return_pc, Regist
|
|||||||
Register R_f1_sender_sp = tmp1;
|
Register R_f1_sender_sp = tmp1;
|
||||||
Register R_f2_sp = tmp2;
|
Register R_f2_sp = tmp2;
|
||||||
|
|
||||||
// Tirst check the for the interpreter frame's magic.
|
// First check for the interpreter frame's magic.
|
||||||
asm_assert_ijava_state_magic(R_f2_sp/*tmp*/);
|
asm_assert_ijava_state_magic(R_f2_sp/*tmp*/);
|
||||||
z_lg(R_f2_sp, _z_parent_ijava_frame_abi(callers_sp), Z_fp);
|
z_lg(R_f2_sp, _z_parent_ijava_frame_abi(callers_sp), Z_fp);
|
||||||
z_lg(R_f1_sender_sp, _z_ijava_state_neg(sender_sp), Z_fp);
|
z_lg(R_f1_sender_sp, _z_ijava_state_neg(sender_sp), Z_fp);
|
||||||
|
@ -120,6 +120,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
|||||||
// load cpool->resolved_klass_at(index)
|
// load cpool->resolved_klass_at(index)
|
||||||
void load_resolved_klass_at_offset(Register cpool, Register offset, Register iklass);
|
void load_resolved_klass_at_offset(Register cpool, Register offset, Register iklass);
|
||||||
|
|
||||||
|
void load_resolved_method_at_index(int byte_no, Register cache, Register cpe_offset, Register method);
|
||||||
|
|
||||||
// Pop topmost element from stack. It just disappears. Useful if
|
// Pop topmost element from stack. It just disappears. Useful if
|
||||||
// consumed previously by access via stackTop().
|
// consumed previously by access via stackTop().
|
||||||
void popx(int len);
|
void popx(int len);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016, 2018, SAP SE. All rights reserved.
|
* Copyright (c) 2016, 2019, SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -3130,6 +3130,33 @@ void MacroAssembler::check_klass_subtype(Register sub_klass,
|
|||||||
BLOCK_COMMENT("} check_klass_subtype");
|
BLOCK_COMMENT("} check_klass_subtype");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroAssembler::clinit_barrier(Register klass, Register thread, Label* L_fast_path, Label* L_slow_path) {
|
||||||
|
assert(L_fast_path != NULL || L_slow_path != NULL, "at least one is required");
|
||||||
|
|
||||||
|
Label L_fallthrough;
|
||||||
|
if (L_fast_path == NULL) {
|
||||||
|
L_fast_path = &L_fallthrough;
|
||||||
|
} else if (L_slow_path == NULL) {
|
||||||
|
L_slow_path = &L_fallthrough;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fast path check: class is fully initialized
|
||||||
|
z_cli(Address(klass, InstanceKlass::init_state_offset()), InstanceKlass::fully_initialized);
|
||||||
|
z_bre(*L_fast_path);
|
||||||
|
|
||||||
|
// Fast path check: current thread is initializer thread
|
||||||
|
z_cg(thread, Address(klass, InstanceKlass::init_thread_offset()));
|
||||||
|
if (L_slow_path == &L_fallthrough) {
|
||||||
|
z_bre(*L_fast_path);
|
||||||
|
} else if (L_fast_path == &L_fallthrough) {
|
||||||
|
z_brne(*L_slow_path);
|
||||||
|
} else {
|
||||||
|
Unimplemented();
|
||||||
|
}
|
||||||
|
|
||||||
|
bind(L_fallthrough);
|
||||||
|
}
|
||||||
|
|
||||||
// Increment a counter at counter_address when the eq condition code is
|
// Increment a counter at counter_address when the eq condition code is
|
||||||
// set. Kills registers tmp1_reg and tmp2_reg and preserves the condition code.
|
// set. Kills registers tmp1_reg and tmp2_reg and preserves the condition code.
|
||||||
void MacroAssembler::increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg) {
|
void MacroAssembler::increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg) {
|
||||||
@ -4339,14 +4366,19 @@ void MacroAssembler::resolve_oop_handle(Register result) {
|
|||||||
z_lg(result, 0, result);
|
z_lg(result, 0, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MacroAssembler::load_mirror(Register mirror, Register method) {
|
void MacroAssembler::load_mirror_from_const_method(Register mirror, Register const_method) {
|
||||||
mem2reg_opt(mirror, Address(method, Method::const_offset()));
|
mem2reg_opt(mirror, Address(const_method, ConstMethod::constants_offset()));
|
||||||
mem2reg_opt(mirror, Address(mirror, ConstMethod::constants_offset()));
|
|
||||||
mem2reg_opt(mirror, Address(mirror, ConstantPool::pool_holder_offset_in_bytes()));
|
mem2reg_opt(mirror, Address(mirror, ConstantPool::pool_holder_offset_in_bytes()));
|
||||||
mem2reg_opt(mirror, Address(mirror, Klass::java_mirror_offset()));
|
mem2reg_opt(mirror, Address(mirror, Klass::java_mirror_offset()));
|
||||||
resolve_oop_handle(mirror);
|
resolve_oop_handle(mirror);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MacroAssembler::load_method_holder(Register holder, Register method) {
|
||||||
|
mem2reg_opt(holder, Address(method, Method::const_offset()));
|
||||||
|
mem2reg_opt(holder, Address(holder, ConstMethod::constants_offset()));
|
||||||
|
mem2reg_opt(holder, Address(holder, ConstantPool::pool_holder_offset_in_bytes()));
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
//--- Operations on arrays.
|
//--- Operations on arrays.
|
||||||
//---------------------------------------------------------------
|
//---------------------------------------------------------------
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016, 2018, SAP SE. All rights reserved.
|
* Copyright (c) 2016, 2019, SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -713,6 +713,11 @@ class MacroAssembler: public Assembler {
|
|||||||
Register temp2_reg,
|
Register temp2_reg,
|
||||||
Label& L_success);
|
Label& L_success);
|
||||||
|
|
||||||
|
void clinit_barrier(Register klass,
|
||||||
|
Register thread,
|
||||||
|
Label* L_fast_path = NULL,
|
||||||
|
Label* L_slow_path = NULL);
|
||||||
|
|
||||||
// Increment a counter at counter_address when the eq condition code is set.
|
// Increment a counter at counter_address when the eq condition code is set.
|
||||||
// Kills registers tmp1_reg and tmp2_reg and preserves the condition code.
|
// Kills registers tmp1_reg and tmp2_reg and preserves the condition code.
|
||||||
void increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg);
|
void increment_counter_eq(address counter_address, Register tmp1_reg, Register tmp2_reg);
|
||||||
@ -823,7 +828,8 @@ class MacroAssembler: public Assembler {
|
|||||||
Register Rbase = Z_R1, int pow2_offset = -1);
|
Register Rbase = Z_R1, int pow2_offset = -1);
|
||||||
|
|
||||||
void resolve_oop_handle(Register result);
|
void resolve_oop_handle(Register result);
|
||||||
void load_mirror(Register mirror, Register method);
|
void load_mirror_from_const_method(Register mirror, Register const_method);
|
||||||
|
void load_method_holder(Register holder, Register method);
|
||||||
|
|
||||||
//--------------------------
|
//--------------------------
|
||||||
//--- Operations on arrays.
|
//--- Operations on arrays.
|
||||||
|
@ -867,6 +867,23 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
|||||||
|
|
||||||
assert(framesize % wordSize == 0, "must preserve wordSize alignment");
|
assert(framesize % wordSize == 0, "must preserve wordSize alignment");
|
||||||
|
|
||||||
|
if (C->clinit_barrier_on_entry()) {
|
||||||
|
assert(!C->method()->holder()->is_not_initialized(), "initialization should have been started");
|
||||||
|
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = Z_R1_scratch;
|
||||||
|
|
||||||
|
// Notify OOP recorder (don't need the relocation)
|
||||||
|
AddressLiteral md = __ constant_metadata_address(C->method()->holder()->constant_encoding());
|
||||||
|
__ load_const_optimized(klass, md.value());
|
||||||
|
__ clinit_barrier(klass, Z_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub());
|
||||||
|
__ z_br(klass);
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
// Calls to C2R adapters often do not accept exceptional returns.
|
// Calls to C2R adapters often do not accept exceptional returns.
|
||||||
// We require that their callers must bang for them. But be
|
// We require that their callers must bang for them. But be
|
||||||
// careful, because some VM calls (such as call site linkage) can
|
// careful, because some VM calls (such as call site linkage) can
|
||||||
|
@ -1832,6 +1832,20 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
wrapper_VEPStart = __ offset();
|
wrapper_VEPStart = __ offset();
|
||||||
|
|
||||||
|
if (VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) {
|
||||||
|
Label L_skip_barrier;
|
||||||
|
Register klass = Z_R1_scratch;
|
||||||
|
// Notify OOP recorder (don't need the relocation)
|
||||||
|
AddressLiteral md = __ constant_metadata_address(method->method_holder());
|
||||||
|
__ load_const_optimized(klass, md.value());
|
||||||
|
__ clinit_barrier(klass, Z_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub());
|
||||||
|
__ z_br(klass);
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
__ save_return_pc();
|
__ save_return_pc();
|
||||||
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
|
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
|
||||||
#ifndef USE_RESIZE_FRAME
|
#ifndef USE_RESIZE_FRAME
|
||||||
@ -2696,8 +2710,28 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
|||||||
// Fallthru to VEP. Duplicate LTG, but saved taken branch.
|
// Fallthru to VEP. Duplicate LTG, but saved taken branch.
|
||||||
}
|
}
|
||||||
|
|
||||||
address c2i_entry;
|
address c2i_entry = __ pc();
|
||||||
c2i_entry = gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, skip_fixup);
|
|
||||||
|
// Class initialization barrier for static methods
|
||||||
|
if (VM_Version::supports_fast_class_init_checks()) {
|
||||||
|
Label L_skip_barrier;
|
||||||
|
|
||||||
|
{ // Bypass the barrier for non-static methods
|
||||||
|
__ testbit(Address(Z_method, Method::access_flags_offset()), JVM_ACC_STATIC_BIT);
|
||||||
|
__ z_bfalse(L_skip_barrier); // non-static
|
||||||
|
}
|
||||||
|
|
||||||
|
Register klass = Z_R11;
|
||||||
|
__ load_method_holder(klass, Z_method);
|
||||||
|
__ clinit_barrier(klass, Z_thread, &L_skip_barrier /*L_fast_path*/);
|
||||||
|
|
||||||
|
__ load_const_optimized(klass, SharedRuntime::get_handle_wrong_method_stub());
|
||||||
|
__ z_br(klass);
|
||||||
|
|
||||||
|
__ bind(L_skip_barrier);
|
||||||
|
}
|
||||||
|
|
||||||
|
gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, skip_fixup);
|
||||||
|
|
||||||
return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
|
return AdapterHandlerLibrary::new_entry(fingerprint, i2c_entry, c2i_entry, c2i_unverified_entry);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2016, 2018, SAP SE. All rights reserved.
|
* Copyright (c) 2016, 2019, SAP SE. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -821,7 +821,7 @@ void TemplateInterpreterGenerator::generate_stack_overflow_check(Register frame_
|
|||||||
const int page_size = os::vm_page_size();
|
const int page_size = os::vm_page_size();
|
||||||
NearLabel after_frame_check;
|
NearLabel after_frame_check;
|
||||||
|
|
||||||
BLOCK_COMMENT("counter_overflow {");
|
BLOCK_COMMENT("stack_overflow_check {");
|
||||||
|
|
||||||
assert_different_registers(frame_size, tmp1);
|
assert_different_registers(frame_size, tmp1);
|
||||||
|
|
||||||
@ -883,7 +883,7 @@ void TemplateInterpreterGenerator::generate_stack_overflow_check(Register frame_
|
|||||||
// If you get to here, then there is enough stack space.
|
// If you get to here, then there is enough stack space.
|
||||||
__ bind(after_frame_check);
|
__ bind(after_frame_check);
|
||||||
|
|
||||||
BLOCK_COMMENT("} counter_overflow");
|
BLOCK_COMMENT("} stack_overflow_check");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate monitor and lock method (asm interpreter).
|
// Allocate monitor and lock method (asm interpreter).
|
||||||
@ -927,7 +927,9 @@ void TemplateInterpreterGenerator::lock_method(void) {
|
|||||||
__ bind(static_method);
|
__ bind(static_method);
|
||||||
|
|
||||||
// Lock the java mirror.
|
// Lock the java mirror.
|
||||||
__ load_mirror(object, method);
|
// Load mirror from interpreter frame.
|
||||||
|
__ z_lg(object, _z_ijava_state_neg(mirror), Z_fp);
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
{
|
{
|
||||||
NearLabel L;
|
NearLabel L;
|
||||||
@ -993,18 +995,18 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
|
|
||||||
const Register local_count = Z_ARG5;
|
const Register local_count = Z_ARG5;
|
||||||
const Register fp = Z_tmp_2;
|
const Register fp = Z_tmp_2;
|
||||||
|
const Register const_method = Z_ARG1;
|
||||||
|
|
||||||
BLOCK_COMMENT("generate_fixed_frame {");
|
BLOCK_COMMENT("generate_fixed_frame {");
|
||||||
|
|
||||||
{
|
{
|
||||||
// local registers
|
// local registers
|
||||||
const Register top_frame_size = Z_ARG2;
|
const Register top_frame_size = Z_ARG2;
|
||||||
const Register sp_after_resize = Z_ARG3;
|
const Register sp_after_resize = Z_ARG3;
|
||||||
const Register max_stack = Z_ARG4;
|
const Register max_stack = Z_ARG4;
|
||||||
|
|
||||||
// local_count = method->constMethod->max_locals();
|
__ z_lg(const_method, Address(Z_method, Method::const_offset()));
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
__ z_llgh(max_stack, Address(const_method, ConstMethod::size_of_parameters_offset()));
|
||||||
__ z_llgh(local_count, Address(Z_R1_scratch, ConstMethod::size_of_locals_offset()));
|
__ z_sllg(Z_locals /*parameter_count bytes*/, max_stack /*parameter_count*/, LogBytesPerWord);
|
||||||
|
|
||||||
if (native_call) {
|
if (native_call) {
|
||||||
// If we're calling a native method, we replace max_stack (which is
|
// If we're calling a native method, we replace max_stack (which is
|
||||||
@ -1024,9 +1026,6 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
// area, so we need to allocate at least that much even though we're
|
// area, so we need to allocate at least that much even though we're
|
||||||
// going to throw it away.
|
// going to throw it away.
|
||||||
//
|
//
|
||||||
|
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
|
||||||
__ z_llgh(max_stack, Address(Z_R1_scratch, ConstMethod::size_of_parameters_offset()));
|
|
||||||
__ add2reg(max_stack, 2);
|
__ add2reg(max_stack, 2);
|
||||||
|
|
||||||
NearLabel passing_args_on_stack;
|
NearLabel passing_args_on_stack;
|
||||||
@ -1042,14 +1041,14 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
__ bind(passing_args_on_stack);
|
__ bind(passing_args_on_stack);
|
||||||
} else {
|
} else {
|
||||||
// !native_call
|
// !native_call
|
||||||
__ z_lg(max_stack, method_(const));
|
// local_count = method->constMethod->max_locals();
|
||||||
|
__ z_llgh(local_count, Address(const_method, ConstMethod::size_of_locals_offset()));
|
||||||
|
|
||||||
// Calculate number of non-parameter locals (in slots):
|
// Calculate number of non-parameter locals (in slots):
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
__ z_sgr(local_count, max_stack);
|
||||||
__ z_sh(local_count, Address(Z_R1_scratch, ConstMethod::size_of_parameters_offset()));
|
|
||||||
|
|
||||||
// max_stack = method->max_stack();
|
// max_stack = method->max_stack();
|
||||||
__ z_llgh(max_stack, Address(max_stack, ConstMethod::max_stack_offset()));
|
__ z_llgh(max_stack, Address(const_method, ConstMethod::max_stack_offset()));
|
||||||
// max_stack in bytes
|
// max_stack in bytes
|
||||||
__ z_sllg(max_stack, max_stack, LogBytesPerWord);
|
__ z_sllg(max_stack, max_stack, LogBytesPerWord);
|
||||||
}
|
}
|
||||||
@ -1089,14 +1088,15 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
// delta = PARENT_IJAVA_FRAME_ABI + (locals_count - params_count)
|
// delta = PARENT_IJAVA_FRAME_ABI + (locals_count - params_count)
|
||||||
|
|
||||||
__ add2reg(sp_after_resize, (Interpreter::stackElementSize) - (frame::z_parent_ijava_frame_abi_size), Z_esp);
|
__ add2reg(sp_after_resize, (Interpreter::stackElementSize) - (frame::z_parent_ijava_frame_abi_size), Z_esp);
|
||||||
|
if (!native_call) {
|
||||||
__ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
|
__ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
|
||||||
__ z_slgr(sp_after_resize, Z_R0_scratch);
|
__ z_slgr(sp_after_resize, Z_R0_scratch);
|
||||||
|
}
|
||||||
|
|
||||||
// top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
|
// top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
|
||||||
__ add2reg(top_frame_size,
|
__ add2reg(top_frame_size,
|
||||||
frame::z_top_ijava_frame_abi_size +
|
frame::z_top_ijava_frame_abi_size +
|
||||||
frame::z_ijava_state_size +
|
frame::z_ijava_state_size,
|
||||||
frame::interpreter_frame_monitor_size() * wordSize,
|
|
||||||
max_stack);
|
max_stack);
|
||||||
|
|
||||||
if (!native_call) {
|
if (!native_call) {
|
||||||
@ -1104,7 +1104,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
// Native calls don't need the stack size check since they have no
|
// Native calls don't need the stack size check since they have no
|
||||||
// expression stack and the arguments are already on the stack and
|
// expression stack and the arguments are already on the stack and
|
||||||
// we only add a handful of words to the stack.
|
// we only add a handful of words to the stack.
|
||||||
Register frame_size = max_stack; // Reuse the regiser for max_stack.
|
Register frame_size = max_stack; // Reuse the register for max_stack.
|
||||||
__ z_lgr(frame_size, Z_SP);
|
__ z_lgr(frame_size, Z_SP);
|
||||||
__ z_sgr(frame_size, sp_after_resize);
|
__ z_sgr(frame_size, sp_after_resize);
|
||||||
__ z_agr(frame_size, top_frame_size);
|
__ z_agr(frame_size, top_frame_size);
|
||||||
@ -1136,13 +1136,12 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Save sender SP from F1 (i.e. before it was potentially modified by an
|
// Save sender SP from F1 (i.e. before it was potentially modified by an
|
||||||
// adapter) into F0's interpreter state. We us it as well to revert
|
// adapter) into F0's interpreter state. We use it as well to revert
|
||||||
// resizing the frame above.
|
// resizing the frame above.
|
||||||
__ z_stg(Z_R10, _z_ijava_state_neg(sender_sp), fp);
|
__ z_stg(Z_R10, _z_ijava_state_neg(sender_sp), fp);
|
||||||
|
|
||||||
// Load cp cache and save it at the and of this block.
|
// Load cp cache and save it at the end of this block.
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
__ z_lg(Z_R1_scratch, Address(const_method, ConstMethod::constants_offset()));
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_R1_scratch, ConstMethod::constants_offset()));
|
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_R1_scratch, ConstantPool::cache_offset_in_bytes()));
|
__ z_lg(Z_R1_scratch, Address(Z_R1_scratch, ConstantPool::cache_offset_in_bytes()));
|
||||||
|
|
||||||
// z_ijava_state->method = method;
|
// z_ijava_state->method = method;
|
||||||
@ -1152,10 +1151,6 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
// parameters on top of caller's expression stack.
|
// parameters on top of caller's expression stack.
|
||||||
// Tos points past last Java argument.
|
// Tos points past last Java argument.
|
||||||
|
|
||||||
__ z_lg(Z_locals, Address(Z_method, Method::const_offset()));
|
|
||||||
__ z_llgh(Z_locals /*parameter_count words*/,
|
|
||||||
Address(Z_locals, ConstMethod::size_of_parameters_offset()));
|
|
||||||
__ z_sllg(Z_locals /*parameter_count bytes*/, Z_locals /*parameter_count*/, LogBytesPerWord);
|
|
||||||
__ z_agr(Z_locals, Z_esp);
|
__ z_agr(Z_locals, Z_esp);
|
||||||
// z_ijava_state->locals - i*BytesPerWord points to i-th Java local (i starts at 0)
|
// z_ijava_state->locals - i*BytesPerWord points to i-th Java local (i starts at 0)
|
||||||
// z_ijava_state->locals = Z_esp + parameter_count bytes
|
// z_ijava_state->locals = Z_esp + parameter_count bytes
|
||||||
@ -1183,8 +1178,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
if (native_call) {
|
if (native_call) {
|
||||||
__ clear_reg(Z_bcp); // Must initialize. Will get written into frame where GC reads it.
|
__ clear_reg(Z_bcp); // Must initialize. Will get written into frame where GC reads it.
|
||||||
} else {
|
} else {
|
||||||
__ z_lg(Z_bcp, method_(const));
|
__ add2reg(Z_bcp, in_bytes(ConstMethod::codes_offset()), const_method);
|
||||||
__ add2reg(Z_bcp, in_bytes(ConstMethod::codes_offset()));
|
|
||||||
}
|
}
|
||||||
__ z_stg(Z_bcp, _z_ijava_state_neg(bcp), fp);
|
__ z_stg(Z_bcp, _z_ijava_state_neg(bcp), fp);
|
||||||
|
|
||||||
@ -1202,62 +1196,21 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
|||||||
__ z_stg(Z_R1_scratch, _z_ijava_state_neg(cpoolCache), fp);
|
__ z_stg(Z_R1_scratch, _z_ijava_state_neg(cpoolCache), fp);
|
||||||
|
|
||||||
// Get mirror and store it in the frame as GC root for this Method*.
|
// Get mirror and store it in the frame as GC root for this Method*.
|
||||||
__ load_mirror(Z_R1_scratch, Z_method);
|
__ load_mirror_from_const_method(Z_R1_scratch, const_method);
|
||||||
__ z_stg(Z_R1_scratch, _z_ijava_state_neg(mirror), fp);
|
__ z_stg(Z_R1_scratch, _z_ijava_state_neg(mirror), fp);
|
||||||
|
|
||||||
BLOCK_COMMENT("} generate_fixed_frame: initialize interpreter state");
|
BLOCK_COMMENT("} generate_fixed_frame: initialize interpreter state");
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
if (!native_call) {
|
if (!native_call) {
|
||||||
// Fill locals with 0x0s.
|
|
||||||
NearLabel locals_zeroed;
|
|
||||||
NearLabel doXC;
|
|
||||||
|
|
||||||
// Local_count is already num_locals_slots - num_param_slots.
|
// Local_count is already num_locals_slots - num_param_slots.
|
||||||
__ compare64_and_branch(local_count, (intptr_t)0L, Assembler::bcondNotHigh, locals_zeroed);
|
// Start of locals: local_addr = Z_locals - locals size + 1 slot
|
||||||
|
__ z_llgh(Z_R0_scratch, Address(const_method, ConstMethod::size_of_locals_offset()));
|
||||||
// Advance local_addr to point behind locals (creates positive incr. in loop).
|
__ add2reg(local_addr, BytesPerWord, Z_locals);
|
||||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
|
||||||
__ z_llgh(Z_R0_scratch, Address(Z_R1_scratch, ConstMethod::size_of_locals_offset()));
|
|
||||||
__ add2reg(Z_R0_scratch, -1);
|
|
||||||
|
|
||||||
__ z_lgr(local_addr/*locals*/, Z_locals);
|
|
||||||
__ z_sllg(Z_R0_scratch, Z_R0_scratch, LogBytesPerWord);
|
__ z_sllg(Z_R0_scratch, Z_R0_scratch, LogBytesPerWord);
|
||||||
__ z_sllg(local_count, local_count, LogBytesPerWord); // Local_count are non param locals.
|
|
||||||
__ z_sgr(local_addr, Z_R0_scratch);
|
__ z_sgr(local_addr, Z_R0_scratch);
|
||||||
|
|
||||||
if (VM_Version::has_Prefetch()) {
|
__ Clear_Array(local_count, local_addr, Z_ARG2);
|
||||||
__ z_pfd(0x02, 0, Z_R0, local_addr);
|
|
||||||
__ z_pfd(0x02, 256, Z_R0, local_addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Can't optimise for Z10 using "compare and branch" (immediate value is too big).
|
|
||||||
__ z_cghi(local_count, 256);
|
|
||||||
__ z_brnh(doXC);
|
|
||||||
|
|
||||||
// MVCLE: Initialize if quite a lot locals.
|
|
||||||
// __ bind(doMVCLE);
|
|
||||||
__ z_lgr(Z_R0_scratch, local_addr);
|
|
||||||
__ z_lgr(Z_R1_scratch, local_count);
|
|
||||||
__ clear_reg(Z_ARG2); // Src len of MVCLE is zero.
|
|
||||||
|
|
||||||
__ MacroAssembler::move_long_ext(Z_R0_scratch, Z_ARG1, 0);
|
|
||||||
__ z_bru(locals_zeroed);
|
|
||||||
|
|
||||||
Label XC_template;
|
|
||||||
__ bind(XC_template);
|
|
||||||
__ z_xc(0, 0, local_addr, 0, local_addr);
|
|
||||||
|
|
||||||
__ bind(doXC);
|
|
||||||
__ z_bctgr(local_count, Z_R0); // Get #bytes-1 for EXECUTE.
|
|
||||||
if (VM_Version::has_ExecuteExtensions()) {
|
|
||||||
__ z_exrl(local_count, XC_template); // Execute XC with variable length.
|
|
||||||
} else {
|
|
||||||
__ z_larl(Z_R1_scratch, XC_template);
|
|
||||||
__ z_ex(local_count, 0, Z_R0, Z_R1_scratch); // Execute XC with variable length.
|
|
||||||
}
|
|
||||||
|
|
||||||
__ bind(locals_zeroed);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1530,8 +1483,8 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
|||||||
Label method_is_not_static;
|
Label method_is_not_static;
|
||||||
__ testbit(method2_(Rmethod, access_flags), JVM_ACC_STATIC_BIT);
|
__ testbit(method2_(Rmethod, access_flags), JVM_ACC_STATIC_BIT);
|
||||||
__ z_bfalse(method_is_not_static);
|
__ z_bfalse(method_is_not_static);
|
||||||
// Get mirror.
|
// Load mirror from interpreter frame.
|
||||||
__ load_mirror(Z_R1, Rmethod);
|
__ z_lg(Z_R1, _z_ijava_state_neg(mirror), Z_fp);
|
||||||
// z_ijava_state.oop_temp = pool_holder->klass_part()->java_mirror();
|
// z_ijava_state.oop_temp = pool_holder->klass_part()->java_mirror();
|
||||||
__ z_stg(Z_R1, oop_tmp_offset, Z_fp);
|
__ z_stg(Z_R1, oop_tmp_offset, Z_fp);
|
||||||
// Pass handle to mirror as 2nd argument to JNI method.
|
// Pass handle to mirror as 2nd argument to JNI method.
|
||||||
|
@ -2404,14 +2404,14 @@ void TemplateTable::_return(TosState state) {
|
|||||||
// NOTE: Cpe_offset is already computed as byte offset, so we must not
|
// NOTE: Cpe_offset is already computed as byte offset, so we must not
|
||||||
// shift it afterwards!
|
// shift it afterwards!
|
||||||
void TemplateTable::resolve_cache_and_index(int byte_no,
|
void TemplateTable::resolve_cache_and_index(int byte_no,
|
||||||
Register Rcache,
|
Register cache,
|
||||||
Register cpe_offset,
|
Register cpe_offset,
|
||||||
size_t index_size) {
|
size_t index_size) {
|
||||||
BLOCK_COMMENT("resolve_cache_and_index {");
|
BLOCK_COMMENT("resolve_cache_and_index {");
|
||||||
NearLabel resolved;
|
NearLabel resolved, clinit_barrier_slow;
|
||||||
const Register bytecode_in_cpcache = Z_R1_scratch;
|
const Register bytecode_in_cpcache = Z_R1_scratch;
|
||||||
const int total_f1_offset = in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f1_offset());
|
const int total_f1_offset = in_bytes(ConstantPoolCache::base_offset() + ConstantPoolCacheEntry::f1_offset());
|
||||||
assert_different_registers(Rcache, cpe_offset, bytecode_in_cpcache);
|
assert_different_registers(cache, cpe_offset, bytecode_in_cpcache);
|
||||||
|
|
||||||
Bytecodes::Code code = bytecode();
|
Bytecodes::Code code = bytecode();
|
||||||
switch (code) {
|
switch (code) {
|
||||||
@ -2423,19 +2423,32 @@ void TemplateTable::resolve_cache_and_index(int byte_no,
|
|||||||
|
|
||||||
{
|
{
|
||||||
assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
|
assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
|
||||||
__ get_cache_and_index_and_bytecode_at_bcp(Rcache, cpe_offset, bytecode_in_cpcache, byte_no, 1, index_size);
|
__ get_cache_and_index_and_bytecode_at_bcp(cache, cpe_offset, bytecode_in_cpcache, byte_no, 1, index_size);
|
||||||
// Have we resolved this bytecode?
|
// Have we resolved this bytecode?
|
||||||
__ compare32_and_branch(bytecode_in_cpcache, (int)code, Assembler::bcondEqual, resolved);
|
__ compare32_and_branch(bytecode_in_cpcache, (int)code, Assembler::bcondEqual, resolved);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Resolve first time through.
|
// Resolve first time through.
|
||||||
|
// Class initialization barrier slow path lands here as well.
|
||||||
|
__ bind(clinit_barrier_slow);
|
||||||
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
|
address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
|
||||||
__ load_const_optimized(Z_ARG2, (int) code);
|
__ load_const_optimized(Z_ARG2, (int) code);
|
||||||
__ call_VM(noreg, entry, Z_ARG2);
|
__ call_VM(noreg, entry, Z_ARG2);
|
||||||
|
|
||||||
// Update registers with resolved info.
|
// Update registers with resolved info.
|
||||||
__ get_cache_and_index_at_bcp(Rcache, cpe_offset, 1, index_size);
|
__ get_cache_and_index_at_bcp(cache, cpe_offset, 1, index_size);
|
||||||
__ bind(resolved);
|
__ bind(resolved);
|
||||||
|
|
||||||
|
// Class initialization barrier for static methods
|
||||||
|
if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
|
||||||
|
const Register method = Z_R1_scratch;
|
||||||
|
const Register klass = Z_R1_scratch;
|
||||||
|
|
||||||
|
__ load_resolved_method_at_index(byte_no, cache, cpe_offset, method);
|
||||||
|
__ load_method_holder(klass, method);
|
||||||
|
__ clinit_barrier(klass, Z_thread, NULL /*L_fast_path*/, &clinit_barrier_slow);
|
||||||
|
}
|
||||||
|
|
||||||
BLOCK_COMMENT("} resolve_cache_and_index");
|
BLOCK_COMMENT("} resolve_cache_and_index");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3664,9 +3677,7 @@ void TemplateTable::invokeinterface(int byte_no) {
|
|||||||
// Find entry point to call.
|
// Find entry point to call.
|
||||||
|
|
||||||
// Get declaring interface class from method
|
// Get declaring interface class from method
|
||||||
__ z_lg(interface, Address(method, Method::const_offset()));
|
__ load_method_holder(interface, method);
|
||||||
__ z_lg(interface, Address(interface, ConstMethod::constants_offset()));
|
|
||||||
__ z_lg(interface, Address(interface, ConstantPool::pool_holder_offset_in_bytes()));
|
|
||||||
|
|
||||||
// Get itable index from method
|
// Get itable index from method
|
||||||
Register index = receiver,
|
Register index = receiver,
|
||||||
|
@ -349,6 +349,9 @@ class VM_Version: public Abstract_VM_Version {
|
|||||||
// Override Abstract_VM_Version implementation
|
// Override Abstract_VM_Version implementation
|
||||||
static void print_platform_virtualization_info(outputStream*);
|
static void print_platform_virtualization_info(outputStream*);
|
||||||
|
|
||||||
|
// s390 supports fast class initialization checks for static methods.
|
||||||
|
static bool supports_fast_class_init_checks() { return true; }
|
||||||
|
|
||||||
// CPU feature query functions
|
// CPU feature query functions
|
||||||
static const char* get_model_string() { return _model_string; }
|
static const char* get_model_string() { return _model_string; }
|
||||||
static bool has_StoreFacilityListExtended() { return (_features[0] & StoreFacilityListExtendedMask) == StoreFacilityListExtendedMask; }
|
static bool has_StoreFacilityListExtended() { return (_features[0] & StoreFacilityListExtendedMask) == StoreFacilityListExtendedMask; }
|
||||||
|
@ -2189,11 +2189,6 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int f
|
|||||||
// available (and not reserved for something else).
|
// available (and not reserved for something else).
|
||||||
|
|
||||||
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
||||||
const int max_tries = 10;
|
|
||||||
char* base[max_tries];
|
|
||||||
size_t size[max_tries];
|
|
||||||
const size_t gap = 0x000000;
|
|
||||||
|
|
||||||
// Assert only that the size is a multiple of the page size, since
|
// Assert only that the size is a multiple of the page size, since
|
||||||
// that's all that mmap requires, and since that's all we really know
|
// that's all that mmap requires, and since that's all we really know
|
||||||
// about at this low abstraction level. If we need higher alignment,
|
// about at this low abstraction level. If we need higher alignment,
|
||||||
@ -2216,51 +2211,8 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
|||||||
anon_munmap(addr, bytes);
|
anon_munmap(addr, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < max_tries; ++i) {
|
|
||||||
base[i] = reserve_memory(bytes);
|
|
||||||
|
|
||||||
if (base[i] != NULL) {
|
|
||||||
// Is this the block we wanted?
|
|
||||||
if (base[i] == requested_addr) {
|
|
||||||
size[i] = bytes;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does this overlap the block we wanted? Give back the overlapped
|
|
||||||
// parts and try again.
|
|
||||||
|
|
||||||
size_t top_overlap = requested_addr + (bytes + gap) - base[i];
|
|
||||||
if (top_overlap >= 0 && top_overlap < bytes) {
|
|
||||||
unmap_memory(base[i], top_overlap);
|
|
||||||
base[i] += top_overlap;
|
|
||||||
size[i] = bytes - top_overlap;
|
|
||||||
} else {
|
|
||||||
size_t bottom_overlap = base[i] + bytes - requested_addr;
|
|
||||||
if (bottom_overlap >= 0 && bottom_overlap < bytes) {
|
|
||||||
unmap_memory(requested_addr, bottom_overlap);
|
|
||||||
size[i] = bytes - bottom_overlap;
|
|
||||||
} else {
|
|
||||||
size[i] = bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give back the unused reserved pieces.
|
|
||||||
|
|
||||||
for (int j = 0; j < i; ++j) {
|
|
||||||
if (base[j] != NULL) {
|
|
||||||
unmap_memory(base[j], size[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i < max_tries) {
|
|
||||||
return requested_addr;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
|
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
|
||||||
void os::infinite_sleep() {
|
void os::infinite_sleep() {
|
||||||
|
@ -4105,11 +4105,6 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int f
|
|||||||
// available (and not reserved for something else).
|
// available (and not reserved for something else).
|
||||||
|
|
||||||
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
||||||
const int max_tries = 10;
|
|
||||||
char* base[max_tries];
|
|
||||||
size_t size[max_tries];
|
|
||||||
const size_t gap = 0x000000;
|
|
||||||
|
|
||||||
// Assert only that the size is a multiple of the page size, since
|
// Assert only that the size is a multiple of the page size, since
|
||||||
// that's all that mmap requires, and since that's all we really know
|
// that's all that mmap requires, and since that's all we really know
|
||||||
// about at this low abstraction level. If we need higher alignment,
|
// about at this low abstraction level. If we need higher alignment,
|
||||||
@ -4132,51 +4127,8 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
|||||||
anon_munmap(addr, bytes);
|
anon_munmap(addr, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < max_tries; ++i) {
|
|
||||||
base[i] = reserve_memory(bytes);
|
|
||||||
|
|
||||||
if (base[i] != NULL) {
|
|
||||||
// Is this the block we wanted?
|
|
||||||
if (base[i] == requested_addr) {
|
|
||||||
size[i] = bytes;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does this overlap the block we wanted? Give back the overlapped
|
|
||||||
// parts and try again.
|
|
||||||
|
|
||||||
ptrdiff_t top_overlap = requested_addr + (bytes + gap) - base[i];
|
|
||||||
if (top_overlap >= 0 && (size_t)top_overlap < bytes) {
|
|
||||||
unmap_memory(base[i], top_overlap);
|
|
||||||
base[i] += top_overlap;
|
|
||||||
size[i] = bytes - top_overlap;
|
|
||||||
} else {
|
|
||||||
ptrdiff_t bottom_overlap = base[i] + bytes - requested_addr;
|
|
||||||
if (bottom_overlap >= 0 && (size_t)bottom_overlap < bytes) {
|
|
||||||
unmap_memory(requested_addr, bottom_overlap);
|
|
||||||
size[i] = bytes - bottom_overlap;
|
|
||||||
} else {
|
|
||||||
size[i] = bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give back the unused reserved pieces.
|
|
||||||
|
|
||||||
for (int j = 0; j < i; ++j) {
|
|
||||||
if (base[j] != NULL) {
|
|
||||||
unmap_memory(base[j], size[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i < max_tries) {
|
|
||||||
return requested_addr;
|
|
||||||
} else {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
|
// Sleep forever; naked call to OS-specific sleep; use with CAUTION
|
||||||
void os::infinite_sleep() {
|
void os::infinite_sleep() {
|
||||||
|
@ -2553,17 +2553,6 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr, int f
|
|||||||
// available (and not reserved for something else).
|
// available (and not reserved for something else).
|
||||||
|
|
||||||
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
||||||
const int max_tries = 10;
|
|
||||||
char* base[max_tries];
|
|
||||||
size_t size[max_tries];
|
|
||||||
|
|
||||||
// Solaris adds a gap between mmap'ed regions. The size of the gap
|
|
||||||
// is dependent on the requested size and the MMU. Our initial gap
|
|
||||||
// value here is just a guess and will be corrected later.
|
|
||||||
bool had_top_overlap = false;
|
|
||||||
bool have_adjusted_gap = false;
|
|
||||||
size_t gap = 0x400000;
|
|
||||||
|
|
||||||
// Assert only that the size is a multiple of the page size, since
|
// Assert only that the size is a multiple of the page size, since
|
||||||
// that's all that mmap requires, and since that's all we really know
|
// that's all that mmap requires, and since that's all we really know
|
||||||
// about at this low abstraction level. If we need higher alignment,
|
// about at this low abstraction level. If we need higher alignment,
|
||||||
@ -2572,105 +2561,18 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
|||||||
assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
|
assert(bytes % os::vm_page_size() == 0, "reserving unexpected size block");
|
||||||
|
|
||||||
// Since snv_84, Solaris attempts to honor the address hint - see 5003415.
|
// Since snv_84, Solaris attempts to honor the address hint - see 5003415.
|
||||||
// Give it a try, if the kernel honors the hint we can return immediately.
|
|
||||||
char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
|
char* addr = Solaris::anon_mmap(requested_addr, bytes, 0, false);
|
||||||
|
|
||||||
volatile int err = errno;
|
volatile int err = errno;
|
||||||
if (addr == requested_addr) {
|
if (addr == requested_addr) {
|
||||||
return addr;
|
return addr;
|
||||||
} else if (addr != NULL) {
|
}
|
||||||
|
|
||||||
|
if (addr != NULL) {
|
||||||
pd_unmap_memory(addr, bytes);
|
pd_unmap_memory(addr, bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_is_enabled(Warning, os)) {
|
return NULL;
|
||||||
char buf[256];
|
|
||||||
buf[0] = '\0';
|
|
||||||
if (addr == NULL) {
|
|
||||||
jio_snprintf(buf, sizeof(buf), ": %s", os::strerror(err));
|
|
||||||
}
|
|
||||||
log_info(os)("attempt_reserve_memory_at: couldn't reserve " SIZE_FORMAT " bytes at "
|
|
||||||
PTR_FORMAT ": reserve_memory_helper returned " PTR_FORMAT
|
|
||||||
"%s", bytes, requested_addr, addr, buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Address hint method didn't work. Fall back to the old method.
|
|
||||||
// In theory, once SNV becomes our oldest supported platform, this
|
|
||||||
// code will no longer be needed.
|
|
||||||
//
|
|
||||||
// Repeatedly allocate blocks until the block is allocated at the
|
|
||||||
// right spot. Give up after max_tries.
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < max_tries; ++i) {
|
|
||||||
base[i] = reserve_memory(bytes);
|
|
||||||
|
|
||||||
if (base[i] != NULL) {
|
|
||||||
// Is this the block we wanted?
|
|
||||||
if (base[i] == requested_addr) {
|
|
||||||
size[i] = bytes;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// check that the gap value is right
|
|
||||||
if (had_top_overlap && !have_adjusted_gap) {
|
|
||||||
size_t actual_gap = base[i-1] - base[i] - bytes;
|
|
||||||
if (gap != actual_gap) {
|
|
||||||
// adjust the gap value and retry the last 2 allocations
|
|
||||||
assert(i > 0, "gap adjustment code problem");
|
|
||||||
have_adjusted_gap = true; // adjust the gap only once, just in case
|
|
||||||
gap = actual_gap;
|
|
||||||
log_info(os)("attempt_reserve_memory_at: adjusted gap to 0x%lx", gap);
|
|
||||||
unmap_memory(base[i], bytes);
|
|
||||||
unmap_memory(base[i-1], size[i-1]);
|
|
||||||
i-=2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Does this overlap the block we wanted? Give back the overlapped
|
|
||||||
// parts and try again.
|
|
||||||
//
|
|
||||||
// There is still a bug in this code: if top_overlap == bytes,
|
|
||||||
// the overlap is offset from requested region by the value of gap.
|
|
||||||
// In this case giving back the overlapped part will not work,
|
|
||||||
// because we'll give back the entire block at base[i] and
|
|
||||||
// therefore the subsequent allocation will not generate a new gap.
|
|
||||||
// This could be fixed with a new algorithm that used larger
|
|
||||||
// or variable size chunks to find the requested region -
|
|
||||||
// but such a change would introduce additional complications.
|
|
||||||
// It's rare enough that the planets align for this bug,
|
|
||||||
// so we'll just wait for a fix for 6204603/5003415 which
|
|
||||||
// will provide a mmap flag to allow us to avoid this business.
|
|
||||||
|
|
||||||
size_t top_overlap = requested_addr + (bytes + gap) - base[i];
|
|
||||||
if (top_overlap >= 0 && top_overlap < bytes) {
|
|
||||||
had_top_overlap = true;
|
|
||||||
unmap_memory(base[i], top_overlap);
|
|
||||||
base[i] += top_overlap;
|
|
||||||
size[i] = bytes - top_overlap;
|
|
||||||
} else {
|
|
||||||
size_t bottom_overlap = base[i] + bytes - requested_addr;
|
|
||||||
if (bottom_overlap >= 0 && bottom_overlap < bytes) {
|
|
||||||
if (bottom_overlap == 0) {
|
|
||||||
log_info(os)("attempt_reserve_memory_at: possible alignment bug");
|
|
||||||
}
|
|
||||||
unmap_memory(requested_addr, bottom_overlap);
|
|
||||||
size[i] = bytes - bottom_overlap;
|
|
||||||
} else {
|
|
||||||
size[i] = bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Give back the unused reserved pieces.
|
|
||||||
|
|
||||||
for (int j = 0; j < i; ++j) {
|
|
||||||
if (base[j] != NULL) {
|
|
||||||
unmap_memory(base[j], size[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (i < max_tries) ? requested_addr : NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool os::pd_release_memory(char* addr, size_t bytes) {
|
bool os::pd_release_memory(char* addr, size_t bytes) {
|
||||||
|
@ -40,7 +40,9 @@ struct Atomic::PlatformAdd
|
|||||||
{
|
{
|
||||||
template<typename I, typename D>
|
template<typename I, typename D>
|
||||||
D add_and_fetch(I add_value, D volatile* dest, atomic_memory_order order) const {
|
D add_and_fetch(I add_value, D volatile* dest, atomic_memory_order order) const {
|
||||||
return __sync_add_and_fetch(dest, add_value);
|
D res = __atomic_add_fetch(dest, add_value, __ATOMIC_RELEASE);
|
||||||
|
FULL_MEM_BARRIER;
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -159,7 +159,7 @@ bwd_copy_aligned:
|
|||||||
blo bwd_copy_drain
|
blo bwd_copy_drain
|
||||||
|
|
||||||
bwd_copy_again:
|
bwd_copy_again:
|
||||||
prfm pldl1keep, [s, #-256]
|
prfum pldl1keep, [s, #-256]
|
||||||
stp t0, t1, [d, #-16]
|
stp t0, t1, [d, #-16]
|
||||||
ldp t0, t1, [s, #-16]
|
ldp t0, t1, [s, #-16]
|
||||||
stp t2, t3, [d, #-32]
|
stp t2, t3, [d, #-32]
|
||||||
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "gc/z/zArguments.hpp"
|
||||||
|
#include "runtime/globals.hpp"
|
||||||
|
#include "runtime/globals_extension.hpp"
|
||||||
|
#include "utilities/debug.hpp"
|
||||||
|
|
||||||
|
void ZArguments::initialize_platform() {
|
||||||
|
// Disable class unloading - we don't support concurrent class unloading yet.
|
||||||
|
FLAG_SET_DEFAULT(ClassUnloading, false);
|
||||||
|
FLAG_SET_DEFAULT(ClassUnloadingWithConcurrentMark, false);
|
||||||
|
}
|
@ -0,0 +1,590 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "gc/z/zArray.inline.hpp"
|
||||||
|
#include "gc/z/zBackingFile_linux_aarch64.hpp"
|
||||||
|
#include "gc/z/zBackingPath_linux_aarch64.hpp"
|
||||||
|
#include "gc/z/zErrno.hpp"
|
||||||
|
#include "gc/z/zGlobals.hpp"
|
||||||
|
#include "gc/z/zLargePages.inline.hpp"
|
||||||
|
#include "logging/log.hpp"
|
||||||
|
#include "runtime/init.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
|
#include "utilities/align.hpp"
|
||||||
|
#include "utilities/debug.hpp"
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/statfs.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support for building on older Linux systems
|
||||||
|
//
|
||||||
|
|
||||||
|
// System calls
|
||||||
|
#ifndef SYS_fallocate
|
||||||
|
#define SYS_fallocate 47
|
||||||
|
#endif
|
||||||
|
#ifndef SYS_memfd_create
|
||||||
|
#define SYS_memfd_create 279
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// memfd_create(2) flags
|
||||||
|
#ifndef MFD_CLOEXEC
|
||||||
|
#define MFD_CLOEXEC 0x0001U
|
||||||
|
#endif
|
||||||
|
#ifndef MFD_HUGETLB
|
||||||
|
#define MFD_HUGETLB 0x0004U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// open(2) flags
|
||||||
|
#ifndef O_CLOEXEC
|
||||||
|
#define O_CLOEXEC 02000000
|
||||||
|
#endif
|
||||||
|
#ifndef O_TMPFILE
|
||||||
|
#define O_TMPFILE (020000000 | O_DIRECTORY)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// fallocate(2) flags
|
||||||
|
#ifndef FALLOC_FL_KEEP_SIZE
|
||||||
|
#define FALLOC_FL_KEEP_SIZE 0x01
|
||||||
|
#endif
|
||||||
|
#ifndef FALLOC_FL_PUNCH_HOLE
|
||||||
|
#define FALLOC_FL_PUNCH_HOLE 0x02
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Filesystem types, see statfs(2)
|
||||||
|
#ifndef TMPFS_MAGIC
|
||||||
|
#define TMPFS_MAGIC 0x01021994
|
||||||
|
#endif
|
||||||
|
#ifndef HUGETLBFS_MAGIC
|
||||||
|
#define HUGETLBFS_MAGIC 0x958458f6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Filesystem names
|
||||||
|
#define ZFILESYSTEM_TMPFS "tmpfs"
|
||||||
|
#define ZFILESYSTEM_HUGETLBFS "hugetlbfs"
|
||||||
|
|
||||||
|
// Sysfs file for transparent huge page on tmpfs
|
||||||
|
#define ZFILENAME_SHMEM_ENABLED "/sys/kernel/mm/transparent_hugepage/shmem_enabled"
|
||||||
|
|
||||||
|
// Java heap filename
|
||||||
|
#define ZFILENAME_HEAP "java_heap"
|
||||||
|
|
||||||
|
// Preferred tmpfs mount points, ordered by priority
|
||||||
|
static const char* z_preferred_tmpfs_mountpoints[] = {
|
||||||
|
"/dev/shm",
|
||||||
|
"/run/shm",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
// Preferred hugetlbfs mount points, ordered by priority
|
||||||
|
static const char* z_preferred_hugetlbfs_mountpoints[] = {
|
||||||
|
"/dev/hugepages",
|
||||||
|
"/hugepages",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int z_fallocate_hugetlbfs_attempts = 3;
|
||||||
|
static bool z_fallocate_supported = true;
|
||||||
|
|
||||||
|
static int z_fallocate(int fd, int mode, size_t offset, size_t length) {
|
||||||
|
return syscall(SYS_fallocate, fd, mode, offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int z_memfd_create(const char *name, unsigned int flags) {
|
||||||
|
return syscall(SYS_memfd_create, name, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZBackingFile::ZBackingFile() :
|
||||||
|
_fd(-1),
|
||||||
|
_size(0),
|
||||||
|
_filesystem(0),
|
||||||
|
_block_size(0),
|
||||||
|
_available(0),
|
||||||
|
_initialized(false) {
|
||||||
|
|
||||||
|
// Create backing file
|
||||||
|
_fd = create_fd(ZFILENAME_HEAP);
|
||||||
|
if (_fd == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get filesystem statistics
|
||||||
|
struct statfs buf;
|
||||||
|
if (fstatfs(_fd, &buf) == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to determine filesystem type for backing file (%s)", err.to_string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_filesystem = buf.f_type;
|
||||||
|
_block_size = buf.f_bsize;
|
||||||
|
_available = buf.f_bavail * _block_size;
|
||||||
|
|
||||||
|
// Make sure we're on a supported filesystem
|
||||||
|
if (!is_tmpfs() && !is_hugetlbfs()) {
|
||||||
|
log_error(gc)("Backing file must be located on a %s or a %s filesystem",
|
||||||
|
ZFILESYSTEM_TMPFS, ZFILESYSTEM_HUGETLBFS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure the filesystem type matches requested large page type
|
||||||
|
if (ZLargePages::is_transparent() && !is_tmpfs()) {
|
||||||
|
log_error(gc)("-XX:+UseTransparentHugePages can only be enable when using a %s filesystem",
|
||||||
|
ZFILESYSTEM_TMPFS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ZLargePages::is_transparent() && !tmpfs_supports_transparent_huge_pages()) {
|
||||||
|
log_error(gc)("-XX:+UseTransparentHugePages on a %s filesystem not supported by kernel",
|
||||||
|
ZFILESYSTEM_TMPFS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ZLargePages::is_explicit() && !is_hugetlbfs()) {
|
||||||
|
log_error(gc)("-XX:+UseLargePages (without -XX:+UseTransparentHugePages) can only be enabled "
|
||||||
|
"when using a %s filesystem", ZFILESYSTEM_HUGETLBFS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ZLargePages::is_explicit() && is_hugetlbfs()) {
|
||||||
|
log_error(gc)("-XX:+UseLargePages must be enabled when using a %s filesystem",
|
||||||
|
ZFILESYSTEM_HUGETLBFS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t expected_block_size = is_tmpfs() ? os::vm_page_size() : os::large_page_size();
|
||||||
|
if (expected_block_size != _block_size) {
|
||||||
|
log_error(gc)("%s filesystem has unexpected block size " SIZE_FORMAT " (expected " SIZE_FORMAT ")",
|
||||||
|
is_tmpfs() ? ZFILESYSTEM_TMPFS : ZFILESYSTEM_HUGETLBFS, _block_size, expected_block_size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Successfully initialized
|
||||||
|
_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZBackingFile::create_mem_fd(const char* name) const {
|
||||||
|
// Create file name
|
||||||
|
char filename[PATH_MAX];
|
||||||
|
snprintf(filename, sizeof(filename), "%s%s", name, ZLargePages::is_explicit() ? ".hugetlb" : "");
|
||||||
|
|
||||||
|
// Create file
|
||||||
|
const int extra_flags = ZLargePages::is_explicit() ? MFD_HUGETLB : 0;
|
||||||
|
const int fd = z_memfd_create(filename, MFD_CLOEXEC | extra_flags);
|
||||||
|
if (fd == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_debug(gc, init)("Failed to create memfd file (%s)",
|
||||||
|
((ZLargePages::is_explicit() && err == EINVAL) ? "Hugepages not supported" : err.to_string()));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info(gc, init)("Heap backed by file: /memfd:%s", filename);
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZBackingFile::create_file_fd(const char* name) const {
|
||||||
|
const char* const filesystem = ZLargePages::is_explicit()
|
||||||
|
? ZFILESYSTEM_HUGETLBFS
|
||||||
|
: ZFILESYSTEM_TMPFS;
|
||||||
|
const char** const preferred_mountpoints = ZLargePages::is_explicit()
|
||||||
|
? z_preferred_hugetlbfs_mountpoints
|
||||||
|
: z_preferred_tmpfs_mountpoints;
|
||||||
|
|
||||||
|
// Find mountpoint
|
||||||
|
ZBackingPath path(filesystem, preferred_mountpoints);
|
||||||
|
if (path.get() == NULL) {
|
||||||
|
log_error(gc)("Use -XX:ZPath to specify the path to a %s filesystem", filesystem);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to create an anonymous file using the O_TMPFILE flag. Note that this
|
||||||
|
// flag requires kernel >= 3.11. If this fails we fall back to open/unlink.
|
||||||
|
const int fd_anon = os::open(path.get(), O_TMPFILE|O_EXCL|O_RDWR|O_CLOEXEC, S_IRUSR|S_IWUSR);
|
||||||
|
if (fd_anon == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_debug(gc, init)("Failed to create anonymous file in %s (%s)", path.get(),
|
||||||
|
(err == EINVAL ? "Not supported" : err.to_string()));
|
||||||
|
} else {
|
||||||
|
// Get inode number for anonymous file
|
||||||
|
struct stat stat_buf;
|
||||||
|
if (fstat(fd_anon, &stat_buf) == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to determine inode number for anonymous file (%s)", err.to_string());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info(gc, init)("Heap backed by file: %s/#" UINT64_FORMAT, path.get(), (uint64_t)stat_buf.st_ino);
|
||||||
|
|
||||||
|
return fd_anon;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug(gc, init)("Falling back to open/unlink");
|
||||||
|
|
||||||
|
// Create file name
|
||||||
|
char filename[PATH_MAX];
|
||||||
|
snprintf(filename, sizeof(filename), "%s/%s.%d", path.get(), name, os::current_process_id());
|
||||||
|
|
||||||
|
// Create file
|
||||||
|
const int fd = os::open(filename, O_CREAT|O_EXCL|O_RDWR|O_CLOEXEC, S_IRUSR|S_IWUSR);
|
||||||
|
if (fd == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to create file %s (%s)", filename, err.to_string());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unlink file
|
||||||
|
if (unlink(filename) == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to unlink file %s (%s)", filename, err.to_string());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info(gc, init)("Heap backed by file: %s", filename);
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZBackingFile::create_fd(const char* name) const {
|
||||||
|
if (ZPath == NULL) {
|
||||||
|
// If the path is not explicitly specified, then we first try to create a memfd file
|
||||||
|
// instead of looking for a tmpfd/hugetlbfs mount point. Note that memfd_create() might
|
||||||
|
// not be supported at all (requires kernel >= 3.17), or it might not support large
|
||||||
|
// pages (requires kernel >= 4.14). If memfd_create() fails, then we try to create a
|
||||||
|
// file on an accessible tmpfs or hugetlbfs mount point.
|
||||||
|
const int fd = create_mem_fd(name);
|
||||||
|
if (fd != -1) {
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug(gc, init)("Falling back to searching for an accessible mount point");
|
||||||
|
}
|
||||||
|
|
||||||
|
return create_file_fd(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZBackingFile::is_initialized() const {
|
||||||
|
return _initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ZBackingFile::fd() const {
|
||||||
|
return _fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZBackingFile::size() const {
|
||||||
|
return _size;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZBackingFile::available() const {
|
||||||
|
return _available;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZBackingFile::is_tmpfs() const {
|
||||||
|
return _filesystem == TMPFS_MAGIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZBackingFile::is_hugetlbfs() const {
|
||||||
|
return _filesystem == HUGETLBFS_MAGIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZBackingFile::tmpfs_supports_transparent_huge_pages() const {
|
||||||
|
// If the shmem_enabled file exists and is readable then we
|
||||||
|
// know the kernel supports transparent huge pages for tmpfs.
|
||||||
|
return access(ZFILENAME_SHMEM_ENABLED, R_OK) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_compat_ftruncate(size_t size) const {
|
||||||
|
while (ftruncate(_fd, size) == -1) {
|
||||||
|
if (errno != EINTR) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_compat_mmap(size_t offset, size_t length, bool touch) const {
|
||||||
|
// On hugetlbfs, mapping a file segment will fail immediately, without
|
||||||
|
// the need to touch the mapped pages first, if there aren't enough huge
|
||||||
|
// pages available to back the mapping.
|
||||||
|
void* const addr = mmap(0, length, PROT_READ|PROT_WRITE, MAP_SHARED, _fd, offset);
|
||||||
|
if (addr == MAP_FAILED) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Once mapped, the huge pages are only reserved. We need to touch them
|
||||||
|
// to associate them with the file segment. Note that we can not punch
|
||||||
|
// hole in file segments which only have reserved pages.
|
||||||
|
if (touch) {
|
||||||
|
char* const start = (char*)addr;
|
||||||
|
char* const end = start + length;
|
||||||
|
os::pretouch_memory(start, end, _block_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmap again. From now on, the huge pages that were mapped are allocated
|
||||||
|
// to this file. There's no risk in getting SIGBUS when touching them.
|
||||||
|
if (munmap(addr, length) == -1) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_compat_pwrite(size_t offset, size_t length) const {
|
||||||
|
uint8_t data = 0;
|
||||||
|
|
||||||
|
// Allocate backing memory by writing to each block
|
||||||
|
for (size_t pos = offset; pos < offset + length; pos += _block_size) {
|
||||||
|
if (pwrite(_fd, &data, sizeof(data), pos) == -1) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_fill_hole_compat(size_t offset, size_t length) {
|
||||||
|
// fallocate(2) is only supported by tmpfs since Linux 3.5, and by hugetlbfs
|
||||||
|
// since Linux 4.3. When fallocate(2) is not supported we emulate it using
|
||||||
|
// ftruncate/pwrite (for tmpfs) or ftruncate/mmap/munmap (for hugetlbfs).
|
||||||
|
|
||||||
|
const size_t end = offset + length;
|
||||||
|
if (end > _size) {
|
||||||
|
// Increase file size
|
||||||
|
const ZErrno err = fallocate_compat_ftruncate(end);
|
||||||
|
if (err) {
|
||||||
|
// Failed
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allocate backing memory
|
||||||
|
const ZErrno err = is_hugetlbfs() ? fallocate_compat_mmap(offset, length, false /* touch */)
|
||||||
|
: fallocate_compat_pwrite(offset, length);
|
||||||
|
if (err) {
|
||||||
|
if (end > _size) {
|
||||||
|
// Restore file size
|
||||||
|
fallocate_compat_ftruncate(_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failed
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end > _size) {
|
||||||
|
// Record new file size
|
||||||
|
_size = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_fill_hole_syscall(size_t offset, size_t length) {
|
||||||
|
const int mode = 0; // Allocate
|
||||||
|
const int res = z_fallocate(_fd, mode, offset, length);
|
||||||
|
if (res == -1) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
const size_t end = offset + length;
|
||||||
|
if (end > _size) {
|
||||||
|
// Record new file size
|
||||||
|
_size = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_fill_hole(size_t offset, size_t length) {
|
||||||
|
// Using compat mode is more efficient when allocating space on hugetlbfs.
|
||||||
|
// Note that allocating huge pages this way will only reserve them, and not
|
||||||
|
// associate them with segments of the file. We must guarantee that we at
|
||||||
|
// some point touch these segments, otherwise we can not punch hole in them.
|
||||||
|
if (z_fallocate_supported && !is_hugetlbfs()) {
|
||||||
|
const ZErrno err = fallocate_fill_hole_syscall(offset, length);
|
||||||
|
if (!err) {
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err != ENOSYS && err != EOPNOTSUPP) {
|
||||||
|
// Failed
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not supported
|
||||||
|
log_debug(gc)("Falling back to fallocate() compatibility mode");
|
||||||
|
z_fallocate_supported = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fallocate_fill_hole_compat(offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate_punch_hole(size_t offset, size_t length) {
|
||||||
|
if (is_hugetlbfs()) {
|
||||||
|
// We can only punch hole in pages that have been touched. Non-touched
|
||||||
|
// pages are only reserved, and not associated with any specific file
|
||||||
|
// segment. We don't know which pages have been previously touched, so
|
||||||
|
// we always touch them here to guarantee that we can punch hole.
|
||||||
|
const ZErrno err = fallocate_compat_mmap(offset, length, true /* touch */);
|
||||||
|
if (err) {
|
||||||
|
// Failed
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const int mode = FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE;
|
||||||
|
if (z_fallocate(_fd, mode, offset, length) == -1) {
|
||||||
|
// Failed
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::split_and_fallocate(bool punch_hole, size_t offset, size_t length) {
|
||||||
|
// Try first half
|
||||||
|
const size_t offset0 = offset;
|
||||||
|
const size_t length0 = align_up(length / 2, _block_size);
|
||||||
|
const ZErrno err0 = fallocate(punch_hole, offset0, length0);
|
||||||
|
if (err0) {
|
||||||
|
return err0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try second half
|
||||||
|
const size_t offset1 = offset0 + length0;
|
||||||
|
const size_t length1 = length - length0;
|
||||||
|
const ZErrno err1 = fallocate(punch_hole, offset1, length1);
|
||||||
|
if (err1) {
|
||||||
|
return err1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZErrno ZBackingFile::fallocate(bool punch_hole, size_t offset, size_t length) {
|
||||||
|
assert(is_aligned(offset, _block_size), "Invalid offset");
|
||||||
|
assert(is_aligned(length, _block_size), "Invalid length");
|
||||||
|
|
||||||
|
const ZErrno err = punch_hole ? fallocate_punch_hole(offset, length) : fallocate_fill_hole(offset, length);
|
||||||
|
if (err == EINTR && length > _block_size) {
|
||||||
|
// Calling fallocate(2) with a large length can take a long time to
|
||||||
|
// complete. When running profilers, such as VTune, this syscall will
|
||||||
|
// be constantly interrupted by signals. Expanding the file in smaller
|
||||||
|
// steps avoids this problem.
|
||||||
|
return split_and_fallocate(punch_hole, offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZBackingFile::commit_inner(size_t offset, size_t length) {
|
||||||
|
log_trace(gc, heap)("Committing memory: " SIZE_FORMAT "M-" SIZE_FORMAT "M (" SIZE_FORMAT "M)",
|
||||||
|
offset / M, (offset + length) / M, length / M);
|
||||||
|
|
||||||
|
retry:
|
||||||
|
const ZErrno err = fallocate(false /* punch_hole */, offset, length);
|
||||||
|
if (err) {
|
||||||
|
if (err == ENOSPC && !is_init_completed() && is_hugetlbfs() && z_fallocate_hugetlbfs_attempts-- > 0) {
|
||||||
|
// If we fail to allocate during initialization, due to lack of space on
|
||||||
|
// the hugetlbfs filesystem, then we wait and retry a few times before
|
||||||
|
// giving up. Otherwise there is a risk that running JVMs back-to-back
|
||||||
|
// will fail, since there is a delay between process termination and the
|
||||||
|
// huge pages owned by that process being returned to the huge page pool
|
||||||
|
// and made available for new allocations.
|
||||||
|
log_debug(gc, init)("Failed to commit memory (%s), retrying", err.to_string());
|
||||||
|
|
||||||
|
// Wait and retry in one second, in the hope that huge pages will be
|
||||||
|
// available by then.
|
||||||
|
sleep(1);
|
||||||
|
goto retry;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failed
|
||||||
|
log_error(gc)("Failed to commit memory (%s)", err.to_string());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Success
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZBackingFile::commit(size_t offset, size_t length) {
|
||||||
|
// Try to commit the whole region
|
||||||
|
if (commit_inner(offset, length)) {
|
||||||
|
// Success
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Failed, try to commit as much as possible
|
||||||
|
size_t start = offset;
|
||||||
|
size_t end = offset + length;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
length = align_down((end - start) / 2, ZGranuleSize);
|
||||||
|
if (length < ZGranuleSize) {
|
||||||
|
// Done, don't commit more
|
||||||
|
return start - offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (commit_inner(start, length)) {
|
||||||
|
// Success, try commit more
|
||||||
|
start += length;
|
||||||
|
} else {
|
||||||
|
// Failed, try commit less
|
||||||
|
end -= length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZBackingFile::uncommit(size_t offset, size_t length) {
|
||||||
|
log_trace(gc, heap)("Uncommitting memory: " SIZE_FORMAT "M-" SIZE_FORMAT "M (" SIZE_FORMAT "M)",
|
||||||
|
offset / M, (offset + length) / M, length / M);
|
||||||
|
|
||||||
|
const ZErrno err = fallocate(true /* punch_hole */, offset, length);
|
||||||
|
if (err) {
|
||||||
|
log_error(gc)("Failed to uncommit memory (%s)", err.to_string());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGFILE_LINUX_AARCH64_HPP
|
||||||
|
#define OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGFILE_LINUX_AARCH64_HPP
|
||||||
|
|
||||||
|
#include "memory/allocation.hpp"
|
||||||
|
|
||||||
|
class ZErrno;
|
||||||
|
|
||||||
|
class ZBackingFile {
|
||||||
|
private:
|
||||||
|
int _fd;
|
||||||
|
size_t _size;
|
||||||
|
uint64_t _filesystem;
|
||||||
|
size_t _block_size;
|
||||||
|
size_t _available;
|
||||||
|
bool _initialized;
|
||||||
|
|
||||||
|
int create_mem_fd(const char* name) const;
|
||||||
|
int create_file_fd(const char* name) const;
|
||||||
|
int create_fd(const char* name) const;
|
||||||
|
|
||||||
|
bool is_tmpfs() const;
|
||||||
|
bool is_hugetlbfs() const;
|
||||||
|
bool tmpfs_supports_transparent_huge_pages() const;
|
||||||
|
|
||||||
|
ZErrno fallocate_compat_ftruncate(size_t size) const;
|
||||||
|
ZErrno fallocate_compat_mmap(size_t offset, size_t length, bool reserve_only) const;
|
||||||
|
ZErrno fallocate_compat_pwrite(size_t offset, size_t length) const;
|
||||||
|
ZErrno fallocate_fill_hole_compat(size_t offset, size_t length);
|
||||||
|
ZErrno fallocate_fill_hole_syscall(size_t offset, size_t length);
|
||||||
|
ZErrno fallocate_fill_hole(size_t offset, size_t length);
|
||||||
|
ZErrno fallocate_punch_hole(size_t offset, size_t length);
|
||||||
|
ZErrno split_and_fallocate(bool punch_hole, size_t offset, size_t length);
|
||||||
|
ZErrno fallocate(bool punch_hole, size_t offset, size_t length);
|
||||||
|
|
||||||
|
bool commit_inner(size_t offset, size_t length);
|
||||||
|
|
||||||
|
public:
|
||||||
|
ZBackingFile();
|
||||||
|
|
||||||
|
bool is_initialized() const;
|
||||||
|
|
||||||
|
int fd() const;
|
||||||
|
size_t size() const;
|
||||||
|
size_t available() const;
|
||||||
|
|
||||||
|
size_t commit(size_t offset, size_t length);
|
||||||
|
size_t uncommit(size_t offset, size_t length);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGFILE_LINUX_AARCH64_HPP
|
@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "gc/z/zArray.inline.hpp"
|
||||||
|
#include "zBackingPath_linux_aarch64.hpp"
|
||||||
|
#include "gc/z/zErrno.hpp"
|
||||||
|
#include "logging/log.hpp"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
// Mount information, see proc(5) for more details.
|
||||||
|
#define PROC_SELF_MOUNTINFO "/proc/self/mountinfo"
|
||||||
|
|
||||||
|
ZBackingPath::ZBackingPath(const char* filesystem, const char** preferred_mountpoints) {
|
||||||
|
if (ZPath != NULL) {
|
||||||
|
// Use specified path
|
||||||
|
_path = strdup(ZPath);
|
||||||
|
} else {
|
||||||
|
// Find suitable path
|
||||||
|
_path = find_mountpoint(filesystem, preferred_mountpoints);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZBackingPath::~ZBackingPath() {
|
||||||
|
free(_path);
|
||||||
|
_path = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* ZBackingPath::get_mountpoint(const char* line, const char* filesystem) const {
|
||||||
|
char* line_mountpoint = NULL;
|
||||||
|
char* line_filesystem = NULL;
|
||||||
|
|
||||||
|
// Parse line and return a newly allocated string containing the mount point if
|
||||||
|
// the line contains a matching filesystem and the mount point is accessible by
|
||||||
|
// the current user.
|
||||||
|
if (sscanf(line, "%*u %*u %*u:%*u %*s %ms %*[^-]- %ms", &line_mountpoint, &line_filesystem) != 2 ||
|
||||||
|
strcmp(line_filesystem, filesystem) != 0 ||
|
||||||
|
access(line_mountpoint, R_OK|W_OK|X_OK) != 0) {
|
||||||
|
// Not a matching or accessible filesystem
|
||||||
|
free(line_mountpoint);
|
||||||
|
line_mountpoint = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(line_filesystem);
|
||||||
|
|
||||||
|
return line_mountpoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZBackingPath::get_mountpoints(const char* filesystem, ZArray<char*>* mountpoints) const {
|
||||||
|
FILE* fd = fopen(PROC_SELF_MOUNTINFO, "r");
|
||||||
|
if (fd == NULL) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to open %s: %s", PROC_SELF_MOUNTINFO, err.to_string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* line = NULL;
|
||||||
|
size_t length = 0;
|
||||||
|
|
||||||
|
while (getline(&line, &length, fd) != -1) {
|
||||||
|
char* const mountpoint = get_mountpoint(line, filesystem);
|
||||||
|
if (mountpoint != NULL) {
|
||||||
|
mountpoints->add(mountpoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(line);
|
||||||
|
fclose(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZBackingPath::free_mountpoints(ZArray<char*>* mountpoints) const {
|
||||||
|
ZArrayIterator<char*> iter(mountpoints);
|
||||||
|
for (char* mountpoint; iter.next(&mountpoint);) {
|
||||||
|
free(mountpoint);
|
||||||
|
}
|
||||||
|
mountpoints->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
char* ZBackingPath::find_preferred_mountpoint(const char* filesystem,
|
||||||
|
ZArray<char*>* mountpoints,
|
||||||
|
const char** preferred_mountpoints) const {
|
||||||
|
// Find preferred mount point
|
||||||
|
ZArrayIterator<char*> iter1(mountpoints);
|
||||||
|
for (char* mountpoint; iter1.next(&mountpoint);) {
|
||||||
|
for (const char** preferred = preferred_mountpoints; *preferred != NULL; preferred++) {
|
||||||
|
if (!strcmp(mountpoint, *preferred)) {
|
||||||
|
// Preferred mount point found
|
||||||
|
return strdup(mountpoint);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Preferred mount point not found
|
||||||
|
log_error(gc)("More than one %s filesystem found:", filesystem);
|
||||||
|
ZArrayIterator<char*> iter2(mountpoints);
|
||||||
|
for (char* mountpoint; iter2.next(&mountpoint);) {
|
||||||
|
log_error(gc)(" %s", mountpoint);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* ZBackingPath::find_mountpoint(const char* filesystem, const char** preferred_mountpoints) const {
|
||||||
|
char* path = NULL;
|
||||||
|
ZArray<char*> mountpoints;
|
||||||
|
|
||||||
|
get_mountpoints(filesystem, &mountpoints);
|
||||||
|
|
||||||
|
if (mountpoints.size() == 0) {
|
||||||
|
// No mount point found
|
||||||
|
log_error(gc)("Failed to find an accessible %s filesystem", filesystem);
|
||||||
|
} else if (mountpoints.size() == 1) {
|
||||||
|
// One mount point found
|
||||||
|
path = strdup(mountpoints.at(0));
|
||||||
|
} else {
|
||||||
|
// More than one mount point found
|
||||||
|
path = find_preferred_mountpoint(filesystem, &mountpoints, preferred_mountpoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
free_mountpoints(&mountpoints);
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* ZBackingPath::get() const {
|
||||||
|
return _path;
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGPATH_LINUX_AARCH64_HPP
|
||||||
|
#define OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGPATH_LINUX_AARCH64_HPP
|
||||||
|
|
||||||
|
#include "gc/z/zArray.hpp"
|
||||||
|
#include "memory/allocation.hpp"
|
||||||
|
|
||||||
|
class ZBackingPath : public StackObj {
|
||||||
|
private:
|
||||||
|
char* _path;
|
||||||
|
|
||||||
|
char* get_mountpoint(const char* line,
|
||||||
|
const char* filesystem) const;
|
||||||
|
void get_mountpoints(const char* filesystem,
|
||||||
|
ZArray<char*>* mountpoints) const;
|
||||||
|
void free_mountpoints(ZArray<char*>* mountpoints) const;
|
||||||
|
char* find_preferred_mountpoint(const char* filesystem,
|
||||||
|
ZArray<char*>* mountpoints,
|
||||||
|
const char** preferred_mountpoints) const;
|
||||||
|
char* find_mountpoint(const char* filesystem,
|
||||||
|
const char** preferred_mountpoints) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ZBackingPath(const char* filesystem, const char** preferred_mountpoints);
|
||||||
|
~ZBackingPath();
|
||||||
|
|
||||||
|
const char* get() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OS_CPU_LINUX_AARCH64_GC_Z_ZBACKINGPATH_LINUX_AARCH64_HPP
|
173
src/hotspot/os_cpu/linux_aarch64/gc/z/zGlobals_linux_aarch64.cpp
Normal file
173
src/hotspot/os_cpu/linux_aarch64/gc/z/zGlobals_linux_aarch64.cpp
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "gc/z/zGlobals.hpp"
|
||||||
|
#include "gc/z/zUtils.inline.hpp"
|
||||||
|
#include "runtime/globals.hpp"
|
||||||
|
#include "utilities/globalDefinitions.hpp"
|
||||||
|
|
||||||
|
//
|
||||||
|
// The heap can have three different layouts, depending on the max heap size.
|
||||||
|
//
|
||||||
|
// Address Space & Pointer Layout 1
|
||||||
|
// --------------------------------
|
||||||
|
//
|
||||||
|
// +--------------------------------+ 0x00007FFFFFFFFFFF (127TB)
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000014000000000 (20TB)
|
||||||
|
// | Remapped View |
|
||||||
|
// +--------------------------------+ 0x0000010000000000 (16TB)
|
||||||
|
// | (Reserved, but unused) |
|
||||||
|
// +--------------------------------+ 0x00000c0000000000 (12TB)
|
||||||
|
// | Marked1 View |
|
||||||
|
// +--------------------------------+ 0x0000080000000000 (8TB)
|
||||||
|
// | Marked0 View |
|
||||||
|
// +--------------------------------+ 0x0000040000000000 (4TB)
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000000000000000
|
||||||
|
//
|
||||||
|
// 6 4 4 4 4
|
||||||
|
// 3 6 5 2 1 0
|
||||||
|
// +--------------------+----+-----------------------------------------------+
|
||||||
|
// |00000000 00000000 00|1111|11 11111111 11111111 11111111 11111111 11111111|
|
||||||
|
// +--------------------+----+-----------------------------------------------+
|
||||||
|
// | | |
|
||||||
|
// | | * 41-0 Object Offset (42-bits, 4TB address space)
|
||||||
|
// | |
|
||||||
|
// | * 45-42 Metadata Bits (4-bits) 0001 = Marked0 (Address view 4-8TB)
|
||||||
|
// | 0010 = Marked1 (Address view 8-12TB)
|
||||||
|
// | 0100 = Remapped (Address view 16-20TB)
|
||||||
|
// | 1000 = Finalizable (Address view N/A)
|
||||||
|
// |
|
||||||
|
// * 63-46 Fixed (18-bits, always zero)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Address Space & Pointer Layout 2
|
||||||
|
// --------------------------------
|
||||||
|
//
|
||||||
|
// +--------------------------------+ 0x00007FFFFFFFFFFF (127TB)
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000280000000000 (40TB)
|
||||||
|
// | Remapped View |
|
||||||
|
// +--------------------------------+ 0x0000200000000000 (32TB)
|
||||||
|
// | (Reserved, but unused) |
|
||||||
|
// +--------------------------------+ 0x0000180000000000 (24TB)
|
||||||
|
// | Marked1 View |
|
||||||
|
// +--------------------------------+ 0x0000100000000000 (16TB)
|
||||||
|
// | Marked0 View |
|
||||||
|
// +--------------------------------+ 0x0000080000000000 (8TB)
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000000000000000
|
||||||
|
//
|
||||||
|
// 6 4 4 4 4
|
||||||
|
// 3 7 6 3 2 0
|
||||||
|
// +------------------+-----+------------------------------------------------+
|
||||||
|
// |00000000 00000000 0|1111|111 11111111 11111111 11111111 11111111 11111111|
|
||||||
|
// +-------------------+----+------------------------------------------------+
|
||||||
|
// | | |
|
||||||
|
// | | * 42-0 Object Offset (43-bits, 8TB address space)
|
||||||
|
// | |
|
||||||
|
// | * 46-43 Metadata Bits (4-bits) 0001 = Marked0 (Address view 8-16TB)
|
||||||
|
// | 0010 = Marked1 (Address view 16-24TB)
|
||||||
|
// | 0100 = Remapped (Address view 32-40TB)
|
||||||
|
// | 1000 = Finalizable (Address view N/A)
|
||||||
|
// |
|
||||||
|
// * 63-47 Fixed (17-bits, always zero)
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Address Space & Pointer Layout 3
|
||||||
|
// --------------------------------
|
||||||
|
//
|
||||||
|
// +--------------------------------+ 0x00007FFFFFFFFFFF (127TB)
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000500000000000 (80TB)
|
||||||
|
// | Remapped View |
|
||||||
|
// +--------------------------------+ 0x0000400000000000 (64TB)
|
||||||
|
// | (Reserved, but unused) |
|
||||||
|
// +--------------------------------+ 0x0000300000000000 (48TB)
|
||||||
|
// | Marked1 View |
|
||||||
|
// +--------------------------------+ 0x0000200000000000 (32TB)
|
||||||
|
// | Marked0 View |
|
||||||
|
// +--------------------------------+ 0x0000100000000000 (16TB)
|
||||||
|
// . .
|
||||||
|
// +--------------------------------+ 0x0000000000000000
|
||||||
|
//
|
||||||
|
// 6 4 4 4 4
|
||||||
|
// 3 8 7 4 3 0
|
||||||
|
// +------------------+----+-------------------------------------------------+
|
||||||
|
// |00000000 00000000 |1111|1111 11111111 11111111 11111111 11111111 11111111|
|
||||||
|
// +------------------+----+-------------------------------------------------+
|
||||||
|
// | | |
|
||||||
|
// | | * 43-0 Object Offset (44-bits, 16TB address space)
|
||||||
|
// | |
|
||||||
|
// | * 47-44 Metadata Bits (4-bits) 0001 = Marked0 (Address view 16-32TB)
|
||||||
|
// | 0010 = Marked1 (Address view 32-48TB)
|
||||||
|
// | 0100 = Remapped (Address view 64-80TB)
|
||||||
|
// | 1000 = Finalizable (Address view N/A)
|
||||||
|
// |
|
||||||
|
// * 63-48 Fixed (16-bits, always zero)
|
||||||
|
//
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressSpaceStart() {
|
||||||
|
const uintptr_t first_heap_view_address = (uintptr_t)1 << (ZPlatformAddressMetadataShift() + 0);
|
||||||
|
const size_t min_address_offset = 0;
|
||||||
|
return first_heap_view_address + min_address_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressSpaceEnd() {
|
||||||
|
const uintptr_t last_heap_view_address = (uintptr_t)1 << (ZPlatformAddressMetadataShift() + 2);
|
||||||
|
const size_t max_address_offset = (size_t)1 << ZPlatformAddressOffsetBits();
|
||||||
|
return last_heap_view_address + max_address_offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressReservedStart() {
|
||||||
|
return ZPlatformAddressSpaceStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressReservedEnd() {
|
||||||
|
return ZPlatformAddressSpaceEnd();
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressBase() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZPlatformAddressOffsetBits() {
|
||||||
|
const size_t min_address_offset_bits = 42; // 4TB
|
||||||
|
const size_t max_address_offset_bits = 44; // 16TB
|
||||||
|
const size_t virtual_to_physical_ratio = 7; // 7:1
|
||||||
|
const size_t address_offset = ZUtils::round_up_power_of_2(MaxHeapSize * virtual_to_physical_ratio);
|
||||||
|
const size_t address_offset_bits = log2_intptr(address_offset);
|
||||||
|
return MIN2(MAX2(address_offset_bits, min_address_offset_bits), max_address_offset_bits);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZPlatformAddressMetadataShift() {
|
||||||
|
return ZPlatformAddressOffsetBits();
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_CPU_LINUX_AARCH64_GC_Z_ZGLOBALS_LINUX_AARCH64_HPP
|
||||||
|
#define OS_CPU_LINUX_AARCH64_GC_Z_ZGLOBALS_LINUX_AARCH64_HPP
|
||||||
|
|
||||||
|
//
|
||||||
|
// Page Allocation Tiers
|
||||||
|
// ---------------------
|
||||||
|
//
|
||||||
|
// Page Type Page Size Object Size Limit Object Alignment
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Small 2M <= 265K <MinObjAlignmentInBytes>
|
||||||
|
// Medium 32M <= 4M 4K
|
||||||
|
// Large X*M > 4M 2M
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
const size_t ZPlatformGranuleSizeShift = 21; // 2MB
|
||||||
|
const size_t ZPlatformMaxHeapSizeShift = 46; // 16TB
|
||||||
|
const size_t ZPlatformNMethodDisarmedOffset = 4;
|
||||||
|
const size_t ZPlatformCacheLineSize = 64;
|
||||||
|
|
||||||
|
uintptr_t ZPlatformAddressSpaceStart();
|
||||||
|
uintptr_t ZPlatformAddressSpaceEnd();
|
||||||
|
uintptr_t ZPlatformAddressReservedStart();
|
||||||
|
uintptr_t ZPlatformAddressReservedEnd();
|
||||||
|
uintptr_t ZPlatformAddressBase();
|
||||||
|
size_t ZPlatformAddressOffsetBits();
|
||||||
|
size_t ZPlatformAddressMetadataShift();
|
||||||
|
|
||||||
|
#endif // OS_CPU_LINUX_AARCH64_GC_Z_ZGLOBALS_LINUX_AARCH64_HPP
|
@ -0,0 +1,333 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "precompiled.hpp"
|
||||||
|
#include "gc/z/zAddress.inline.hpp"
|
||||||
|
#include "gc/z/zBackingFile_linux_aarch64.hpp"
|
||||||
|
#include "gc/z/zErrno.hpp"
|
||||||
|
#include "gc/z/zGlobals.hpp"
|
||||||
|
#include "gc/z/zLargePages.inline.hpp"
|
||||||
|
#include "gc/z/zMemory.hpp"
|
||||||
|
#include "gc/z/zNUMA.hpp"
|
||||||
|
#include "gc/z/zPhysicalMemory.inline.hpp"
|
||||||
|
#include "gc/z/zPhysicalMemoryBacking_linux_aarch64.hpp"
|
||||||
|
#include "logging/log.hpp"
|
||||||
|
#include "runtime/init.hpp"
|
||||||
|
#include "runtime/os.hpp"
|
||||||
|
#include "utilities/align.hpp"
|
||||||
|
#include "utilities/debug.hpp"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
//
|
||||||
|
// Support for building on older Linux systems
|
||||||
|
//
|
||||||
|
|
||||||
|
// madvise(2) flags
|
||||||
|
#ifndef MADV_HUGEPAGE
|
||||||
|
#define MADV_HUGEPAGE 14
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Proc file entry for max map mount
|
||||||
|
#define ZFILENAME_PROC_MAX_MAP_COUNT "/proc/sys/vm/max_map_count"
|
||||||
|
|
||||||
|
bool ZPhysicalMemoryBacking::is_initialized() const {
|
||||||
|
return _file.is_initialized();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::warn_available_space(size_t max) const {
|
||||||
|
// Note that the available space on a tmpfs or a hugetlbfs filesystem
|
||||||
|
// will be zero if no size limit was specified when it was mounted.
|
||||||
|
const size_t available = _file.available();
|
||||||
|
if (available == 0) {
|
||||||
|
// No size limit set, skip check
|
||||||
|
log_info(gc, init)("Available space on backing filesystem: N/A");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info(gc, init)("Available space on backing filesystem: " SIZE_FORMAT "M", available / M);
|
||||||
|
|
||||||
|
// Warn if the filesystem doesn't currently have enough space available to hold
|
||||||
|
// the max heap size. The max heap size will be capped if we later hit this limit
|
||||||
|
// when trying to expand the heap.
|
||||||
|
if (available < max) {
|
||||||
|
log_warning(gc)("***** WARNING! INCORRECT SYSTEM CONFIGURATION DETECTED! *****");
|
||||||
|
log_warning(gc)("Not enough space available on the backing filesystem to hold the current max Java heap");
|
||||||
|
log_warning(gc)("size (" SIZE_FORMAT "M). Please adjust the size of the backing filesystem accordingly "
|
||||||
|
"(available", max / M);
|
||||||
|
log_warning(gc)("space is currently " SIZE_FORMAT "M). Continuing execution with the current filesystem "
|
||||||
|
"size could", available / M);
|
||||||
|
log_warning(gc)("lead to a premature OutOfMemoryError being thrown, due to failure to map memory.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::warn_max_map_count(size_t max) const {
|
||||||
|
const char* const filename = ZFILENAME_PROC_MAX_MAP_COUNT;
|
||||||
|
FILE* const file = fopen(filename, "r");
|
||||||
|
if (file == NULL) {
|
||||||
|
// Failed to open file, skip check
|
||||||
|
log_debug(gc, init)("Failed to open %s", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t actual_max_map_count = 0;
|
||||||
|
const int result = fscanf(file, SIZE_FORMAT, &actual_max_map_count);
|
||||||
|
fclose(file);
|
||||||
|
if (result != 1) {
|
||||||
|
// Failed to read file, skip check
|
||||||
|
log_debug(gc, init)("Failed to read %s", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The required max map count is impossible to calculate exactly since subsystems
|
||||||
|
// other than ZGC are also creating memory mappings, and we have no control over that.
|
||||||
|
// However, ZGC tends to create the most mappings and dominate the total count.
|
||||||
|
// In the worst cases, ZGC will map each granule three times, i.e. once per heap view.
|
||||||
|
// We speculate that we need another 20% to allow for non-ZGC subsystems to map memory.
|
||||||
|
const size_t required_max_map_count = (max / ZGranuleSize) * 3 * 1.2;
|
||||||
|
if (actual_max_map_count < required_max_map_count) {
|
||||||
|
log_warning(gc)("***** WARNING! INCORRECT SYSTEM CONFIGURATION DETECTED! *****");
|
||||||
|
log_warning(gc)("The system limit on number of memory mappings per process might be too low for the given");
|
||||||
|
log_warning(gc)("max Java heap size (" SIZE_FORMAT "M). Please adjust %s to allow for at",
|
||||||
|
max / M, filename);
|
||||||
|
log_warning(gc)("least " SIZE_FORMAT " mappings (current limit is " SIZE_FORMAT "). Continuing execution "
|
||||||
|
"with the current", required_max_map_count, actual_max_map_count);
|
||||||
|
log_warning(gc)("limit could lead to a fatal error, due to failure to map memory.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::warn_commit_limits(size_t max) const {
|
||||||
|
// Warn if available space is too low
|
||||||
|
warn_available_space(max);
|
||||||
|
|
||||||
|
// Warn if max map count is too low
|
||||||
|
warn_max_map_count(max);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ZPhysicalMemoryBacking::supports_uncommit() {
|
||||||
|
assert(!is_init_completed(), "Invalid state");
|
||||||
|
assert(_file.size() >= ZGranuleSize, "Invalid size");
|
||||||
|
|
||||||
|
// Test if uncommit is supported by uncommitting and then re-committing a granule
|
||||||
|
return commit(uncommit(ZGranuleSize)) == ZGranuleSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZPhysicalMemoryBacking::commit(size_t size) {
|
||||||
|
size_t committed = 0;
|
||||||
|
|
||||||
|
// Fill holes in the backing file
|
||||||
|
while (committed < size) {
|
||||||
|
size_t allocated = 0;
|
||||||
|
const size_t remaining = size - committed;
|
||||||
|
const uintptr_t start = _uncommitted.alloc_from_front_at_most(remaining, &allocated);
|
||||||
|
if (start == UINTPTR_MAX) {
|
||||||
|
// No holes to commit
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try commit hole
|
||||||
|
const size_t filled = _file.commit(start, allocated);
|
||||||
|
if (filled > 0) {
|
||||||
|
// Successful or partialy successful
|
||||||
|
_committed.free(start, filled);
|
||||||
|
committed += filled;
|
||||||
|
}
|
||||||
|
if (filled < allocated) {
|
||||||
|
// Failed or partialy failed
|
||||||
|
_uncommitted.free(start + filled, allocated - filled);
|
||||||
|
return committed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expand backing file
|
||||||
|
if (committed < size) {
|
||||||
|
const size_t remaining = size - committed;
|
||||||
|
const uintptr_t start = _file.size();
|
||||||
|
const size_t expanded = _file.commit(start, remaining);
|
||||||
|
if (expanded > 0) {
|
||||||
|
// Successful or partialy successful
|
||||||
|
_committed.free(start, expanded);
|
||||||
|
committed += expanded;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return committed;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ZPhysicalMemoryBacking::uncommit(size_t size) {
|
||||||
|
size_t uncommitted = 0;
|
||||||
|
|
||||||
|
// Punch holes in backing file
|
||||||
|
while (uncommitted < size) {
|
||||||
|
size_t allocated = 0;
|
||||||
|
const size_t remaining = size - uncommitted;
|
||||||
|
const uintptr_t start = _committed.alloc_from_back_at_most(remaining, &allocated);
|
||||||
|
assert(start != UINTPTR_MAX, "Allocation should never fail");
|
||||||
|
|
||||||
|
// Try punch hole
|
||||||
|
const size_t punched = _file.uncommit(start, allocated);
|
||||||
|
if (punched > 0) {
|
||||||
|
// Successful or partialy successful
|
||||||
|
_uncommitted.free(start, punched);
|
||||||
|
uncommitted += punched;
|
||||||
|
}
|
||||||
|
if (punched < allocated) {
|
||||||
|
// Failed or partialy failed
|
||||||
|
_committed.free(start + punched, allocated - punched);
|
||||||
|
return uncommitted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return uncommitted;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZPhysicalMemory ZPhysicalMemoryBacking::alloc(size_t size) {
|
||||||
|
assert(is_aligned(size, ZGranuleSize), "Invalid size");
|
||||||
|
|
||||||
|
ZPhysicalMemory pmem;
|
||||||
|
|
||||||
|
// Allocate segments
|
||||||
|
for (size_t allocated = 0; allocated < size; allocated += ZGranuleSize) {
|
||||||
|
const uintptr_t start = _committed.alloc_from_front(ZGranuleSize);
|
||||||
|
assert(start != UINTPTR_MAX, "Allocation should never fail");
|
||||||
|
pmem.add_segment(ZPhysicalMemorySegment(start, ZGranuleSize));
|
||||||
|
}
|
||||||
|
|
||||||
|
return pmem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::free(const ZPhysicalMemory& pmem) {
|
||||||
|
const size_t nsegments = pmem.nsegments();
|
||||||
|
|
||||||
|
// Free segments
|
||||||
|
for (size_t i = 0; i < nsegments; i++) {
|
||||||
|
const ZPhysicalMemorySegment& segment = pmem.segment(i);
|
||||||
|
_committed.free(segment.start(), segment.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::map_failed(ZErrno err) const {
|
||||||
|
if (err == ENOMEM) {
|
||||||
|
fatal("Failed to map memory. Please check the system limit on number of "
|
||||||
|
"memory mappings allowed per process (see %s)", ZFILENAME_PROC_MAX_MAP_COUNT);
|
||||||
|
} else {
|
||||||
|
fatal("Failed to map memory (%s)", err.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::advise_view(uintptr_t addr, size_t size, int advice) const {
|
||||||
|
if (madvise((void*)addr, size, advice) == -1) {
|
||||||
|
ZErrno err;
|
||||||
|
log_error(gc)("Failed to advise on memory (advice %d, %s)", advice, err.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::pretouch_view(uintptr_t addr, size_t size) const {
|
||||||
|
const size_t page_size = ZLargePages::is_explicit() ? os::large_page_size() : os::vm_page_size();
|
||||||
|
os::pretouch_memory((void*)addr, (void*)(addr + size), page_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::map_view(const ZPhysicalMemory& pmem, uintptr_t addr, bool pretouch) const {
|
||||||
|
const size_t nsegments = pmem.nsegments();
|
||||||
|
size_t size = 0;
|
||||||
|
|
||||||
|
// Map segments
|
||||||
|
for (size_t i = 0; i < nsegments; i++) {
|
||||||
|
const ZPhysicalMemorySegment& segment = pmem.segment(i);
|
||||||
|
const uintptr_t segment_addr = addr + size;
|
||||||
|
const void* const res = mmap((void*)segment_addr, segment.size(), PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, _file.fd(), segment.start());
|
||||||
|
if (res == MAP_FAILED) {
|
||||||
|
ZErrno err;
|
||||||
|
map_failed(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
size += segment.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Advise on use of transparent huge pages before touching it
|
||||||
|
if (ZLargePages::is_transparent()) {
|
||||||
|
advise_view(addr, size, MADV_HUGEPAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// NUMA interleave memory before touching it
|
||||||
|
ZNUMA::memory_interleave(addr, size);
|
||||||
|
|
||||||
|
// Pre-touch memory
|
||||||
|
if (pretouch) {
|
||||||
|
pretouch_view(addr, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::unmap_view(const ZPhysicalMemory& pmem, uintptr_t addr) const {
|
||||||
|
// Note that we must keep the address space reservation intact and just detach
|
||||||
|
// the backing memory. For this reason we map a new anonymous, non-accessible
|
||||||
|
// and non-reserved page over the mapping instead of actually unmapping.
|
||||||
|
const void* const res = mmap((void*)addr, pmem.size(), PROT_NONE, MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE|MAP_NORESERVE, -1, 0);
|
||||||
|
if (res == MAP_FAILED) {
|
||||||
|
ZErrno err;
|
||||||
|
map_failed(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uintptr_t ZPhysicalMemoryBacking::nmt_address(uintptr_t offset) const {
|
||||||
|
// From an NMT point of view we treat the first heap view (marked0) as committed
|
||||||
|
return ZAddress::marked0(offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::map(const ZPhysicalMemory& pmem, uintptr_t offset) const {
|
||||||
|
if (ZVerifyViews) {
|
||||||
|
// Map good view
|
||||||
|
map_view(pmem, ZAddress::good(offset), AlwaysPreTouch);
|
||||||
|
} else {
|
||||||
|
// Map all views
|
||||||
|
map_view(pmem, ZAddress::marked0(offset), AlwaysPreTouch);
|
||||||
|
map_view(pmem, ZAddress::marked1(offset), AlwaysPreTouch);
|
||||||
|
map_view(pmem, ZAddress::remapped(offset), AlwaysPreTouch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const {
|
||||||
|
if (ZVerifyViews) {
|
||||||
|
// Unmap good view
|
||||||
|
unmap_view(pmem, ZAddress::good(offset));
|
||||||
|
} else {
|
||||||
|
// Unmap all views
|
||||||
|
unmap_view(pmem, ZAddress::marked0(offset));
|
||||||
|
unmap_view(pmem, ZAddress::marked1(offset));
|
||||||
|
unmap_view(pmem, ZAddress::remapped(offset));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::debug_map(const ZPhysicalMemory& pmem, uintptr_t offset) const {
|
||||||
|
// Map good view
|
||||||
|
assert(ZVerifyViews, "Should be enabled");
|
||||||
|
map_view(pmem, ZAddress::good(offset), false /* pretouch */);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ZPhysicalMemoryBacking::debug_unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const {
|
||||||
|
// Unmap good view
|
||||||
|
assert(ZVerifyViews, "Should be enabled");
|
||||||
|
unmap_view(pmem, ZAddress::good(offset));
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OS_CPU_LINUX_AARCH64_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_AARCH64_HPP
|
||||||
|
#define OS_CPU_LINUX_AARCH64_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_AARCH64_HPP
|
||||||
|
|
||||||
|
#include "gc/z/zBackingFile_linux_aarch64.hpp"
|
||||||
|
#include "gc/z/zMemory.hpp"
|
||||||
|
|
||||||
|
class ZErrno;
|
||||||
|
class ZPhysicalMemory;
|
||||||
|
|
||||||
|
class ZPhysicalMemoryBacking {
|
||||||
|
private:
|
||||||
|
ZBackingFile _file;
|
||||||
|
ZMemoryManager _committed;
|
||||||
|
ZMemoryManager _uncommitted;
|
||||||
|
|
||||||
|
void warn_available_space(size_t max) const;
|
||||||
|
void warn_max_map_count(size_t max) const;
|
||||||
|
|
||||||
|
void map_failed(ZErrno err) const;
|
||||||
|
|
||||||
|
void advise_view(uintptr_t addr, size_t size, int advice) const;
|
||||||
|
void pretouch_view(uintptr_t addr, size_t size) const;
|
||||||
|
void map_view(const ZPhysicalMemory& pmem, uintptr_t addr, bool pretouch) const;
|
||||||
|
void unmap_view(const ZPhysicalMemory& pmem, uintptr_t addr) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool is_initialized() const;
|
||||||
|
|
||||||
|
void warn_commit_limits(size_t max) const;
|
||||||
|
bool supports_uncommit();
|
||||||
|
|
||||||
|
size_t commit(size_t size);
|
||||||
|
size_t uncommit(size_t size);
|
||||||
|
|
||||||
|
ZPhysicalMemory alloc(size_t size);
|
||||||
|
void free(const ZPhysicalMemory& pmem);
|
||||||
|
|
||||||
|
uintptr_t nmt_address(uintptr_t offset) const;
|
||||||
|
|
||||||
|
void map(const ZPhysicalMemory& pmem, uintptr_t offset) const;
|
||||||
|
void unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const;
|
||||||
|
|
||||||
|
void debug_map(const ZPhysicalMemory& pmem, uintptr_t offset) const;
|
||||||
|
void debug_unmap(const ZPhysicalMemory& pmem, uintptr_t offset) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // OS_CPU_LINUX_AARCH64_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_AARCH64_HPP
|
@ -83,19 +83,13 @@
|
|||||||
#define REG_SP REG_RSP
|
#define REG_SP REG_RSP
|
||||||
#define REG_PC REG_RIP
|
#define REG_PC REG_RIP
|
||||||
#define REG_FP REG_RBP
|
#define REG_FP REG_RBP
|
||||||
#define SPELL_REG_SP "rsp"
|
|
||||||
#define SPELL_REG_FP "rbp"
|
|
||||||
#else
|
#else
|
||||||
#define REG_FP 29
|
#define REG_FP 29
|
||||||
#define REG_LR 30
|
#define REG_LR 30
|
||||||
|
|
||||||
#define SPELL_REG_SP "sp"
|
|
||||||
#define SPELL_REG_FP "x29"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
address os::current_stack_pointer() {
|
NOINLINE address os::current_stack_pointer() {
|
||||||
register void *esp __asm__ (SPELL_REG_SP);
|
return (address)__builtin_frame_address(0);
|
||||||
return (address) esp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* os::non_memory_address_word() {
|
char* os::non_memory_address_word() {
|
||||||
@ -230,23 +224,8 @@ frame os::get_sender_for_C_frame(frame* fr) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
intptr_t* _get_previous_fp() {
|
NOINLINE frame os::current_frame() {
|
||||||
register intptr_t **fp __asm__ (SPELL_REG_FP);
|
intptr_t *fp = *(intptr_t **)__builtin_frame_address(0);
|
||||||
|
|
||||||
// fp is for this frame (_get_previous_fp). We want the fp for the
|
|
||||||
// caller of os::current_frame*(), so go up two frames. However, for
|
|
||||||
// optimized builds, _get_previous_fp() will be inlined, so only go
|
|
||||||
// up 1 frame in that case.
|
|
||||||
#ifdef _NMT_NOINLINE_
|
|
||||||
return **(intptr_t***)fp;
|
|
||||||
#else
|
|
||||||
return *fp;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
frame os::current_frame() {
|
|
||||||
intptr_t* fp = _get_previous_fp();
|
|
||||||
frame myframe((intptr_t*)os::current_stack_pointer(),
|
frame myframe((intptr_t*)os::current_stack_pointer(),
|
||||||
(intptr_t*)fp,
|
(intptr_t*)fp,
|
||||||
CAST_FROM_FN_PTR(address, os::current_frame));
|
CAST_FROM_FN_PTR(address, os::current_frame));
|
||||||
@ -259,12 +238,6 @@ frame os::current_frame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Utility functions
|
// Utility functions
|
||||||
|
|
||||||
// From IA32 System Programming Guide
|
|
||||||
enum {
|
|
||||||
trap_page_fault = 0xE
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef BUILTIN_SIM
|
#ifdef BUILTIN_SIM
|
||||||
extern "C" void Fetch32PFI () ;
|
extern "C" void Fetch32PFI () ;
|
||||||
extern "C" void Fetch32Resume () ;
|
extern "C" void Fetch32Resume () ;
|
||||||
@ -667,42 +640,42 @@ extern "C" {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
void _Copy_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {
|
||||||
if (from > to) {
|
if (from > to) {
|
||||||
jshort *end = from + count;
|
const jshort *end = from + count;
|
||||||
while (from < end)
|
while (from < end)
|
||||||
*(to++) = *(from++);
|
*(to++) = *(from++);
|
||||||
}
|
}
|
||||||
else if (from < to) {
|
else if (from < to) {
|
||||||
jshort *end = from;
|
const jshort *end = from;
|
||||||
from += count - 1;
|
from += count - 1;
|
||||||
to += count - 1;
|
to += count - 1;
|
||||||
while (from >= end)
|
while (from >= end)
|
||||||
*(to--) = *(from--);
|
*(to--) = *(from--);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void _Copy_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
|
void _Copy_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {
|
||||||
if (from > to) {
|
if (from > to) {
|
||||||
jint *end = from + count;
|
const jint *end = from + count;
|
||||||
while (from < end)
|
while (from < end)
|
||||||
*(to++) = *(from++);
|
*(to++) = *(from++);
|
||||||
}
|
}
|
||||||
else if (from < to) {
|
else if (from < to) {
|
||||||
jint *end = from;
|
const jint *end = from;
|
||||||
from += count - 1;
|
from += count - 1;
|
||||||
to += count - 1;
|
to += count - 1;
|
||||||
while (from >= end)
|
while (from >= end)
|
||||||
*(to--) = *(from--);
|
*(to--) = *(from--);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void _Copy_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
|
void _Copy_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {
|
||||||
if (from > to) {
|
if (from > to) {
|
||||||
jlong *end = from + count;
|
const jlong *end = from + count;
|
||||||
while (from < end)
|
while (from < end)
|
||||||
os::atomic_copy64(from++, to++);
|
os::atomic_copy64(from++, to++);
|
||||||
}
|
}
|
||||||
else if (from < to) {
|
else if (from < to) {
|
||||||
jlong *end = from;
|
const jlong *end = from;
|
||||||
from += count - 1;
|
from += count - 1;
|
||||||
to += count - 1;
|
to += count - 1;
|
||||||
while (from >= end)
|
while (from >= end)
|
||||||
@ -710,22 +683,22 @@ extern "C" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _Copy_arrayof_conjoint_bytes(HeapWord* from,
|
void _Copy_arrayof_conjoint_bytes(const HeapWord* from,
|
||||||
HeapWord* to,
|
HeapWord* to,
|
||||||
size_t count) {
|
size_t count) {
|
||||||
memmove(to, from, count);
|
memmove(to, from, count);
|
||||||
}
|
}
|
||||||
void _Copy_arrayof_conjoint_jshorts(HeapWord* from,
|
void _Copy_arrayof_conjoint_jshorts(const HeapWord* from,
|
||||||
HeapWord* to,
|
HeapWord* to,
|
||||||
size_t count) {
|
size_t count) {
|
||||||
memmove(to, from, count * 2);
|
memmove(to, from, count * 2);
|
||||||
}
|
}
|
||||||
void _Copy_arrayof_conjoint_jints(HeapWord* from,
|
void _Copy_arrayof_conjoint_jints(const HeapWord* from,
|
||||||
HeapWord* to,
|
HeapWord* to,
|
||||||
size_t count) {
|
size_t count) {
|
||||||
memmove(to, from, count * 4);
|
memmove(to, from, count * 4);
|
||||||
}
|
}
|
||||||
void _Copy_arrayof_conjoint_jlongs(HeapWord* from,
|
void _Copy_arrayof_conjoint_jlongs(const HeapWord* from,
|
||||||
HeapWord* to,
|
HeapWord* to,
|
||||||
size_t count) {
|
size_t count) {
|
||||||
memmove(to, from, count * 8);
|
memmove(to, from, count * 8);
|
||||||
|
@ -313,25 +313,22 @@ const char* AbstractAssembler::code_string(const char* str) {
|
|||||||
bool MacroAssembler::uses_implicit_null_check(void* address) {
|
bool MacroAssembler::uses_implicit_null_check(void* address) {
|
||||||
// Exception handler checks the nmethod's implicit null checks table
|
// Exception handler checks the nmethod's implicit null checks table
|
||||||
// only when this method returns false.
|
// only when this method returns false.
|
||||||
intptr_t int_address = reinterpret_cast<intptr_t>(address);
|
uintptr_t addr = reinterpret_cast<uintptr_t>(address);
|
||||||
intptr_t cell_header_size = Universe::heap()->cell_header_size();
|
uintptr_t page_size = (uintptr_t)os::vm_page_size();
|
||||||
size_t region_size = os::vm_page_size() + cell_header_size;
|
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
if (UseCompressedOops && CompressedOops::base() != NULL) {
|
if (UseCompressedOops && CompressedOops::base() != NULL) {
|
||||||
// A SEGV can legitimately happen in C2 code at address
|
// A SEGV can legitimately happen in C2 code at address
|
||||||
// (heap_base + offset) if Matcher::narrow_oop_use_complex_address
|
// (heap_base + offset) if Matcher::narrow_oop_use_complex_address
|
||||||
// is configured to allow narrow oops field loads to be implicitly
|
// is configured to allow narrow oops field loads to be implicitly
|
||||||
// null checked
|
// null checked
|
||||||
intptr_t start = ((intptr_t)CompressedOops::base()) - cell_header_size;
|
uintptr_t start = (uintptr_t)CompressedOops::base();
|
||||||
intptr_t end = start + region_size;
|
uintptr_t end = start + page_size;
|
||||||
if (int_address >= start && int_address < end) {
|
if (addr >= start && addr < end) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
intptr_t start = -cell_header_size;
|
return addr < page_size;
|
||||||
intptr_t end = start + region_size;
|
|
||||||
return int_address >= start && int_address < end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
|
bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
|
||||||
@ -341,12 +338,8 @@ bool MacroAssembler::needs_explicit_null_check(intptr_t offset) {
|
|||||||
// with -1. Another example is GraphBuilder::access_field(...) which uses -1 as placeholder
|
// with -1. Another example is GraphBuilder::access_field(...) which uses -1 as placeholder
|
||||||
// for offsets to be patched in later. The -1 there means the offset is not yet known
|
// for offsets to be patched in later. The -1 there means the offset is not yet known
|
||||||
// and may lie outside of the zero-trapping page, and thus we need to ensure we're forcing
|
// and may lie outside of the zero-trapping page, and thus we need to ensure we're forcing
|
||||||
// an explicit null check for -1, even if it may otherwise be in the range
|
// an explicit null check for -1.
|
||||||
// [-cell_header_size, os::vm_page_size).
|
|
||||||
// TODO: Find and replace all relevant uses of -1 with a reasonably named constant.
|
|
||||||
if (offset == -1) return true;
|
|
||||||
|
|
||||||
// Check if offset is outside of [-cell_header_size, os::vm_page_size)
|
// Check if offset is outside of [0, os::vm_page_size()]
|
||||||
return offset < -Universe::heap()->cell_header_size() ||
|
return offset < 0 || offset >= os::vm_page_size();
|
||||||
offset >= os::vm_page_size();
|
|
||||||
}
|
}
|
||||||
|
@ -413,6 +413,7 @@ class CodeBuffer: public StackObj {
|
|||||||
|| PrintMethodHandleStubs
|
|| PrintMethodHandleStubs
|
||||||
|| PrintInterpreter
|
|| PrintInterpreter
|
||||||
|| PrintSignatureHandlers
|
|| PrintSignatureHandlers
|
||||||
|
|| UnlockDiagnosticVMOptions
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +125,8 @@
|
|||||||
|
|
||||||
#define JAVA_13_VERSION 57
|
#define JAVA_13_VERSION 57
|
||||||
|
|
||||||
|
#define JAVA_14_VERSION 58
|
||||||
|
|
||||||
void ClassFileParser::set_class_bad_constant_seen(short bad_constant) {
|
void ClassFileParser::set_class_bad_constant_seen(short bad_constant) {
|
||||||
assert((bad_constant == JVM_CONSTANT_Module ||
|
assert((bad_constant == JVM_CONSTANT_Module ||
|
||||||
bad_constant == JVM_CONSTANT_Package) && _major_version >= JAVA_9_VERSION,
|
bad_constant == JVM_CONSTANT_Package) && _major_version >= JAVA_9_VERSION,
|
||||||
@ -4754,16 +4756,38 @@ static bool has_illegal_visibility(jint flags) {
|
|||||||
|
|
||||||
// A legal major_version.minor_version must be one of the following:
|
// A legal major_version.minor_version must be one of the following:
|
||||||
//
|
//
|
||||||
// Major_version = 45, any minor_version.
|
// Major_version >= 45 and major_version < 56, any minor_version.
|
||||||
// Major_version >= 46 and major_version <= current_major_version and minor_version = 0.
|
// Major_version >= 56 and major_version <= JVM_CLASSFILE_MAJOR_VERSION and minor_version = 0.
|
||||||
// Major_version = current_major_version and minor_version = 65535 and --enable-preview is present.
|
// Major_version = JVM_CLASSFILE_MAJOR_VERSION and minor_version = 65535 and --enable-preview is present.
|
||||||
//
|
//
|
||||||
static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){
|
static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){
|
||||||
|
ResourceMark rm(THREAD);
|
||||||
const u2 max_version = JVM_CLASSFILE_MAJOR_VERSION;
|
const u2 max_version = JVM_CLASSFILE_MAJOR_VERSION;
|
||||||
if (major != JAVA_MIN_SUPPORTED_VERSION) { // All 45.* are ok including 45.65535
|
if (major < JAVA_MIN_SUPPORTED_VERSION) {
|
||||||
|
Exceptions::fthrow(
|
||||||
|
THREAD_AND_LOCATION,
|
||||||
|
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||||
|
"%s (class file version %u.%u) was compiled with an invalid major version",
|
||||||
|
class_name->as_C_string(), major, minor);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (major > max_version) {
|
||||||
|
Exceptions::fthrow(
|
||||||
|
THREAD_AND_LOCATION,
|
||||||
|
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||||
|
"%s has been compiled by a more recent version of the Java Runtime (class file version %u.%u), "
|
||||||
|
"this version of the Java Runtime only recognizes class file versions up to %u.0",
|
||||||
|
class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (major < JAVA_12_VERSION || minor == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (minor == JAVA_PREVIEW_MINOR_VERSION) {
|
if (minor == JAVA_PREVIEW_MINOR_VERSION) {
|
||||||
if (major != max_version) {
|
if (major != max_version) {
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Exceptions::fthrow(
|
Exceptions::fthrow(
|
||||||
THREAD_AND_LOCATION,
|
THREAD_AND_LOCATION,
|
||||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||||
@ -4774,7 +4798,6 @@ static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!Arguments::enable_preview()) {
|
if (!Arguments::enable_preview()) {
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Exceptions::fthrow(
|
Exceptions::fthrow(
|
||||||
THREAD_AND_LOCATION,
|
THREAD_AND_LOCATION,
|
||||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||||
@ -4784,23 +4807,6 @@ static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else { // minor != JAVA_PREVIEW_MINOR_VERSION
|
} else { // minor != JAVA_PREVIEW_MINOR_VERSION
|
||||||
if (major > max_version) {
|
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Exceptions::fthrow(
|
|
||||||
THREAD_AND_LOCATION,
|
|
||||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
|
||||||
"%s has been compiled by a more recent version of the Java Runtime (class file version %u.%u), "
|
|
||||||
"this version of the Java Runtime only recognizes class file versions up to %u.0",
|
|
||||||
class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION);
|
|
||||||
} else if (major < JAVA_MIN_SUPPORTED_VERSION) {
|
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Exceptions::fthrow(
|
|
||||||
THREAD_AND_LOCATION,
|
|
||||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
|
||||||
"%s (class file version %u.%u) was compiled with an invalid major version",
|
|
||||||
class_name->as_C_string(), major, minor);
|
|
||||||
} else if (minor != 0) {
|
|
||||||
ResourceMark rm(THREAD);
|
|
||||||
Exceptions::fthrow(
|
Exceptions::fthrow(
|
||||||
THREAD_AND_LOCATION,
|
THREAD_AND_LOCATION,
|
||||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||||
@ -4808,8 +4814,6 @@ static void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS){
|
|||||||
class_name->as_C_string(), major, minor);
|
class_name->as_C_string(), major, minor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ClassFileParser::verify_legal_field_modifiers(jint flags,
|
void ClassFileParser::verify_legal_field_modifiers(jint flags,
|
||||||
bool is_interface,
|
bool is_interface,
|
||||||
@ -5641,11 +5645,11 @@ void ClassFileParser::fill_instance_klass(InstanceKlass* ik, bool changed_by_loa
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ik->minor_version() == JAVA_PREVIEW_MINOR_VERSION &&
|
if (ik->minor_version() == JAVA_PREVIEW_MINOR_VERSION &&
|
||||||
ik->major_version() != JAVA_MIN_SUPPORTED_VERSION &&
|
ik->major_version() == JVM_CLASSFILE_MAJOR_VERSION &&
|
||||||
log_is_enabled(Info, class, preview)) {
|
log_is_enabled(Info, class, preview)) {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
log_info(class, preview)("Loading class %s that depends on preview features (class file version %d.65535)",
|
log_info(class, preview)("Loading class %s that depends on preview features (class file version %d.65535)",
|
||||||
ik->external_name(), ik->major_version());
|
ik->external_name(), JVM_CLASSFILE_MAJOR_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (log_is_enabled(Debug, class, resolve)) {
|
if (log_is_enabled(Debug, class, resolve)) {
|
||||||
|
@ -58,8 +58,8 @@
|
|||||||
const double PREF_AVG_LIST_LEN = 2.0;
|
const double PREF_AVG_LIST_LEN = 2.0;
|
||||||
// 2^24 is max size
|
// 2^24 is max size
|
||||||
const size_t END_SIZE = 24;
|
const size_t END_SIZE = 24;
|
||||||
// If a chain gets to 32 something might be wrong
|
// If a chain gets to 100 something might be wrong
|
||||||
const size_t REHASH_LEN = 32;
|
const size_t REHASH_LEN = 100;
|
||||||
// If we have as many dead items as 50% of the number of bucket
|
// If we have as many dead items as 50% of the number of bucket
|
||||||
const double CLEAN_DEAD_HIGH_WATER_MARK = 0.5;
|
const double CLEAN_DEAD_HIGH_WATER_MARK = 0.5;
|
||||||
|
|
||||||
@ -496,8 +496,9 @@ bool StringTable::do_rehash() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We use max size
|
// We use current size, not max size.
|
||||||
StringTableHash* new_table = new StringTableHash(END_SIZE, END_SIZE, REHASH_LEN);
|
size_t new_size = _local_table->get_size_log2(Thread::current());
|
||||||
|
StringTableHash* new_table = new StringTableHash(new_size, END_SIZE, REHASH_LEN);
|
||||||
// Use alt hash from now on
|
// Use alt hash from now on
|
||||||
_alt_hash = true;
|
_alt_hash = true;
|
||||||
if (!_local_table->try_move_nodes_to(Thread::current(), new_table)) {
|
if (!_local_table->try_move_nodes_to(Thread::current(), new_table)) {
|
||||||
|
@ -267,7 +267,7 @@ void SymbolTable::symbols_do(SymbolClosure *cl) {
|
|||||||
// all symbols from the dynamic table
|
// all symbols from the dynamic table
|
||||||
SymbolsDo sd(cl);
|
SymbolsDo sd(cl);
|
||||||
if (!_local_table->try_scan(Thread::current(), sd)) {
|
if (!_local_table->try_scan(Thread::current(), sd)) {
|
||||||
log_info(stringtable)("symbols_do unavailable at this moment");
|
log_info(symboltable)("symbols_do unavailable at this moment");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,7 +557,7 @@ void SymbolTable::verify() {
|
|||||||
Thread* thr = Thread::current();
|
Thread* thr = Thread::current();
|
||||||
VerifySymbols vs;
|
VerifySymbols vs;
|
||||||
if (!_local_table->try_scan(thr, vs)) {
|
if (!_local_table->try_scan(thr, vs)) {
|
||||||
log_info(stringtable)("verify unavailable at this moment");
|
log_info(symboltable)("verify unavailable at this moment");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -763,8 +763,9 @@ bool SymbolTable::do_rehash() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We use max size
|
// We use current size
|
||||||
SymbolTableHash* new_table = new SymbolTableHash(END_SIZE, END_SIZE, REHASH_LEN);
|
size_t new_size = _local_table->get_size_log2(Thread::current());
|
||||||
|
SymbolTableHash* new_table = new SymbolTableHash(new_size, END_SIZE, REHASH_LEN);
|
||||||
// Use alt hash from now on
|
// Use alt hash from now on
|
||||||
_alt_hash = true;
|
_alt_hash = true;
|
||||||
if (!_local_table->try_move_nodes_to(Thread::current(), new_table)) {
|
if (!_local_table->try_move_nodes_to(Thread::current(), new_table)) {
|
||||||
|
@ -2861,14 +2861,17 @@ void SystemDictionary::dump(outputStream *st, bool verbose) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TableStatistics SystemDictionary::placeholders_statistics() {
|
TableStatistics SystemDictionary::placeholders_statistics() {
|
||||||
|
MutexLocker ml(SystemDictionary_lock);
|
||||||
return placeholders()->statistics_calculate();
|
return placeholders()->statistics_calculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
TableStatistics SystemDictionary::loader_constraints_statistics() {
|
TableStatistics SystemDictionary::loader_constraints_statistics() {
|
||||||
|
MutexLocker ml(SystemDictionary_lock);
|
||||||
return constraints()->statistics_calculate();
|
return constraints()->statistics_calculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
TableStatistics SystemDictionary::protection_domain_cache_statistics() {
|
TableStatistics SystemDictionary::protection_domain_cache_statistics() {
|
||||||
|
MutexLocker ml(SystemDictionary_lock);
|
||||||
return pd_cache_table()->statistics_calculate();
|
return pd_cache_table()->statistics_calculate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,12 +38,12 @@
|
|||||||
bool AbstractDisassembler::_show_data_hex = true;
|
bool AbstractDisassembler::_show_data_hex = true;
|
||||||
bool AbstractDisassembler::_show_data_int = false;
|
bool AbstractDisassembler::_show_data_int = false;
|
||||||
bool AbstractDisassembler::_show_data_float = false;
|
bool AbstractDisassembler::_show_data_float = false;
|
||||||
bool AbstractDisassembler::_align_instr = false;
|
bool AbstractDisassembler::_align_instr = true;
|
||||||
bool AbstractDisassembler::_show_pc = true;
|
bool AbstractDisassembler::_show_pc = true;
|
||||||
bool AbstractDisassembler::_show_offset = false;
|
bool AbstractDisassembler::_show_offset = false;
|
||||||
bool AbstractDisassembler::_show_structs = false;
|
bool AbstractDisassembler::_show_structs = true;
|
||||||
bool AbstractDisassembler::_show_comment = false;
|
bool AbstractDisassembler::_show_comment = true;
|
||||||
bool AbstractDisassembler::_show_block_comment = false;
|
bool AbstractDisassembler::_show_block_comment = true;
|
||||||
|
|
||||||
// set "true" to see what's in memory bit by bit
|
// set "true" to see what's in memory bit by bit
|
||||||
// might prove cumbersome on platforms where instr_len is hard to find out
|
// might prove cumbersome on platforms where instr_len is hard to find out
|
||||||
|
@ -147,7 +147,10 @@ class decode_env {
|
|||||||
|
|
||||||
if (AbstractDisassembler::show_comment()) {
|
if (AbstractDisassembler::show_comment()) {
|
||||||
if ((_nm != NULL) && _nm->has_code_comment(pc0, pc)) {
|
if ((_nm != NULL) && _nm->has_code_comment(pc0, pc)) {
|
||||||
_nm->print_code_comment_on(st, _post_decode_alignment, pc0, pc);
|
_nm->print_code_comment_on
|
||||||
|
(st,
|
||||||
|
_post_decode_alignment ? _post_decode_alignment : COMMENT_COLUMN,
|
||||||
|
pc0, pc);
|
||||||
// this calls reloc_string_for which calls oop::print_value_on
|
// this calls reloc_string_for which calls oop::print_value_on
|
||||||
}
|
}
|
||||||
print_hook_comments(pc0, _nm != NULL);
|
print_hook_comments(pc0, _nm != NULL);
|
||||||
|
@ -379,12 +379,8 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
// We can not verify the oop here if we are using ZGC, the oop
|
if ((((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
|
||||||
// will be bad in case we had a safepoint between a load and a
|
!Universe::heap()->is_in_or_null(*loc)) {
|
||||||
// load barrier.
|
|
||||||
if (!UseZGC &&
|
|
||||||
((((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
|
|
||||||
!Universe::heap()->is_in_or_null(*loc))) {
|
|
||||||
tty->print_cr("# Found non oop pointer. Dumping state at failure");
|
tty->print_cr("# Found non oop pointer. Dumping state at failure");
|
||||||
// try to dump out some helpful debugging information
|
// try to dump out some helpful debugging information
|
||||||
trace_codeblob_maps(fr, reg_map);
|
trace_codeblob_maps(fr, reg_map);
|
||||||
|
@ -2780,6 +2780,23 @@ void G1CollectedHeap::register_regions_with_region_attr() {
|
|||||||
cl.flush_rem_set_entries();
|
cl.flush_rem_set_entries();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef PRODUCT
|
||||||
|
void G1CollectedHeap::verify_region_attr_remset_update() {
|
||||||
|
class VerifyRegionAttrRemSet : public HeapRegionClosure {
|
||||||
|
public:
|
||||||
|
virtual bool do_heap_region(HeapRegion* r) {
|
||||||
|
G1CollectedHeap* g1h = G1CollectedHeap::heap();
|
||||||
|
bool const needs_remset_update = g1h->region_attr(r->bottom()).needs_remset_update();
|
||||||
|
assert(r->rem_set()->is_tracked() == needs_remset_update,
|
||||||
|
"Region %u remset tracking status (%s) different to region attribute (%s)",
|
||||||
|
r->hrm_index(), BOOL_TO_STR(r->rem_set()->is_tracked()), BOOL_TO_STR(needs_remset_update));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} cl;
|
||||||
|
heap_region_iterate(&cl);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
class VerifyRegionRemSetClosure : public HeapRegionClosure {
|
class VerifyRegionRemSetClosure : public HeapRegionClosure {
|
||||||
public:
|
public:
|
||||||
bool do_heap_region(HeapRegion* hr) {
|
bool do_heap_region(HeapRegion* hr) {
|
||||||
@ -3059,6 +3076,7 @@ bool G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_
|
|||||||
|
|
||||||
// Actually do the work...
|
// Actually do the work...
|
||||||
evacuate_initial_collection_set(&per_thread_states);
|
evacuate_initial_collection_set(&per_thread_states);
|
||||||
|
|
||||||
if (_collection_set.optional_region_length() != 0) {
|
if (_collection_set.optional_region_length() != 0) {
|
||||||
evacuate_optional_collection_set(&per_thread_states);
|
evacuate_optional_collection_set(&per_thread_states);
|
||||||
}
|
}
|
||||||
@ -4640,7 +4658,7 @@ void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
|
|||||||
|
|
||||||
bool const during_im = collector_state()->in_initial_mark_gc();
|
bool const during_im = collector_state()->in_initial_mark_gc();
|
||||||
if (during_im && allocated_bytes > 0) {
|
if (during_im && allocated_bytes > 0) {
|
||||||
_cm->root_regions()->add(alloc_region);
|
_cm->root_regions()->add(alloc_region->next_top_at_mark_start(), alloc_region->top());
|
||||||
}
|
}
|
||||||
_hr_printer.retire(alloc_region);
|
_hr_printer.retire(alloc_region);
|
||||||
}
|
}
|
||||||
|
@ -593,6 +593,10 @@ public:
|
|||||||
_region_attr.clear();
|
_region_attr.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify that the G1RegionAttr remset tracking corresponds to actual remset tracking
|
||||||
|
// for all regions.
|
||||||
|
void verify_region_attr_remset_update() PRODUCT_RETURN;
|
||||||
|
|
||||||
bool is_user_requested_concurrent_full_gc(GCCause::Cause cause);
|
bool is_user_requested_concurrent_full_gc(GCCause::Cause cause);
|
||||||
|
|
||||||
// This is called at the start of either a concurrent cycle or a Full
|
// This is called at the start of either a concurrent cycle or a Full
|
||||||
|
@ -519,6 +519,9 @@ bool G1CollectionSet::finalize_optional_for_evacuation(double remaining_pause_ti
|
|||||||
_num_optional_regions -= num_selected_regions;
|
_num_optional_regions -= num_selected_regions;
|
||||||
|
|
||||||
stop_incremental_building();
|
stop_incremental_building();
|
||||||
|
|
||||||
|
_g1h->verify_region_attr_remset_update();
|
||||||
|
|
||||||
return num_selected_regions > 0;
|
return num_selected_regions > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -526,10 +529,15 @@ void G1CollectionSet::abandon_optional_collection_set(G1ParScanThreadStateSet* p
|
|||||||
for (uint i = 0; i < _num_optional_regions; i++) {
|
for (uint i = 0; i < _num_optional_regions; i++) {
|
||||||
HeapRegion* r = candidates()->at(candidates()->cur_idx() + i);
|
HeapRegion* r = candidates()->at(candidates()->cur_idx() + i);
|
||||||
pss->record_unused_optional_region(r);
|
pss->record_unused_optional_region(r);
|
||||||
|
// Clear collection set marker and make sure that the remembered set information
|
||||||
|
// is correct as we still need it later.
|
||||||
_g1h->clear_region_attr(r);
|
_g1h->clear_region_attr(r);
|
||||||
|
_g1h->register_region_with_region_attr(r);
|
||||||
r->clear_index_in_opt_cset();
|
r->clear_index_in_opt_cset();
|
||||||
}
|
}
|
||||||
free_optional_regions();
|
free_optional_regions();
|
||||||
|
|
||||||
|
_g1h->verify_region_attr_remset_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ASSERT
|
#ifdef ASSERT
|
||||||
|
@ -257,30 +257,38 @@ void G1CMMarkStack::set_empty() {
|
|||||||
_free_list = NULL;
|
_free_list = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
G1CMRootRegions::G1CMRootRegions(uint const max_regions) :
|
G1CMRootMemRegions::G1CMRootMemRegions(uint const max_regions) :
|
||||||
_root_regions(NEW_C_HEAP_ARRAY(HeapRegion*, max_regions, mtGC)),
|
_root_regions(NULL),
|
||||||
_max_regions(max_regions),
|
_max_regions(max_regions),
|
||||||
_num_root_regions(0),
|
_num_root_regions(0),
|
||||||
_claimed_root_regions(0),
|
_claimed_root_regions(0),
|
||||||
_scan_in_progress(false),
|
_scan_in_progress(false),
|
||||||
_should_abort(false) { }
|
_should_abort(false) {
|
||||||
|
_root_regions = new MemRegion[_max_regions];
|
||||||
G1CMRootRegions::~G1CMRootRegions() {
|
if (_root_regions == NULL) {
|
||||||
FREE_C_HEAP_ARRAY(HeapRegion*, _max_regions);
|
vm_exit_during_initialization("Could not allocate root MemRegion set.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::reset() {
|
G1CMRootMemRegions::~G1CMRootMemRegions() {
|
||||||
|
delete[] _root_regions;
|
||||||
|
}
|
||||||
|
|
||||||
|
void G1CMRootMemRegions::reset() {
|
||||||
_num_root_regions = 0;
|
_num_root_regions = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::add(HeapRegion* hr) {
|
void G1CMRootMemRegions::add(HeapWord* start, HeapWord* end) {
|
||||||
assert_at_safepoint();
|
assert_at_safepoint();
|
||||||
size_t idx = Atomic::add((size_t)1, &_num_root_regions) - 1;
|
size_t idx = Atomic::add((size_t)1, &_num_root_regions) - 1;
|
||||||
assert(idx < _max_regions, "Trying to add more root regions than there is space " SIZE_FORMAT, _max_regions);
|
assert(idx < _max_regions, "Trying to add more root MemRegions than there is space " SIZE_FORMAT, _max_regions);
|
||||||
_root_regions[idx] = hr;
|
assert(start != NULL && end != NULL && start <= end, "Start (" PTR_FORMAT ") should be less or equal to "
|
||||||
|
"end (" PTR_FORMAT ")", p2i(start), p2i(end));
|
||||||
|
_root_regions[idx].set_start(start);
|
||||||
|
_root_regions[idx].set_end(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::prepare_for_scan() {
|
void G1CMRootMemRegions::prepare_for_scan() {
|
||||||
assert(!scan_in_progress(), "pre-condition");
|
assert(!scan_in_progress(), "pre-condition");
|
||||||
|
|
||||||
_scan_in_progress = _num_root_regions > 0;
|
_scan_in_progress = _num_root_regions > 0;
|
||||||
@ -289,7 +297,7 @@ void G1CMRootRegions::prepare_for_scan() {
|
|||||||
_should_abort = false;
|
_should_abort = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
HeapRegion* G1CMRootRegions::claim_next() {
|
const MemRegion* G1CMRootMemRegions::claim_next() {
|
||||||
if (_should_abort) {
|
if (_should_abort) {
|
||||||
// If someone has set the should_abort flag, we return NULL to
|
// If someone has set the should_abort flag, we return NULL to
|
||||||
// force the caller to bail out of their loop.
|
// force the caller to bail out of their loop.
|
||||||
@ -302,26 +310,26 @@ HeapRegion* G1CMRootRegions::claim_next() {
|
|||||||
|
|
||||||
size_t claimed_index = Atomic::add((size_t)1, &_claimed_root_regions) - 1;
|
size_t claimed_index = Atomic::add((size_t)1, &_claimed_root_regions) - 1;
|
||||||
if (claimed_index < _num_root_regions) {
|
if (claimed_index < _num_root_regions) {
|
||||||
return _root_regions[claimed_index];
|
return &_root_regions[claimed_index];
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint G1CMRootRegions::num_root_regions() const {
|
uint G1CMRootMemRegions::num_root_regions() const {
|
||||||
return (uint)_num_root_regions;
|
return (uint)_num_root_regions;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::notify_scan_done() {
|
void G1CMRootMemRegions::notify_scan_done() {
|
||||||
MutexLocker x(RootRegionScan_lock, Mutex::_no_safepoint_check_flag);
|
MutexLocker x(RootRegionScan_lock, Mutex::_no_safepoint_check_flag);
|
||||||
_scan_in_progress = false;
|
_scan_in_progress = false;
|
||||||
RootRegionScan_lock->notify_all();
|
RootRegionScan_lock->notify_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::cancel_scan() {
|
void G1CMRootMemRegions::cancel_scan() {
|
||||||
notify_scan_done();
|
notify_scan_done();
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1CMRootRegions::scan_finished() {
|
void G1CMRootMemRegions::scan_finished() {
|
||||||
assert(scan_in_progress(), "pre-condition");
|
assert(scan_in_progress(), "pre-condition");
|
||||||
|
|
||||||
if (!_should_abort) {
|
if (!_should_abort) {
|
||||||
@ -333,7 +341,7 @@ void G1CMRootRegions::scan_finished() {
|
|||||||
notify_scan_done();
|
notify_scan_done();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool G1CMRootRegions::wait_until_scan_finished() {
|
bool G1CMRootMemRegions::wait_until_scan_finished() {
|
||||||
if (!scan_in_progress()) {
|
if (!scan_in_progress()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -875,14 +883,21 @@ uint G1ConcurrentMark::calc_active_marking_workers() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1ConcurrentMark::scan_root_region(HeapRegion* hr, uint worker_id) {
|
void G1ConcurrentMark::scan_root_region(const MemRegion* region, uint worker_id) {
|
||||||
assert(hr->is_old() || (hr->is_survivor() && hr->next_top_at_mark_start() == hr->bottom()),
|
#ifdef ASSERT
|
||||||
"Root regions must be old or survivor but region %u is %s", hr->hrm_index(), hr->get_type_str());
|
HeapWord* last = region->last();
|
||||||
|
HeapRegion* hr = _g1h->heap_region_containing(last);
|
||||||
|
assert(hr->is_old() || hr->next_top_at_mark_start() == hr->bottom(),
|
||||||
|
"Root regions must be old or survivor/eden but region %u is %s", hr->hrm_index(), hr->get_type_str());
|
||||||
|
assert(hr->next_top_at_mark_start() == region->start(),
|
||||||
|
"MemRegion start should be equal to nTAMS");
|
||||||
|
#endif
|
||||||
|
|
||||||
G1RootRegionScanClosure cl(_g1h, this, worker_id);
|
G1RootRegionScanClosure cl(_g1h, this, worker_id);
|
||||||
|
|
||||||
const uintx interval = PrefetchScanIntervalInBytes;
|
const uintx interval = PrefetchScanIntervalInBytes;
|
||||||
HeapWord* curr = hr->next_top_at_mark_start();
|
HeapWord* curr = region->start();
|
||||||
const HeapWord* end = hr->top();
|
const HeapWord* end = region->end();
|
||||||
while (curr < end) {
|
while (curr < end) {
|
||||||
Prefetch::read(curr, interval);
|
Prefetch::read(curr, interval);
|
||||||
oop obj = oop(curr);
|
oop obj = oop(curr);
|
||||||
@ -902,11 +917,11 @@ public:
|
|||||||
assert(Thread::current()->is_ConcurrentGC_thread(),
|
assert(Thread::current()->is_ConcurrentGC_thread(),
|
||||||
"this should only be done by a conc GC thread");
|
"this should only be done by a conc GC thread");
|
||||||
|
|
||||||
G1CMRootRegions* root_regions = _cm->root_regions();
|
G1CMRootMemRegions* root_regions = _cm->root_regions();
|
||||||
HeapRegion* hr = root_regions->claim_next();
|
const MemRegion* region = root_regions->claim_next();
|
||||||
while (hr != NULL) {
|
while (region != NULL) {
|
||||||
_cm->scan_root_region(hr, worker_id);
|
_cm->scan_root_region(region, worker_id);
|
||||||
hr = root_regions->claim_next();
|
region = root_regions->claim_next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -222,18 +222,20 @@ private:
|
|||||||
template<typename Fn> void iterate(Fn fn) const PRODUCT_RETURN;
|
template<typename Fn> void iterate(Fn fn) const PRODUCT_RETURN;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Root Regions are regions that contain objects from nTAMS to top. These are roots
|
// Root MemRegions are memory areas that contain objects which references are
|
||||||
// for marking, i.e. their referenced objects must be kept alive to maintain the
|
// roots wrt to the marking. They must be scanned before marking to maintain the
|
||||||
// SATB invariant.
|
// SATB invariant.
|
||||||
// We could scan and mark them through during the initial-mark pause, but for
|
// Typically they contain the areas from nTAMS to top of the regions.
|
||||||
|
// We could scan and mark through these objects during the initial-mark pause, but for
|
||||||
// pause time reasons we move this work to the concurrent phase.
|
// pause time reasons we move this work to the concurrent phase.
|
||||||
// We need to complete this procedure before the next GC because it might determine
|
// We need to complete this procedure before the next GC because it might determine
|
||||||
// that some of these "root objects" are dead, potentially dropping some required
|
// that some of these "root objects" are dead, potentially dropping some required
|
||||||
// references.
|
// references.
|
||||||
// Root regions comprise of the complete contents of survivor regions, and any
|
// Root MemRegions comprise of the contents of survivor regions at the end
|
||||||
// objects copied into old gen during GC.
|
// of the GC, and any objects copied into the old gen during GC.
|
||||||
class G1CMRootRegions {
|
class G1CMRootMemRegions {
|
||||||
HeapRegion** _root_regions;
|
// The set of root MemRegions.
|
||||||
|
MemRegion* _root_regions;
|
||||||
size_t const _max_regions;
|
size_t const _max_regions;
|
||||||
|
|
||||||
volatile size_t _num_root_regions; // Actual number of root regions.
|
volatile size_t _num_root_regions; // Actual number of root regions.
|
||||||
@ -246,13 +248,13 @@ class G1CMRootRegions {
|
|||||||
void notify_scan_done();
|
void notify_scan_done();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1CMRootRegions(uint const max_regions);
|
G1CMRootMemRegions(uint const max_regions);
|
||||||
~G1CMRootRegions();
|
~G1CMRootMemRegions();
|
||||||
|
|
||||||
// Reset the data structure to allow addition of new root regions.
|
// Reset the data structure to allow addition of new root regions.
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
void add(HeapRegion* hr);
|
void add(HeapWord* start, HeapWord* end);
|
||||||
|
|
||||||
// Reset the claiming / scanning of the root regions.
|
// Reset the claiming / scanning of the root regions.
|
||||||
void prepare_for_scan();
|
void prepare_for_scan();
|
||||||
@ -264,9 +266,9 @@ public:
|
|||||||
// false otherwise.
|
// false otherwise.
|
||||||
bool scan_in_progress() { return _scan_in_progress; }
|
bool scan_in_progress() { return _scan_in_progress; }
|
||||||
|
|
||||||
// Claim the next root region to scan atomically, or return NULL if
|
// Claim the next root MemRegion to scan atomically, or return NULL if
|
||||||
// all have been claimed.
|
// all have been claimed.
|
||||||
HeapRegion* claim_next();
|
const MemRegion* claim_next();
|
||||||
|
|
||||||
// The number of root regions to scan.
|
// The number of root regions to scan.
|
||||||
uint num_root_regions() const;
|
uint num_root_regions() const;
|
||||||
@ -310,7 +312,7 @@ class G1ConcurrentMark : public CHeapObj<mtGC> {
|
|||||||
MemRegion const _heap;
|
MemRegion const _heap;
|
||||||
|
|
||||||
// Root region tracking and claiming
|
// Root region tracking and claiming
|
||||||
G1CMRootRegions _root_regions;
|
G1CMRootMemRegions _root_regions;
|
||||||
|
|
||||||
// For grey objects
|
// For grey objects
|
||||||
G1CMMarkStack _global_mark_stack; // Grey objects behind global finger
|
G1CMMarkStack _global_mark_stack; // Grey objects behind global finger
|
||||||
@ -501,7 +503,7 @@ public:
|
|||||||
size_t partial_mark_stack_size_target() const { return _global_mark_stack.capacity() / 3; }
|
size_t partial_mark_stack_size_target() const { return _global_mark_stack.capacity() / 3; }
|
||||||
bool mark_stack_empty() const { return _global_mark_stack.is_empty(); }
|
bool mark_stack_empty() const { return _global_mark_stack.is_empty(); }
|
||||||
|
|
||||||
G1CMRootRegions* root_regions() { return &_root_regions; }
|
G1CMRootMemRegions* root_regions() { return &_root_regions; }
|
||||||
|
|
||||||
void concurrent_cycle_start();
|
void concurrent_cycle_start();
|
||||||
// Abandon current marking iteration due to a Full GC.
|
// Abandon current marking iteration due to a Full GC.
|
||||||
@ -554,8 +556,8 @@ public:
|
|||||||
// them.
|
// them.
|
||||||
void scan_root_regions();
|
void scan_root_regions();
|
||||||
|
|
||||||
// Scan a single root region from nTAMS to top and mark everything reachable from it.
|
// Scan a single root MemRegion to mark everything reachable from it.
|
||||||
void scan_root_region(HeapRegion* hr, uint worker_id);
|
void scan_root_region(const MemRegion* region, uint worker_id);
|
||||||
|
|
||||||
// Do concurrent phase of marking, to a tentative transitive closure.
|
// Do concurrent phase of marking, to a tentative transitive closure.
|
||||||
void mark_from_roots();
|
void mark_from_roots();
|
||||||
|
@ -308,7 +308,6 @@ public:
|
|||||||
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const { return false; }
|
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const { return false; }
|
||||||
virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const { return false; }
|
virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const { return false; }
|
||||||
virtual bool escape_has_out_with_unsafe_object(Node* n) const { return false; }
|
virtual bool escape_has_out_with_unsafe_object(Node* n) const { return false; }
|
||||||
virtual bool escape_is_barrier_node(Node* n) const { return false; }
|
|
||||||
|
|
||||||
virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const { return false; };
|
virtual bool matcher_find_shared_visit(Matcher* matcher, Matcher::MStack& mstack, Node* n, uint opcode, bool& mem_op, int& mem_addr_idx) const { return false; };
|
||||||
virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const { return false; };
|
virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const { return false; };
|
||||||
|
@ -534,11 +534,6 @@ class CollectedHeap : public CHeapObj<mtInternal> {
|
|||||||
|
|
||||||
virtual size_t obj_size(oop obj) const;
|
virtual size_t obj_size(oop obj) const;
|
||||||
|
|
||||||
// Cells are memory slices allocated by the allocator. Objects are initialized
|
|
||||||
// in cells. The cell itself may have a header, found at a negative offset of
|
|
||||||
// oops. Usually, the size of the cell header is 0, but it may be larger.
|
|
||||||
virtual ptrdiff_t cell_header_size() const { return 0; }
|
|
||||||
|
|
||||||
// Non product verification and debugging.
|
// Non product verification and debugging.
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
// Support for PromotionFailureALot. Return true if it's time to cause a
|
// Support for PromotionFailureALot. Return true if it's time to cause a
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
#define SHARE_GC_SHARED_GCLOCKER_INLINE_HPP
|
#define SHARE_GC_SHARED_GCLOCKER_INLINE_HPP
|
||||||
|
|
||||||
#include "gc/shared/gcLocker.hpp"
|
#include "gc/shared/gcLocker.hpp"
|
||||||
#include "runtime/thread.hpp"
|
#include "runtime/thread.inline.hpp"
|
||||||
|
|
||||||
void GCLocker::lock_critical(JavaThread* thread) {
|
void GCLocker::lock_critical(JavaThread* thread) {
|
||||||
if (!thread->in_critical()) {
|
if (!thread->in_critical()) {
|
||||||
|
@ -1194,10 +1194,6 @@ bool ShenandoahBarrierSetC2::escape_has_out_with_unsafe_object(Node* n) const {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ShenandoahBarrierSetC2::escape_is_barrier_node(Node* n) const {
|
|
||||||
return n->Opcode() == Op_ShenandoahLoadReferenceBarrier;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ShenandoahBarrierSetC2::matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const {
|
bool ShenandoahBarrierSetC2::matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const {
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case Op_ShenandoahCompareAndExchangeP:
|
case Op_ShenandoahCompareAndExchangeP:
|
||||||
|
@ -144,7 +144,6 @@ public:
|
|||||||
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const;
|
virtual bool escape_add_to_con_graph(ConnectionGraph* conn_graph, PhaseGVN* gvn, Unique_Node_List* delayed_worklist, Node* n, uint opcode) const;
|
||||||
virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const;
|
virtual bool escape_add_final_edges(ConnectionGraph* conn_graph, PhaseGVN* gvn, Node* n, uint opcode) const;
|
||||||
virtual bool escape_has_out_with_unsafe_object(Node* n) const;
|
virtual bool escape_has_out_with_unsafe_object(Node* n) const;
|
||||||
virtual bool escape_is_barrier_node(Node* n) const;
|
|
||||||
|
|
||||||
virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const;
|
virtual bool matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const;
|
||||||
virtual bool matcher_is_store_load_barrier(Node* x, uint xop) const;
|
virtual bool matcher_is_store_load_barrier(Node* x, uint xop) const;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017, 2018, Red Hat, Inc. All rights reserved.
|
* Copyright (c) 2017, 2019, Red Hat, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
@ -122,7 +122,7 @@ public:
|
|||||||
void possibly_parallel_blobs_do(CodeBlobClosure* f);
|
void possibly_parallel_blobs_do(CodeBlobClosure* f);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShenandoahCodeRoots : public CHeapObj<mtGC> {
|
class ShenandoahCodeRoots : public AllStatic {
|
||||||
friend class ShenandoahHeap;
|
friend class ShenandoahHeap;
|
||||||
friend class ShenandoahCodeRootsIterator;
|
friend class ShenandoahCodeRootsIterator;
|
||||||
|
|
||||||
|
@ -1279,7 +1279,12 @@ void ShenandoahHeap::object_iterate(ObjectClosure* cl) {
|
|||||||
// First, we process all GC roots. This populates the work stack with initial objects.
|
// First, we process all GC roots. This populates the work stack with initial objects.
|
||||||
ShenandoahAllRootScanner rp(1, ShenandoahPhaseTimings::_num_phases);
|
ShenandoahAllRootScanner rp(1, ShenandoahPhaseTimings::_num_phases);
|
||||||
ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
|
ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
|
||||||
|
|
||||||
|
if (unload_classes()) {
|
||||||
|
rp.strong_roots_do_unchecked(&oops);
|
||||||
|
} else {
|
||||||
rp.roots_do_unchecked(&oops);
|
rp.roots_do_unchecked(&oops);
|
||||||
|
}
|
||||||
|
|
||||||
// Work through the oop stack to traverse heap.
|
// Work through the oop stack to traverse heap.
|
||||||
while (! oop_stack.is_empty()) {
|
while (! oop_stack.is_empty()) {
|
||||||
@ -1694,8 +1699,29 @@ void ShenandoahHeap::op_degenerated(ShenandoahDegenPoint point) {
|
|||||||
// it would be a simple check, which is supposed to be fast. This is also
|
// it would be a simple check, which is supposed to be fast. This is also
|
||||||
// safe to do even without degeneration, as CSet iterator is at beginning
|
// safe to do even without degeneration, as CSet iterator is at beginning
|
||||||
// in preparation for evacuation anyway.
|
// in preparation for evacuation anyway.
|
||||||
|
//
|
||||||
|
// Before doing that, we need to make sure we never had any cset-pinned
|
||||||
|
// regions. This may happen if allocation failure happened when evacuating
|
||||||
|
// the about-to-be-pinned object, oom-evac protocol left the object in
|
||||||
|
// the collection set, and then the pin reached the cset region. If we continue
|
||||||
|
// the cycle here, we would trash the cset and alive objects in it. To avoid
|
||||||
|
// it, we fail degeneration right away and slide into Full GC to recover.
|
||||||
|
|
||||||
|
{
|
||||||
collection_set()->clear_current_index();
|
collection_set()->clear_current_index();
|
||||||
|
|
||||||
|
ShenandoahHeapRegion* r;
|
||||||
|
while ((r = collection_set()->next()) != NULL) {
|
||||||
|
if (r->is_pinned()) {
|
||||||
|
cancel_gc(GCCause::_shenandoah_upgrade_to_full_gc);
|
||||||
|
op_degenerated_fail();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
collection_set()->clear_current_index();
|
||||||
|
}
|
||||||
|
|
||||||
op_stw_evac();
|
op_stw_evac();
|
||||||
if (cancelled_gc()) {
|
if (cancelled_gc()) {
|
||||||
op_degenerated_fail();
|
op_degenerated_fail();
|
||||||
@ -2152,6 +2178,11 @@ void ShenandoahHeap::op_final_updaterefs() {
|
|||||||
concurrent_mark()->update_thread_roots(ShenandoahPhaseTimings::final_update_refs_roots);
|
concurrent_mark()->update_thread_roots(ShenandoahPhaseTimings::final_update_refs_roots);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Has to be done before cset is clear
|
||||||
|
if (ShenandoahVerify) {
|
||||||
|
verifier()->verify_roots_in_to_space();
|
||||||
|
}
|
||||||
|
|
||||||
ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle);
|
ShenandoahGCPhase final_update_refs(ShenandoahPhaseTimings::final_update_refs_recycle);
|
||||||
|
|
||||||
trash_cset_regions();
|
trash_cset_regions();
|
||||||
@ -2159,7 +2190,6 @@ void ShenandoahHeap::op_final_updaterefs() {
|
|||||||
set_update_refs_in_progress(false);
|
set_update_refs_in_progress(false);
|
||||||
|
|
||||||
if (ShenandoahVerify) {
|
if (ShenandoahVerify) {
|
||||||
verifier()->verify_roots_no_forwarded();
|
|
||||||
verifier()->verify_after_updaterefs();
|
verifier()->verify_after_updaterefs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,8 +60,7 @@ ShenandoahSerialRoots::ShenandoahSerialRoots() :
|
|||||||
_object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
|
_object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
|
||||||
_management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
|
_management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
|
||||||
_system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
|
_system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
|
||||||
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots),
|
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
|
||||||
_jni_handle_root(&JNIHandles::oops_do, ShenandoahPhaseTimings::JNIRoots) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
|
void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
|
||||||
@ -70,7 +69,10 @@ void ShenandoahSerialRoots::oops_do(OopClosure* cl, uint worker_id) {
|
|||||||
_management_root.oops_do(cl, worker_id);
|
_management_root.oops_do(cl, worker_id);
|
||||||
_system_dictionary_root.oops_do(cl, worker_id);
|
_system_dictionary_root.oops_do(cl, worker_id);
|
||||||
_jvmti_root.oops_do(cl, worker_id);
|
_jvmti_root.oops_do(cl, worker_id);
|
||||||
_jni_handle_root.oops_do(cl, worker_id);
|
}
|
||||||
|
|
||||||
|
ShenandoahJNIHandleRoots::ShenandoahJNIHandleRoots() :
|
||||||
|
ShenandoahSerialRoot(&JNIHandles::oops_do, ShenandoahPhaseTimings::JNIRoots) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) {
|
ShenandoahThreadRoots::ShenandoahThreadRoots(bool is_par) : _is_par(is_par) {
|
||||||
@ -160,6 +162,7 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
|
|||||||
AlwaysTrueClosure always_true;
|
AlwaysTrueClosure always_true;
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
|
|
||||||
_thread_roots.oops_do(oops, NULL, worker_id);
|
_thread_roots.oops_do(oops, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&clds, &clds, worker_id);
|
_cld_roots.clds_do(&clds, &clds, worker_id);
|
||||||
@ -189,6 +192,7 @@ void ShenandoahRootAdjuster::roots_do(uint worker_id, OopClosure* oops) {
|
|||||||
AlwaysTrueClosure always_true;
|
AlwaysTrueClosure always_true;
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
|
|
||||||
_thread_roots.oops_do(oops, NULL, worker_id);
|
_thread_roots.oops_do(oops, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
|
_cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
|
||||||
|
@ -56,12 +56,16 @@ private:
|
|||||||
ShenandoahSerialRoot _management_root;
|
ShenandoahSerialRoot _management_root;
|
||||||
ShenandoahSerialRoot _system_dictionary_root;
|
ShenandoahSerialRoot _system_dictionary_root;
|
||||||
ShenandoahSerialRoot _jvmti_root;
|
ShenandoahSerialRoot _jvmti_root;
|
||||||
ShenandoahSerialRoot _jni_handle_root;
|
|
||||||
public:
|
public:
|
||||||
ShenandoahSerialRoots();
|
ShenandoahSerialRoots();
|
||||||
void oops_do(OopClosure* cl, uint worker_id);
|
void oops_do(OopClosure* cl, uint worker_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ShenandoahJNIHandleRoots : public ShenandoahSerialRoot {
|
||||||
|
public:
|
||||||
|
ShenandoahJNIHandleRoots();
|
||||||
|
};
|
||||||
|
|
||||||
class ShenandoahThreadRoots {
|
class ShenandoahThreadRoots {
|
||||||
private:
|
private:
|
||||||
const bool _is_par;
|
const bool _is_par;
|
||||||
@ -126,6 +130,7 @@ template <typename ITR>
|
|||||||
class ShenandoahRootScanner : public ShenandoahRootProcessor {
|
class ShenandoahRootScanner : public ShenandoahRootProcessor {
|
||||||
private:
|
private:
|
||||||
ShenandoahSerialRoots _serial_roots;
|
ShenandoahSerialRoots _serial_roots;
|
||||||
|
ShenandoahJNIHandleRoots _jni_roots;
|
||||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||||
ShenandoahThreadRoots _thread_roots;
|
ShenandoahThreadRoots _thread_roots;
|
||||||
ShenandoahCodeCacheRoots<ITR> _code_roots;
|
ShenandoahCodeCacheRoots<ITR> _code_roots;
|
||||||
@ -143,6 +148,7 @@ public:
|
|||||||
void roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc = NULL);
|
void roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc = NULL);
|
||||||
// For heap object iteration
|
// For heap object iteration
|
||||||
void roots_do_unchecked(OopClosure* cl);
|
void roots_do_unchecked(OopClosure* cl);
|
||||||
|
void strong_roots_do_unchecked(OopClosure* cl);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef ShenandoahRootScanner<ShenandoahAllCodeRootsIterator> ShenandoahAllRootScanner;
|
typedef ShenandoahRootScanner<ShenandoahAllCodeRootsIterator> ShenandoahAllRootScanner;
|
||||||
@ -152,6 +158,7 @@ typedef ShenandoahRootScanner<ShenandoahCsetCodeRootsIterator> ShenandoahCSetRoo
|
|||||||
class ShenandoahRootEvacuator : public ShenandoahRootProcessor {
|
class ShenandoahRootEvacuator : public ShenandoahRootProcessor {
|
||||||
private:
|
private:
|
||||||
ShenandoahSerialRoots _serial_roots;
|
ShenandoahSerialRoots _serial_roots;
|
||||||
|
ShenandoahJNIHandleRoots _jni_roots;
|
||||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||||
ShenandoahThreadRoots _thread_roots;
|
ShenandoahThreadRoots _thread_roots;
|
||||||
ShenandoahWeakRoots _weak_roots;
|
ShenandoahWeakRoots _weak_roots;
|
||||||
@ -168,6 +175,7 @@ public:
|
|||||||
class ShenandoahRootUpdater : public ShenandoahRootProcessor {
|
class ShenandoahRootUpdater : public ShenandoahRootProcessor {
|
||||||
private:
|
private:
|
||||||
ShenandoahSerialRoots _serial_roots;
|
ShenandoahSerialRoots _serial_roots;
|
||||||
|
ShenandoahJNIHandleRoots _jni_roots;
|
||||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||||
ShenandoahThreadRoots _thread_roots;
|
ShenandoahThreadRoots _thread_roots;
|
||||||
ShenandoahWeakRoots _weak_roots;
|
ShenandoahWeakRoots _weak_roots;
|
||||||
@ -186,6 +194,7 @@ public:
|
|||||||
class ShenandoahRootAdjuster : public ShenandoahRootProcessor {
|
class ShenandoahRootAdjuster : public ShenandoahRootProcessor {
|
||||||
private:
|
private:
|
||||||
ShenandoahSerialRoots _serial_roots;
|
ShenandoahSerialRoots _serial_roots;
|
||||||
|
ShenandoahJNIHandleRoots _jni_roots;
|
||||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||||
ShenandoahThreadRoots _thread_roots;
|
ShenandoahThreadRoots _thread_roots;
|
||||||
ShenandoahWeakRoots _weak_roots;
|
ShenandoahWeakRoots _weak_roots;
|
||||||
|
@ -99,6 +99,7 @@ void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDC
|
|||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
_cld_roots.clds_do(clds, clds, worker_id);
|
_cld_roots.clds_do(clds, clds, worker_id);
|
||||||
_thread_roots.threads_do(&tc_cl, worker_id);
|
_thread_roots.threads_do(&tc_cl, worker_id);
|
||||||
|
|
||||||
@ -118,11 +119,25 @@ void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) {
|
|||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, 0);
|
_serial_roots.oops_do(oops, 0);
|
||||||
|
_jni_roots.oops_do(oops, 0);
|
||||||
_cld_roots.clds_do(&clds, &clds, 0);
|
_cld_roots.clds_do(&clds, &clds, 0);
|
||||||
_thread_roots.threads_do(&tc_cl, 0);
|
_thread_roots.threads_do(&tc_cl, 0);
|
||||||
_code_roots.code_blobs_do(&code, 0);
|
_code_roots.code_blobs_do(&code, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ITR>
|
||||||
|
void ShenandoahRootScanner<ITR>::strong_roots_do_unchecked(OopClosure* oops) {
|
||||||
|
CLDToOopClosure clds(oops, ClassLoaderData::_claim_strong);
|
||||||
|
MarkingCodeBlobClosure code(oops, !CodeBlobToOopClosure::FixRelocations);
|
||||||
|
ShenandoahParallelOopsDoThreadClosure tc_cl(oops, &code, NULL);
|
||||||
|
ResourceMark rm;
|
||||||
|
|
||||||
|
_serial_roots.oops_do(oops, 0);
|
||||||
|
_jni_roots.oops_do(oops, 0);
|
||||||
|
_cld_roots.clds_do(&clds, NULL, 0);
|
||||||
|
_thread_roots.threads_do(&tc_cl, 0);
|
||||||
|
}
|
||||||
|
|
||||||
template <typename ITR>
|
template <typename ITR>
|
||||||
void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
|
void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oops, CLDClosure* clds, CodeBlobClosure* code, ThreadClosure* tc) {
|
||||||
assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading");
|
assert(ShenandoahHeap::heap()->unload_classes(), "Should be used during class unloading");
|
||||||
@ -130,6 +145,7 @@ void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oop
|
|||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
|
|
||||||
_serial_roots.oops_do(oops, worker_id);
|
_serial_roots.oops_do(oops, worker_id);
|
||||||
|
_jni_roots.oops_do(oops, worker_id);
|
||||||
_cld_roots.clds_do(clds, NULL, worker_id);
|
_cld_roots.clds_do(clds, NULL, worker_id);
|
||||||
_thread_roots.threads_do(&tc_cl, worker_id);
|
_thread_roots.threads_do(&tc_cl, worker_id);
|
||||||
}
|
}
|
||||||
@ -141,6 +157,7 @@ void ShenandoahRootUpdater::roots_do(uint worker_id, IsAlive* is_alive, KeepAliv
|
|||||||
CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
|
CLDToOopClosure* weak_clds = ShenandoahHeap::heap()->unload_classes() ? NULL : &clds;
|
||||||
|
|
||||||
_serial_roots.oops_do(keep_alive, worker_id);
|
_serial_roots.oops_do(keep_alive, worker_id);
|
||||||
|
_jni_roots.oops_do(keep_alive, worker_id);
|
||||||
|
|
||||||
_thread_roots.oops_do(keep_alive, NULL, worker_id);
|
_thread_roots.oops_do(keep_alive, NULL, worker_id);
|
||||||
_cld_roots.clds_do(&clds, weak_clds, worker_id);
|
_cld_roots.clds_do(&clds, weak_clds, worker_id);
|
||||||
|
@ -69,15 +69,18 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
|
|||||||
|
|
||||||
if (verify(SerialRoots)) {
|
if (verify(SerialRoots)) {
|
||||||
shenandoah_assert_safepoint();
|
shenandoah_assert_safepoint();
|
||||||
|
|
||||||
Universe::oops_do(oops);
|
Universe::oops_do(oops);
|
||||||
Management::oops_do(oops);
|
Management::oops_do(oops);
|
||||||
JvmtiExport::oops_do(oops);
|
JvmtiExport::oops_do(oops);
|
||||||
JNIHandles::oops_do(oops);
|
|
||||||
ObjectSynchronizer::oops_do(oops);
|
ObjectSynchronizer::oops_do(oops);
|
||||||
SystemDictionary::oops_do(oops);
|
SystemDictionary::oops_do(oops);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (verify(JNIHandleRoots)) {
|
||||||
|
shenandoah_assert_safepoint();
|
||||||
|
JNIHandles::oops_do(oops);
|
||||||
|
}
|
||||||
|
|
||||||
if (verify(WeakRoots)) {
|
if (verify(WeakRoots)) {
|
||||||
shenandoah_assert_safepoint();
|
shenandoah_assert_safepoint();
|
||||||
AlwaysTrueClosure always_true;
|
AlwaysTrueClosure always_true;
|
||||||
|
@ -36,7 +36,8 @@ public:
|
|||||||
CLDGRoots = 1 << 3,
|
CLDGRoots = 1 << 3,
|
||||||
WeakRoots = 1 << 4,
|
WeakRoots = 1 << 4,
|
||||||
StringDedupRoots = 1 << 5,
|
StringDedupRoots = 1 << 5,
|
||||||
AllRoots = (SerialRoots | ThreadRoots | CodeRoots | CLDGRoots | WeakRoots | StringDedupRoots)
|
JNIHandleRoots = 1 << 6,
|
||||||
|
AllRoots = (SerialRoots | ThreadRoots | CodeRoots | CLDGRoots | WeakRoots | StringDedupRoots | JNIHandleRoots)
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -964,6 +964,44 @@ public:
|
|||||||
void do_oop(oop* p) { do_oop_work(p); }
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ShenandoahVerifyInToSpaceClosure : public OopClosure {
|
||||||
|
private:
|
||||||
|
template <class T>
|
||||||
|
void do_oop_work(T* p) {
|
||||||
|
T o = RawAccess<>::oop_load(p);
|
||||||
|
if (!CompressedOops::is_null(o)) {
|
||||||
|
oop obj = CompressedOops::decode_not_null(o);
|
||||||
|
ShenandoahHeap* heap = ShenandoahHeap::heap_no_check();
|
||||||
|
|
||||||
|
if (!heap->marking_context()->is_marked(obj)) {
|
||||||
|
ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL,
|
||||||
|
"Verify Roots In To-Space", "Should be marked", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (heap->in_collection_set(obj)) {
|
||||||
|
ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL,
|
||||||
|
"Verify Roots In To-Space", "Should not be in collection set", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
oop fwd = (oop) ShenandoahForwarding::get_forwardee_raw_unchecked(obj);
|
||||||
|
if (!oopDesc::equals_raw(obj, fwd)) {
|
||||||
|
ShenandoahAsserts::print_failure(ShenandoahAsserts::_safe_all, obj, p, NULL,
|
||||||
|
"Verify Roots In To-Space", "Should not be forwarded", __FILE__, __LINE__);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
void do_oop(narrowOop* p) { do_oop_work(p); }
|
||||||
|
void do_oop(oop* p) { do_oop_work(p); }
|
||||||
|
};
|
||||||
|
|
||||||
|
void ShenandoahVerifier::verify_roots_in_to_space() {
|
||||||
|
ShenandoahRootVerifier verifier;
|
||||||
|
ShenandoahVerifyInToSpaceClosure cl;
|
||||||
|
verifier.oops_do(&cl);
|
||||||
|
}
|
||||||
|
|
||||||
void ShenandoahVerifier::verify_roots_no_forwarded() {
|
void ShenandoahVerifier::verify_roots_no_forwarded() {
|
||||||
ShenandoahRootVerifier verifier;
|
ShenandoahRootVerifier verifier;
|
||||||
ShenandoahVerifyNoForwared cl;
|
ShenandoahVerifyNoForwared cl;
|
||||||
|
@ -189,6 +189,7 @@ public:
|
|||||||
void verify_generic(VerifyOption option);
|
void verify_generic(VerifyOption option);
|
||||||
|
|
||||||
// Roots should only contain to-space oops
|
// Roots should only contain to-space oops
|
||||||
|
void verify_roots_in_to_space();
|
||||||
void verify_roots_no_forwarded();
|
void verify_roots_no_forwarded();
|
||||||
void verify_roots_no_forwarded_except(ShenandoahRootVerifier::RootTypes types);
|
void verify_roots_no_forwarded_except(ShenandoahRootVerifier::RootTypes types);
|
||||||
};
|
};
|
||||||
|
@ -866,7 +866,6 @@ static bool fixup_uses_in_catch(PhaseIdealLoop *phase, Node *start_ctrl, Node *n
|
|||||||
// In some very rare cases a load that doesn't need a barrier will end up here
|
// In some very rare cases a load that doesn't need a barrier will end up here
|
||||||
// Treat it as a LoadP and the insertion of phis will be done correctly.
|
// Treat it as a LoadP and the insertion of phis will be done correctly.
|
||||||
if (node->is_Load()) {
|
if (node->is_Load()) {
|
||||||
assert(node->as_Load()->barrier_data() == 0, "Sanity");
|
|
||||||
call_catch_cleanup_one(phase, node->as_Load(), phase->get_ctrl(node));
|
call_catch_cleanup_one(phase, node->as_Load(), phase->get_ctrl(node));
|
||||||
} else {
|
} else {
|
||||||
for (DUIterator_Fast jmax, i = node->fast_outs(jmax); i < jmax; i++) {
|
for (DUIterator_Fast jmax, i = node->fast_outs(jmax); i < jmax; i++) {
|
||||||
@ -1356,6 +1355,14 @@ void ZBarrierSetC2::clean_catch_blocks(PhaseIdealLoop* phase) const {
|
|||||||
while(nodeStack.length() > 0) {
|
while(nodeStack.length() > 0) {
|
||||||
Node *n = nodeStack.pop();
|
Node *n = nodeStack.pop();
|
||||||
|
|
||||||
|
for (uint i = 0; i < n->len(); i++) {
|
||||||
|
if (n->in(i)) {
|
||||||
|
if (!visited.test_set(n->in(i)->_idx)) {
|
||||||
|
nodeStack.push(n->in(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool is_old_node = (n->_idx < new_ids); // don't process nodes that were created during cleanup
|
bool is_old_node = (n->_idx < new_ids); // don't process nodes that were created during cleanup
|
||||||
if (n->is_Load() && is_old_node) {
|
if (n->is_Load() && is_old_node) {
|
||||||
LoadNode* load = n->isa_Load();
|
LoadNode* load = n->isa_Load();
|
||||||
@ -1364,14 +1371,6 @@ void ZBarrierSetC2::clean_catch_blocks(PhaseIdealLoop* phase) const {
|
|||||||
process_catch_cleanup_candidate(phase, load);
|
process_catch_cleanup_candidate(phase, load);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint i = 0; i < n->len(); i++) {
|
|
||||||
if (n->in(i)) {
|
|
||||||
if (!visited.test_set(n->in(i)->_idx)) {
|
|
||||||
nodeStack.push(n->in(i));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
C->print_method(PHASE_CALL_CATCH_CLEANUP, 2);
|
C->print_method(PHASE_CALL_CATCH_CLEANUP, 2);
|
||||||
|
@ -471,8 +471,8 @@ void ZHeap::relocate() {
|
|||||||
void ZHeap::object_iterate(ObjectClosure* cl, bool visit_referents) {
|
void ZHeap::object_iterate(ObjectClosure* cl, bool visit_referents) {
|
||||||
assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
|
assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
|
||||||
|
|
||||||
ZHeapIterator iter(visit_referents);
|
ZHeapIterator iter;
|
||||||
iter.objects_do(cl);
|
iter.objects_do(cl, visit_referents);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZHeap::serviceability_initialize() {
|
void ZHeap::serviceability_initialize() {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user