Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
c1ee843b
D
dragonwell11
项目概览
openanolis
/
dragonwell11
通知
7
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell11
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c1ee843b
编写于
7月 05, 2017
作者:
D
duke
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
6215dcc4
c82a3963
变更
24
隐藏空白更改
内联
并排
Showing
24 changed file
with
469 addition
and
118 deletion
+469
-118
.hgtags-top-repo
.hgtags-top-repo
+1
-0
hotspot/.hgtags
hotspot/.hgtags
+2
-0
hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java
.../agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java
+23
-3
hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
...t/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
+15
-14
hotspot/make/hotspot_version
hotspot/make/hotspot_version
+1
-1
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
+8
-6
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
+12
-20
hotspot/src/share/vm/ci/ciEnv.cpp
hotspot/src/share/vm/ci/ciEnv.cpp
+11
-13
hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
+2
-0
hotspot/src/share/vm/classfile/systemDictionary.hpp
hotspot/src/share/vm/classfile/systemDictionary.hpp
+0
-1
hotspot/src/share/vm/classfile/verifier.cpp
hotspot/src/share/vm/classfile/verifier.cpp
+1
-5
hotspot/src/share/vm/classfile/vmSymbols.hpp
hotspot/src/share/vm/classfile/vmSymbols.hpp
+0
-1
hotspot/src/share/vm/interpreter/rewriter.cpp
hotspot/src/share/vm/interpreter/rewriter.cpp
+26
-24
hotspot/src/share/vm/interpreter/rewriter.hpp
hotspot/src/share/vm/interpreter/rewriter.hpp
+3
-3
hotspot/src/share/vm/runtime/globals.cpp
hotspot/src/share/vm/runtime/globals.cpp
+2
-0
hotspot/src/share/vm/runtime/globals.hpp
hotspot/src/share/vm/runtime/globals.hpp
+0
-3
hotspot/src/share/vm/runtime/reflection.cpp
hotspot/src/share/vm/runtime/reflection.cpp
+0
-12
hotspot/src/share/vm/runtime/sharedRuntime.cpp
hotspot/src/share/vm/runtime/sharedRuntime.cpp
+17
-9
hotspot/src/share/vm/runtime/sharedRuntime.hpp
hotspot/src/share/vm/runtime/sharedRuntime.hpp
+7
-0
hotspot/src/share/vm/runtime/sweeper.cpp
hotspot/src/share/vm/runtime/sweeper.cpp
+2
-1
hotspot/src/share/vm/services/threadService.cpp
hotspot/src/share/vm/services/threadService.cpp
+33
-0
hotspot/src/share/vm/services/threadService.hpp
hotspot/src/share/vm/services/threadService.hpp
+9
-1
hotspot/test/compiler/jsr292/ConcurrentClassLoadingTest.java
hotspot/test/compiler/jsr292/ConcurrentClassLoadingTest.java
+0
-1
hotspot/test/compiler/uncommontrap/TestStackBangRbp.java
hotspot/test/compiler/uncommontrap/TestStackBangRbp.java
+294
-0
未找到文件。
.hgtags-top-repo
浏览文件 @
c1ee843b
...
...
@@ -238,3 +238,4 @@ d086227bfc45d124f09b3bd72a07956b4073bf71 jdk8-b111
4f2011496393a26dcfd7b1f7787a3673ddd32599 jdk8-b114
763ada2a1d8c5962bc8c3d297e57c562d2e95338 jdk8-b115
cbfe5da942c63ef865cab4a7159e01eff7d7fcf5 jdk8-b116
a4afb0a8d55ef75aef5b0d77b434070468fb89f8 jdk8-b117
hotspot/.hgtags
浏览文件 @
c1ee843b
...
...
@@ -395,3 +395,5 @@ f6962730bbde82f279a0ae3a1c14bc5e58096c6e jdk8-b111
e510dfdec6dd701410f3398ed86ebcdff0cca63a hs25-b58
52b076e6ffae247c1c7d8b7aba995195be2b6fc2 jdk8-b116
c78d517c7ea47501b456e707afd4b78e7b5b202e hs25-b59
f573d00213b7170c2ff856f9cd83cd148437f5b9 jdk8-b117
abad3b2d905d9e1ad767c94baa94aba6ed5b207b hs25-b60
hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java
浏览文件 @
c1ee843b
...
...
@@ -24,8 +24,9 @@
package
sun.jvm.hotspot.tools
;
import
sun.jvm.hotspot.runtime.*
;
import
sun.jvm.hotspot.debugger.JVMDebugger
;
import
sun.jvm.hotspot.runtime.Arguments
;
import
sun.jvm.hotspot.runtime.VM
;
public
class
JInfo
extends
Tool
{
public
JInfo
()
{
...
...
@@ -138,14 +139,33 @@ public class JInfo extends Tool {
}
private
void
printVMFlags
()
{
VM
.
Flag
[]
flags
=
VM
.
getVM
().
getCommandLineFlags
();
System
.
out
.
print
(
"Non-default VM flags: "
);
for
(
VM
.
Flag
flag
:
flags
)
{
if
(
flag
.
getOrigin
()
==
0
)
{
// only print flags which aren't their defaults
continue
;
}
if
(
flag
.
isBool
())
{
String
onoff
=
flag
.
getBool
()
?
"+"
:
"-"
;
System
.
out
.
print
(
"-XX:"
+
onoff
+
flag
.
getName
()
+
" "
);
}
else
{
System
.
out
.
print
(
"-XX:"
+
flag
.
getName
()
+
"="
+
flag
.
getValue
()
+
" "
);
}
}
System
.
out
.
println
();
System
.
out
.
print
(
"Command line: "
);
String
str
=
Arguments
.
getJVMFlags
();
if
(
str
!=
null
)
{
System
.
out
.
print
ln
(
str
);
System
.
out
.
print
(
str
+
" "
);
}
str
=
Arguments
.
getJVMArgs
();
if
(
str
!=
null
)
{
System
.
out
.
print
ln
(
str
);
System
.
out
.
print
(
str
);
}
System
.
out
.
println
();
}
private
int
mode
;
...
...
hotspot/agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java
浏览文件 @
c1ee843b
...
...
@@ -25,11 +25,11 @@
package
sun.jvm.hotspot.tools
;
import
java.io.PrintStream
;
import
java.util.Hashtable
;
import
sun.jvm.hotspot.*
;
import
sun.jvm.hotspot.runtime.*
;
import
sun.jvm.hotspot.debugger.*
;
import
sun.jvm.hotspot.HotSpotAgent
;
import
sun.jvm.hotspot.debugger.DebuggerException
;
import
sun.jvm.hotspot.debugger.JVMDebugger
;
import
sun.jvm.hotspot.runtime.VM
;
// generic command line or GUI tool.
// override run & code main as shown below.
...
...
@@ -147,6 +147,7 @@ public abstract class Tool implements Runnable {
}
PrintStream
err
=
System
.
err
;
PrintStream
out
=
System
.
out
;
int
pid
=
0
;
String
coreFileName
=
null
;
...
...
@@ -180,18 +181,18 @@ public abstract class Tool implements Runnable {
try
{
switch
(
debugeeType
)
{
case
DEBUGEE_PID:
err
.
println
(
"Attaching to process ID "
+
pid
+
", please wait..."
);
out
.
println
(
"Attaching to process ID "
+
pid
+
", please wait..."
);
agent
.
attach
(
pid
);
break
;
case
DEBUGEE_CORE:
err
.
println
(
"Attaching to core "
+
coreFileName
+
out
.
println
(
"Attaching to core "
+
coreFileName
+
" from executable "
+
executableName
+
", please wait..."
);
agent
.
attach
(
executableName
,
coreFileName
);
break
;
case
DEBUGEE_REMOTE:
err
.
println
(
"Attaching to remote server "
+
remoteServer
+
", please wait..."
);
out
.
println
(
"Attaching to remote server "
+
remoteServer
+
", please wait..."
);
agent
.
attach
(
remoteServer
);
break
;
}
...
...
@@ -218,7 +219,7 @@ public abstract class Tool implements Runnable {
return
1
;
}
err
.
println
(
"Debugger attached successfully."
);
out
.
println
(
"Debugger attached successfully."
);
startInternal
();
return
0
;
}
...
...
@@ -237,14 +238,14 @@ public abstract class Tool implements Runnable {
// Remains of the start mechanism, common to both start methods.
private
void
startInternal
()
{
PrintStream
err
=
System
.
err
;
PrintStream
out
=
System
.
out
;
VM
vm
=
VM
.
getVM
();
if
(
vm
.
isCore
())
{
err
.
println
(
"Core build detected."
);
out
.
println
(
"Core build detected."
);
}
else
if
(
vm
.
isClientCompiler
())
{
err
.
println
(
"Client compiler detected."
);
out
.
println
(
"Client compiler detected."
);
}
else
if
(
vm
.
isServerCompiler
())
{
err
.
println
(
"Server compiler detected."
);
out
.
println
(
"Server compiler detected."
);
}
else
{
throw
new
RuntimeException
(
"Fatal error: "
+
"should have been able to detect core/C1/C2 build"
);
...
...
@@ -252,8 +253,8 @@ public abstract class Tool implements Runnable {
String
version
=
vm
.
getVMRelease
();
if
(
version
!=
null
)
{
err
.
print
(
"JVM version is "
);
err
.
println
(
version
);
out
.
print
(
"JVM version is "
);
out
.
println
(
version
);
}
run
();
...
...
hotspot/make/hotspot_version
浏览文件 @
c1ee843b
...
...
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2013
HS_MAJOR_VER=25
HS_MINOR_VER=0
HS_BUILD_NUMBER=
59
HS_BUILD_NUMBER=
60
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
...
...
hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp
浏览文件 @
c1ee843b
...
...
@@ -3001,6 +3001,10 @@ void SharedRuntime::generate_deopt_blob() {
// sp should be pointing at the return address to the caller (3)
// Pick up the initial fp we should save
// restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved)
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Stack bang to make sure there's enough room for these interpreter frames.
if
(
UseStackBanging
)
{
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
total_frame_sizes_offset_in_bytes
()));
...
...
@@ -3020,9 +3024,6 @@ void SharedRuntime::generate_deopt_blob() {
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
number_of_frames_offset_in_bytes
()));
__
movl
(
counter
,
rbx
);
// Pick up the initial fp we should save
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Now adjust the caller's stack to make up for the extra locals
// but record the original sp so that we can save it in the skeletal interpreter
// frame and the stack walking of interpreter_sender will get the unextended sp
...
...
@@ -3220,6 +3221,10 @@ void SharedRuntime::generate_uncommon_trap_blob() {
// sp should be pointing at the return address to the caller (3)
// Pick up the initial fp we should save
// restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved)
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Stack bang to make sure there's enough room for these interpreter frames.
if
(
UseStackBanging
)
{
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
total_frame_sizes_offset_in_bytes
()));
...
...
@@ -3240,9 +3245,6 @@ void SharedRuntime::generate_uncommon_trap_blob() {
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
number_of_frames_offset_in_bytes
()));
__
movl
(
counter
,
rbx
);
// Pick up the initial fp we should save
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Now adjust the caller's stack to make up for the extra locals
// but record the original sp so that we can save it in the skeletal interpreter
// frame and the stack walking of interpreter_sender will get the unextended sp
...
...
hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp
浏览文件 @
c1ee843b
...
...
@@ -3471,6 +3471,10 @@ void SharedRuntime::generate_deopt_blob() {
// rsp should be pointing at the return address to the caller (3)
// Pick up the initial fp we should save
// restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved)
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Stack bang to make sure there's enough room for these interpreter frames.
if
(
UseStackBanging
)
{
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
total_frame_sizes_offset_in_bytes
()));
...
...
@@ -3489,9 +3493,6 @@ void SharedRuntime::generate_deopt_blob() {
// Load counter into rdx
__
movl
(
rdx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
number_of_frames_offset_in_bytes
()));
// Pick up the initial fp we should save
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Now adjust the caller's stack to make up for the extra locals
// but record the original sp so that we can save it in the skeletal interpreter
// frame and the stack walking of interpreter_sender will get the unextended sp
...
...
@@ -3663,6 +3664,10 @@ void SharedRuntime::generate_uncommon_trap_blob() {
// rsp should be pointing at the return address to the caller (3)
// Pick up the initial fp we should save
// restore rbp before stack bang because if stack overflow is thrown it needs to be pushed (and preserved)
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
// Stack bang to make sure there's enough room for these interpreter frames.
if
(
UseStackBanging
)
{
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
total_frame_sizes_offset_in_bytes
()));
...
...
@@ -3670,27 +3675,16 @@ void SharedRuntime::generate_uncommon_trap_blob() {
}
// Load address of array of frame pcs into rcx (address*)
__
movptr
(
rcx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
frame_pcs_offset_in_bytes
()));
__
movptr
(
rcx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
frame_pcs_offset_in_bytes
()));
// Trash the return pc
__
addptr
(
rsp
,
wordSize
);
// Load address of array of frame sizes into rsi (intptr_t*)
__
movptr
(
rsi
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
frame_sizes_offset_in_bytes
()));
__
movptr
(
rsi
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
frame_sizes_offset_in_bytes
()));
// Counter
__
movl
(
rdx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
number_of_frames_offset_in_bytes
()));
// (int)
// Pick up the initial fp we should save
__
movptr
(
rbp
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
initial_info_offset_in_bytes
()));
__
movl
(
rdx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
number_of_frames_offset_in_bytes
()));
// (int)
// Now adjust the caller's stack to make up for the extra locals but
// record the original sp so that we can save it in the skeletal
...
...
@@ -3700,9 +3694,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
const
Register
sender_sp
=
r8
;
__
mov
(
sender_sp
,
rsp
);
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
caller_adjustment_offset_in_bytes
()));
// (int)
__
movl
(
rbx
,
Address
(
rdi
,
Deoptimization
::
UnrollBlock
::
caller_adjustment_offset_in_bytes
()));
// (int)
__
subptr
(
rsp
,
rbx
);
// Push interpreter frames in a loop
...
...
hotspot/src/share/vm/ci/ciEnv.cpp
浏览文件 @
c1ee843b
...
...
@@ -1003,21 +1003,15 @@ void ciEnv::register_method(ciMethod* target,
// Free codeBlobs
code_buffer
->
free_blob
();
if
(
nm
==
NULL
)
{
// The CodeCache is full. Print out warning and disable compilation.
record_failure
(
"code cache is full"
);
{
MutexUnlocker
ml
(
Compile_lock
);
MutexUnlocker
locker
(
MethodCompileQueue_lock
);
CompileBroker
::
handle_full_code_cache
();
}
}
else
{
if
(
nm
!=
NULL
)
{
nm
->
set_has_unsafe_access
(
has_unsafe_access
);
nm
->
set_has_wide_vectors
(
has_wide_vectors
);
// Record successful registration.
// (Put nm into the task handle *before* publishing to the Java heap.)
if
(
task
()
!=
NULL
)
task
()
->
set_code
(
nm
);
if
(
task
()
!=
NULL
)
{
task
()
->
set_code
(
nm
);
}
if
(
entry_bci
==
InvocationEntryBci
)
{
if
(
TieredCompilation
)
{
...
...
@@ -1055,12 +1049,16 @@ void ciEnv::register_method(ciMethod* target,
method
->
method_holder
()
->
add_osr_nmethod
(
nm
);
}
}
}
// JVMTI -- compiled method notification (must be done outside lock)
}
// safepoints are allowed again
if
(
nm
!=
NULL
)
{
// JVMTI -- compiled method notification (must be done outside lock)
nm
->
post_compiled_method_load_event
();
}
else
{
// The CodeCache is full. Print out warning and disable compilation.
record_failure
(
"code cache is full"
);
CompileBroker
::
handle_full_code_cache
();
}
}
...
...
hotspot/src/share/vm/classfile/metadataOnStackMark.cpp
浏览文件 @
c1ee843b
...
...
@@ -30,6 +30,7 @@
#include "prims/jvmtiImpl.hpp"
#include "runtime/synchronizer.hpp"
#include "runtime/thread.hpp"
#include "services/threadService.hpp"
#include "utilities/growableArray.hpp"
...
...
@@ -50,6 +51,7 @@ MetadataOnStackMark::MetadataOnStackMark() {
CodeCache
::
alive_nmethods_do
(
nmethod
::
mark_on_stack
);
CompileBroker
::
mark_on_stack
();
JvmtiCurrentBreakpoints
::
metadata_do
(
Metadata
::
mark_on_stack
);
ThreadService
::
metadata_do
(
Metadata
::
mark_on_stack
);
}
MetadataOnStackMark
::~
MetadataOnStackMark
()
{
...
...
hotspot/src/share/vm/classfile/systemDictionary.hpp
浏览文件 @
c1ee843b
...
...
@@ -141,7 +141,6 @@ class SymbolPropertyTable;
/* NOTE: needed too early in bootstrapping process to have checks based on JDK version */
\
/* Universe::is_gte_jdk14x_version() is not set up by this point. */
\
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */
\
do_klass(lambda_MagicLambdaImpl_klass, java_lang_invoke_MagicLambdaImpl, Opt ) \
do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \
do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
...
...
hotspot/src/share/vm/classfile/verifier.cpp
浏览文件 @
c1ee843b
...
...
@@ -188,10 +188,8 @@ bool Verifier::verify(instanceKlassHandle klass, Verifier::Mode mode, bool shoul
bool
Verifier
::
is_eligible_for_verification
(
instanceKlassHandle
klass
,
bool
should_verify_class
)
{
Symbol
*
name
=
klass
->
name
();
Klass
*
refl_magic_klass
=
SystemDictionary
::
reflect_MagicAccessorImpl_klass
();
Klass
*
lambda_magic_klass
=
SystemDictionary
::
lambda_MagicLambdaImpl_klass
();
bool
is_reflect
=
refl_magic_klass
!=
NULL
&&
klass
->
is_subtype_of
(
refl_magic_klass
);
bool
is_lambda
=
lambda_magic_klass
!=
NULL
&&
klass
->
is_subtype_of
(
lambda_magic_klass
);
return
(
should_verify_for
(
klass
->
class_loader
(),
should_verify_class
)
&&
// return if the class is a bootstrapping class
...
...
@@ -215,9 +213,7 @@ bool Verifier::is_eligible_for_verification(instanceKlassHandle klass, bool shou
// NOTE: this is called too early in the bootstrapping process to be
// guarded by Universe::is_gte_jdk14x_version()/UseNewReflection.
// Also for lambda generated code, gte jdk8
(
!
is_reflect
||
VerifyReflectionBytecodes
)
&&
(
!
is_lambda
||
VerifyLambdaBytecodes
)
);
(
!
is_reflect
||
VerifyReflectionBytecodes
));
}
Symbol
*
Verifier
::
inference_verify
(
...
...
hotspot/src/share/vm/classfile/vmSymbols.hpp
浏览文件 @
c1ee843b
...
...
@@ -273,7 +273,6 @@
template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \
template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \
template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \
template(java_lang_invoke_MagicLambdaImpl, "java/lang/invoke/MagicLambdaImpl") \
/* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */
\
template(findMethodHandleType_name, "findMethodHandleType") \
template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \
...
...
hotspot/src/share/vm/interpreter/rewriter.cpp
浏览文件 @
c1ee843b
...
...
@@ -70,12 +70,14 @@ void Rewriter::compute_index_maps() {
}
// Unrewrite the bytecodes if an error occurs.
void
Rewriter
::
restore_bytecodes
(
TRAPS
)
{
void
Rewriter
::
restore_bytecodes
()
{
int
len
=
_methods
->
length
();
bool
invokespecial_error
=
false
;
for
(
int
i
=
len
-
1
;
i
>=
0
;
i
--
)
{
Method
*
method
=
_methods
->
at
(
i
);
scan_method
(
method
,
true
,
CHECK
);
scan_method
(
method
,
true
,
&
invokespecial_error
);
assert
(
!
invokespecial_error
,
"reversing should not get an invokespecial error"
);
}
}
...
...
@@ -160,22 +162,21 @@ void Rewriter::rewrite_member_reference(address bcp, int offset, bool reverse) {
// These cannot share cpCache entries. It's unclear if all invokespecial to
// InterfaceMethodrefs would resolve to the same thing so a new cpCache entry
// is created for each one. This was added with lambda.
void
Rewriter
::
rewrite_invokespecial
(
address
bcp
,
int
offset
,
bool
reverse
,
TRAPS
)
{
static
int
count
=
0
;
void
Rewriter
::
rewrite_invokespecial
(
address
bcp
,
int
offset
,
bool
reverse
,
bool
*
invokespecial_error
)
{
address
p
=
bcp
+
offset
;
if
(
!
reverse
)
{
int
cp_index
=
Bytes
::
get_Java_u2
(
p
);
if
(
_pool
->
tag_at
(
cp_index
).
is_interface_method
())
{
int
cache_index
=
add_invokespecial_cp_cache_entry
(
cp_index
);
if
(
cache_index
!=
(
int
)(
jushort
)
cache_index
)
{
THROW_MSG
(
vmSymbols
::
java_lang_InternalError
(),
"This classfile overflows invokespecial for interfaces "
"and cannot be loaded"
);
*
invokespecial_error
=
true
;
}
Bytes
::
put_native_u2
(
p
,
cache_index
);
}
else
{
int
cache_index
=
Bytes
::
get_native_u2
(
p
);
int
cp_index
=
cp_cache_entry_pool_index
(
cache_index
);
Bytes
::
put_Java_u2
(
p
,
cp_index
);
rewrite_member_reference
(
bcp
,
offset
,
reverse
);
}
}
else
{
rewrite_member_reference
(
bcp
,
offset
,
reverse
);
}
}
...
...
@@ -329,7 +330,7 @@ void Rewriter::maybe_rewrite_ldc(address bcp, int offset, bool is_wide,
// Rewrites a method given the index_map information
void
Rewriter
::
scan_method
(
Method
*
method
,
bool
reverse
,
TRAPS
)
{
void
Rewriter
::
scan_method
(
Method
*
method
,
bool
reverse
,
bool
*
invokespecial_error
)
{
int
nof_jsrs
=
0
;
bool
has_monitor_bytecodes
=
false
;
...
...
@@ -391,15 +392,7 @@ void Rewriter::scan_method(Method* method, bool reverse, TRAPS) {
}
case
Bytecodes
::
_invokespecial
:
{
int
offset
=
prefix_length
+
1
;
address
p
=
bcp
+
offset
;
int
cp_index
=
Bytes
::
get_Java_u2
(
p
);
// InterfaceMethodref
if
(
_pool
->
tag_at
(
cp_index
).
is_interface_method
())
{
rewrite_invokespecial
(
bcp
,
offset
,
reverse
,
CHECK
);
}
else
{
rewrite_member_reference
(
bcp
,
offset
,
reverse
);
}
rewrite_invokespecial
(
bcp
,
prefix_length
+
1
,
reverse
,
invokespecial_error
);
break
;
}
...
...
@@ -496,11 +489,20 @@ Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Me
// rewrite methods, in two passes
int
len
=
_methods
->
length
();
bool
invokespecial_error
=
false
;
for
(
int
i
=
len
-
1
;
i
>=
0
;
i
--
)
{
Method
*
method
=
_methods
->
at
(
i
);
scan_method
(
method
,
false
,
CHECK
);
// If you get an error here,
// there is no reversing bytecodes
scan_method
(
method
,
false
,
&
invokespecial_error
);
if
(
invokespecial_error
)
{
// If you get an error here, there is no reversing bytecodes
// This exception is stored for this class and no further attempt is
// made at verifying or rewriting.
THROW_MSG
(
vmSymbols
::
java_lang_InternalError
(),
"This classfile overflows invokespecial for interfaces "
"and cannot be loaded"
);
return
;
}
}
// May have to fix invokedynamic bytecodes if invokestatic/InterfaceMethodref
...
...
@@ -513,7 +515,7 @@ Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Me
// Restore bytecodes to their unrewritten state if there are exceptions
// rewriting bytecodes or allocating the cpCache
if
(
HAS_PENDING_EXCEPTION
)
{
restore_bytecodes
(
CATCH
);
restore_bytecodes
();
return
;
}
...
...
@@ -530,7 +532,7 @@ Rewriter::Rewriter(instanceKlassHandle klass, constantPoolHandle cpool, Array<Me
// relocating bytecodes. If some are relocated, that is ok because that
// doesn't affect constant pool to cpCache rewriting.
if
(
HAS_PENDING_EXCEPTION
)
{
restore_bytecodes
(
CATCH
);
restore_bytecodes
();
return
;
}
// Method might have gotten rewritten.
...
...
hotspot/src/share/vm/interpreter/rewriter.hpp
浏览文件 @
c1ee843b
...
...
@@ -189,18 +189,18 @@ class Rewriter: public StackObj {
void
compute_index_maps
();
void
make_constant_pool_cache
(
TRAPS
);
void
scan_method
(
Method
*
m
,
bool
reverse
,
TRAPS
);
void
scan_method
(
Method
*
m
,
bool
reverse
,
bool
*
invokespecial_error
);
void
rewrite_Object_init
(
methodHandle
m
,
TRAPS
);
void
rewrite_member_reference
(
address
bcp
,
int
offset
,
bool
reverse
);
void
maybe_rewrite_invokehandle
(
address
opc
,
int
cp_index
,
int
cache_index
,
bool
reverse
);
void
rewrite_invokedynamic
(
address
bcp
,
int
offset
,
bool
reverse
);
void
maybe_rewrite_ldc
(
address
bcp
,
int
offset
,
bool
is_wide
,
bool
reverse
);
void
rewrite_invokespecial
(
address
bcp
,
int
offset
,
bool
reverse
,
TRAPS
);
void
rewrite_invokespecial
(
address
bcp
,
int
offset
,
bool
reverse
,
bool
*
invokespecial_error
);
void
patch_invokedynamic_bytecodes
();
// Revert bytecodes in case of an exception.
void
restore_bytecodes
(
TRAPS
);
void
restore_bytecodes
();
static
methodHandle
rewrite_jsrs
(
methodHandle
m
,
TRAPS
);
public:
...
...
hotspot/src/share/vm/runtime/globals.cpp
浏览文件 @
c1ee843b
...
...
@@ -321,6 +321,8 @@ void Flag::print_kind(outputStream* st) {
{
KIND_PRODUCT
,
"product"
},
{
KIND_MANAGEABLE
,
"manageable"
},
{
KIND_DIAGNOSTIC
,
"diagnostic"
},
{
KIND_EXPERIMENTAL
,
"experimental"
},
{
KIND_COMMERCIAL
,
"commercial"
},
{
KIND_NOT_PRODUCT
,
"notproduct"
},
{
KIND_DEVELOP
,
"develop"
},
{
KIND_LP64_PRODUCT
,
"lp64_product"
},
...
...
hotspot/src/share/vm/runtime/globals.hpp
浏览文件 @
c1ee843b
...
...
@@ -3622,9 +3622,6 @@ class CommandLineFlags {
"Temporary flag for transition to AbstractMethodError wrapped " \
"in InvocationTargetException. See 6531596") \
\
develop(bool, VerifyLambdaBytecodes, false, \
"Force verification of jdk 8 lambda metafactory bytecodes") \
\
develop(intx, FastSuperclassLimit, 8, \
"Depth of hardwired instanceof accelerator array") \
\
...
...
hotspot/src/share/vm/runtime/reflection.cpp
浏览文件 @
c1ee843b
...
...
@@ -470,12 +470,6 @@ bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, boo
return
true
;
}
// Also allow all accesses from
// java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
if
(
current_class
->
is_subclass_of
(
SystemDictionary
::
lambda_MagicLambdaImpl_klass
()))
{
return
true
;
}
return
can_relax_access_check_for
(
current_class
,
new_class
,
classloader_only
);
}
...
...
@@ -570,12 +564,6 @@ bool Reflection::verify_field_access(Klass* current_class,
return
true
;
}
// Also allow all accesses from
// java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
if
(
current_class
->
is_subclass_of
(
SystemDictionary
::
lambda_MagicLambdaImpl_klass
()))
{
return
true
;
}
return
can_relax_access_check_for
(
current_class
,
field_class
,
classloader_only
);
}
...
...
hotspot/src/share/vm/runtime/sharedRuntime.cpp
浏览文件 @
c1ee843b
...
...
@@ -84,6 +84,7 @@
// Shared stub locations
RuntimeStub
*
SharedRuntime
::
_wrong_method_blob
;
RuntimeStub
*
SharedRuntime
::
_wrong_method_abstract_blob
;
RuntimeStub
*
SharedRuntime
::
_ic_miss_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_opt_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_virtual_call_blob
;
...
...
@@ -101,11 +102,12 @@ UncommonTrapBlob* SharedRuntime::_uncommon_trap_blob;
//----------------------------generate_stubs-----------------------------------
void
SharedRuntime
::
generate_stubs
()
{
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_wrong_method_abstract_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_abstract
),
"wrong_method_abstract_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
#ifdef COMPILER2
// Vectors are generated only by C2.
...
...
@@ -1345,6 +1347,11 @@ JRT_BLOCK_ENTRY(address, SharedRuntime::handle_wrong_method(JavaThread* thread))
return
callee_method
->
verified_code_entry
();
JRT_END
// Handle abstract method call
JRT_BLOCK_ENTRY
(
address
,
SharedRuntime
::
handle_wrong_method_abstract
(
JavaThread
*
thread
))
return
StubRoutines
::
throw_AbstractMethodError_entry
();
JRT_END
// resolve a static call and patch code
JRT_BLOCK_ENTRY
(
address
,
SharedRuntime
::
resolve_static_call_C
(
JavaThread
*
thread
))
...
...
@@ -2341,12 +2348,13 @@ void AdapterHandlerLibrary::initialize() {
// Create a special handler for abstract methods. Abstract methods
// are never compiled so an i2c entry is somewhat meaningless, but
// fill it in with something appropriate just in case. Pass handle
// wrong method for the c2i transitions.
address
wrong_method
=
SharedRuntime
::
get_handle_wrong_method_stub
();
// throw AbstractMethodError just in case.
// Pass wrong_method_abstract for the c2i transitions to return
// AbstractMethodError for invalid invocations.
address
wrong_method_abstract
=
SharedRuntime
::
get_handle_wrong_method_abstract_stub
();
_abstract_method_handler
=
AdapterHandlerLibrary
::
new_entry
(
new
AdapterFingerPrint
(
0
,
NULL
),
StubRoutines
::
throw_AbstractMethodError_entry
(),
wrong_method
,
wrong_method
);
wrong_method
_abstract
,
wrong_method_abstract
);
}
AdapterHandlerEntry
*
AdapterHandlerLibrary
::
new_entry
(
AdapterFingerPrint
*
fingerprint
,
...
...
hotspot/src/share/vm/runtime/sharedRuntime.hpp
浏览文件 @
c1ee843b
...
...
@@ -56,6 +56,7 @@ class SharedRuntime: AllStatic {
// Shared stub locations
static
RuntimeStub
*
_wrong_method_blob
;
static
RuntimeStub
*
_wrong_method_abstract_blob
;
static
RuntimeStub
*
_ic_miss_blob
;
static
RuntimeStub
*
_resolve_opt_virtual_call_blob
;
static
RuntimeStub
*
_resolve_virtual_call_blob
;
...
...
@@ -206,6 +207,11 @@ class SharedRuntime: AllStatic {
return
_wrong_method_blob
->
entry_point
();
}
static
address
get_handle_wrong_method_abstract_stub
()
{
assert
(
_wrong_method_abstract_blob
!=
NULL
,
"oops"
);
return
_wrong_method_abstract_blob
->
entry_point
();
}
#ifdef COMPILER2
static
void
generate_uncommon_trap_blob
(
void
);
static
UncommonTrapBlob
*
uncommon_trap_blob
()
{
return
_uncommon_trap_blob
;
}
...
...
@@ -481,6 +487,7 @@ class SharedRuntime: AllStatic {
// handle ic miss with caller being compiled code
// wrong method handling (inline cache misses, zombie methods)
static
address
handle_wrong_method
(
JavaThread
*
thread
);
static
address
handle_wrong_method_abstract
(
JavaThread
*
thread
);
static
address
handle_wrong_method_ic_miss
(
JavaThread
*
thread
);
#ifndef PRODUCT
...
...
hotspot/src/share/vm/runtime/sweeper.cpp
浏览文件 @
c1ee843b
...
...
@@ -231,7 +231,8 @@ void NMethodSweeper::mark_active_nmethods() {
*/
void
NMethodSweeper
::
possibly_sweep
()
{
assert
(
JavaThread
::
current
()
->
thread_state
()
==
_thread_in_vm
,
"must run in vm mode"
);
if
(
!
MethodFlushing
||
!
sweep_in_progress
())
{
// Only compiler threads are allowed to sweep
if
(
!
MethodFlushing
||
!
sweep_in_progress
()
||
!
Thread
::
current
()
->
is_Compiler_thread
())
{
return
;
}
...
...
hotspot/src/share/vm/services/threadService.cpp
浏览文件 @
c1ee843b
...
...
@@ -200,6 +200,12 @@ void ThreadService::oops_do(OopClosure* f) {
}
}
void
ThreadService
::
metadata_do
(
void
f
(
Metadata
*
))
{
for
(
ThreadDumpResult
*
dump
=
_threaddump_list
;
dump
!=
NULL
;
dump
=
dump
->
next
())
{
dump
->
metadata_do
(
f
);
}
}
void
ThreadService
::
add_thread_dump
(
ThreadDumpResult
*
dump
)
{
MutexLocker
ml
(
Management_lock
);
if
(
_threaddump_list
==
NULL
)
{
...
...
@@ -451,9 +457,16 @@ void ThreadDumpResult::oops_do(OopClosure* f) {
}
}
void
ThreadDumpResult
::
metadata_do
(
void
f
(
Metadata
*
))
{
for
(
ThreadSnapshot
*
ts
=
_snapshots
;
ts
!=
NULL
;
ts
=
ts
->
next
())
{
ts
->
metadata_do
(
f
);
}
}
StackFrameInfo
::
StackFrameInfo
(
javaVFrame
*
jvf
,
bool
with_lock_info
)
{
_method
=
jvf
->
method
();
_bci
=
jvf
->
bci
();
_class_holder
=
_method
->
method_holder
()
->
klass_holder
();
_locked_monitors
=
NULL
;
if
(
with_lock_info
)
{
ResourceMark
rm
;
...
...
@@ -477,6 +490,11 @@ void StackFrameInfo::oops_do(OopClosure* f) {
f
->
do_oop
((
oop
*
)
_locked_monitors
->
adr_at
(
i
));
}
}
f
->
do_oop
(
&
_class_holder
);
}
void
StackFrameInfo
::
metadata_do
(
void
f
(
Metadata
*
))
{
f
(
_method
);
}
void
StackFrameInfo
::
print_on
(
outputStream
*
st
)
const
{
...
...
@@ -620,6 +638,14 @@ void ThreadStackTrace::oops_do(OopClosure* f) {
}
}
void
ThreadStackTrace
::
metadata_do
(
void
f
(
Metadata
*
))
{
int
length
=
_frames
->
length
();
for
(
int
i
=
0
;
i
<
length
;
i
++
)
{
_frames
->
at
(
i
)
->
metadata_do
(
f
);
}
}
ConcurrentLocksDump
::~
ConcurrentLocksDump
()
{
if
(
_retain_map_on_free
)
{
return
;
...
...
@@ -823,6 +849,13 @@ void ThreadSnapshot::oops_do(OopClosure* f) {
}
}
void
ThreadSnapshot
::
metadata_do
(
void
f
(
Metadata
*
))
{
if
(
_stack_trace
!=
NULL
)
{
_stack_trace
->
metadata_do
(
f
);
}
}
DeadlockCycle
::
DeadlockCycle
()
{
_is_deadlock
=
false
;
_threads
=
new
(
ResourceObj
::
C_HEAP
,
mtInternal
)
GrowableArray
<
JavaThread
*>
(
INITIAL_ARRAY_SIZE
,
true
);
...
...
hotspot/src/share/vm/services/threadService.hpp
浏览文件 @
c1ee843b
...
...
@@ -113,6 +113,7 @@ public:
// GC support
static
void
oops_do
(
OopClosure
*
f
);
static
void
metadata_do
(
void
f
(
Metadata
*
));
};
// Per-thread Statistics for synchronization
...
...
@@ -242,6 +243,7 @@ public:
void
dump_stack_at_safepoint
(
int
max_depth
,
bool
with_locked_monitors
);
void
set_concurrent_locks
(
ThreadConcurrentLocks
*
l
)
{
_concurrent_locks
=
l
;
}
void
oops_do
(
OopClosure
*
f
);
void
metadata_do
(
void
f
(
Metadata
*
));
};
class
ThreadStackTrace
:
public
CHeapObj
<
mtInternal
>
{
...
...
@@ -265,6 +267,7 @@ class ThreadStackTrace : public CHeapObj<mtInternal> {
void
dump_stack_at_safepoint
(
int
max_depth
);
Handle
allocate_fill_stack_trace_element_array
(
TRAPS
);
void
oops_do
(
OopClosure
*
f
);
void
metadata_do
(
void
f
(
Metadata
*
));
GrowableArray
<
oop
>*
jni_locked_monitors
()
{
return
_jni_locked_monitors
;
}
int
num_jni_locked_monitors
()
{
return
(
_jni_locked_monitors
!=
NULL
?
_jni_locked_monitors
->
length
()
:
0
);
}
...
...
@@ -280,6 +283,9 @@ class StackFrameInfo : public CHeapObj<mtInternal> {
Method
*
_method
;
int
_bci
;
GrowableArray
<
oop
>*
_locked_monitors
;
// list of object monitors locked by this frame
// We need to save the mirrors in the backtrace to keep the class
// from being unloaded while we still have this stack trace.
oop
_class_holder
;
public:
...
...
@@ -289,9 +295,10 @@ class StackFrameInfo : public CHeapObj<mtInternal> {
delete
_locked_monitors
;
}
};
Method
*
method
()
const
{
return
_method
;
}
Method
*
method
()
const
{
return
_method
;
}
int
bci
()
const
{
return
_bci
;
}
void
oops_do
(
OopClosure
*
f
);
void
metadata_do
(
void
f
(
Metadata
*
));
int
num_locked_monitors
()
{
return
(
_locked_monitors
!=
NULL
?
_locked_monitors
->
length
()
:
0
);
}
GrowableArray
<
oop
>*
locked_monitors
()
{
return
_locked_monitors
;
}
...
...
@@ -354,6 +361,7 @@ class ThreadDumpResult : public StackObj {
int
num_snapshots
()
{
return
_num_snapshots
;
}
ThreadSnapshot
*
snapshots
()
{
return
_snapshots
;
}
void
oops_do
(
OopClosure
*
f
);
void
metadata_do
(
void
f
(
Metadata
*
));
};
class
DeadlockCycle
:
public
CHeapObj
<
mtInternal
>
{
...
...
hotspot/test/compiler/jsr292/ConcurrentClassLoadingTest.java
浏览文件 @
c1ee843b
...
...
@@ -172,7 +172,6 @@ public class ConcurrentClassLoadingTest {
"java.lang.invoke.LambdaConversionException"
,
"java.lang.invoke.LambdaForm"
,
"java.lang.invoke.LambdaMetafactory"
,
"java.lang.invoke.MagicLambdaImpl"
,
"java.lang.invoke.MemberName"
,
"java.lang.invoke.MethodHandle"
,
"java.lang.invoke.MethodHandleImpl"
,
...
...
hotspot/test/compiler/uncommontrap/TestStackBangRbp.java
0 → 100644
浏览文件 @
c1ee843b
/*
* Copyright (c) 2013, 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.
*/
/*
* @test
* @bug 8028308
* @summary rbp not restored when stack overflow is thrown from deopt/uncommon trap blobs
* @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=dontinline,TestStackBangRbp::m1 -XX:CompileCommand=exclude,TestStackBangRbp::m2 -Xss256K -XX:-UseOnStackReplacement TestStackBangRbp
*
*/
public
class
TestStackBangRbp
{
static
class
UnloadedClass1
{
}
static
class
UnloadedClass2
{
}
static
Object
m1
(
boolean
deopt
)
{
long
l0
,
l1
,
l2
,
l3
,
l4
,
l5
,
l6
,
l7
,
l8
,
l9
,
l10
,
l11
,
l12
,
l13
,
l14
,
l15
,
l16
,
l17
,
l18
,
l19
,
l20
,
l21
,
l22
,
l23
,
l24
,
l25
,
l26
,
l27
,
l28
,
l29
,
l30
,
l31
,
l32
,
l33
,
l34
,
l35
,
l36
,
l37
,
l38
,
l39
,
l40
,
l41
,
l42
,
l43
,
l44
,
l45
,
l46
,
l47
,
l48
,
l49
,
l50
,
l51
,
l52
,
l53
,
l54
,
l55
,
l56
,
l57
,
l58
,
l59
,
l60
,
l61
,
l62
,
l63
,
l64
,
l65
,
l66
,
l67
,
l68
,
l69
,
l70
,
l71
,
l72
,
l73
,
l74
,
l75
,
l76
,
l77
,
l78
,
l79
,
l80
,
l81
,
l82
,
l83
,
l84
,
l85
,
l86
,
l87
,
l88
,
l89
,
l90
,
l91
,
l92
,
l93
,
l94
,
l95
,
l96
,
l97
,
l98
,
l99
,
l100
,
l101
,
l102
,
l103
,
l104
,
l105
,
l106
,
l107
,
l108
,
l109
,
l110
,
l111
,
l112
,
l113
,
l114
,
l115
,
l116
,
l117
,
l118
,
l119
,
l120
,
l121
,
l122
,
l123
,
l124
,
l125
,
l126
,
l127
,
l128
,
l129
,
l130
,
l131
,
l132
,
l133
,
l134
,
l135
,
l136
,
l137
,
l138
,
l139
,
l140
,
l141
,
l142
,
l143
,
l144
,
l145
,
l146
,
l147
,
l148
,
l149
,
l150
,
l151
,
l152
,
l153
,
l154
,
l155
,
l156
,
l157
,
l158
,
l159
,
l160
,
l161
,
l162
,
l163
,
l164
,
l165
,
l166
,
l167
,
l168
,
l169
,
l170
,
l171
,
l172
,
l173
,
l174
,
l175
,
l176
,
l177
,
l178
,
l179
,
l180
,
l181
,
l182
,
l183
,
l184
,
l185
,
l186
,
l187
,
l188
,
l189
,
l190
,
l191
,
l192
,
l193
,
l194
,
l195
,
l196
,
l197
,
l198
,
l199
,
l200
,
l201
,
l202
,
l203
,
l204
,
l205
,
l206
,
l207
,
l208
,
l209
,
l210
,
l211
,
l212
,
l213
,
l214
,
l215
,
l216
,
l217
,
l218
,
l219
,
l220
,
l221
,
l222
,
l223
,
l224
,
l225
,
l226
,
l227
,
l228
,
l229
,
l230
,
l231
,
l232
,
l233
,
l234
,
l235
,
l236
,
l237
,
l238
,
l239
,
l240
,
l241
,
l242
,
l243
,
l244
,
l245
,
l246
,
l247
,
l248
,
l249
,
l250
,
l251
,
l252
,
l253
,
l254
,
l255
,
l256
,
l257
,
l258
,
l259
,
l260
,
l261
,
l262
,
l263
,
l264
,
l265
,
l266
,
l267
,
l268
,
l269
,
l270
,
l271
,
l272
,
l273
,
l274
,
l275
,
l276
,
l277
,
l278
,
l279
,
l280
,
l281
,
l282
,
l283
,
l284
,
l285
,
l286
,
l287
,
l288
,
l289
,
l290
,
l291
,
l292
,
l293
,
l294
,
l295
,
l296
,
l297
,
l298
,
l299
,
l300
,
l301
,
l302
,
l303
,
l304
,
l305
,
l306
,
l307
,
l308
,
l309
,
l310
,
l311
,
l312
,
l313
,
l314
,
l315
,
l316
,
l317
,
l318
,
l319
,
l320
,
l321
,
l322
,
l323
,
l324
,
l325
,
l326
,
l327
,
l328
,
l329
,
l330
,
l331
,
l332
,
l333
,
l334
,
l335
,
l336
,
l337
,
l338
,
l339
,
l340
,
l341
,
l342
,
l343
,
l344
,
l345
,
l346
,
l347
,
l348
,
l349
,
l350
,
l351
,
l352
,
l353
,
l354
,
l355
,
l356
,
l357
,
l358
,
l359
,
l360
,
l361
,
l362
,
l363
,
l364
,
l365
,
l366
,
l367
,
l368
,
l369
,
l370
,
l371
,
l372
,
l373
,
l374
,
l375
,
l376
,
l377
,
l378
,
l379
,
l380
,
l381
,
l382
,
l383
,
l384
,
l385
,
l386
,
l387
,
l388
,
l389
,
l390
,
l391
,
l392
,
l393
,
l394
,
l395
,
l396
,
l397
,
l398
,
l399
,
l400
,
l401
,
l402
,
l403
,
l404
,
l405
,
l406
,
l407
,
l408
,
l409
,
l410
,
l411
,
l412
,
l413
,
l414
,
l415
,
l416
,
l417
,
l418
,
l419
,
l420
,
l421
,
l422
,
l423
,
l424
,
l425
,
l426
,
l427
,
l428
,
l429
,
l430
,
l431
,
l432
,
l433
,
l434
,
l435
,
l436
,
l437
,
l438
,
l439
,
l440
,
l441
,
l442
,
l443
,
l444
,
l445
,
l446
,
l447
,
l448
,
l449
,
l450
,
l451
,
l452
,
l453
,
l454
,
l455
,
l456
,
l457
,
l458
,
l459
,
l460
,
l461
,
l462
,
l463
,
l464
,
l465
,
l466
,
l467
,
l468
,
l469
,
l470
,
l471
,
l472
,
l473
,
l474
,
l475
,
l476
,
l477
,
l478
,
l479
,
l480
,
l481
,
l482
,
l483
,
l484
,
l485
,
l486
,
l487
,
l488
,
l489
,
l490
,
l491
,
l492
,
l493
,
l494
,
l495
,
l496
,
l497
,
l498
,
l499
,
l500
,
l501
,
l502
,
l503
,
l504
,
l505
,
l506
,
l507
,
l508
,
l509
,
l510
,
l511
;
long
ll0
,
ll1
,
ll2
,
ll3
,
ll4
,
ll5
,
ll6
,
ll7
,
ll8
,
ll9
,
ll10
,
ll11
,
ll12
,
ll13
,
ll14
,
ll15
,
ll16
,
ll17
,
ll18
,
ll19
,
ll20
,
ll21
,
ll22
,
ll23
,
ll24
,
ll25
,
ll26
,
ll27
,
ll28
,
ll29
,
ll30
,
ll31
,
ll32
,
ll33
,
ll34
,
ll35
,
ll36
,
ll37
,
ll38
,
ll39
,
ll40
,
ll41
,
ll42
,
ll43
,
ll44
,
ll45
,
ll46
,
ll47
,
ll48
,
ll49
,
ll50
,
ll51
,
ll52
,
ll53
,
ll54
,
ll55
,
ll56
,
ll57
,
ll58
,
ll59
,
ll60
,
ll61
,
ll62
,
ll63
,
ll64
,
ll65
,
ll66
,
ll67
,
ll68
,
ll69
,
ll70
,
ll71
,
ll72
,
ll73
,
ll74
,
ll75
,
ll76
,
ll77
,
ll78
,
ll79
,
ll80
,
ll81
,
ll82
,
ll83
,
ll84
,
ll85
,
ll86
,
ll87
,
ll88
,
ll89
,
ll90
,
ll91
,
ll92
,
ll93
,
ll94
,
ll95
,
ll96
,
ll97
,
ll98
,
ll99
,
ll100
,
ll101
,
ll102
,
ll103
,
ll104
,
ll105
,
ll106
,
ll107
,
ll108
,
ll109
,
ll110
,
ll111
,
ll112
,
ll113
,
ll114
,
ll115
,
ll116
,
ll117
,
ll118
,
ll119
,
ll120
,
ll121
,
ll122
,
ll123
,
ll124
,
ll125
,
ll126
,
ll127
,
ll128
,
ll129
,
ll130
,
ll131
,
ll132
,
ll133
,
ll134
,
ll135
,
ll136
,
ll137
,
ll138
,
ll139
,
ll140
,
ll141
,
ll142
,
ll143
,
ll144
,
ll145
,
ll146
,
ll147
,
ll148
,
ll149
,
ll150
,
ll151
,
ll152
,
ll153
,
ll154
,
ll155
,
ll156
,
ll157
,
ll158
,
ll159
,
ll160
,
ll161
,
ll162
,
ll163
,
ll164
,
ll165
,
ll166
,
ll167
,
ll168
,
ll169
,
ll170
,
ll171
,
ll172
,
ll173
,
ll174
,
ll175
,
ll176
,
ll177
,
ll178
,
ll179
,
ll180
,
ll181
,
ll182
,
ll183
,
ll184
,
ll185
,
ll186
,
ll187
,
ll188
,
ll189
,
ll190
,
ll191
,
ll192
,
ll193
,
ll194
,
ll195
,
ll196
,
ll197
,
ll198
,
ll199
,
ll200
,
ll201
,
ll202
,
ll203
,
ll204
,
ll205
,
ll206
,
ll207
,
ll208
,
ll209
,
ll210
,
ll211
,
ll212
,
ll213
,
ll214
,
ll215
,
ll216
,
ll217
,
ll218
,
ll219
,
ll220
,
ll221
,
ll222
,
ll223
,
ll224
,
ll225
,
ll226
,
ll227
,
ll228
,
ll229
,
ll230
,
ll231
,
ll232
,
ll233
,
ll234
,
ll235
,
ll236
,
ll237
,
ll238
,
ll239
,
ll240
,
ll241
,
ll242
,
ll243
,
ll244
,
ll245
,
ll246
,
ll247
,
ll248
,
ll249
,
ll250
,
ll251
,
ll252
,
ll253
,
ll254
,
ll255
,
ll256
,
ll257
,
ll258
,
ll259
,
ll260
,
ll261
,
ll262
,
ll263
,
ll264
,
ll265
,
ll266
,
ll267
,
ll268
,
ll269
,
ll270
,
ll271
,
ll272
,
ll273
,
ll274
,
ll275
,
ll276
,
ll277
,
ll278
,
ll279
,
ll280
,
ll281
,
ll282
,
ll283
,
ll284
,
ll285
,
ll286
,
ll287
,
ll288
,
ll289
,
ll290
,
ll291
,
ll292
,
ll293
,
ll294
,
ll295
,
ll296
,
ll297
,
ll298
,
ll299
,
ll300
,
ll301
,
ll302
,
ll303
,
ll304
,
ll305
,
ll306
,
ll307
,
ll308
,
ll309
,
ll310
,
ll311
,
ll312
,
ll313
,
ll314
,
ll315
,
ll316
,
ll317
,
ll318
,
ll319
,
ll320
,
ll321
,
ll322
,
ll323
,
ll324
,
ll325
,
ll326
,
ll327
,
ll328
,
ll329
,
ll330
,
ll331
,
ll332
,
ll333
,
ll334
,
ll335
,
ll336
,
ll337
,
ll338
,
ll339
,
ll340
,
ll341
,
ll342
,
ll343
,
ll344
,
ll345
,
ll346
,
ll347
,
ll348
,
ll349
,
ll350
,
ll351
,
ll352
,
ll353
,
ll354
,
ll355
,
ll356
,
ll357
,
ll358
,
ll359
,
ll360
,
ll361
,
ll362
,
ll363
,
ll364
,
ll365
,
ll366
,
ll367
,
ll368
,
ll369
,
ll370
,
ll371
,
ll372
,
ll373
,
ll374
,
ll375
,
ll376
,
ll377
,
ll378
,
ll379
,
ll380
,
ll381
,
ll382
,
ll383
,
ll384
,
ll385
,
ll386
,
ll387
,
ll388
,
ll389
,
ll390
,
ll391
,
ll392
,
ll393
,
ll394
,
ll395
,
ll396
,
ll397
,
ll398
,
ll399
,
ll400
,
ll401
,
ll402
,
ll403
,
ll404
,
ll405
,
ll406
,
ll407
,
ll408
,
ll409
,
ll410
,
ll411
,
ll412
,
ll413
,
ll414
,
ll415
,
ll416
,
ll417
,
ll418
,
ll419
,
ll420
,
ll421
,
ll422
,
ll423
,
ll424
,
ll425
,
ll426
,
ll427
,
ll428
,
ll429
,
ll430
,
ll431
,
ll432
,
ll433
,
ll434
,
ll435
,
ll436
,
ll437
,
ll438
,
ll439
,
ll440
,
ll441
,
ll442
,
ll443
,
ll444
,
ll445
,
ll446
,
ll447
,
ll448
,
ll449
,
ll450
,
ll451
,
ll452
,
ll453
,
ll454
,
ll455
,
ll456
,
ll457
,
ll458
,
ll459
,
ll460
,
ll461
,
ll462
,
ll463
,
ll464
,
ll465
,
ll466
,
ll467
,
ll468
,
ll469
,
ll470
,
ll471
,
ll472
,
ll473
,
ll474
,
ll475
,
ll476
,
ll477
,
ll478
,
ll479
,
ll480
,
ll481
,
ll482
,
ll483
,
ll484
,
ll485
,
ll486
,
ll487
,
ll488
,
ll489
,
ll490
,
ll491
,
ll492
,
ll493
,
ll494
,
ll495
,
ll496
,
ll497
,
ll498
,
ll499
,
ll500
,
ll501
,
ll502
,
ll503
,
ll504
,
ll505
,
ll506
,
ll507
,
ll508
,
ll509
,
ll510
,
ll511
;
int
i1
=
TestStackBangRbp
.
i1
;
int
i2
=
TestStackBangRbp
.
i2
;
int
i3
=
TestStackBangRbp
.
i3
;
int
i4
=
TestStackBangRbp
.
i4
;
int
i5
=
TestStackBangRbp
.
i5
;
int
i6
=
TestStackBangRbp
.
i6
;
int
i7
=
TestStackBangRbp
.
i7
;
int
i8
=
TestStackBangRbp
.
i8
;
int
i9
=
TestStackBangRbp
.
i9
;
int
i10
=
TestStackBangRbp
.
i10
;
int
i11
=
TestStackBangRbp
.
i11
;
int
i12
=
TestStackBangRbp
.
i12
;
int
i13
=
TestStackBangRbp
.
i13
;
int
i14
=
TestStackBangRbp
.
i14
;
int
i15
=
TestStackBangRbp
.
i15
;
int
i16
=
TestStackBangRbp
.
i16
;
TestStackBangRbp
.
i1
=
i1
;
TestStackBangRbp
.
i2
=
i2
;
TestStackBangRbp
.
i3
=
i3
;
TestStackBangRbp
.
i4
=
i4
;
TestStackBangRbp
.
i5
=
i5
;
TestStackBangRbp
.
i6
=
i6
;
TestStackBangRbp
.
i7
=
i7
;
TestStackBangRbp
.
i8
=
i8
;
TestStackBangRbp
.
i9
=
i9
;
TestStackBangRbp
.
i10
=
i10
;
TestStackBangRbp
.
i11
=
i11
;
TestStackBangRbp
.
i12
=
i12
;
TestStackBangRbp
.
i13
=
i13
;
TestStackBangRbp
.
i14
=
i14
;
TestStackBangRbp
.
i15
=
i15
;
TestStackBangRbp
.
i16
=
i16
;
if
(
deopt
)
{
// deoptimize with integer in rbp
UnloadedClass1
res
=
new
UnloadedClass1
();
// forces deopt with c2
return
res
;
}
return
null
;
}
static
boolean
m2
(
boolean
deopt
)
{
// call m2 recursively until stack overflow. Then call m3 that
// will call m1 and trigger and deopt in m1 while keeping a
// lot of objects live in registers at the call to m1
long
l0
,
l1
,
l2
,
l3
,
l4
,
l5
,
l6
,
l7
,
l8
,
l9
,
l10
,
l11
,
l12
,
l13
,
l14
,
l15
,
l16
,
l17
,
l18
,
l19
,
l20
,
l21
,
l22
,
l23
,
l24
,
l25
,
l26
,
l27
,
l28
,
l29
,
l30
,
l31
,
l32
,
l33
,
l34
,
l35
,
l36
,
l37
,
l38
,
l39
,
l40
,
l41
,
l42
,
l43
,
l44
,
l45
,
l46
,
l47
,
l48
,
l49
,
l50
,
l51
,
l52
,
l53
,
l54
,
l55
,
l56
,
l57
,
l58
,
l59
,
l60
,
l61
,
l62
,
l63
,
l64
,
l65
,
l66
,
l67
,
l68
,
l69
,
l70
,
l71
,
l72
,
l73
,
l74
,
l75
,
l76
,
l77
,
l78
,
l79
,
l80
,
l81
,
l82
,
l83
,
l84
,
l85
,
l86
,
l87
,
l88
,
l89
,
l90
,
l91
,
l92
,
l93
,
l94
,
l95
,
l96
,
l97
,
l98
,
l99
,
l100
,
l101
,
l102
,
l103
,
l104
,
l105
,
l106
,
l107
,
l108
,
l109
,
l110
,
l111
,
l112
,
l113
,
l114
,
l115
,
l116
,
l117
,
l118
,
l119
,
l120
,
l121
,
l122
,
l123
,
l124
,
l125
,
l126
,
l127
,
l128
,
l129
,
l130
,
l131
,
l132
,
l133
,
l134
,
l135
,
l136
,
l137
,
l138
,
l139
,
l140
,
l141
,
l142
,
l143
,
l144
,
l145
,
l146
,
l147
,
l148
,
l149
,
l150
,
l151
,
l152
,
l153
,
l154
,
l155
,
l156
,
l157
,
l158
,
l159
,
l160
,
l161
,
l162
,
l163
,
l164
,
l165
,
l166
,
l167
,
l168
,
l169
,
l170
,
l171
,
l172
,
l173
,
l174
,
l175
,
l176
,
l177
,
l178
,
l179
,
l180
,
l181
,
l182
,
l183
,
l184
,
l185
,
l186
,
l187
,
l188
,
l189
,
l190
,
l191
,
l192
,
l193
,
l194
,
l195
,
l196
,
l197
,
l198
,
l199
,
l200
,
l201
,
l202
,
l203
,
l204
,
l205
,
l206
,
l207
,
l208
,
l209
,
l210
,
l211
,
l212
,
l213
,
l214
,
l215
,
l216
,
l217
,
l218
,
l219
,
l220
,
l221
,
l222
,
l223
,
l224
,
l225
,
l226
,
l227
,
l228
,
l229
,
l230
,
l231
,
l232
,
l233
,
l234
,
l235
,
l236
,
l237
,
l238
,
l239
,
l240
,
l241
,
l242
,
l243
,
l244
,
l245
,
l246
,
l247
,
l248
,
l249
,
l250
,
l251
,
l252
,
l253
,
l254
,
l255
,
l256
,
l257
,
l258
,
l259
,
l260
,
l261
,
l262
,
l263
,
l264
,
l265
,
l266
,
l267
,
l268
,
l269
,
l270
,
l271
,
l272
,
l273
,
l274
,
l275
,
l276
,
l277
,
l278
,
l279
,
l280
,
l281
,
l282
,
l283
,
l284
,
l285
,
l286
,
l287
,
l288
,
l289
,
l290
,
l291
,
l292
,
l293
,
l294
,
l295
,
l296
,
l297
,
l298
,
l299
,
l300
,
l301
,
l302
,
l303
,
l304
,
l305
,
l306
,
l307
,
l308
,
l309
,
l310
,
l311
,
l312
,
l313
,
l314
,
l315
,
l316
,
l317
,
l318
,
l319
,
l320
,
l321
,
l322
,
l323
,
l324
,
l325
,
l326
,
l327
,
l328
,
l329
,
l330
,
l331
,
l332
,
l333
,
l334
,
l335
,
l336
,
l337
,
l338
,
l339
,
l340
,
l341
,
l342
,
l343
,
l344
,
l345
,
l346
,
l347
,
l348
,
l349
,
l350
,
l351
,
l352
,
l353
,
l354
,
l355
,
l356
,
l357
,
l358
,
l359
,
l360
,
l361
,
l362
,
l363
,
l364
,
l365
,
l366
,
l367
,
l368
,
l369
,
l370
,
l371
,
l372
,
l373
,
l374
,
l375
,
l376
,
l377
,
l378
,
l379
,
l380
,
l381
,
l382
,
l383
,
l384
,
l385
,
l386
,
l387
,
l388
,
l389
,
l390
,
l391
,
l392
,
l393
,
l394
,
l395
,
l396
,
l397
,
l398
,
l399
,
l400
,
l401
,
l402
,
l403
,
l404
,
l405
,
l406
,
l407
,
l408
,
l409
,
l410
,
l411
,
l412
,
l413
,
l414
,
l415
,
l416
,
l417
,
l418
,
l419
,
l420
,
l421
,
l422
,
l423
,
l424
,
l425
,
l426
,
l427
,
l428
,
l429
,
l430
,
l431
,
l432
,
l433
,
l434
,
l435
,
l436
,
l437
,
l438
,
l439
,
l440
,
l441
,
l442
,
l443
,
l444
,
l445
,
l446
,
l447
,
l448
,
l449
,
l450
,
l451
,
l452
,
l453
,
l454
,
l455
,
l456
,
l457
,
l458
,
l459
,
l460
,
l461
,
l462
,
l463
,
l464
,
l465
,
l466
,
l467
,
l468
,
l469
,
l470
,
l471
,
l472
,
l473
,
l474
,
l475
,
l476
,
l477
,
l478
,
l479
,
l480
,
l481
,
l482
,
l483
,
l484
,
l485
,
l486
,
l487
,
l488
,
l489
,
l490
,
l491
,
l492
,
l493
,
l494
,
l495
,
l496
,
l497
,
l498
,
l499
,
l500
,
l501
,
l502
,
l503
,
l504
,
l505
,
l506
,
l507
,
l508
,
l509
,
l510
,
l511
;
boolean
do_m3
=
false
;
try
{
do_m3
=
m2
(
deopt
);
}
catch
(
StackOverflowError
e
)
{
return
true
;
}
if
(
do_m3
)
{
m3
(
deopt
);
}
return
false
;
}
static
volatile
Object
o1
=
new
Object
();
static
volatile
int
i1
=
1
;
static
volatile
int
i2
=
2
;
static
volatile
int
i3
=
3
;
static
volatile
int
i4
=
4
;
static
volatile
int
i5
=
5
;
static
volatile
int
i6
=
6
;
static
volatile
int
i7
=
7
;
static
volatile
int
i8
=
8
;
static
volatile
int
i9
=
9
;
static
volatile
int
i10
=
10
;
static
volatile
int
i11
=
11
;
static
volatile
int
i12
=
12
;
static
volatile
int
i13
=
13
;
static
volatile
int
i14
=
14
;
static
volatile
int
i15
=
15
;
static
volatile
int
i16
=
16
;
static
void
m3
(
boolean
deopt
)
{
Object
o1
=
TestStackBangRbp
.
o1
;
TestStackBangRbp
.
o1
=
o1
;
try
{
m1
(
deopt
);
}
catch
(
StackOverflowError
e
)
{
// deoptimize again. rbp holds an integer. It should have an object.
UnloadedClass2
res
=
new
UnloadedClass2
();
// forces deopt with c2
}
TestStackBangRbp
.
o1
=
o1
;
}
static
public
void
main
(
String
[]
args
)
{
// get m1 & m3 compiled
for
(
int
i
=
0
;
i
<
20000
;
i
++)
{
m1
(
false
);
m3
(
false
);
}
m2
(
true
);
System
.
out
.
println
(
"TEST PASSED"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录