Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell11
提交
a4678c27
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,发现更多精彩内容 >>
提交
a4678c27
编写于
6月 13, 2012
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
Reviewed-by: kvn
上级
d098df78
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
35 addition
and
28 deletion
+35
-28
hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
+4
-4
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
+1
-1
hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
+4
-4
hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
+12
-14
hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
+8
-0
hotspot/src/share/vm/oops/methodOop.cpp
hotspot/src/share/vm/oops/methodOop.cpp
+4
-3
hotspot/src/share/vm/oops/methodOop.hpp
hotspot/src/share/vm/oops/methodOop.hpp
+2
-2
未找到文件。
hotspot/src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp
浏览文件 @
a4678c27
...
...
@@ -965,10 +965,10 @@ void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
if
(
!
x
->
klass
()
->
is_loaded
()
||
PatchALot
)
{
patching_info
=
state_for
(
x
,
x
->
state_before
());
//
c
annot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers
. This is handled transparently in other
//
places by the CodeEmitInfo cloning logic but is handled
//
specially here because a stub isn't being used
.
//
C
annot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers
(NOTE: Usually this is handled transparently
//
by the CodeEmitInfo cloning logic in CodeStub constructors but
//
is done explicitly here because a stub isn't being used)
.
x
->
set_exception_handlers
(
new
XHandlers
(
x
->
exception_handlers
()));
}
CodeEmitInfo
*
info
=
state_for
(
x
,
x
->
state
());
...
...
hotspot/src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
浏览文件 @
a4678c27
...
...
@@ -2673,7 +2673,7 @@ void LIR_Assembler::comp_op(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2,
#endif // _LP64
}
}
else
{
ShouldNotReachHere
(
);
fatal
(
err_msg
(
"unexpected type: %s"
,
basictype_to_str
(
c
->
type
()))
);
}
// cpu register - address
}
else
if
(
opr2
->
is_address
())
{
...
...
hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
浏览文件 @
a4678c27
...
...
@@ -1087,10 +1087,10 @@ void LIRGenerator::do_NewMultiArray(NewMultiArray* x) {
if
(
!
x
->
klass
()
->
is_loaded
()
||
PatchALot
)
{
patching_info
=
state_for
(
x
,
x
->
state_before
());
//
c
annot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers
. This is handled transparently in other
//
places by the CodeEmitInfo cloning logic but is handled
//
specially here because a stub isn't being used
.
//
C
annot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers
(NOTE: Usually this is handled transparently
//
by the CodeEmitInfo cloning logic in CodeStub constructors but
//
is done explicitly here because a stub isn't being used)
.
x
->
set_exception_handlers
(
new
XHandlers
(
x
->
exception_handlers
()));
}
CodeEmitInfo
*
info
=
state_for
(
x
,
x
->
state
());
...
...
hotspot/src/share/vm/c1/c1_LIRGenerator.cpp
浏览文件 @
a4678c27
...
...
@@ -2807,31 +2807,29 @@ void LIRGenerator::do_Invoke(Invoke* x) {
int
index
=
bcs
.
get_method_index
();
size_t
call_site_offset
=
cpcache
->
get_f1_offset
(
index
);
// Load CallSite object from constant pool cache.
LIR_Opr
call_site
=
new_register
(
objectType
);
__
oop2reg
(
cpcache
->
constant_encoding
(),
call_site
);
__
move_wide
(
new
LIR_Address
(
call_site
,
call_site_offset
,
T_OBJECT
),
call_site
);
// If this invokedynamic call site hasn't been executed yet in
// the interpreter, the CallSite object in the constant pool
// cache is still null and we need to deoptimize.
if
(
cpcache
->
is_f1_null_at
(
index
))
{
// Cannot re-use same xhandlers for multiple CodeEmitInfos, so
// clone all handlers. This is handled transparently in other
// places by the CodeEmitInfo cloning logic but is handled
// specially here because a stub isn't being used.
x
->
set_exception_handlers
(
new
XHandlers
(
x
->
exception_handlers
()));
// Only deoptimize if the CallSite object is still null; we don't
// recompile methods in C1 after deoptimization so this call site
// might be resolved the next time we execute it after OSR.
DeoptimizeStub
*
deopt_stub
=
new
DeoptimizeStub
(
deopt_info
);
__
jump
(
deopt_stub
);
__
cmp
(
lir_cond_equal
,
call_site
,
LIR_OprFact
::
oopConst
(
NULL
));
__
branch
(
lir_cond_equal
,
T_OBJECT
,
deopt_stub
);
}
// Use the receiver register for the synthetic MethodHandle
// argument.
receiver
=
LIR_Assembler
::
receiverOpr
();
LIR_Opr
tmp
=
new_register
(
objectType
);
// Load CallSite object from constant pool cache.
__
oop2reg
(
cpcache
->
constant_encoding
(),
tmp
);
__
move_wide
(
new
LIR_Address
(
tmp
,
call_site_offset
,
T_OBJECT
),
tmp
);
// Load target MethodHandle from CallSite object.
__
load
(
new
LIR_Address
(
tmp
,
java_lang_invoke_CallSite
::
target_offset_in_bytes
(),
T_OBJECT
),
receiver
);
__
load
(
new
LIR_Address
(
call_site
,
java_lang_invoke_CallSite
::
target_offset_in_bytes
(),
T_OBJECT
),
receiver
);
__
call_dynamic
(
target
,
receiver
,
result_register
,
SharedRuntime
::
get_resolve_opt_virtual_call_stub
(),
...
...
@@ -2839,7 +2837,7 @@ void LIRGenerator::do_Invoke(Invoke* x) {
break
;
}
default:
ShouldNotReachHere
(
);
fatal
(
err_msg
(
"unexpected bytecode: %s"
,
Bytecodes
::
name
(
x
->
code
()))
);
break
;
}
...
...
hotspot/src/share/vm/interpreter/interpreterRuntime.cpp
浏览文件 @
a4678c27
...
...
@@ -844,6 +844,14 @@ nmethod* InterpreterRuntime::frequency_counter_overflow(JavaThread* thread, addr
int
bci
=
method
->
bci_from
(
fr
.
interpreter_frame_bcp
());
nm
=
method
->
lookup_osr_nmethod_for
(
bci
,
CompLevel_none
,
false
);
}
#ifndef PRODUCT
if
(
TraceOnStackReplacement
)
{
if
(
nm
!=
NULL
)
{
tty
->
print
(
"OSR entry @ pc: "
INTPTR_FORMAT
": "
,
nm
->
osr_entry
());
nm
->
print
();
}
}
#endif
return
nm
;
}
...
...
hotspot/src/share/vm/oops/methodOop.cpp
浏览文件 @
a4678c27
...
...
@@ -70,11 +70,11 @@ address methodOopDesc::get_c2i_unverified_entry() {
return
_adapter
->
get_c2i_unverified_entry
();
}
char
*
methodOopDesc
::
name_and_sig_as_C_string
()
{
char
*
methodOopDesc
::
name_and_sig_as_C_string
()
const
{
return
name_and_sig_as_C_string
(
Klass
::
cast
(
constants
()
->
pool_holder
()),
name
(),
signature
());
}
char
*
methodOopDesc
::
name_and_sig_as_C_string
(
char
*
buf
,
int
size
)
{
char
*
methodOopDesc
::
name_and_sig_as_C_string
(
char
*
buf
,
int
size
)
const
{
return
name_and_sig_as_C_string
(
Klass
::
cast
(
constants
()
->
pool_holder
()),
name
(),
signature
(),
buf
,
size
);
}
...
...
@@ -177,7 +177,8 @@ void methodOopDesc::mask_for(int bci, InterpreterOopMap* mask) {
int
methodOopDesc
::
bci_from
(
address
bcp
)
const
{
assert
(
is_native
()
&&
bcp
==
code_base
()
||
contains
(
bcp
)
||
is_error_reported
(),
"bcp doesn't belong to this method"
);
assert
(
is_native
()
&&
bcp
==
code_base
()
||
contains
(
bcp
)
||
is_error_reported
(),
err_msg
(
"bcp doesn't belong to this method: bcp: "
INTPTR_FORMAT
", method: %s"
,
bcp
,
name_and_sig_as_C_string
()));
return
bcp
-
code_base
();
}
...
...
hotspot/src/share/vm/oops/methodOop.hpp
浏览文件 @
a4678c27
...
...
@@ -198,8 +198,8 @@ class methodOopDesc : public oopDesc {
// C string, for the purpose of providing more useful NoSuchMethodErrors
// and fatal error handling. The string is allocated in resource
// area if a buffer is not provided by the caller.
char
*
name_and_sig_as_C_string
();
char
*
name_and_sig_as_C_string
(
char
*
buf
,
int
size
);
char
*
name_and_sig_as_C_string
()
const
;
char
*
name_and_sig_as_C_string
(
char
*
buf
,
int
size
)
const
;
// Static routine in the situations we don't have a methodOop
static
char
*
name_and_sig_as_C_string
(
Klass
*
klass
,
Symbol
*
method_name
,
Symbol
*
signature
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录