Merge
This commit is contained in:
commit
b870874d22
3
.hgtags
3
.hgtags
@ -562,3 +562,6 @@ f2f11d7f7f4e7128f8aba6ffa576cfa76fbf7d1a jdk-13+21
|
||||
181986c5476468bc2dd4532af49599003ee8af37 jdk-13+22
|
||||
b034d2dee5fc93d42a81b65e58ce3f91e42586ff jdk-13+23
|
||||
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
|
||||
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])
|
||||
else
|
||||
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.
|
||||
#
|
||||
# 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_FEATURE=13
|
||||
DEFAULT_VERSION_FEATURE=14
|
||||
DEFAULT_VERSION_INTERIM=0
|
||||
DEFAULT_VERSION_UPDATE=0
|
||||
DEFAULT_VERSION_PATCH=0
|
||||
DEFAULT_VERSION_EXTRA1=0
|
||||
DEFAULT_VERSION_EXTRA2=0
|
||||
DEFAULT_VERSION_EXTRA3=0
|
||||
DEFAULT_VERSION_DATE=2019-09-17
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=57 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_DATE=2020-03-17
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=58 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="12 13"
|
||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=13
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="12 13 14"
|
||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=14
|
||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||
|
||||
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:
|
||||
#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 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 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 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;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.file.Files;
|
||||
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.X509Certificate;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Generate cacerts
|
||||
@ -39,23 +50,99 @@ import java.security.cert.CertificateFactory;
|
||||
*/
|
||||
public class GenerateCacerts {
|
||||
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])) {
|
||||
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.
|
||||
#
|
||||
# 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)
|
||||
|
||||
$(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
|
||||
|
||||
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
|
||||
);
|
||||
|
||||
// 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
|
||||
reg_class int_flags(RFLAGS);
|
||||
|
||||
@ -4774,6 +4914,258 @@ operand vRegD_V3()
|
||||
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
|
||||
|
||||
// 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" %}
|
||||
|
||||
ins_encode %{
|
||||
__ fcmps(as_FloatRegister($src1$$reg), 0.0D);
|
||||
__ fcmps(as_FloatRegister($src1$$reg), 0.0);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_class_compare);
|
||||
@ -13892,7 +14284,7 @@ instruct compD_reg_zero(rFlagsReg cr, vRegD src1, immD0 src2)
|
||||
format %{ "fcmpd $src1, 0.0" %}
|
||||
|
||||
ins_encode %{
|
||||
__ fcmpd(as_FloatRegister($src1$$reg), 0.0D);
|
||||
__ fcmpd(as_FloatRegister($src1$$reg), 0.0);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_class_compare);
|
||||
@ -13968,7 +14360,7 @@ instruct compF3_reg_immF0(iRegINoSp dst, vRegF src1, immF0 zero, rFlagsReg cr)
|
||||
Label done;
|
||||
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
||||
Register d = as_Register($dst$$reg);
|
||||
__ fcmps(s1, 0.0D);
|
||||
__ fcmps(s1, 0.0);
|
||||
// installs 0 if EQ else -1
|
||||
__ csinvw(d, zr, zr, Assembler::EQ);
|
||||
// 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;
|
||||
FloatRegister s1 = as_FloatRegister($src1$$reg);
|
||||
Register d = as_Register($dst$$reg);
|
||||
__ fcmpd(s1, 0.0D);
|
||||
__ fcmpd(s1, 0.0);
|
||||
// installs 0 if EQ else -1
|
||||
__ csinvw(d, zr, zr, Assembler::EQ);
|
||||
// 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) {
|
||||
int nbits = msb - lsb + 1;
|
||||
unsigned mask = ((1U << nbits) - 1) << lsb;
|
||||
assert_cond(bits & mask == mask);
|
||||
assert_cond((bits & mask) == mask);
|
||||
return (insn & mask) >> lsb;
|
||||
}
|
||||
|
||||
@ -306,10 +306,12 @@ public:
|
||||
};
|
||||
class Post : public PrePost {
|
||||
Register _idx;
|
||||
bool _is_postreg;
|
||||
public:
|
||||
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; }
|
||||
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; }
|
||||
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; _is_postreg = false; }
|
||||
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; _is_postreg = true; }
|
||||
Register idx_reg() { return _idx; }
|
||||
bool is_postreg() {return _is_postreg; }
|
||||
};
|
||||
|
||||
namespace ext
|
||||
@ -393,7 +395,7 @@ class Address {
|
||||
: _base(p.reg()), _offset(p.offset()), _mode(pre) { }
|
||||
Address(Post p)
|
||||
: _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)
|
||||
: _mode(literal),
|
||||
_rspec(rspec),
|
||||
@ -807,32 +809,34 @@ public:
|
||||
#undef INSN
|
||||
|
||||
// Bitfield
|
||||
#define INSN(NAME, opcode) \
|
||||
#define INSN(NAME, opcode, size) \
|
||||
void NAME(Register Rd, Register Rn, unsigned immr, unsigned imms) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || (immr < 32 && imms < 32), "incorrect immr/imms");\
|
||||
f(opcode, 31, 22), f(immr, 21, 16), f(imms, 15, 10); \
|
||||
zrf(Rn, 5), rf(Rd, 0); \
|
||||
}
|
||||
|
||||
INSN(sbfmw, 0b0001001100);
|
||||
INSN(bfmw, 0b0011001100);
|
||||
INSN(ubfmw, 0b0101001100);
|
||||
INSN(sbfm, 0b1001001101);
|
||||
INSN(bfm, 0b1011001101);
|
||||
INSN(ubfm, 0b1101001101);
|
||||
INSN(sbfmw, 0b0001001100, 0);
|
||||
INSN(bfmw, 0b0011001100, 0);
|
||||
INSN(ubfmw, 0b0101001100, 0);
|
||||
INSN(sbfm, 0b1001001101, 1);
|
||||
INSN(bfm, 0b1011001101, 1);
|
||||
INSN(ubfm, 0b1101001101, 1);
|
||||
|
||||
#undef INSN
|
||||
|
||||
// Extract
|
||||
#define INSN(NAME, opcode) \
|
||||
#define INSN(NAME, opcode, size) \
|
||||
void NAME(Register Rd, Register Rn, Register Rm, unsigned imms) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || imms < 32, "incorrect imms"); \
|
||||
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(extr, 0b10010011110);
|
||||
INSN(extrw, 0b00010011100, 0);
|
||||
INSN(extr, 0b10010011110, 1);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@ -1126,7 +1130,7 @@ public:
|
||||
Register Rn, enum operand_size sz, int op, bool ordered) {
|
||||
starti;
|
||||
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,
|
||||
@ -1255,7 +1259,7 @@ public:
|
||||
enum operand_size sz, int op1, int op2, bool a, bool r) {
|
||||
starti;
|
||||
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) \
|
||||
@ -1477,6 +1481,7 @@ public:
|
||||
void NAME(Register Rd, Register Rn, Register Rm, \
|
||||
enum shift_kind kind = LSL, unsigned shift = 0) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || shift < 32, "incorrect shift"); \
|
||||
f(N, 21); \
|
||||
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
||||
op_shifted_reg(0b01010, kind, shift, size, op); \
|
||||
@ -1539,6 +1544,7 @@ void mvnw(Register Rd, Register Rm,
|
||||
starti; \
|
||||
f(0, 21); \
|
||||
assert_cond(kind != ROR); \
|
||||
guarantee(size == 1 || shift < 32, "incorrect shift");\
|
||||
zrf(Rd, 0), zrf(Rn, 5), zrf(Rm, 16); \
|
||||
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,
|
||||
Register Rd, Register Rn, Register Rm,
|
||||
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(option, 15, 13), f(imm, 12, 10);
|
||||
}
|
||||
@ -1652,7 +1658,7 @@ void mvnw(Register Rd, Register Rm,
|
||||
f(o2, 10);
|
||||
f(o3, 4);
|
||||
f(nzcv, 3, 0);
|
||||
f(imm5, 20, 16), rf(Rn, 5);
|
||||
f(imm5, 20, 16), zrf(Rn, 5);
|
||||
}
|
||||
|
||||
#define INSN(NAME, op) \
|
||||
@ -2121,7 +2127,12 @@ public:
|
||||
}
|
||||
void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
|
||||
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;
|
||||
f(0,31), f((int)T & 1, 30);
|
||||
f(op1 | 0b100, 29, 21), f(0b11111, 20, 16), f(op2, 15, 12);
|
||||
@ -2228,42 +2239,47 @@ public:
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc, opc2) \
|
||||
#define INSN(NAME, opc, opc2, acceptT2D) \
|
||||
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; \
|
||||
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); \
|
||||
rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(addv, 0, 0b100001);
|
||||
INSN(subv, 1, 0b100001);
|
||||
INSN(mulv, 0, 0b100111);
|
||||
INSN(mlav, 0, 0b100101);
|
||||
INSN(mlsv, 1, 0b100101);
|
||||
INSN(sshl, 0, 0b010001);
|
||||
INSN(ushl, 1, 0b010001);
|
||||
INSN(umullv, 1, 0b110000);
|
||||
INSN(umlalv, 1, 0b100000);
|
||||
INSN(addv, 0, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(subv, 1, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(mulv, 0, 0b100111, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(mlav, 0, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(mlsv, 1, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(sshl, 0, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(ushl, 1, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(umullv, 1, 0b110000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(umlalv, 1, 0b100000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc, opc2) \
|
||||
#define INSN(NAME, opc, opc2, accepted) \
|
||||
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; \
|
||||
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); \
|
||||
rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(absr, 0, 0b100000101110);
|
||||
INSN(negr, 1, 0b100000101110);
|
||||
INSN(notr, 1, 0b100000010110);
|
||||
INSN(addv, 0, 0b110001101110);
|
||||
INSN(cls, 0, 0b100000010010);
|
||||
INSN(clz, 1, 0b100000010010);
|
||||
INSN(cnt, 0, 0b100000010110);
|
||||
INSN(uaddlv, 1, 0b110000001110);
|
||||
INSN(absr, 0, 0b100000101110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
INSN(negr, 1, 0b100000101110, 2); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(notr, 1, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||
INSN(addv, 0, 0b110001101110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
INSN(cls, 0, 0b100000010010, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
INSN(clz, 1, 0b100000010010, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
INSN(cnt, 0, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||
INSN(uaddlv, 1, 0b110000001110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
|
||||
#undef INSN
|
||||
|
||||
@ -2287,7 +2303,7 @@ public:
|
||||
starti; \
|
||||
assert(lsl == 0 || \
|
||||
((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; \
|
||||
if (T == T4H || T == T8H) cmode |= 0b1000; \
|
||||
if (!(T == T4H || T == T8H || T == T2S || T == T4S)) { \
|
||||
@ -2448,7 +2464,8 @@ public:
|
||||
|
||||
#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;
|
||||
/* The encodings for the immh:immb fields (bits 22:16) are
|
||||
* 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(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) {
|
||||
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
|
||||
@ -2470,19 +2495,21 @@ public:
|
||||
void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
|
||||
starti;
|
||||
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
|
||||
// mov Rd, Vn.T[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;
|
||||
f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
|
||||
f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
||||
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;
|
||||
assert((Ta == T1Q && (Tb == T1D || Tb == T2D)) ||
|
||||
(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(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) {
|
||||
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) {
|
||||
@ -2509,7 +2543,7 @@ public:
|
||||
starti;
|
||||
assert(T != T1D, "reserved encoding");
|
||||
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)
|
||||
@ -2524,6 +2558,7 @@ public:
|
||||
// AdvSIMD ZIP/UZP/TRN
|
||||
#define INSN(NAME, opcode) \
|
||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
||||
guarantee(T != T1D && T != T1Q, "invalid arrangement"); \
|
||||
starti; \
|
||||
f(0, 31), f(0b001110, 29, 24), f(0, 21), f(0, 15); \
|
||||
f(opcode, 14, 12), f(0b10, 11, 10); \
|
||||
@ -2609,7 +2644,7 @@ public:
|
||||
// RBIT only allows T8B and T16B but encodes them oddly. Argh...
|
||||
void rbit(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) {
|
||||
assert((ASSERTION), MSG);
|
||||
_rbit(Vd, SIMD_Arrangement(T & 1 | 0b010), Vn);
|
||||
_rbit(Vd, SIMD_Arrangement((T & 1) | 0b010), Vn);
|
||||
}
|
||||
#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.
|
||||
* 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) {
|
||||
__ decode_heap_oop(dest->as_register());
|
||||
}
|
||||
__ verify_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());
|
||||
}
|
||||
} else if (type == T_ADDRESS && addr->disp() == oopDesc::klass_offset_in_bytes()) {
|
||||
if (UseCompressedClassPointers) {
|
||||
__ 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
|
||||
// another branch here. Likewise, Assembler::NE does not permit
|
||||
// ordered branches.
|
||||
if (is_unordered && op->cond() == lir_cond_equal
|
||||
|| !is_unordered && op->cond() == lir_cond_notEqual)
|
||||
if ((is_unordered && op->cond() == lir_cond_equal)
|
||||
|| (!is_unordered && op->cond() == lir_cond_notEqual))
|
||||
__ br(Assembler::VS, *(op->ublock()->label()));
|
||||
switch(op->cond()) {
|
||||
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) {
|
||||
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_mul_strictfp: // fall through
|
||||
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;
|
||||
default:
|
||||
ShouldNotReachHere();
|
||||
}
|
||||
} else if (left->is_double_fpu()) {
|
||||
if (right->is_double_fpu()) {
|
||||
// cpu register - cpu register
|
||||
// fpu register - fpu register
|
||||
switch (code) {
|
||||
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_mul_strictfp: // fall through
|
||||
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;
|
||||
default:
|
||||
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) {
|
||||
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()));
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
* 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);
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
@ -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.
|
||||
* 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,
|
||||
unsigned long bcx, unsigned long thread) {
|
||||
RegisterMap map((JavaThread*)thread, false);
|
||||
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);
|
||||
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:
|
||||
using MacroAssembler::call_VM_leaf_base;
|
||||
|
||||
// Interpreter specific version of call_VM_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)) {
|
||||
add(tmp, base, offset & ((1<<12)-1));
|
||||
base = tmp;
|
||||
offset &= -1<<12;
|
||||
offset &= -1u<<12;
|
||||
}
|
||||
|
||||
if (offset >= (1<<12) * size) {
|
||||
|
@ -286,7 +286,7 @@ void MacroAssembler::fast_log(FloatRegister vtmp0, FloatRegister vtmp1,
|
||||
frecpe(vtmp5, vtmp5, S); // vtmp5 ~= 1/vtmp5
|
||||
lsr(tmp2, rscratch1, 48);
|
||||
movz(tmp4, 0x77f0, 48);
|
||||
fmovd(vtmp4, 1.0d);
|
||||
fmovd(vtmp4, 1.0);
|
||||
movz(tmp1, INF_OR_NAN_PREFIX, 48);
|
||||
bfm(tmp4, rscratch1, 0, 51); // tmp4 = 0x77F0 << 48 | mantissa(X)
|
||||
// vtmp1 = AS_DOUBLE_BITS(0x77F0 << 48 | mantissa(X)) == mx
|
||||
@ -358,7 +358,7 @@ void MacroAssembler::fast_log(FloatRegister vtmp0, FloatRegister vtmp1,
|
||||
br(GE, DONE);
|
||||
cmp(rscratch1, tmp2);
|
||||
br(NE, CHECKED_CORNER_CASES);
|
||||
fmovd(v0, 0.0d);
|
||||
fmovd(v0, 0.0);
|
||||
}
|
||||
bind(DONE);
|
||||
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--;"); {
|
||||
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[]
|
||||
fmuld(v3, v26, v10);
|
||||
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);
|
||||
}
|
||||
bind(NX_SET);
|
||||
@ -696,7 +696,7 @@ void MacroAssembler::generate__kernel_rem_pio2(address two_over_pi, address pio2
|
||||
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]
|
||||
cselw(jv, jv, zr, GE);
|
||||
fmovd(v26, 0.0d);
|
||||
fmovd(v26, 0.0);
|
||||
addw(tmp5, jv, 1); // jv+1
|
||||
subsw(j, jv, jx);
|
||||
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);
|
||||
fmovd(v17, i); // v17 = twon24
|
||||
fmovd(v30, tmp5); // 2^q0
|
||||
fmovd(v21, 0.125d);
|
||||
fmovd(v20, 8.0d);
|
||||
fmovd(v21, 0.125);
|
||||
fmovd(v20, 8.0);
|
||||
fmovd(v22, tmp4); // 2^-q0
|
||||
|
||||
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
|
||||
b(Q0_ZERO_CMP_DONE);
|
||||
bind(Q0_ZERO_CMP_LT);
|
||||
fmovd(v4, 0.5d);
|
||||
fmovd(v4, 0.5);
|
||||
fcmpd(v18, v4);
|
||||
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);
|
||||
|
||||
block_comment("if(ih==2) {"); {
|
||||
fmovd(v25, 1.0d);
|
||||
fmovd(v25, 1.0);
|
||||
fsubd(v18, v25, v18); // z = one - z;
|
||||
cbzw(rscratch2, IH_HANDLED);
|
||||
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);
|
||||
// check if recomputation is needed
|
||||
fcmpd(v18, 0.0d);
|
||||
fcmpd(v18, 0.0);
|
||||
br(NE, RECOMP_CHECK_DONE_NOT_ZERO);
|
||||
|
||||
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);
|
||||
// chop off zero terms
|
||||
fcmpd(v18, 0.0d);
|
||||
fcmpd(v18, 0.0);
|
||||
br(EQ, Z_IS_ZERO);
|
||||
|
||||
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
|
||||
bind(COMP_FOR);
|
||||
// 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
|
||||
movw(tmp3, 4);
|
||||
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
|
||||
|
||||
block_comment("for (i=jz;i>=0;i--) fw += fq[i];"); {
|
||||
fmovd(v4, 0.0d);
|
||||
fmovd(v4, 0.0);
|
||||
mov(i, jz);
|
||||
bind(FW_FOR1);
|
||||
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
|
||||
block_comment("calculate r = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))))"); {
|
||||
fmaddd(r, z, C6, C5);
|
||||
fmovd(half, 0.5d);
|
||||
fmovd(half, 0.5);
|
||||
fmaddd(r, z, r, C4);
|
||||
fmuld(y, x, y);
|
||||
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)))
|
||||
}
|
||||
// need to multiply r by z to have "final" r value
|
||||
fmovd(one, 1.0d);
|
||||
fmovd(one, 1.0);
|
||||
cmp(ix, rscratch1);
|
||||
br(GT, IX_IS_LARGE);
|
||||
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);
|
||||
bind(SET_QX_CONST);
|
||||
block_comment("if(ix > 0x3fe90000) qx = 0.28125;"); {
|
||||
fmovd(qx, 0.28125d);
|
||||
fmovd(qx, 0.28125);
|
||||
}
|
||||
bind(QX_SET);
|
||||
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>}"); {
|
||||
bind(TINY_X);
|
||||
if (isCos) {
|
||||
fmovd(v0, 1.0d);
|
||||
fmovd(v0, 1.0);
|
||||
}
|
||||
ret(lr);
|
||||
}
|
||||
|
@ -136,7 +136,7 @@ class FloatRegisterImpl: public AbstractRegisterImpl {
|
||||
VMReg as_VMReg();
|
||||
|
||||
// derived registers, offsets, and addresses
|
||||
FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
|
||||
FloatRegister successor() const { return as_FloatRegister((encoding() + 1) % 32); }
|
||||
|
||||
// accessors
|
||||
int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
|
||||
|
@ -46,6 +46,9 @@
|
||||
#ifdef COMPILER2
|
||||
#include "opto/runtime.hpp"
|
||||
#endif
|
||||
#if INCLUDE_ZGC
|
||||
#include "gc/z/zThreadLocalData.hpp"
|
||||
#endif
|
||||
|
||||
#ifdef BUILTIN_SIM
|
||||
#include "../../../../../../simulator/simulator.hpp"
|
||||
@ -580,6 +583,16 @@ class StubGenerator: public StubCodeGenerator {
|
||||
// make sure object is 'reasonable'
|
||||
__ 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
|
||||
__ mov(c_rarg3, (intptr_t) Universe::verify_oop_mask());
|
||||
__ andr(c_rarg2, r0, c_rarg3);
|
||||
|
@ -177,7 +177,7 @@ void VM_Version::get_processor_features() {
|
||||
if (FILE *f = fopen("/proc/cpuinfo", "r")) {
|
||||
char buf[128], *p;
|
||||
while (fgets(buf, sizeof (buf), f) != NULL) {
|
||||
if (p = strchr(buf, ':')) {
|
||||
if ((p = strchr(buf, ':')) != NULL) {
|
||||
long v = strtol(p+1, NULL, 0);
|
||||
if (strncmp(buf, "CPU implementer", sizeof "CPU implementer" - 1) == 0) {
|
||||
_cpu = v;
|
||||
|
@ -80,7 +80,19 @@ int LIR_Assembler::check_icache() {
|
||||
}
|
||||
|
||||
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() {
|
||||
|
@ -82,6 +82,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
// load cpool->resolved_klass_at(index)
|
||||
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);
|
||||
|
||||
// helpers for expression stack
|
||||
|
@ -516,6 +516,18 @@ void InterpreterMacroAssembler::load_resolved_klass_at_offset(Register Rcpool, R
|
||||
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
|
||||
// a subtype of super_klass. Blows registers Rsub_klass, tmp1, tmp2.
|
||||
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.
|
||||
}
|
||||
|
||||
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,
|
||||
Register temp_reg,
|
||||
Label& wrong_method_type) {
|
||||
@ -3194,6 +3223,12 @@ void MacroAssembler::load_mirror_from_const_method(Register mirror, Register con
|
||||
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
|
||||
// For very short arrays. tmp == R0 is allowed.
|
||||
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,
|
||||
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).
|
||||
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 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();
|
||||
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) 2012, 2018 SAP SE. All rights reserved.
|
||||
// Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
// Copyright (c) 2012, 2019 SAP SE. 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
|
||||
@ -1400,6 +1400,24 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
___(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.
|
||||
// We require that their callers must bang for them. But be
|
||||
// careful, because some VM calls (such as call site linkage) can
|
||||
@ -4631,6 +4649,16 @@ operand immD() %{
|
||||
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 Destination Register
|
||||
// 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) %{
|
||||
match(Set dst (ReplicateS zero));
|
||||
predicate(n->as_Vector()->length() == 4);
|
||||
format %{ "LI $dst, #0 \t// replicate4C" %}
|
||||
format %{ "LI $dst, #0 \t// replicate4S" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
// 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) %{
|
||||
match(Set dst (ReplicateS src));
|
||||
predicate(n->as_Vector()->length() == 4);
|
||||
format %{ "LI $dst, -1 \t// replicate4C" %}
|
||||
format %{ "LI $dst, -1 \t// replicate4S" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||
@ -14062,7 +14090,7 @@ instruct repl8S_immIminus1(vecX dst, immI_minus1 src) %{
|
||||
match(Set dst (ReplicateS src));
|
||||
predicate(n->as_Vector()->length() == 8);
|
||||
|
||||
format %{ "XXLEQV $dst, $src \t// replicate16B" %}
|
||||
format %{ "XXLEQV $dst, $src \t// replicate8S" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ 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) %{
|
||||
match(Set dst (ReplicateI zero));
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
format %{ "LI $dst, #0 \t// replicate4C" %}
|
||||
format %{ "LI $dst, #0 \t// replicate2I" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
// 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) %{
|
||||
match(Set dst (ReplicateI src));
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
format %{ "LI $dst, -1 \t// replicate4C" %}
|
||||
format %{ "LI $dst, -1 \t// replicate2I" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
// TODO: PPC port $archOpcode(ppc64Opcode_addi);
|
||||
@ -14669,7 +14697,7 @@ instruct repl2D_reg_Ex(vecX dst, regD src) %{
|
||||
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));
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
|
||||
@ -14681,18 +14709,6 @@ instruct repl2D_immI0(vecX dst, immI_0 zero) %{
|
||||
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) %{
|
||||
predicate(false);
|
||||
effect(DEF dst, USE src);
|
||||
@ -14754,7 +14770,7 @@ instruct repl2L_immIminus1(vecX dst, immI_minus1 src) %{
|
||||
match(Set dst (ReplicateL src));
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
|
||||
format %{ "XXLEQV $dst, $src \t// replicate16B" %}
|
||||
format %{ "XXLEQV $dst, $src \t// replicate2L" %}
|
||||
size(4);
|
||||
ins_encode %{
|
||||
__ xxleqv($dst$$VectorSRegister, $dst$$VectorSRegister, $dst$$VectorSRegister);
|
||||
|
@ -1274,7 +1274,30 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm
|
||||
|
||||
// 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);
|
||||
}
|
||||
@ -2106,6 +2129,21 @@ nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm,
|
||||
__ 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);
|
||||
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating frame.
|
||||
__ 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) {
|
||||
|
||||
__ get_cache_and_index_at_bcp(Rcache, 1, index_size);
|
||||
Label Lresolved, Ldone;
|
||||
Label Lresolved, Ldone, L_clinit_barrier_slow;
|
||||
|
||||
Bytecodes::Code code = bytecode();
|
||||
switch (code) {
|
||||
@ -2253,6 +2253,9 @@ void TemplateTable::resolve_cache_and_index(int byte_no, Register Rcache, Regist
|
||||
__ cmpdi(CCR0, Rscratch, (int)code);
|
||||
__ 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);
|
||||
__ li(R4_ARG2, code);
|
||||
__ 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);
|
||||
__ 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);
|
||||
}
|
||||
|
||||
@ -2329,7 +2343,7 @@ void TemplateTable::load_invoke_cp_cache_entry(int byte_no,
|
||||
// Already resolved.
|
||||
__ get_cache_and_index_at_bcp(Rcache, 1);
|
||||
} 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);
|
||||
@ -3634,9 +3648,7 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
// Find entry point to call.
|
||||
|
||||
// Get declaring interface class from method
|
||||
__ ld(Rinterface_klass, in_bytes(Method::const_offset()), Rmethod);
|
||||
__ ld(Rinterface_klass, in_bytes(ConstMethod::constants_offset()), Rinterface_klass);
|
||||
__ ld(Rinterface_klass, ConstantPool::pool_holder_offset_in_bytes(), Rinterface_klass);
|
||||
__ load_method_holder(Rinterface_klass, Rmethod);
|
||||
|
||||
// Get itable index from method
|
||||
__ lwa(Rindex, in_bytes(Method::itable_index_offset()), Rmethod);
|
||||
|
@ -95,6 +95,9 @@ public:
|
||||
// Override Abstract_VM_Version implementation
|
||||
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; }
|
||||
// CPU instruction support
|
||||
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) {
|
||||
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() {
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2018 SAP SE. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019 SAP SE. 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
|
||||
@ -414,6 +414,19 @@ void InterpreterMacroAssembler::get_cache_entry_pointer_at_bcp(Register cache,
|
||||
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
|
||||
// a subtype of super_klass. Blows registers Rsuper_klass, Rsub_klass, tmp1, tmp2.
|
||||
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_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*/);
|
||||
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);
|
||||
|
@ -120,6 +120,8 @@ class InterpreterMacroAssembler: public MacroAssembler {
|
||||
// load cpool->resolved_klass_at(index)
|
||||
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
|
||||
// consumed previously by access via stackTop().
|
||||
void popx(int len);
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2018, SAP SE. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, SAP SE. 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
|
||||
@ -3130,6 +3130,33 @@ void MacroAssembler::check_klass_subtype(Register sub_klass,
|
||||
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
|
||||
// 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) {
|
||||
@ -4339,14 +4366,19 @@ void MacroAssembler::resolve_oop_handle(Register result) {
|
||||
z_lg(result, 0, result);
|
||||
}
|
||||
|
||||
void MacroAssembler::load_mirror(Register mirror, Register method) {
|
||||
mem2reg_opt(mirror, Address(method, Method::const_offset()));
|
||||
mem2reg_opt(mirror, Address(mirror, ConstMethod::constants_offset()));
|
||||
void MacroAssembler::load_mirror_from_const_method(Register mirror, Register const_method) {
|
||||
mem2reg_opt(mirror, Address(const_method, ConstMethod::constants_offset()));
|
||||
mem2reg_opt(mirror, Address(mirror, ConstantPool::pool_holder_offset_in_bytes()));
|
||||
mem2reg_opt(mirror, Address(mirror, Klass::java_mirror_offset()));
|
||||
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.
|
||||
//---------------------------------------------------------------
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* 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.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@ -713,6 +713,11 @@ class MacroAssembler: public Assembler {
|
||||
Register temp2_reg,
|
||||
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.
|
||||
// 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);
|
||||
@ -823,7 +828,8 @@ class MacroAssembler: public Assembler {
|
||||
Register Rbase = Z_R1, int pow2_offset = -1);
|
||||
|
||||
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.
|
||||
|
@ -867,6 +867,23 @@ void MachPrologNode::emit(CodeBuffer &cbuf, PhaseRegAlloc *ra_) const {
|
||||
|
||||
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.
|
||||
// We require that their callers must bang for them. But be
|
||||
// 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();
|
||||
|
||||
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();
|
||||
__ generate_stack_overflow_check(frame_size_in_bytes); // Check before creating 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.
|
||||
}
|
||||
|
||||
address c2i_entry;
|
||||
c2i_entry = gen_c2i_adapter(masm, total_args_passed, comp_args_on_stack, sig_bt, regs, skip_fixup);
|
||||
address 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
|
||||
__ 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);
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2018, SAP SE. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2016, 2019, SAP SE. 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
|
||||
@ -821,7 +821,7 @@ void TemplateInterpreterGenerator::generate_stack_overflow_check(Register frame_
|
||||
const int page_size = os::vm_page_size();
|
||||
NearLabel after_frame_check;
|
||||
|
||||
BLOCK_COMMENT("counter_overflow {");
|
||||
BLOCK_COMMENT("stack_overflow_check {");
|
||||
|
||||
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.
|
||||
__ bind(after_frame_check);
|
||||
|
||||
BLOCK_COMMENT("} counter_overflow");
|
||||
BLOCK_COMMENT("} stack_overflow_check");
|
||||
}
|
||||
|
||||
// Allocate monitor and lock method (asm interpreter).
|
||||
@ -927,7 +927,9 @@ void TemplateInterpreterGenerator::lock_method(void) {
|
||||
__ bind(static_method);
|
||||
|
||||
// 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
|
||||
{
|
||||
NearLabel L;
|
||||
@ -991,20 +993,20 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
||||
// Allocate space for locals other than the parameters, the
|
||||
// interpreter state, monitors, and the expression stack.
|
||||
|
||||
const Register local_count = Z_ARG5;
|
||||
const Register fp = Z_tmp_2;
|
||||
const Register local_count = Z_ARG5;
|
||||
const Register fp = Z_tmp_2;
|
||||
const Register const_method = Z_ARG1;
|
||||
|
||||
BLOCK_COMMENT("generate_fixed_frame {");
|
||||
|
||||
{
|
||||
// local registers
|
||||
const Register top_frame_size = Z_ARG2;
|
||||
const Register sp_after_resize = Z_ARG3;
|
||||
const Register max_stack = Z_ARG4;
|
||||
|
||||
// local_count = method->constMethod->max_locals();
|
||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
||||
__ z_llgh(local_count, Address(Z_R1_scratch, ConstMethod::size_of_locals_offset()));
|
||||
__ z_lg(const_method, Address(Z_method, Method::const_offset()));
|
||||
__ z_llgh(max_stack, Address(const_method, ConstMethod::size_of_parameters_offset()));
|
||||
__ z_sllg(Z_locals /*parameter_count bytes*/, max_stack /*parameter_count*/, LogBytesPerWord);
|
||||
|
||||
if (native_call) {
|
||||
// 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
|
||||
// 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);
|
||||
|
||||
NearLabel passing_args_on_stack;
|
||||
@ -1042,14 +1041,14 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
||||
__ bind(passing_args_on_stack);
|
||||
} else {
|
||||
// !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):
|
||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
||||
__ z_sh(local_count, Address(Z_R1_scratch, ConstMethod::size_of_parameters_offset()));
|
||||
__ z_sgr(local_count, 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
|
||||
__ 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)
|
||||
|
||||
__ add2reg(sp_after_resize, (Interpreter::stackElementSize) - (frame::z_parent_ijava_frame_abi_size), Z_esp);
|
||||
__ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
|
||||
__ z_slgr(sp_after_resize, Z_R0_scratch);
|
||||
if (!native_call) {
|
||||
__ z_sllg(Z_R0_scratch, local_count, LogBytesPerWord); // Params have already been subtracted from local_count.
|
||||
__ z_slgr(sp_after_resize, Z_R0_scratch);
|
||||
}
|
||||
|
||||
// top_frame_size = TOP_IJAVA_FRAME_ABI + max_stack + size of interpreter state
|
||||
__ add2reg(top_frame_size,
|
||||
frame::z_top_ijava_frame_abi_size +
|
||||
frame::z_ijava_state_size +
|
||||
frame::interpreter_frame_monitor_size() * wordSize,
|
||||
frame::z_ijava_state_size,
|
||||
max_stack);
|
||||
|
||||
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
|
||||
// expression stack and the arguments are already on the stack and
|
||||
// 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_sgr(frame_size, sp_after_resize);
|
||||
__ z_agr(frame_size, top_frame_size);
|
||||
@ -1136,13 +1136,12 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
||||
#endif
|
||||
|
||||
// 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.
|
||||
__ z_stg(Z_R10, _z_ijava_state_neg(sender_sp), fp);
|
||||
|
||||
// Load cp cache and save it at the and of this block.
|
||||
__ z_lg(Z_R1_scratch, Address(Z_method, Method::const_offset()));
|
||||
__ z_lg(Z_R1_scratch, Address(Z_R1_scratch, ConstMethod::constants_offset()));
|
||||
// Load cp cache and save it at the end of this block.
|
||||
__ z_lg(Z_R1_scratch, Address(const_method, ConstMethod::constants_offset()));
|
||||
__ z_lg(Z_R1_scratch, Address(Z_R1_scratch, ConstantPool::cache_offset_in_bytes()));
|
||||
|
||||
// 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.
|
||||
// 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_ijava_state->locals - i*BytesPerWord points to i-th Java local (i starts at 0)
|
||||
// z_ijava_state->locals = Z_esp + parameter_count bytes
|
||||
@ -1183,8 +1178,7 @@ void TemplateInterpreterGenerator::generate_fixed_frame(bool native_call) {
|
||||
if (native_call) {
|
||||
__ clear_reg(Z_bcp); // Must initialize. Will get written into frame where GC reads it.
|
||||
} else {
|
||||
__ z_lg(Z_bcp, method_(const));
|
||||
__ add2reg(Z_bcp, in_bytes(ConstMethod::codes_offset()));
|
||||
__ add2reg(Z_bcp, in_bytes(ConstMethod::codes_offset()), const_method);
|
||||
}
|
||||
__ 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);
|
||||
|
||||
// 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);
|
||||
|
||||
BLOCK_COMMENT("} generate_fixed_frame: initialize interpreter state");
|
||||
|
||||
//=============================================================================
|
||||
if (!native_call) {
|
||||
// Fill locals with 0x0s.
|
||||
NearLabel locals_zeroed;
|
||||
NearLabel doXC;
|
||||
|
||||
// Local_count is already num_locals_slots - num_param_slots.
|
||||
__ compare64_and_branch(local_count, (intptr_t)0L, Assembler::bcondNotHigh, locals_zeroed);
|
||||
|
||||
// Advance local_addr to point behind locals (creates positive incr. in loop).
|
||||
__ 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);
|
||||
// Start of locals: local_addr = Z_locals - locals size + 1 slot
|
||||
__ z_llgh(Z_R0_scratch, Address(const_method, ConstMethod::size_of_locals_offset()));
|
||||
__ add2reg(local_addr, BytesPerWord, Z_locals);
|
||||
__ 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);
|
||||
|
||||
if (VM_Version::has_Prefetch()) {
|
||||
__ 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);
|
||||
__ Clear_Array(local_count, local_addr, Z_ARG2);
|
||||
}
|
||||
|
||||
}
|
||||
@ -1530,8 +1483,8 @@ address TemplateInterpreterGenerator::generate_native_entry(bool synchronized) {
|
||||
Label method_is_not_static;
|
||||
__ testbit(method2_(Rmethod, access_flags), JVM_ACC_STATIC_BIT);
|
||||
__ z_bfalse(method_is_not_static);
|
||||
// Get mirror.
|
||||
__ load_mirror(Z_R1, Rmethod);
|
||||
// Load mirror from interpreter frame.
|
||||
__ z_lg(Z_R1, _z_ijava_state_neg(mirror), Z_fp);
|
||||
// z_ijava_state.oop_temp = pool_holder->klass_part()->java_mirror();
|
||||
__ z_stg(Z_R1, oop_tmp_offset, Z_fp);
|
||||
// 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
|
||||
// shift it afterwards!
|
||||
void TemplateTable::resolve_cache_and_index(int byte_no,
|
||||
Register Rcache,
|
||||
Register cache,
|
||||
Register cpe_offset,
|
||||
size_t index_size) {
|
||||
BLOCK_COMMENT("resolve_cache_and_index {");
|
||||
NearLabel resolved;
|
||||
NearLabel resolved, clinit_barrier_slow;
|
||||
const Register bytecode_in_cpcache = Z_R1_scratch;
|
||||
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();
|
||||
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");
|
||||
__ 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?
|
||||
__ compare32_and_branch(bytecode_in_cpcache, (int)code, Assembler::bcondEqual, resolved);
|
||||
}
|
||||
|
||||
// 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);
|
||||
__ load_const_optimized(Z_ARG2, (int) code);
|
||||
__ call_VM(noreg, entry, Z_ARG2);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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");
|
||||
}
|
||||
|
||||
@ -3664,9 +3677,7 @@ void TemplateTable::invokeinterface(int byte_no) {
|
||||
// Find entry point to call.
|
||||
|
||||
// Get declaring interface class from method
|
||||
__ z_lg(interface, Address(method, Method::const_offset()));
|
||||
__ z_lg(interface, Address(interface, ConstMethod::constants_offset()));
|
||||
__ z_lg(interface, Address(interface, ConstantPool::pool_holder_offset_in_bytes()));
|
||||
__ load_method_holder(interface, method);
|
||||
|
||||
// Get itable index from method
|
||||
Register index = receiver,
|
||||
|
@ -349,6 +349,9 @@ class VM_Version: public Abstract_VM_Version {
|
||||
// Override Abstract_VM_Version implementation
|
||||
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
|
||||
static const char* get_model_string() { return _model_string; }
|
||||
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).
|
||||
|
||||
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
|
||||
// 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,
|
||||
@ -2216,50 +2211,7 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
||||
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
|
||||
|
@ -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).
|
||||
|
||||
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
|
||||
// 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,
|
||||
@ -4132,50 +4127,7 @@ char* os::pd_attempt_reserve_memory_at(size_t bytes, char* requested_addr) {
|
||||
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
|
||||
|
@ -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).
|
||||
|
||||
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
|
||||
// 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,
|
||||
@ -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");
|
||||
|
||||
// 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);
|
||||
|
||||
volatile int err = errno;
|
||||
if (addr == requested_addr) {
|
||||
return addr;
|
||||
} else if (addr != NULL) {
|
||||
}
|
||||
|
||||
if (addr != NULL) {
|
||||
pd_unmap_memory(addr, bytes);
|
||||
}
|
||||
|
||||
if (log_is_enabled(Warning, os)) {
|
||||
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;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool os::pd_release_memory(char* addr, size_t bytes) {
|
||||
|
@ -40,7 +40,9 @@ struct Atomic::PlatformAdd
|
||||
{
|
||||
template<typename I, typename D>
|
||||
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
|
||||
|
||||
bwd_copy_again:
|
||||
prfm pldl1keep, [s, #-256]
|
||||
prfum pldl1keep, [s, #-256]
|
||||
stp t0, t1, [d, #-16]
|
||||
ldp t0, t1, [s, #-16]
|
||||
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_PC REG_RIP
|
||||
#define REG_FP REG_RBP
|
||||
#define SPELL_REG_SP "rsp"
|
||||
#define SPELL_REG_FP "rbp"
|
||||
#else
|
||||
#define REG_FP 29
|
||||
#define REG_LR 30
|
||||
|
||||
#define SPELL_REG_SP "sp"
|
||||
#define SPELL_REG_FP "x29"
|
||||
#endif
|
||||
|
||||
address os::current_stack_pointer() {
|
||||
register void *esp __asm__ (SPELL_REG_SP);
|
||||
return (address) esp;
|
||||
NOINLINE address os::current_stack_pointer() {
|
||||
return (address)__builtin_frame_address(0);
|
||||
}
|
||||
|
||||
char* os::non_memory_address_word() {
|
||||
@ -230,23 +224,8 @@ frame os::get_sender_for_C_frame(frame* fr) {
|
||||
#endif
|
||||
}
|
||||
|
||||
intptr_t* _get_previous_fp() {
|
||||
register intptr_t **fp __asm__ (SPELL_REG_FP);
|
||||
|
||||
// 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();
|
||||
NOINLINE frame os::current_frame() {
|
||||
intptr_t *fp = *(intptr_t **)__builtin_frame_address(0);
|
||||
frame myframe((intptr_t*)os::current_stack_pointer(),
|
||||
(intptr_t*)fp,
|
||||
CAST_FROM_FN_PTR(address, os::current_frame));
|
||||
@ -259,12 +238,6 @@ frame os::current_frame() {
|
||||
}
|
||||
|
||||
// Utility functions
|
||||
|
||||
// From IA32 System Programming Guide
|
||||
enum {
|
||||
trap_page_fault = 0xE
|
||||
};
|
||||
|
||||
#ifdef BUILTIN_SIM
|
||||
extern "C" void Fetch32PFI () ;
|
||||
extern "C" void Fetch32Resume () ;
|
||||
@ -667,42 +640,42 @@ extern "C" {
|
||||
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) {
|
||||
jshort *end = from + count;
|
||||
const jshort *end = from + count;
|
||||
while (from < end)
|
||||
*(to++) = *(from++);
|
||||
}
|
||||
else if (from < to) {
|
||||
jshort *end = from;
|
||||
const jshort *end = from;
|
||||
from += count - 1;
|
||||
to += count - 1;
|
||||
while (from >= end)
|
||||
*(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) {
|
||||
jint *end = from + count;
|
||||
const jint *end = from + count;
|
||||
while (from < end)
|
||||
*(to++) = *(from++);
|
||||
}
|
||||
else if (from < to) {
|
||||
jint *end = from;
|
||||
const jint *end = from;
|
||||
from += count - 1;
|
||||
to += count - 1;
|
||||
while (from >= end)
|
||||
*(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) {
|
||||
jlong *end = from + count;
|
||||
const jlong *end = from + count;
|
||||
while (from < end)
|
||||
os::atomic_copy64(from++, to++);
|
||||
}
|
||||
else if (from < to) {
|
||||
jlong *end = from;
|
||||
const jlong *end = from;
|
||||
from += count - 1;
|
||||
to += count - 1;
|
||||
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,
|
||||
size_t count) {
|
||||
memmove(to, from, count);
|
||||
}
|
||||
void _Copy_arrayof_conjoint_jshorts(HeapWord* from,
|
||||
void _Copy_arrayof_conjoint_jshorts(const HeapWord* from,
|
||||
HeapWord* to,
|
||||
size_t count) {
|
||||
memmove(to, from, count * 2);
|
||||
}
|
||||
void _Copy_arrayof_conjoint_jints(HeapWord* from,
|
||||
void _Copy_arrayof_conjoint_jints(const HeapWord* from,
|
||||
HeapWord* to,
|
||||
size_t count) {
|
||||
memmove(to, from, count * 4);
|
||||
}
|
||||
void _Copy_arrayof_conjoint_jlongs(HeapWord* from,
|
||||
void _Copy_arrayof_conjoint_jlongs(const HeapWord* from,
|
||||
HeapWord* to,
|
||||
size_t count) {
|
||||
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) {
|
||||
// Exception handler checks the nmethod's implicit null checks table
|
||||
// only when this method returns false.
|
||||
intptr_t int_address = reinterpret_cast<intptr_t>(address);
|
||||
intptr_t cell_header_size = Universe::heap()->cell_header_size();
|
||||
size_t region_size = os::vm_page_size() + cell_header_size;
|
||||
uintptr_t addr = reinterpret_cast<uintptr_t>(address);
|
||||
uintptr_t page_size = (uintptr_t)os::vm_page_size();
|
||||
#ifdef _LP64
|
||||
if (UseCompressedOops && CompressedOops::base() != NULL) {
|
||||
// A SEGV can legitimately happen in C2 code at address
|
||||
// (heap_base + offset) if Matcher::narrow_oop_use_complex_address
|
||||
// is configured to allow narrow oops field loads to be implicitly
|
||||
// null checked
|
||||
intptr_t start = ((intptr_t)CompressedOops::base()) - cell_header_size;
|
||||
intptr_t end = start + region_size;
|
||||
if (int_address >= start && int_address < end) {
|
||||
uintptr_t start = (uintptr_t)CompressedOops::base();
|
||||
uintptr_t end = start + page_size;
|
||||
if (addr >= start && addr < end) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
intptr_t start = -cell_header_size;
|
||||
intptr_t end = start + region_size;
|
||||
return int_address >= start && int_address < end;
|
||||
return addr < page_size;
|
||||
}
|
||||
|
||||
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
|
||||
// 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
|
||||
// an explicit null check for -1, even if it may otherwise be in the range
|
||||
// [-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;
|
||||
// an explicit null check for -1.
|
||||
|
||||
// Check if offset is outside of [-cell_header_size, os::vm_page_size)
|
||||
return offset < -Universe::heap()->cell_header_size() ||
|
||||
offset >= os::vm_page_size();
|
||||
// Check if offset is outside of [0, os::vm_page_size()]
|
||||
return offset < 0 || offset >= os::vm_page_size();
|
||||
}
|
||||
|
@ -413,6 +413,7 @@ class CodeBuffer: public StackObj {
|
||||
|| PrintMethodHandleStubs
|
||||
|| PrintInterpreter
|
||||
|| PrintSignatureHandlers
|
||||
|| UnlockDiagnosticVMOptions
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -125,6 +125,8 @@
|
||||
|
||||
#define JAVA_13_VERSION 57
|
||||
|
||||
#define JAVA_14_VERSION 58
|
||||
|
||||
void ClassFileParser::set_class_bad_constant_seen(short bad_constant) {
|
||||
assert((bad_constant == JVM_CONSTANT_Module ||
|
||||
bad_constant == JVM_CONSTANT_Package) && _major_version >= JAVA_9_VERSION,
|
||||
@ -4754,60 +4756,62 @@ static bool has_illegal_visibility(jint flags) {
|
||||
|
||||
// A legal major_version.minor_version must be one of the following:
|
||||
//
|
||||
// Major_version = 45, any minor_version.
|
||||
// Major_version >= 46 and major_version <= current_major_version and minor_version = 0.
|
||||
// Major_version = current_major_version and minor_version = 65535 and --enable-preview is present.
|
||||
// Major_version >= 45 and major_version < 56, any minor_version.
|
||||
// Major_version >= 56 and major_version <= JVM_CLASSFILE_MAJOR_VERSION and minor_version = 0.
|
||||
// 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){
|
||||
ResourceMark rm(THREAD);
|
||||
const u2 max_version = JVM_CLASSFILE_MAJOR_VERSION;
|
||||
if (major != JAVA_MIN_SUPPORTED_VERSION) { // All 45.* are ok including 45.65535
|
||||
if (minor == JAVA_PREVIEW_MINOR_VERSION) {
|
||||
if (major != max_version) {
|
||||
ResourceMark rm(THREAD);
|
||||
Exceptions::fthrow(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"%s (class file version %u.%u) was compiled with preview features that are unsupported. "
|
||||
"This version of the Java Runtime only recognizes preview features for class file version %u.%u",
|
||||
class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION, JAVA_PREVIEW_MINOR_VERSION);
|
||||
return;
|
||||
}
|
||||
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 (!Arguments::enable_preview()) {
|
||||
ResourceMark rm(THREAD);
|
||||
Exceptions::fthrow(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"Preview features are not enabled for %s (class file version %u.%u). Try running with '--enable-preview'",
|
||||
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;
|
||||
}
|
||||
|
||||
} 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(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"%s (class file version %u.%u) was compiled with an invalid non-zero minor version",
|
||||
class_name->as_C_string(), major, minor);
|
||||
}
|
||||
if (major < JAVA_12_VERSION || minor == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (minor == JAVA_PREVIEW_MINOR_VERSION) {
|
||||
if (major != max_version) {
|
||||
Exceptions::fthrow(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"%s (class file version %u.%u) was compiled with preview features that are unsupported. "
|
||||
"This version of the Java Runtime only recognizes preview features for class file version %u.%u",
|
||||
class_name->as_C_string(), major, minor, JVM_CLASSFILE_MAJOR_VERSION, JAVA_PREVIEW_MINOR_VERSION);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Arguments::enable_preview()) {
|
||||
Exceptions::fthrow(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"Preview features are not enabled for %s (class file version %u.%u). Try running with '--enable-preview'",
|
||||
class_name->as_C_string(), major, minor);
|
||||
return;
|
||||
}
|
||||
|
||||
} else { // minor != JAVA_PREVIEW_MINOR_VERSION
|
||||
Exceptions::fthrow(
|
||||
THREAD_AND_LOCATION,
|
||||
vmSymbols::java_lang_UnsupportedClassVersionError(),
|
||||
"%s (class file version %u.%u) was compiled with an invalid non-zero minor version",
|
||||
class_name->as_C_string(), major, minor);
|
||||
}
|
||||
}
|
||||
|
||||
@ -5641,11 +5645,11 @@ void ClassFileParser::fill_instance_klass(InstanceKlass* ik, bool changed_by_loa
|
||||
}
|
||||
|
||||
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)) {
|
||||
ResourceMark rm;
|
||||
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)) {
|
||||
|
@ -58,8 +58,8 @@
|
||||
const double PREF_AVG_LIST_LEN = 2.0;
|
||||
// 2^24 is max size
|
||||
const size_t END_SIZE = 24;
|
||||
// If a chain gets to 32 something might be wrong
|
||||
const size_t REHASH_LEN = 32;
|
||||
// If a chain gets to 100 something might be wrong
|
||||
const size_t REHASH_LEN = 100;
|
||||
// If we have as many dead items as 50% of the number of bucket
|
||||
const double CLEAN_DEAD_HIGH_WATER_MARK = 0.5;
|
||||
|
||||
@ -496,8 +496,9 @@ bool StringTable::do_rehash() {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We use max size
|
||||
StringTableHash* new_table = new StringTableHash(END_SIZE, END_SIZE, REHASH_LEN);
|
||||
// We use current size, not max size.
|
||||
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
|
||||
_alt_hash = true;
|
||||
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
|
||||
SymbolsDo sd(cl);
|
||||
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();
|
||||
VerifySymbols 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;
|
||||
}
|
||||
|
||||
// We use max size
|
||||
SymbolTableHash* new_table = new SymbolTableHash(END_SIZE, END_SIZE, REHASH_LEN);
|
||||
// We use current size
|
||||
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
|
||||
_alt_hash = true;
|
||||
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() {
|
||||
MutexLocker ml(SystemDictionary_lock);
|
||||
return placeholders()->statistics_calculate();
|
||||
}
|
||||
|
||||
TableStatistics SystemDictionary::loader_constraints_statistics() {
|
||||
MutexLocker ml(SystemDictionary_lock);
|
||||
return constraints()->statistics_calculate();
|
||||
}
|
||||
|
||||
TableStatistics SystemDictionary::protection_domain_cache_statistics() {
|
||||
MutexLocker ml(SystemDictionary_lock);
|
||||
return pd_cache_table()->statistics_calculate();
|
||||
}
|
||||
|
||||
|
@ -38,12 +38,12 @@
|
||||
bool AbstractDisassembler::_show_data_hex = true;
|
||||
bool AbstractDisassembler::_show_data_int = 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_offset = false;
|
||||
bool AbstractDisassembler::_show_structs = false;
|
||||
bool AbstractDisassembler::_show_comment = false;
|
||||
bool AbstractDisassembler::_show_block_comment = false;
|
||||
bool AbstractDisassembler::_show_structs = true;
|
||||
bool AbstractDisassembler::_show_comment = true;
|
||||
bool AbstractDisassembler::_show_block_comment = true;
|
||||
|
||||
// set "true" to see what's in memory bit by bit
|
||||
// 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 ((_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
|
||||
}
|
||||
print_hook_comments(pc0, _nm != NULL);
|
||||
|
@ -379,12 +379,8 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
|
||||
continue;
|
||||
}
|
||||
#ifdef ASSERT
|
||||
// We can not verify the oop here if we are using ZGC, the oop
|
||||
// will be bad in case we had a safepoint between a load and a
|
||||
// load barrier.
|
||||
if (!UseZGC &&
|
||||
((((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
|
||||
!Universe::heap()->is_in_or_null(*loc))) {
|
||||
if ((((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");
|
||||
// try to dump out some helpful debugging information
|
||||
trace_codeblob_maps(fr, reg_map);
|
||||
|
@ -2780,6 +2780,23 @@ void G1CollectedHeap::register_regions_with_region_attr() {
|
||||
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 {
|
||||
public:
|
||||
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...
|
||||
evacuate_initial_collection_set(&per_thread_states);
|
||||
|
||||
if (_collection_set.optional_region_length() != 0) {
|
||||
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();
|
||||
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);
|
||||
}
|
||||
|
@ -593,6 +593,10 @@ public:
|
||||
_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);
|
||||
|
||||
// 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;
|
||||
|
||||
stop_incremental_building();
|
||||
|
||||
_g1h->verify_region_attr_remset_update();
|
||||
|
||||
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++) {
|
||||
HeapRegion* r = candidates()->at(candidates()->cur_idx() + i);
|
||||
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->register_region_with_region_attr(r);
|
||||
r->clear_index_in_opt_cset();
|
||||
}
|
||||
free_optional_regions();
|
||||
|
||||
_g1h->verify_region_attr_remset_update();
|
||||
}
|
||||
|
||||
#ifdef ASSERT
|
||||
|
@ -257,30 +257,38 @@ void G1CMMarkStack::set_empty() {
|
||||
_free_list = NULL;
|
||||
}
|
||||
|
||||
G1CMRootRegions::G1CMRootRegions(uint const max_regions) :
|
||||
_root_regions(NEW_C_HEAP_ARRAY(HeapRegion*, max_regions, mtGC)),
|
||||
_max_regions(max_regions),
|
||||
_num_root_regions(0),
|
||||
_claimed_root_regions(0),
|
||||
_scan_in_progress(false),
|
||||
_should_abort(false) { }
|
||||
|
||||
G1CMRootRegions::~G1CMRootRegions() {
|
||||
FREE_C_HEAP_ARRAY(HeapRegion*, _max_regions);
|
||||
G1CMRootMemRegions::G1CMRootMemRegions(uint const max_regions) :
|
||||
_root_regions(NULL),
|
||||
_max_regions(max_regions),
|
||||
_num_root_regions(0),
|
||||
_claimed_root_regions(0),
|
||||
_scan_in_progress(false),
|
||||
_should_abort(false) {
|
||||
_root_regions = new MemRegion[_max_regions];
|
||||
if (_root_regions == NULL) {
|
||||
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;
|
||||
}
|
||||
|
||||
void G1CMRootRegions::add(HeapRegion* hr) {
|
||||
void G1CMRootMemRegions::add(HeapWord* start, HeapWord* end) {
|
||||
assert_at_safepoint();
|
||||
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);
|
||||
_root_regions[idx] = hr;
|
||||
assert(idx < _max_regions, "Trying to add more root MemRegions than there is space " SIZE_FORMAT, _max_regions);
|
||||
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");
|
||||
|
||||
_scan_in_progress = _num_root_regions > 0;
|
||||
@ -289,7 +297,7 @@ void G1CMRootRegions::prepare_for_scan() {
|
||||
_should_abort = false;
|
||||
}
|
||||
|
||||
HeapRegion* G1CMRootRegions::claim_next() {
|
||||
const MemRegion* G1CMRootMemRegions::claim_next() {
|
||||
if (_should_abort) {
|
||||
// If someone has set the should_abort flag, we return NULL to
|
||||
// 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;
|
||||
if (claimed_index < _num_root_regions) {
|
||||
return _root_regions[claimed_index];
|
||||
return &_root_regions[claimed_index];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uint G1CMRootRegions::num_root_regions() const {
|
||||
uint G1CMRootMemRegions::num_root_regions() const {
|
||||
return (uint)_num_root_regions;
|
||||
}
|
||||
|
||||
void G1CMRootRegions::notify_scan_done() {
|
||||
void G1CMRootMemRegions::notify_scan_done() {
|
||||
MutexLocker x(RootRegionScan_lock, Mutex::_no_safepoint_check_flag);
|
||||
_scan_in_progress = false;
|
||||
RootRegionScan_lock->notify_all();
|
||||
}
|
||||
|
||||
void G1CMRootRegions::cancel_scan() {
|
||||
void G1CMRootMemRegions::cancel_scan() {
|
||||
notify_scan_done();
|
||||
}
|
||||
|
||||
void G1CMRootRegions::scan_finished() {
|
||||
void G1CMRootMemRegions::scan_finished() {
|
||||
assert(scan_in_progress(), "pre-condition");
|
||||
|
||||
if (!_should_abort) {
|
||||
@ -333,7 +341,7 @@ void G1CMRootRegions::scan_finished() {
|
||||
notify_scan_done();
|
||||
}
|
||||
|
||||
bool G1CMRootRegions::wait_until_scan_finished() {
|
||||
bool G1CMRootMemRegions::wait_until_scan_finished() {
|
||||
if (!scan_in_progress()) {
|
||||
return false;
|
||||
}
|
||||
@ -875,14 +883,21 @@ uint G1ConcurrentMark::calc_active_marking_workers() {
|
||||
return result;
|
||||
}
|
||||
|
||||
void G1ConcurrentMark::scan_root_region(HeapRegion* hr, uint worker_id) {
|
||||
assert(hr->is_old() || (hr->is_survivor() && hr->next_top_at_mark_start() == hr->bottom()),
|
||||
"Root regions must be old or survivor but region %u is %s", hr->hrm_index(), hr->get_type_str());
|
||||
void G1ConcurrentMark::scan_root_region(const MemRegion* region, uint worker_id) {
|
||||
#ifdef ASSERT
|
||||
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);
|
||||
|
||||
const uintx interval = PrefetchScanIntervalInBytes;
|
||||
HeapWord* curr = hr->next_top_at_mark_start();
|
||||
const HeapWord* end = hr->top();
|
||||
HeapWord* curr = region->start();
|
||||
const HeapWord* end = region->end();
|
||||
while (curr < end) {
|
||||
Prefetch::read(curr, interval);
|
||||
oop obj = oop(curr);
|
||||
@ -902,11 +917,11 @@ public:
|
||||
assert(Thread::current()->is_ConcurrentGC_thread(),
|
||||
"this should only be done by a conc GC thread");
|
||||
|
||||
G1CMRootRegions* root_regions = _cm->root_regions();
|
||||
HeapRegion* hr = root_regions->claim_next();
|
||||
while (hr != NULL) {
|
||||
_cm->scan_root_region(hr, worker_id);
|
||||
hr = root_regions->claim_next();
|
||||
G1CMRootMemRegions* root_regions = _cm->root_regions();
|
||||
const MemRegion* region = root_regions->claim_next();
|
||||
while (region != NULL) {
|
||||
_cm->scan_root_region(region, worker_id);
|
||||
region = root_regions->claim_next();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -222,18 +222,20 @@ private:
|
||||
template<typename Fn> void iterate(Fn fn) const PRODUCT_RETURN;
|
||||
};
|
||||
|
||||
// Root Regions are regions that contain objects from nTAMS to top. These are roots
|
||||
// for marking, i.e. their referenced objects must be kept alive to maintain the
|
||||
// Root MemRegions are memory areas that contain objects which references are
|
||||
// roots wrt to the marking. They must be scanned before marking to maintain the
|
||||
// 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.
|
||||
// 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
|
||||
// references.
|
||||
// Root regions comprise of the complete contents of survivor regions, and any
|
||||
// objects copied into old gen during GC.
|
||||
class G1CMRootRegions {
|
||||
HeapRegion** _root_regions;
|
||||
// Root MemRegions comprise of the contents of survivor regions at the end
|
||||
// of the GC, and any objects copied into the old gen during GC.
|
||||
class G1CMRootMemRegions {
|
||||
// The set of root MemRegions.
|
||||
MemRegion* _root_regions;
|
||||
size_t const _max_regions;
|
||||
|
||||
volatile size_t _num_root_regions; // Actual number of root regions.
|
||||
@ -246,13 +248,13 @@ class G1CMRootRegions {
|
||||
void notify_scan_done();
|
||||
|
||||
public:
|
||||
G1CMRootRegions(uint const max_regions);
|
||||
~G1CMRootRegions();
|
||||
G1CMRootMemRegions(uint const max_regions);
|
||||
~G1CMRootMemRegions();
|
||||
|
||||
// Reset the data structure to allow addition of new root regions.
|
||||
void reset();
|
||||
|
||||
void add(HeapRegion* hr);
|
||||
void add(HeapWord* start, HeapWord* end);
|
||||
|
||||
// Reset the claiming / scanning of the root regions.
|
||||
void prepare_for_scan();
|
||||
@ -264,9 +266,9 @@ public:
|
||||
// false otherwise.
|
||||
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.
|
||||
HeapRegion* claim_next();
|
||||
const MemRegion* claim_next();
|
||||
|
||||
// The number of root regions to scan.
|
||||
uint num_root_regions() const;
|
||||
@ -310,7 +312,7 @@ class G1ConcurrentMark : public CHeapObj<mtGC> {
|
||||
MemRegion const _heap;
|
||||
|
||||
// Root region tracking and claiming
|
||||
G1CMRootRegions _root_regions;
|
||||
G1CMRootMemRegions _root_regions;
|
||||
|
||||
// For grey objects
|
||||
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; }
|
||||
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();
|
||||
// Abandon current marking iteration due to a Full GC.
|
||||
@ -554,8 +556,8 @@ public:
|
||||
// them.
|
||||
void scan_root_regions();
|
||||
|
||||
// Scan a single root region from nTAMS to top and mark everything reachable from it.
|
||||
void scan_root_region(HeapRegion* hr, uint worker_id);
|
||||
// Scan a single root MemRegion to mark everything reachable from it.
|
||||
void scan_root_region(const MemRegion* region, uint worker_id);
|
||||
|
||||
// Do concurrent phase of marking, to a tentative transitive closure.
|
||||
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_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_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_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;
|
||||
|
||||
// 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.
|
||||
#ifndef PRODUCT
|
||||
// Support for PromotionFailureALot. Return true if it's time to cause a
|
||||
|
@ -26,7 +26,7 @@
|
||||
#define SHARE_GC_SHARED_GCLOCKER_INLINE_HPP
|
||||
|
||||
#include "gc/shared/gcLocker.hpp"
|
||||
#include "runtime/thread.hpp"
|
||||
#include "runtime/thread.inline.hpp"
|
||||
|
||||
void GCLocker::lock_critical(JavaThread* thread) {
|
||||
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 {
|
||||
switch (opcode) {
|
||||
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_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_is_barrier_node(Node* n) 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;
|
||||
|
@ -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
|
||||
* 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);
|
||||
};
|
||||
|
||||
class ShenandoahCodeRoots : public CHeapObj<mtGC> {
|
||||
class ShenandoahCodeRoots : public AllStatic {
|
||||
friend class ShenandoahHeap;
|
||||
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.
|
||||
ShenandoahAllRootScanner rp(1, ShenandoahPhaseTimings::_num_phases);
|
||||
ObjectIterateScanRootClosure oops(&_aux_bit_map, &oop_stack);
|
||||
rp.roots_do_unchecked(&oops);
|
||||
|
||||
if (unload_classes()) {
|
||||
rp.strong_roots_do_unchecked(&oops);
|
||||
} else {
|
||||
rp.roots_do_unchecked(&oops);
|
||||
}
|
||||
|
||||
// Work through the oop stack to traverse heap.
|
||||
while (! oop_stack.is_empty()) {
|
||||
@ -1694,7 +1699,28 @@ void ShenandoahHeap::op_degenerated(ShenandoahDegenPoint point) {
|
||||
// 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
|
||||
// in preparation for evacuation anyway.
|
||||
collection_set()->clear_current_index();
|
||||
//
|
||||
// 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();
|
||||
|
||||
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();
|
||||
if (cancelled_gc()) {
|
||||
@ -2152,6 +2178,11 @@ void ShenandoahHeap::op_final_updaterefs() {
|
||||
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);
|
||||
|
||||
trash_cset_regions();
|
||||
@ -2159,7 +2190,6 @@ void ShenandoahHeap::op_final_updaterefs() {
|
||||
set_update_refs_in_progress(false);
|
||||
|
||||
if (ShenandoahVerify) {
|
||||
verifier()->verify_roots_no_forwarded();
|
||||
verifier()->verify_after_updaterefs();
|
||||
}
|
||||
|
||||
|
@ -60,8 +60,7 @@ ShenandoahSerialRoots::ShenandoahSerialRoots() :
|
||||
_object_synchronizer_root(&ObjectSynchronizer::oops_do, ShenandoahPhaseTimings::ObjectSynchronizerRoots),
|
||||
_management_root(&Management::oops_do, ShenandoahPhaseTimings::ManagementRoots),
|
||||
_system_dictionary_root(&SystemDictionary::oops_do, ShenandoahPhaseTimings::SystemDictionaryRoots),
|
||||
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots),
|
||||
_jni_handle_root(&JNIHandles::oops_do, ShenandoahPhaseTimings::JNIRoots) {
|
||||
_jvmti_root(&JvmtiExport::oops_do, ShenandoahPhaseTimings::JVMTIRoots) {
|
||||
}
|
||||
|
||||
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);
|
||||
_system_dictionary_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) {
|
||||
@ -160,6 +162,7 @@ void ShenandoahRootEvacuator::roots_do(uint worker_id, OopClosure* oops) {
|
||||
AlwaysTrueClosure always_true;
|
||||
|
||||
_serial_roots.oops_do(oops, worker_id);
|
||||
_jni_roots.oops_do(oops, worker_id);
|
||||
|
||||
_thread_roots.oops_do(oops, NULL, 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;
|
||||
|
||||
_serial_roots.oops_do(oops, worker_id);
|
||||
_jni_roots.oops_do(oops, worker_id);
|
||||
|
||||
_thread_roots.oops_do(oops, NULL, worker_id);
|
||||
_cld_roots.clds_do(&adjust_cld_closure, NULL, worker_id);
|
||||
|
@ -56,12 +56,16 @@ private:
|
||||
ShenandoahSerialRoot _management_root;
|
||||
ShenandoahSerialRoot _system_dictionary_root;
|
||||
ShenandoahSerialRoot _jvmti_root;
|
||||
ShenandoahSerialRoot _jni_handle_root;
|
||||
public:
|
||||
ShenandoahSerialRoots();
|
||||
void oops_do(OopClosure* cl, uint worker_id);
|
||||
};
|
||||
|
||||
class ShenandoahJNIHandleRoots : public ShenandoahSerialRoot {
|
||||
public:
|
||||
ShenandoahJNIHandleRoots();
|
||||
};
|
||||
|
||||
class ShenandoahThreadRoots {
|
||||
private:
|
||||
const bool _is_par;
|
||||
@ -126,6 +130,7 @@ template <typename ITR>
|
||||
class ShenandoahRootScanner : public ShenandoahRootProcessor {
|
||||
private:
|
||||
ShenandoahSerialRoots _serial_roots;
|
||||
ShenandoahJNIHandleRoots _jni_roots;
|
||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||
ShenandoahThreadRoots _thread_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);
|
||||
// For heap object iteration
|
||||
void roots_do_unchecked(OopClosure* cl);
|
||||
void strong_roots_do_unchecked(OopClosure* cl);
|
||||
};
|
||||
|
||||
typedef ShenandoahRootScanner<ShenandoahAllCodeRootsIterator> ShenandoahAllRootScanner;
|
||||
@ -152,6 +158,7 @@ typedef ShenandoahRootScanner<ShenandoahCsetCodeRootsIterator> ShenandoahCSetRoo
|
||||
class ShenandoahRootEvacuator : public ShenandoahRootProcessor {
|
||||
private:
|
||||
ShenandoahSerialRoots _serial_roots;
|
||||
ShenandoahJNIHandleRoots _jni_roots;
|
||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||
ShenandoahThreadRoots _thread_roots;
|
||||
ShenandoahWeakRoots _weak_roots;
|
||||
@ -168,6 +175,7 @@ public:
|
||||
class ShenandoahRootUpdater : public ShenandoahRootProcessor {
|
||||
private:
|
||||
ShenandoahSerialRoots _serial_roots;
|
||||
ShenandoahJNIHandleRoots _jni_roots;
|
||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||
ShenandoahThreadRoots _thread_roots;
|
||||
ShenandoahWeakRoots _weak_roots;
|
||||
@ -186,6 +194,7 @@ public:
|
||||
class ShenandoahRootAdjuster : public ShenandoahRootProcessor {
|
||||
private:
|
||||
ShenandoahSerialRoots _serial_roots;
|
||||
ShenandoahJNIHandleRoots _jni_roots;
|
||||
ShenandoahClassLoaderDataRoots _cld_roots;
|
||||
ShenandoahThreadRoots _thread_roots;
|
||||
ShenandoahWeakRoots _weak_roots;
|
||||
|
@ -99,6 +99,7 @@ void ShenandoahRootScanner<ITR>::roots_do(uint worker_id, OopClosure* oops, CLDC
|
||||
ResourceMark rm;
|
||||
|
||||
_serial_roots.oops_do(oops, worker_id);
|
||||
_jni_roots.oops_do(oops, worker_id);
|
||||
_cld_roots.clds_do(clds, clds, worker_id);
|
||||
_thread_roots.threads_do(&tc_cl, worker_id);
|
||||
|
||||
@ -118,11 +119,25 @@ void ShenandoahRootScanner<ITR>::roots_do_unchecked(OopClosure* oops) {
|
||||
ResourceMark rm;
|
||||
|
||||
_serial_roots.oops_do(oops, 0);
|
||||
_jni_roots.oops_do(oops, 0);
|
||||
_cld_roots.clds_do(&clds, &clds, 0);
|
||||
_thread_roots.threads_do(&tc_cl, 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>
|
||||
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");
|
||||
@ -130,6 +145,7 @@ void ShenandoahRootScanner<ITR>::strong_roots_do(uint worker_id, OopClosure* oop
|
||||
ResourceMark rm;
|
||||
|
||||
_serial_roots.oops_do(oops, worker_id);
|
||||
_jni_roots.oops_do(oops, worker_id);
|
||||
_cld_roots.clds_do(clds, NULL, 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;
|
||||
|
||||
_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);
|
||||
_cld_roots.clds_do(&clds, weak_clds, worker_id);
|
||||
|
@ -69,15 +69,18 @@ void ShenandoahRootVerifier::oops_do(OopClosure* oops) {
|
||||
|
||||
if (verify(SerialRoots)) {
|
||||
shenandoah_assert_safepoint();
|
||||
|
||||
Universe::oops_do(oops);
|
||||
Management::oops_do(oops);
|
||||
JvmtiExport::oops_do(oops);
|
||||
JNIHandles::oops_do(oops);
|
||||
ObjectSynchronizer::oops_do(oops);
|
||||
SystemDictionary::oops_do(oops);
|
||||
}
|
||||
|
||||
if (verify(JNIHandleRoots)) {
|
||||
shenandoah_assert_safepoint();
|
||||
JNIHandles::oops_do(oops);
|
||||
}
|
||||
|
||||
if (verify(WeakRoots)) {
|
||||
shenandoah_assert_safepoint();
|
||||
AlwaysTrueClosure always_true;
|
||||
|
@ -36,7 +36,8 @@ public:
|
||||
CLDGRoots = 1 << 3,
|
||||
WeakRoots = 1 << 4,
|
||||
StringDedupRoots = 1 << 5,
|
||||
AllRoots = (SerialRoots | ThreadRoots | CodeRoots | CLDGRoots | WeakRoots | StringDedupRoots)
|
||||
JNIHandleRoots = 1 << 6,
|
||||
AllRoots = (SerialRoots | ThreadRoots | CodeRoots | CLDGRoots | WeakRoots | StringDedupRoots | JNIHandleRoots)
|
||||
};
|
||||
|
||||
private:
|
||||
|
@ -964,6 +964,44 @@ public:
|
||||
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() {
|
||||
ShenandoahRootVerifier verifier;
|
||||
ShenandoahVerifyNoForwared cl;
|
||||
|
@ -189,6 +189,7 @@ public:
|
||||
void verify_generic(VerifyOption option);
|
||||
|
||||
// Roots should only contain to-space oops
|
||||
void verify_roots_in_to_space();
|
||||
void verify_roots_no_forwarded();
|
||||
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
|
||||
// Treat it as a LoadP and the insertion of phis will be done correctly.
|
||||
if (node->is_Load()) {
|
||||
assert(node->as_Load()->barrier_data() == 0, "Sanity");
|
||||
call_catch_cleanup_one(phase, node->as_Load(), phase->get_ctrl(node));
|
||||
} else {
|
||||
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) {
|
||||
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
|
||||
if (n->is_Load() && is_old_node) {
|
||||
LoadNode* load = n->isa_Load();
|
||||
@ -1364,14 +1371,6 @@ void ZBarrierSetC2::clean_catch_blocks(PhaseIdealLoop* phase) const {
|
||||
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);
|
||||
|
@ -471,8 +471,8 @@ void ZHeap::relocate() {
|
||||
void ZHeap::object_iterate(ObjectClosure* cl, bool visit_referents) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "Should be at safepoint");
|
||||
|
||||
ZHeapIterator iter(visit_referents);
|
||||
iter.objects_do(cl);
|
||||
ZHeapIterator iter;
|
||||
iter.objects_do(cl, visit_referents);
|
||||
}
|
||||
|
||||
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