Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
3f2511a9
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看板
提交
3f2511a9
编写于
7月 01, 2014
作者:
S
stefank
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8047362: Add a version of CompiledIC_at that doesn't create a new RelocIterator
Reviewed-by: iveresov, mgerdin
上级
f9a4e271
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
47 addition
and
16 deletion
+47
-16
src/share/vm/code/codeCache.cpp
src/share/vm/code/codeCache.cpp
+1
-1
src/share/vm/code/compiledIC.cpp
src/share/vm/code/compiledIC.cpp
+30
-10
src/share/vm/code/compiledIC.hpp
src/share/vm/code/compiledIC.hpp
+11
-0
src/share/vm/code/nmethod.cpp
src/share/vm/code/nmethod.cpp
+5
-5
未找到文件。
src/share/vm/code/codeCache.cpp
浏览文件 @
3f2511a9
...
...
@@ -494,7 +494,7 @@ void CodeCache::gc_epilogue() {
while
(
iter
.
next
())
{
if
(
iter
.
type
()
==
relocInfo
::
virtual_call_type
)
{
if
(
CompiledIC
::
is_icholder_call_site
(
iter
.
virtual_call_reloc
()))
{
CompiledIC
*
ic
=
CompiledIC_at
(
iter
.
reloc
()
);
CompiledIC
*
ic
=
CompiledIC_at
(
&
iter
);
if
(
TraceCompiledIC
)
{
tty
->
print
(
"noticed icholder "
INTPTR_FORMAT
" "
,
p2i
(
ic
->
cached_icholder
()));
ic
->
print
();
...
...
src/share/vm/code/compiledIC.cpp
浏览文件 @
3f2511a9
...
...
@@ -159,10 +159,24 @@ address CompiledIC::stub_address() const {
//-----------------------------------------------------------------------------
// High-level access to an inline cache. Guaranteed to be MT-safe.
void
CompiledIC
::
initialize_from_iter
(
RelocIterator
*
iter
)
{
assert
(
iter
->
addr
()
==
_ic_call
->
instruction_address
(),
"must find ic_call"
);
if
(
iter
->
type
()
==
relocInfo
::
virtual_call_type
)
{
virtual_call_Relocation
*
r
=
iter
->
virtual_call_reloc
();
_is_optimized
=
false
;
_value
=
nativeMovConstReg_at
(
r
->
cached_value
());
}
else
{
assert
(
iter
->
type
()
==
relocInfo
::
opt_virtual_call_type
,
"must be a virtual call"
);
_is_optimized
=
true
;
_value
=
NULL
;
}
}
CompiledIC
::
CompiledIC
(
nmethod
*
nm
,
NativeCall
*
call
)
:
_ic_call
(
call
)
{
address
ic_call
=
call
->
instruction_address
();
address
ic_call
=
_ic_
call
->
instruction_address
();
assert
(
ic_call
!=
NULL
,
"ic_call address must be set"
);
assert
(
nm
!=
NULL
,
"must pass nmethod"
);
...
...
@@ -173,15 +187,21 @@ CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
bool
ret
=
iter
.
next
();
assert
(
ret
==
true
,
"relocInfo must exist at this address"
);
assert
(
iter
.
addr
()
==
ic_call
,
"must find ic_call"
);
if
(
iter
.
type
()
==
relocInfo
::
virtual_call_type
)
{
virtual_call_Relocation
*
r
=
iter
.
virtual_call_reloc
();
_is_optimized
=
false
;
_value
=
nativeMovConstReg_at
(
r
->
cached_value
());
}
else
{
assert
(
iter
.
type
()
==
relocInfo
::
opt_virtual_call_type
,
"must be a virtual call"
);
_is_optimized
=
true
;
_value
=
NULL
;
}
initialize_from_iter
(
&
iter
);
}
CompiledIC
::
CompiledIC
(
RelocIterator
*
iter
)
:
_ic_call
(
nativeCall_at
(
iter
->
addr
()))
{
address
ic_call
=
_ic_call
->
instruction_address
();
nmethod
*
nm
=
iter
->
code
();
assert
(
ic_call
!=
NULL
,
"ic_call address must be set"
);
assert
(
nm
!=
NULL
,
"must pass nmethod"
);
assert
(
nm
->
contains
(
ic_call
),
"must be in nmethod"
);
initialize_from_iter
(
iter
);
}
bool
CompiledIC
::
set_to_megamorphic
(
CallInfo
*
call_info
,
Bytecodes
::
Code
bytecode
,
TRAPS
)
{
...
...
src/share/vm/code/compiledIC.hpp
浏览文件 @
3f2511a9
...
...
@@ -150,6 +150,9 @@ class CompiledIC: public ResourceObj {
bool
_is_optimized
;
// an optimized virtual call (i.e., no compiled IC)
CompiledIC
(
nmethod
*
nm
,
NativeCall
*
ic_call
);
CompiledIC
(
RelocIterator
*
iter
);
void
initialize_from_iter
(
RelocIterator
*
iter
);
static
bool
is_icholder_entry
(
address
entry
);
...
...
@@ -183,6 +186,7 @@ class CompiledIC: public ResourceObj {
friend
CompiledIC
*
CompiledIC_before
(
nmethod
*
nm
,
address
return_addr
);
friend
CompiledIC
*
CompiledIC_at
(
nmethod
*
nm
,
address
call_site
);
friend
CompiledIC
*
CompiledIC_at
(
Relocation
*
call_site
);
friend
CompiledIC
*
CompiledIC_at
(
RelocIterator
*
reloc_iter
);
// This is used to release CompiledICHolder*s from nmethods that
// are about to be freed. The callsite might contain other stale
...
...
@@ -263,6 +267,13 @@ inline CompiledIC* CompiledIC_at(Relocation* call_site) {
return
c_ic
;
}
inline
CompiledIC
*
CompiledIC_at
(
RelocIterator
*
reloc_iter
)
{
assert
(
reloc_iter
->
type
()
==
relocInfo
::
virtual_call_type
||
reloc_iter
->
type
()
==
relocInfo
::
opt_virtual_call_type
,
"wrong reloc. info"
);
CompiledIC
*
c_ic
=
new
CompiledIC
(
reloc_iter
);
c_ic
->
verify
();
return
c_ic
;
}
//-----------------------------------------------------------------------------
// The CompiledStaticCall represents a call to a static method in the compiled
...
...
src/share/vm/code/nmethod.cpp
浏览文件 @
3f2511a9
...
...
@@ -1166,7 +1166,7 @@ void nmethod::cleanup_inline_caches() {
switch
(
iter
.
type
())
{
case
relocInfo
::
virtual_call_type
:
case
relocInfo
::
opt_virtual_call_type
:
{
CompiledIC
*
ic
=
CompiledIC_at
(
iter
.
reloc
()
);
CompiledIC
*
ic
=
CompiledIC_at
(
&
iter
);
// Ok, to lookup references to zombies here
CodeBlob
*
cb
=
CodeCache
::
find_blob_unsafe
(
ic
->
ic_destination
());
if
(
cb
!=
NULL
&&
cb
->
is_nmethod
()
)
{
...
...
@@ -1663,7 +1663,7 @@ void nmethod::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred)
RelocIterator
iter
(
this
,
low_boundary
);
while
(
iter
.
next
())
{
if
(
iter
.
type
()
==
relocInfo
::
virtual_call_type
)
{
CompiledIC
*
ic
=
CompiledIC_at
(
iter
.
reloc
()
);
CompiledIC
*
ic
=
CompiledIC_at
(
&
iter
);
if
(
ic
->
is_icholder_call
())
{
// The only exception is compiledICHolder oops which may
// yet be marked below. (We check this further below).
...
...
@@ -1772,7 +1772,7 @@ void nmethod::verify_metadata_loaders(address low_boundary, BoolObjectClosure* i
// compiled code is maintaining a link to dead metadata.
address
static_call_addr
=
NULL
;
if
(
iter
.
type
()
==
relocInfo
::
opt_virtual_call_type
)
{
CompiledIC
*
cic
=
CompiledIC_at
(
iter
.
reloc
()
);
CompiledIC
*
cic
=
CompiledIC_at
(
&
iter
);
if
(
!
cic
->
is_call_to_interpreted
())
{
static_call_addr
=
iter
.
addr
();
}
...
...
@@ -1824,7 +1824,7 @@ void nmethod::metadata_do(void f(Metadata*)) {
}
}
else
if
(
iter
.
type
()
==
relocInfo
::
virtual_call_type
)
{
// Check compiledIC holders associated with this nmethod
CompiledIC
*
ic
=
CompiledIC_at
(
iter
.
reloc
()
);
CompiledIC
*
ic
=
CompiledIC_at
(
&
iter
);
if
(
ic
->
is_icholder_call
())
{
CompiledICHolder
*
cichk
=
ic
->
cached_icholder
();
f
(
cichk
->
holder_method
());
...
...
@@ -2927,7 +2927,7 @@ void nmethod::print_calls(outputStream* st) {
case
relocInfo
::
virtual_call_type
:
case
relocInfo
::
opt_virtual_call_type
:
{
VerifyMutexLocker
mc
(
CompiledIC_lock
);
CompiledIC_at
(
iter
.
reloc
()
)
->
print
();
CompiledIC_at
(
&
iter
)
->
print
();
break
;
}
case
relocInfo
::
static_call_type
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录