Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
30ace565
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看板
提交
30ace565
编写于
2月 27, 2013
作者:
I
iignatyev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8007439: C2: adding successful message of inlining
Reviewed-by: kvn, vlivanov
上级
b2d65fa7
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
162 addition
and
101 deletion
+162
-101
src/share/vm/opto/bytecodeInfo.cpp
src/share/vm/opto/bytecodeInfo.cpp
+143
-94
src/share/vm/opto/parse.hpp
src/share/vm/opto/parse.hpp
+19
-7
未找到文件。
src/share/vm/opto/bytecodeInfo.cpp
浏览文件 @
30ace565
...
...
@@ -47,7 +47,8 @@ InlineTree::InlineTree(Compile* c,
_site_invoke_ratio
(
site_invoke_ratio
),
_max_inline_level
(
max_inline_level
),
_count_inline_bcs
(
method
()
->
code_size_for_inlining
()),
_subtrees
(
c
->
comp_arena
(),
2
,
0
,
NULL
)
_subtrees
(
c
->
comp_arena
(),
2
,
0
,
NULL
),
_msg
(
NULL
)
{
NOT_PRODUCT
(
_count_inlines
=
0
;)
if
(
_caller_jvms
!=
NULL
)
{
...
...
@@ -77,7 +78,8 @@ InlineTree::InlineTree(Compile* c, ciMethod* callee_method, JVMState* caller_jvm
_method
(
callee_method
),
_site_invoke_ratio
(
site_invoke_ratio
),
_max_inline_level
(
max_inline_level
),
_count_inline_bcs
(
method
()
->
code_size
())
_count_inline_bcs
(
method
()
->
code_size
()),
_msg
(
NULL
)
{
NOT_PRODUCT
(
_count_inlines
=
0
;)
assert
(
!
UseOldInlining
,
"do not use for old stuff"
);
...
...
@@ -95,8 +97,10 @@ static bool is_init_with_ea(ciMethod* callee_method,
);
}
// positive filter: should callee be inlined? returns NULL, if yes, or rejection msg
const
char
*
InlineTree
::
should_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
)
const
{
// positive filter: should callee be inlined?
bool
InlineTree
::
should_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
)
{
// Allows targeted inlining
if
(
callee_method
->
should_inline
())
{
*
wci_result
=
*
(
WarmCallInfo
::
always_hot
());
...
...
@@ -104,11 +108,10 @@ const char* InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_
CompileTask
::
print_inline_indent
(
inline_level
());
tty
->
print_cr
(
"Inlined method is hot: "
);
}
return
NULL
;
set_msg
(
"force inline by CompilerOracle"
);
return
true
;
}
// positive filter: should send be inlined? returns NULL (--> yes)
// or rejection msg
int
size
=
callee_method
->
code_size_for_inlining
();
// Check for too many throws (and not too huge)
...
...
@@ -119,11 +122,13 @@ const char* InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_
CompileTask
::
print_inline_indent
(
inline_level
());
tty
->
print_cr
(
"Inlined method with many throws (throws=%d):"
,
callee_method
->
interpreter_throwout_count
());
}
return
NULL
;
set_msg
(
"many throws"
);
return
true
;
}
if
(
!
UseOldInlining
)
{
return
NULL
;
// size and frequency are represented in a new way
set_msg
(
"!UseOldInlining"
);
return
true
;
// size and frequency are represented in a new way
}
int
default_max_inline_size
=
C
->
max_inline_size
();
...
...
@@ -153,31 +158,44 @@ const char* InlineTree::should_inline(ciMethod* callee_method, ciMethod* caller_
// Not hot. Check for medium-sized pre-existing nmethod at cold sites.
if
(
callee_method
->
has_compiled_code
()
&&
callee_method
->
instructions_size
()
>
inline_small_code_size
)
return
"already compiled into a medium method"
;
set_msg
(
"already compiled into a medium method"
);
return
false
;
}
if
(
size
>
max_inline_size
)
{
if
(
max_inline_size
>
default_max_inline_size
)
return
"hot method too big"
;
return
"too big"
;
if
(
max_inline_size
>
default_max_inline_size
)
{
set_msg
(
"hot method too big"
);
}
else
{
set_msg
(
"too big"
);
}
return
false
;
}
return
NULL
;
return
true
;
}
// negative filter: should callee NOT be inlined? returns NULL, ok to inline, or rejection msg
const
char
*
InlineTree
::
should_not_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
WarmCallInfo
*
wci_result
)
const
{
// negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg
// negative filter: should callee NOT be inlined?
bool
InlineTree
::
should_not_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
WarmCallInfo
*
wci_result
)
{
const
char
*
fail_msg
=
NULL
;
// First check all inlining restrictions which are required for correctness
if
(
callee_method
->
is_abstract
())
{
fail_msg
=
"abstract method"
;
// // note: we allow ik->is_abstract()
}
else
if
(
!
callee_method
->
holder
()
->
is_initialized
())
{
fail_msg
=
"method holder not initialized"
;
}
else
if
(
callee_method
->
is_native
())
{
fail_msg
=
"native method"
;
}
else
if
(
callee_method
->
dont_inline
())
{
fail_msg
=
"don't inline by annotation"
;
}
if
(
!
UseOldInlining
)
{
const
char
*
fail
=
NULL
;
if
(
callee_method
->
is_abstract
())
fail
=
"abstract method"
;
// note: we allow ik->is_abstract()
if
(
!
callee_method
->
holder
()
->
is_initialized
())
fail
=
"method holder not initialized"
;
if
(
callee_method
->
is_native
())
fail
=
"native method"
;
if
(
callee_method
->
dont_inline
())
fail
=
"don't inline by annotation"
;
if
(
fail
)
{
if
(
fail_msg
!=
NULL
)
{
*
wci_result
=
*
(
WarmCallInfo
::
always_cold
());
return
fail
;
set_msg
(
fail_msg
);
return
true
;
}
if
(
callee_method
->
has_unloaded_classes_in_signature
())
{
...
...
@@ -199,20 +217,23 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
// %%% adjust wci_result->size()?
}
return
NULL
;
return
false
;
}
// First check all inlining restrictions which are required for correctness
if
(
callee_method
->
is_abstract
())
return
"abstract method"
;
// note: we allow ik->is_abstract()
if
(
!
callee_method
->
holder
()
->
is_initialized
())
return
"method holder not initialized"
;
if
(
callee_method
->
is_native
())
return
"native method"
;
if
(
callee_method
->
dont_inline
())
return
"don't inline by annotation"
;
if
(
callee_method
->
has_unloaded_classes_in_signature
())
return
"unloaded signature classes"
;
// one more inlining restriction
if
(
fail_msg
==
NULL
&&
callee_method
->
has_unloaded_classes_in_signature
())
{
fail_msg
=
"unloaded signature classes"
;
}
if
(
fail_msg
!=
NULL
)
{
set_msg
(
fail_msg
);
return
true
;
}
// ignore heuristic controls on inlining
if
(
callee_method
->
should_inline
())
{
// ignore heuristic controls on inlining
return
NULL
;
set_msg
(
"force inline by CompilerOracle"
);
return
false
;
}
// Now perform checks which are heuristic
...
...
@@ -220,7 +241,8 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
if
(
!
callee_method
->
force_inline
())
{
if
(
callee_method
->
has_compiled_code
()
&&
callee_method
->
instructions_size
()
>
InlineSmallCode
)
{
return
"already compiled into a big method"
;
set_msg
(
"already compiled into a big method"
);
return
true
;
}
}
...
...
@@ -231,17 +253,21 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
const
InlineTree
*
top
=
this
;
while
(
top
->
caller_tree
()
!=
NULL
)
top
=
top
->
caller_tree
();
ciInstanceKlass
*
k
=
top
->
method
()
->
holder
();
if
(
!
k
->
is_subclass_of
(
C
->
env
()
->
Throwable_klass
()))
return
"exception method"
;
if
(
!
k
->
is_subclass_of
(
C
->
env
()
->
Throwable_klass
()))
{
set_msg
(
"exception method"
);
return
true
;
}
}
if
(
callee_method
->
should_not_inline
())
{
return
"disallowed by CompilerOracle"
;
set_msg
(
"disallowed by CompilerOracle"
);
return
true
;
}
#ifndef PRODUCT
if
(
ciReplay
::
should_not_inline
(
callee_method
))
{
return
"disallowed by ciReplay"
;
set_msg
(
"disallowed by ciReplay"
);
return
true
;
}
#endif
...
...
@@ -249,19 +275,23 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
// Do not inline StringCache::profile() method used only at the beginning.
if
(
callee_method
->
name
()
==
ciSymbol
::
profile_name
()
&&
callee_method
->
holder
()
->
name
()
==
ciSymbol
::
java_lang_StringCache
())
{
return
"profiling method"
;
set_msg
(
"profiling method"
);
return
true
;
}
}
// use frequency-based objections only for non-trivial methods
if
(
callee_method
->
code_size
()
<=
MaxTrivialSize
)
return
NULL
;
if
(
callee_method
->
code_size
()
<=
MaxTrivialSize
)
{
return
false
;
}
// don't use counts with -Xcomp or CTW
if
(
UseInterpreter
&&
!
CompileTheWorld
)
{
if
(
!
callee_method
->
has_compiled_code
()
&&
!
callee_method
->
was_executed_more_than
(
0
))
{
return
"never executed"
;
set_msg
(
"never executed"
);
return
true
;
}
if
(
is_init_with_ea
(
callee_method
,
caller_method
,
C
))
{
...
...
@@ -270,39 +300,44 @@ const char* InlineTree::should_not_inline(ciMethod *callee_method, ciMethod* cal
}
else
if
(
!
callee_method
->
was_executed_more_than
(
MIN2
(
MinInliningThreshold
,
CompileThreshold
>>
1
)))
{
return
"executed < MinInliningThreshold times"
;
set_msg
(
"executed < MinInliningThreshold times"
);
return
true
;
}
}
return
NULL
;
return
false
;
}
//-----------------------------try_to_inline-----------------------------------
// return
NULL if ok, reason for not inlining otherwise
// return
true if ok
// Relocated from "InliningClosure::try_to_inline"
const
char
*
InlineTree
::
try_to_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
,
bool
&
should_delay
)
{
// Old algorithm had funny accumulating BC-size counters
bool
InlineTree
::
try_to_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
,
bool
&
should_delay
)
{
// Old algorithm had funny accumulating BC-size counters
if
(
UseOldInlining
&&
ClipInlining
&&
(
int
)
count_inline_bcs
()
>=
DesiredMethodLimit
)
{
if
(
!
callee_method
->
force_inline
()
||
!
IncrementalInline
)
{
return
"size > DesiredMethodLimit"
;
set_msg
(
"size > DesiredMethodLimit"
);
return
false
;
}
else
if
(
!
C
->
inlining_incrementally
())
{
should_delay
=
true
;
}
}
const
char
*
msg
=
NULL
;
msg
=
should_inline
(
callee_method
,
caller_method
,
caller_bci
,
profile
,
wci_result
);
if
(
msg
!=
NULL
)
return
msg
;
msg
=
should_not_inline
(
callee_method
,
caller_method
,
wci_result
);
if
(
msg
!=
NULL
)
return
msg
;
if
(
!
should_inline
(
callee_method
,
caller_method
,
caller_bci
,
profile
,
wci_result
))
{
return
false
;
}
if
(
should_not_inline
(
callee_method
,
caller_method
,
wci_result
))
{
return
false
;
}
if
(
InlineAccessors
&&
callee_method
->
is_accessor
())
{
// accessor methods are not subject to any of the following limits.
return
NULL
;
set_msg
(
"accessor"
);
return
true
;
}
// suppress a few checks for accessors and trivial methods
...
...
@@ -312,7 +347,8 @@ const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_
if
(
C
->
over_inlining_cutoff
())
{
if
((
!
callee_method
->
force_inline
()
&&
!
caller_method
->
is_compiled_lambda_form
())
||
!
IncrementalInline
)
{
return
"NodeCountInliningCutoff"
;
set_msg
(
"NodeCountInliningCutoff"
);
return
false
;
}
else
{
should_delay
=
true
;
}
...
...
@@ -326,16 +362,19 @@ const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_
}
else
if
(
profile
.
count
()
==
0
)
{
// don't inline unreached call sites
return
"call site not reached"
;
set_msg
(
"call site not reached"
);
return
false
;
}
}
if
(
!
C
->
do_inlining
()
&&
InlineAccessors
)
{
return
"not an accessor"
;
set_msg
(
"not an accessor"
);
return
false
;
}
if
(
inline_level
()
>
_max_inline_level
)
{
if
(
!
callee_method
->
force_inline
()
||
!
IncrementalInline
)
{
return
"inlining too deep"
;
set_msg
(
"inlining too deep"
);
return
false
;
}
else
if
(
!
C
->
inlining_incrementally
())
{
should_delay
=
true
;
}
...
...
@@ -345,15 +384,19 @@ const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_
if
(
!
callee_method
->
is_compiled_lambda_form
())
{
// count the current method and the callee
int
inline_level
=
(
method
()
==
callee_method
)
?
1
:
0
;
if
(
inline_level
>
MaxRecursiveInlineLevel
)
return
"recursively inlining too deep"
;
if
(
inline_level
>
MaxRecursiveInlineLevel
)
{
set_msg
(
"recursively inlining too deep"
);
return
false
;
}
// count callers of current method and callee
JVMState
*
jvms
=
caller_jvms
();
while
(
jvms
!=
NULL
&&
jvms
->
has_method
())
{
if
(
jvms
->
method
()
==
callee_method
)
{
inline_level
++
;
if
(
inline_level
>
MaxRecursiveInlineLevel
)
return
"recursively inlining too deep"
;
if
(
inline_level
>
MaxRecursiveInlineLevel
)
{
set_msg
(
"recursively inlining too deep"
);
return
false
;
}
}
jvms
=
jvms
->
caller
();
}
...
...
@@ -364,14 +407,15 @@ const char* InlineTree::try_to_inline(ciMethod* callee_method, ciMethod* caller_
if
(
UseOldInlining
&&
ClipInlining
&&
(
int
)
count_inline_bcs
()
+
size
>=
DesiredMethodLimit
)
{
if
(
!
callee_method
->
force_inline
()
||
!
IncrementalInline
)
{
return
"size > DesiredMethodLimit"
;
set_msg
(
"size > DesiredMethodLimit"
);
return
false
;
}
else
if
(
!
C
->
inlining_incrementally
())
{
should_delay
=
true
;
}
}
// ok, inline this method
return
NULL
;
return
true
;
}
//------------------------------pass_initial_checks----------------------------
...
...
@@ -421,17 +465,18 @@ const char* InlineTree::check_can_parse(ciMethod* callee) {
//------------------------------print_inlining---------------------------------
void
InlineTree
::
print_inlining
(
ciMethod
*
callee_method
,
int
caller_bci
,
const
char
*
msg
,
bool
success
)
const
{
assert
(
msg
!=
NULL
,
"just checking"
);
bool
success
)
const
{
const
char
*
inline_msg
=
msg
();
assert
(
inline_msg
!=
NULL
,
"just checking"
);
if
(
C
->
log
()
!=
NULL
)
{
if
(
success
)
{
C
->
log
()
->
inline_success
(
msg
);
C
->
log
()
->
inline_success
(
inline_
msg
);
}
else
{
C
->
log
()
->
inline_fail
(
msg
);
C
->
log
()
->
inline_fail
(
inline_
msg
);
}
}
if
(
PrintInlining
)
{
C
->
print_inlining
(
callee_method
,
inline_level
(),
caller_bci
,
msg
);
C
->
print_inlining
(
callee_method
,
inline_level
(),
caller_bci
,
inline_
msg
);
if
(
callee_method
==
NULL
)
tty
->
print
(
" callee not monotonic or profiled"
);
if
(
Verbose
&&
callee_method
)
{
const
InlineTree
*
top
=
this
;
...
...
@@ -455,49 +500,51 @@ WarmCallInfo* InlineTree::ok_to_inline(ciMethod* callee_method, JVMState* jvms,
}
assert
(
_method
==
jvms
->
method
(),
"redundant instance state"
);
#endif
const
char
*
failure_msg
=
NULL
;
int
caller_bci
=
jvms
->
bci
();
ciMethod
*
caller_method
=
jvms
->
method
();
ciMethod
*
caller_method
=
jvms
->
method
();
// Do some initial checks.
if
(
!
pass_initial_checks
(
caller_method
,
caller_bci
,
callee_method
))
{
print_inlining
(
callee_method
,
caller_bci
,
"failed initial checks"
,
false
/* !success */
);
set_msg
(
"failed initial checks"
);
print_inlining
(
callee_method
,
caller_bci
,
false
/* !success */
);
return
NULL
;
}
// Do some parse checks.
failure_msg
=
check_can_parse
(
callee_method
);
if
(
failure_msg
!=
NULL
)
{
print_inlining
(
callee_method
,
caller_bci
,
failure_msg
,
false
/* !success */
);
set_msg
(
check_can_parse
(
callee_method
));
if
(
msg
()
!=
NULL
)
{
print_inlining
(
callee_method
,
caller_bci
,
false
/* !success */
);
return
NULL
;
}
// Check if inlining policy says no.
WarmCallInfo
wci
=
*
(
initial_wci
);
failure_msg
=
try_to_inline
(
callee_method
,
caller_method
,
caller_bci
,
profile
,
&
wci
,
should_delay
);
bool
success
=
try_to_inline
(
callee_method
,
caller_method
,
caller_bci
,
profile
,
&
wci
,
should_delay
);
#ifndef PRODUCT
if
(
UseOldInlining
&&
InlineWarmCalls
&&
(
PrintOpto
||
PrintOptoInlining
||
PrintInlining
))
{
bool
cold
=
wci
.
is_cold
();
bool
hot
=
!
cold
&&
wci
.
is_hot
();
bool
old_cold
=
(
failure_msg
!=
NULL
)
;
bool
old_cold
=
!
success
;
if
(
old_cold
!=
cold
||
(
Verbose
||
WizardMode
))
{
if
(
msg
()
==
NULL
)
{
set_msg
(
"OK"
);
}
tty
->
print
(
" OldInlining= %4s : %s
\n
WCI="
,
old_cold
?
"cold"
:
"hot"
,
failure_msg
?
failure_msg
:
"OK"
);
old_cold
?
"cold"
:
"hot"
,
msg
()
);
wci
.
print
();
}
}
#endif
if
(
UseOldInlining
)
{
if
(
failure_msg
==
NULL
)
if
(
success
)
{
wci
=
*
(
WarmCallInfo
::
always_hot
());
else
}
else
{
wci
=
*
(
WarmCallInfo
::
always_cold
());
}
}
if
(
!
InlineWarmCalls
)
{
if
(
!
wci
.
is_cold
()
&&
!
wci
.
is_hot
())
{
// Do not inline the warm calls.
...
...
@@ -507,9 +554,10 @@ WarmCallInfo* InlineTree::ok_to_inline(ciMethod* callee_method, JVMState* jvms,
if
(
!
wci
.
is_cold
())
{
// Inline!
print_inlining
(
callee_method
,
caller_bci
,
failure_msg
?
failure_msg
:
"inline (hot)"
,
true
/* success */
);
if
(
msg
()
==
NULL
)
{
set_msg
(
"inline (hot)"
);
}
print_inlining
(
callee_method
,
caller_bci
,
true
/* success */
);
if
(
UseOldInlining
)
build_inline_tree_for_callee
(
callee_method
,
jvms
,
caller_bci
);
if
(
InlineWarmCalls
&&
!
wci
.
is_hot
())
...
...
@@ -518,9 +566,10 @@ WarmCallInfo* InlineTree::ok_to_inline(ciMethod* callee_method, JVMState* jvms,
}
// Do not inline
print_inlining
(
callee_method
,
caller_bci
,
failure_msg
?
failure_msg
:
"too cold to inline"
,
false
/* !success */
);
if
(
msg
()
==
NULL
)
{
set_msg
(
"too cold to inline"
);
}
print_inlining
(
callee_method
,
caller_bci
,
false
/* !success */
);
return
NULL
;
}
...
...
src/share/vm/opto/parse.hpp
浏览文件 @
30ace565
...
...
@@ -58,7 +58,7 @@ class InlineTree : public ResourceObj {
GrowableArray
<
InlineTree
*>
_subtrees
;
void
print_impl
(
outputStream
*
stj
,
int
indent
)
const
PRODUCT_RETURN
;
const
char
*
_msg
;
protected:
InlineTree
(
Compile
*
C
,
const
InlineTree
*
caller_tree
,
...
...
@@ -70,17 +70,29 @@ protected:
InlineTree
*
build_inline_tree_for_callee
(
ciMethod
*
callee_method
,
JVMState
*
caller_jvms
,
int
caller_bci
);
const
char
*
try_to_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
,
bool
&
should_delay
);
const
char
*
should_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
)
const
;
const
char
*
should_not_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
WarmCallInfo
*
wci_result
)
const
;
bool
try_to_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
,
bool
&
should_delay
);
bool
should_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
int
caller_bci
,
ciCallProfile
&
profile
,
WarmCallInfo
*
wci_result
);
bool
should_not_inline
(
ciMethod
*
callee_method
,
ciMethod
*
caller_method
,
WarmCallInfo
*
wci_result
);
void
print_inlining
(
ciMethod
*
callee_method
,
int
caller_bci
,
const
char
*
msg
,
bool
success
)
const
;
bool
success
)
const
;
InlineTree
*
caller_tree
()
const
{
return
_caller_tree
;
}
InlineTree
*
caller_tree
()
const
{
return
_caller_tree
;
}
InlineTree
*
callee_at
(
int
bci
,
ciMethod
*
m
)
const
;
int
inline_level
()
const
{
return
stack_depth
();
}
int
stack_depth
()
const
{
return
_caller_jvms
?
_caller_jvms
->
depth
()
:
0
;
}
const
char
*
msg
()
const
{
return
_msg
;
}
void
set_msg
(
const
char
*
msg
)
{
_msg
=
msg
;
}
public:
static
const
char
*
check_can_parse
(
ciMethod
*
callee
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录