Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
c1bb7488
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看板
提交
c1bb7488
编写于
3月 14, 2011
作者:
A
acorn
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
54e6e946
5b12d0c2
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
28 addition
and
33 deletion
+28
-33
src/share/vm/code/nmethod.cpp
src/share/vm/code/nmethod.cpp
+18
-15
src/share/vm/code/nmethod.hpp
src/share/vm/code/nmethod.hpp
+3
-4
src/share/vm/runtime/deoptimization.cpp
src/share/vm/runtime/deoptimization.cpp
+4
-13
src/share/vm/runtime/deoptimization.hpp
src/share/vm/runtime/deoptimization.hpp
+3
-1
未找到文件。
src/share/vm/code/nmethod.cpp
浏览文件 @
c1bb7488
...
...
@@ -170,7 +170,7 @@ struct nmethod_stats_struct {
int
pc_desc_resets
;
// number of resets (= number of caches)
int
pc_desc_queries
;
// queries to nmethod::find_pc_desc
int
pc_desc_approx
;
// number of those which have approximate true
int
pc_desc_repeats
;
// number of _
last_pc_desc
hits
int
pc_desc_repeats
;
// number of _
pc_descs[0]
hits
int
pc_desc_hits
;
// number of LRU cache hits
int
pc_desc_tests
;
// total number of PcDesc examinations
int
pc_desc_searches
;
// total number of quasi-binary search steps
...
...
@@ -278,40 +278,44 @@ static inline bool match_desc(PcDesc* pc, int pc_offset, bool approximate) {
void
PcDescCache
::
reset_to
(
PcDesc
*
initial_pc_desc
)
{
if
(
initial_pc_desc
==
NULL
)
{
_
last_pc_desc
=
NULL
;
// native method
_
pc_descs
[
0
]
=
NULL
;
// native method; no PcDescs at all
return
;
}
NOT_PRODUCT
(
++
nmethod_stats
.
pc_desc_resets
);
// reset the cache by filling it with benign (non-null) values
assert
(
initial_pc_desc
->
pc_offset
()
<
0
,
"must be sentinel"
);
_last_pc_desc
=
initial_pc_desc
+
1
;
// first valid one is after sentinel
for
(
int
i
=
0
;
i
<
cache_size
;
i
++
)
_pc_descs
[
i
]
=
initial_pc_desc
;
}
PcDesc
*
PcDescCache
::
find_pc_desc
(
int
pc_offset
,
bool
approximate
)
{
NOT_PRODUCT
(
++
nmethod_stats
.
pc_desc_queries
);
NOT_PRODUCT
(
if
(
approximate
)
++
nmethod_stats
.
pc_desc_approx
);
NOT_PRODUCT
(
if
(
approximate
)
++
nmethod_stats
.
pc_desc_approx
);
// Note: one might think that caching the most recently
// read value separately would be a win, but one would be
// wrong. When many threads are updating it, the cache
// line it's in would bounce between caches, negating
// any benefit.
// In order to prevent race conditions do not load cache elements
// repeatedly, but use a local copy:
PcDesc
*
res
;
// Step one: Check the most recently
return
ed value.
res
=
_
last_pc_desc
;
if
(
res
==
NULL
)
return
NULL
;
// native method; no PcDescs at all
// Step one: Check the most recently
add
ed value.
res
=
_
pc_descs
[
0
]
;
if
(
res
==
NULL
)
return
NULL
;
// native method; no PcDescs at all
if
(
match_desc
(
res
,
pc_offset
,
approximate
))
{
NOT_PRODUCT
(
++
nmethod_stats
.
pc_desc_repeats
);
return
res
;
}
// Step two: Check the LRU cache.
for
(
int
i
=
0
;
i
<
cache_size
;
i
++
)
{
// Step two: Check the
rest of the
LRU cache.
for
(
int
i
=
1
;
i
<
cache_size
;
++
i
)
{
res
=
_pc_descs
[
i
];
if
(
res
->
pc_offset
()
<
0
)
break
;
// optimization: skip empty cache
if
(
res
->
pc_offset
()
<
0
)
break
;
// optimization: skip empty cache
if
(
match_desc
(
res
,
pc_offset
,
approximate
))
{
NOT_PRODUCT
(
++
nmethod_stats
.
pc_desc_hits
);
_last_pc_desc
=
res
;
// record this cache hit in case of repeat
return
res
;
}
}
...
...
@@ -322,24 +326,23 @@ PcDesc* PcDescCache::find_pc_desc(int pc_offset, bool approximate) {
void
PcDescCache
::
add_pc_desc
(
PcDesc
*
pc_desc
)
{
NOT_PRODUCT
(
++
nmethod_stats
.
pc_desc_adds
);
// Update the LRU cache by shifting pc_desc forward
:
// Update the LRU cache by shifting pc_desc forward
.
for
(
int
i
=
0
;
i
<
cache_size
;
i
++
)
{
PcDesc
*
next
=
_pc_descs
[
i
];
_pc_descs
[
i
]
=
pc_desc
;
pc_desc
=
next
;
}
// Note: Do not update _last_pc_desc. It fronts for the LRU cache.
}
// adjust pcs_size so that it is a multiple of both oopSize and
// sizeof(PcDesc) (assumes that if sizeof(PcDesc) is not a multiple
// of oopSize, then 2*sizeof(PcDesc) is)
static
int
adjust_pcs_size
(
int
pcs_size
)
{
static
int
adjust_pcs_size
(
int
pcs_size
)
{
int
nsize
=
round_to
(
pcs_size
,
oopSize
);
if
((
nsize
%
sizeof
(
PcDesc
))
!=
0
)
{
nsize
=
pcs_size
+
sizeof
(
PcDesc
);
}
assert
((
nsize
%
oopSize
)
==
0
,
"correct alignment"
);
assert
((
nsize
%
oopSize
)
==
0
,
"correct alignment"
);
return
nsize
;
}
...
...
src/share/vm/code/nmethod.hpp
浏览文件 @
c1bb7488
...
...
@@ -69,14 +69,13 @@ class PcDescCache VALUE_OBJ_CLASS_SPEC {
friend
class
VMStructs
;
private:
enum
{
cache_size
=
4
};
PcDesc
*
_last_pc_desc
;
// most recent pc_desc found
PcDesc
*
_pc_descs
[
cache_size
];
// last cache_size pc_descs found
public:
PcDescCache
()
{
debug_only
(
_
last_pc_desc
=
NULL
);
}
PcDescCache
()
{
debug_only
(
_
pc_descs
[
0
]
=
NULL
);
}
void
reset_to
(
PcDesc
*
initial_pc_desc
);
PcDesc
*
find_pc_desc
(
int
pc_offset
,
bool
approximate
);
void
add_pc_desc
(
PcDesc
*
pc_desc
);
PcDesc
*
last_pc_desc
()
{
return
_
last_pc_desc
;
}
PcDesc
*
last_pc_desc
()
{
return
_
pc_descs
[
0
]
;
}
};
...
...
@@ -178,7 +177,7 @@ class nmethod : public CodeBlob {
unsigned
int
_has_method_handle_invokes
:
1
;
// Has this method MethodHandle invokes?
// Protected by Patching_lock
unsigned
char
_state
;
// {alive, not_entrant, zombie, unloaded
)
unsigned
char
_state
;
// {alive, not_entrant, zombie, unloaded
}
#ifdef ASSERT
bool
_oops_are_stale
;
// indicates that it's no longer safe to access oops section
...
...
src/share/vm/runtime/deoptimization.cpp
浏览文件 @
c1bb7488
...
...
@@ -101,9 +101,9 @@ Deoptimization::UnrollBlock::UnrollBlock(int size_of_deoptimized_frame,
_frame_pcs
=
frame_pcs
;
_register_block
=
NEW_C_HEAP_ARRAY
(
intptr_t
,
RegisterMap
::
reg_count
*
2
);
_return_type
=
return_type
;
_initial_fp
=
0
;
// PD (x86 only)
_counter_temp
=
0
;
_initial_fp
=
0
;
_unpack_kind
=
0
;
_sender_sp_temp
=
0
;
...
...
@@ -459,18 +459,9 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread
frame_sizes
,
frame_pcs
,
return_type
);
#if defined(IA32) || defined(AMD64)
// We need a way to pass fp to the unpacking code so the skeletal frames
// come out correct. This is only needed for x86 because of c2 using ebp
// as an allocatable register. So this update is useless (and harmless)
// on the other platforms. It would be nice to do this in a different
// way but even the old style deoptimization had a problem with deriving
// this value. NEEDS_CLEANUP
// Note: now that c1 is using c2's deopt blob we must do this on all
// x86 based platforms
intptr_t
**
fp_addr
=
(
intptr_t
**
)
(((
address
)
info
)
+
info
->
initial_fp_offset_in_bytes
());
*
fp_addr
=
array
->
sender
().
fp
();
// was adapter_caller
#endif
/* IA32 || AMD64 */
// On some platforms, we need a way to pass fp to the unpacking code
// so the skeletal frames come out correct.
info
->
set_initial_fp
((
intptr_t
)
array
->
sender
().
fp
());
if
(
array
->
frames
()
>
1
)
{
if
(
VerifyStack
&&
TraceDeoptimization
)
{
...
...
src/share/vm/runtime/deoptimization.hpp
浏览文件 @
c1bb7488
...
...
@@ -136,12 +136,12 @@ class Deoptimization : AllStatic {
address
*
_frame_pcs
;
// Array of frame pc's, in bytes, for unrolling the stack
intptr_t
*
_register_block
;
// Block for storing callee-saved registers.
BasicType
_return_type
;
// Tells if we have to restore double or long return value
intptr_t
_initial_fp
;
// FP of the sender frame
// The following fields are used as temps during the unpacking phase
// (which is tight on registers, especially on x86). They really ought
// to be PD variables but that involves moving this class into its own
// file to use the pd include mechanism. Maybe in a later cleanup ...
intptr_t
_counter_temp
;
// SHOULD BE PD VARIABLE (x86 frame count temp)
intptr_t
_initial_fp
;
// SHOULD BE PD VARIABLE (x86/c2 initial ebp)
intptr_t
_unpack_kind
;
// SHOULD BE PD VARIABLE (x86 unpack kind)
intptr_t
_sender_sp_temp
;
// SHOULD BE PD VARIABLE (x86 sender_sp)
public:
...
...
@@ -165,6 +165,8 @@ class Deoptimization : AllStatic {
// Returns the total size of frames
int
size_of_frames
()
const
;
void
set_initial_fp
(
intptr_t
fp
)
{
_initial_fp
=
fp
;
}
// Accessors used by the code generator for the unpack stub.
static
int
size_of_deoptimized_frame_offset_in_bytes
()
{
return
offset_of
(
UnrollBlock
,
_size_of_deoptimized_frame
);
}
static
int
caller_adjustment_offset_in_bytes
()
{
return
offset_of
(
UnrollBlock
,
_caller_adjustment
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录