Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
ddc27095
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ddc27095
编写于
10月 27, 2011
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7102657: JSR 292: C1 deoptimizes unlinked invokedynamic call sites infinitely
Reviewed-by: never, bdelsart
上级
a1b67d19
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
55 addition
and
5 deletion
+55
-5
src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp
src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp
+2
-2
src/cpu/sparc/vm/c1_Runtime1_sparc.cpp
src/cpu/sparc/vm/c1_Runtime1_sparc.cpp
+15
-0
src/cpu/x86/vm/c1_CodeStubs_x86.cpp
src/cpu/x86/vm/c1_CodeStubs_x86.cpp
+2
-2
src/cpu/x86/vm/c1_Runtime1_x86.cpp
src/cpu/x86/vm/c1_Runtime1_x86.cpp
+15
-0
src/share/vm/c1/c1_Runtime1.cpp
src/share/vm/c1/c1_Runtime1.cpp
+17
-0
src/share/vm/c1/c1_Runtime1.hpp
src/share/vm/c1/c1_Runtime1.hpp
+3
-0
src/share/vm/opto/runtime.cpp
src/share/vm/opto/runtime.cpp
+1
-1
未找到文件。
src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp
浏览文件 @
ddc27095
...
...
@@ -367,10 +367,10 @@ void PatchingStub::emit_code(LIR_Assembler* ce) {
void
DeoptimizeStub
::
emit_code
(
LIR_Assembler
*
ce
)
{
__
bind
(
_entry
);
__
call
(
SharedRuntime
::
deopt_blob
()
->
unpack_with_reexecution
()
);
__
call
(
Runtime1
::
entry_for
(
Runtime1
::
deoptimize_id
),
relocInfo
::
runtime_call_type
);
__
delayed
()
->
nop
();
ce
->
add_call_info_here
(
_info
);
debug_only
(
__
should_not_reach_here
());
DEBUG_ONLY
(
__
should_not_reach_here
());
}
...
...
src/cpu/sparc/vm/c1_Runtime1_sparc.cpp
浏览文件 @
ddc27095
...
...
@@ -766,7 +766,22 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
__
ret
();
__
delayed
()
->
restore
();
}
break
;
case
deoptimize_id
:
{
__
set_info
(
"deoptimize"
,
dont_gc_arguments
);
OopMap
*
oop_map
=
save_live_registers
(
sasm
);
int
call_offset
=
__
call_RT
(
noreg
,
noreg
,
CAST_FROM_FN_PTR
(
address
,
deoptimize
));
oop_maps
=
new
OopMapSet
();
oop_maps
->
add_gc_map
(
call_offset
,
oop_map
);
restore_live_registers
(
sasm
);
DeoptimizationBlob
*
deopt_blob
=
SharedRuntime
::
deopt_blob
();
assert
(
deopt_blob
!=
NULL
,
"deoptimization blob must have been created"
);
AddressLiteral
dest
(
deopt_blob
->
unpack_with_reexecution
());
__
jump_to
(
dest
,
O0
);
__
delayed
()
->
restore
();
}
break
;
...
...
src/cpu/x86/vm/c1_CodeStubs_x86.cpp
浏览文件 @
ddc27095
...
...
@@ -387,9 +387,9 @@ void PatchingStub::emit_code(LIR_Assembler* ce) {
void
DeoptimizeStub
::
emit_code
(
LIR_Assembler
*
ce
)
{
__
bind
(
_entry
);
__
call
(
RuntimeAddress
(
SharedRuntime
::
deopt_blob
()
->
unpack_with_reexecution
(
)));
__
call
(
RuntimeAddress
(
Runtime1
::
entry_for
(
Runtime1
::
deoptimize_id
)));
ce
->
add_call_info_here
(
_info
);
debug_only
(
__
should_not_reach_here
());
DEBUG_ONLY
(
__
should_not_reach_here
());
}
...
...
src/cpu/x86/vm/c1_Runtime1_x86.cpp
浏览文件 @
ddc27095
...
...
@@ -1447,7 +1447,22 @@ OopMapSet* Runtime1::generate_code_for(StubID id, StubAssembler* sasm) {
oop_maps
=
new
OopMapSet
();
oop_maps
->
add_gc_map
(
call_offset
,
map
);
restore_live_registers
(
sasm
,
save_fpu_registers
);
}
break
;
case
deoptimize_id
:
{
StubFrame
f
(
sasm
,
"deoptimize"
,
dont_gc_arguments
);
const
int
num_rt_args
=
1
;
// thread
OopMap
*
oop_map
=
save_live_registers
(
sasm
,
num_rt_args
);
int
call_offset
=
__
call_RT
(
noreg
,
noreg
,
CAST_FROM_FN_PTR
(
address
,
deoptimize
));
oop_maps
=
new
OopMapSet
();
oop_maps
->
add_gc_map
(
call_offset
,
oop_map
);
restore_live_registers
(
sasm
);
DeoptimizationBlob
*
deopt_blob
=
SharedRuntime
::
deopt_blob
();
assert
(
deopt_blob
!=
NULL
,
"deoptimization blob must have been created"
);
__
leave
();
__
jump
(
RuntimeAddress
(
deopt_blob
->
unpack_with_reexecution
()));
}
break
;
...
...
src/share/vm/c1/c1_Runtime1.cpp
浏览文件 @
ddc27095
...
...
@@ -681,6 +681,23 @@ JRT_LEAF(void, Runtime1::monitorexit(JavaThread* thread, BasicObjectLock* lock))
}
JRT_END
// Cf. OptoRuntime::deoptimize_caller_frame
JRT_ENTRY
(
void
,
Runtime1
::
deoptimize
(
JavaThread
*
thread
))
// Called from within the owner thread, so no need for safepoint
RegisterMap
reg_map
(
thread
,
false
);
frame
stub_frame
=
thread
->
last_frame
();
assert
(
stub_frame
.
is_runtime_frame
(),
"sanity check"
);
frame
caller_frame
=
stub_frame
.
sender
(
&
reg_map
);
// We are coming from a compiled method; check this is true.
assert
(
CodeCache
::
find_nmethod
(
caller_frame
.
pc
())
!=
NULL
,
"sanity"
);
// Deoptimize the caller frame.
Deoptimization
::
deoptimize_frame
(
thread
,
caller_frame
.
id
());
// Return to the now deoptimized frame.
JRT_END
static
klassOop
resolve_field_return_klass
(
methodHandle
caller
,
int
bci
,
TRAPS
)
{
Bytecode_field
field_access
(
caller
,
bci
);
...
...
src/share/vm/c1/c1_Runtime1.hpp
浏览文件 @
ddc27095
...
...
@@ -63,6 +63,7 @@ class StubAssembler;
stub(monitorenter_nofpu)
/* optimized version that does not preserve fpu registers */
\
stub(monitorexit) \
stub(monitorexit_nofpu)
/* optimized version that does not preserve fpu registers */
\
stub(deoptimize) \
stub(access_field_patching) \
stub(load_klass_patching) \
stub(g1_pre_barrier_slow) \
...
...
@@ -152,6 +153,8 @@ class Runtime1: public AllStatic {
static
void
monitorenter
(
JavaThread
*
thread
,
oopDesc
*
obj
,
BasicObjectLock
*
lock
);
static
void
monitorexit
(
JavaThread
*
thread
,
BasicObjectLock
*
lock
);
static
void
deoptimize
(
JavaThread
*
thread
);
static
int
access_field_patching
(
JavaThread
*
thread
);
static
int
move_klass_patching
(
JavaThread
*
thread
);
...
...
src/share/vm/opto/runtime.cpp
浏览文件 @
ddc27095
...
...
@@ -1130,7 +1130,7 @@ void OptoRuntime::deoptimize_caller_frame(JavaThread *thread, bool doit) {
assert
(
stub_frame
.
is_runtime_frame
()
||
exception_blob
()
->
contains
(
stub_frame
.
pc
()),
"sanity check"
);
frame
caller_frame
=
stub_frame
.
sender
(
&
reg_map
);
//
bypass VM_DeoptimizeFrame and deoptimize the frame directly
//
Deoptimize the caller frame.
Deoptimization
::
deoptimize_frame
(
thread
,
caller_frame
.
id
());
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录