Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
7dc56cff
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7dc56cff
编写于
1月 29, 2010
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
6921339: backout 6917766
Reviewed-by: mr
上级
f3f7a33e
变更
15
隐藏空白更改
内联
并排
Showing
15 changed file
with
134 addition
and
255 deletion
+134
-255
src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
+18
-12
src/cpu/sparc/vm/frame_sparc.cpp
src/cpu/sparc/vm/frame_sparc.cpp
+6
-7
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
+21
-11
src/cpu/x86/vm/frame_x86.cpp
src/cpu/x86/vm/frame_x86.cpp
+27
-61
src/cpu/x86/vm/frame_x86.inline.hpp
src/cpu/x86/vm/frame_x86.inline.hpp
+12
-15
src/share/vm/asm/codeBuffer.hpp
src/share/vm/asm/codeBuffer.hpp
+5
-7
src/share/vm/c1/c1_Compilation.cpp
src/share/vm/c1/c1_Compilation.cpp
+4
-14
src/share/vm/c1/c1_LIRAssembler.hpp
src/share/vm/c1/c1_LIRAssembler.hpp
+3
-3
src/share/vm/code/nmethod.cpp
src/share/vm/code/nmethod.cpp
+4
-21
src/share/vm/code/nmethod.hpp
src/share/vm/code/nmethod.hpp
+24
-33
src/share/vm/opto/output.cpp
src/share/vm/opto/output.cpp
+1
-5
src/share/vm/runtime/deoptimization.cpp
src/share/vm/runtime/deoptimization.cpp
+1
-7
src/share/vm/runtime/frame.cpp
src/share/vm/runtime/frame.cpp
+3
-36
src/share/vm/runtime/frame.hpp
src/share/vm/runtime/frame.hpp
+1
-9
src/share/vm/runtime/sharedRuntime.cpp
src/share/vm/runtime/sharedRuntime.cpp
+4
-14
未找到文件。
src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp
浏览文件 @
7dc56cff
/*
* Copyright 2000-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -357,7 +357,7 @@ void LIR_Assembler::monitorexit(LIR_Opr obj_opr, LIR_Opr lock_opr, Register hdr,
}
int
LIR_Assembler
::
emit_exception_handler
()
{
void
LIR_Assembler
::
emit_exception_handler
()
{
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
...
...
@@ -373,10 +373,13 @@ int LIR_Assembler::emit_exception_handler() {
if
(
handler_base
==
NULL
)
{
// not enough space left for the handler
bailout
(
"exception handler overflow"
);
return
-
1
;
return
;
}
#ifdef ASSERT
int
offset
=
code_offset
();
#endif // ASSERT
compilation
()
->
offsets
()
->
set_value
(
CodeOffsets
::
Exceptions
,
code_offset
());
if
(
compilation
()
->
has_exception_handlers
()
||
compilation
()
->
env
()
->
jvmti_can_post_exceptions
())
{
__
call
(
Runtime1
::
entry_for
(
Runtime1
::
handle_exception_id
),
relocInfo
::
runtime_call_type
);
...
...
@@ -387,13 +390,11 @@ int LIR_Assembler::emit_exception_handler() {
__
delayed
()
->
nop
();
debug_only
(
__
stop
(
"should have gone to the caller"
);)
assert
(
code_offset
()
-
offset
<=
exception_handler_size
,
"overflow"
);
__
end_a_stub
();
return
offset
;
__
end_a_stub
()
;
}
int
LIR_Assembler
::
emit_deopt_handler
()
{
void
LIR_Assembler
::
emit_deopt_handler
()
{
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
...
...
@@ -407,18 +408,23 @@ int LIR_Assembler::emit_deopt_handler() {
if
(
handler_base
==
NULL
)
{
// not enough space left for the handler
bailout
(
"deopt handler overflow"
);
return
-
1
;
return
;
}
#ifdef ASSERT
int
offset
=
code_offset
();
#endif // ASSERT
compilation
()
->
offsets
()
->
set_value
(
CodeOffsets
::
Deopt
,
code_offset
());
AddressLiteral
deopt_blob
(
SharedRuntime
::
deopt_blob
()
->
unpack
());
__
JUMP
(
deopt_blob
,
G3_scratch
,
0
);
// sethi;jmp
__
delayed
()
->
nop
();
assert
(
code_offset
()
-
offset
<=
deopt_handler_size
,
"overflow"
);
debug_only
(
__
stop
(
"should have gone to the caller"
);)
__
end_a_stub
();
return
offset
;
__
end_a_stub
()
;
}
...
...
src/cpu/sparc/vm/frame_sparc.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
08
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -366,9 +366,8 @@ frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_adjusted_sta
// as get_original_pc() needs correct value for unextended_sp()
if
(
_pc
!=
NULL
)
{
_cb
=
CodeCache
::
find_blob
(
_pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
);
if
(
original_pc
!=
NULL
)
{
_pc
=
original_pc
;
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
))
{
_pc
=
((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
);
_deopt_state
=
is_deoptimized
;
}
else
{
_deopt_state
=
not_deoptimized
;
...
...
@@ -520,9 +519,9 @@ void frame::patch_pc(Thread* thread, address pc) {
_cb
=
CodeCache
::
find_blob
(
pc
);
*
O7_addr
()
=
pc
-
pc_return_offset
;
_cb
=
CodeCache
::
find_blob
(
_pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
);
if
(
original_pc
!=
NULL
)
{
assert
(
orig
inal_pc
==
_pc
,
"expected original to be stored before patching"
);
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
))
{
address
orig
=
((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
);
assert
(
orig
==
_pc
,
"expected original to be stored before patching"
);
_deopt_state
=
is_deoptimized
;
}
else
{
_deopt_state
=
not_deoptimized
;
...
...
src/cpu/x86/vm/c1_LIRAssembler_x86.cpp
浏览文件 @
7dc56cff
/*
* Copyright 2000-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -418,12 +418,13 @@ int LIR_Assembler::initial_frame_size_in_bytes() {
}
int
LIR_Assembler
::
emit_exception_handler
()
{
void
LIR_Assembler
::
emit_exception_handler
()
{
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
// failures when searching for the corresponding bci => add a nop
// (was bug 5/14/1999 - gri)
__
nop
();
// generate code for exception handler
...
...
@@ -431,10 +432,13 @@ int LIR_Assembler::emit_exception_handler() {
if
(
handler_base
==
NULL
)
{
// not enough space left for the handler
bailout
(
"exception handler overflow"
);
return
-
1
;
return
;
}
#ifdef ASSERT
int
offset
=
code_offset
();
#endif // ASSERT
compilation
()
->
offsets
()
->
set_value
(
CodeOffsets
::
Exceptions
,
code_offset
());
// if the method does not have an exception handler, then there is
// no reason to search for one
...
...
@@ -470,19 +474,19 @@ int LIR_Assembler::emit_exception_handler() {
// unwind activation and forward exception to caller
// rax,: exception
__
jump
(
RuntimeAddress
(
Runtime1
::
entry_for
(
Runtime1
::
unwind_exception_id
)));
assert
(
code_offset
()
-
offset
<=
exception_handler_size
,
"overflow"
);
__
end_a_stub
();
return
offset
;
__
end_a_stub
()
;
}
int
LIR_Assembler
::
emit_deopt_handler
()
{
void
LIR_Assembler
::
emit_deopt_handler
()
{
// if the last instruction is a call (typically to do a throw which
// is coming at the end after block reordering) the return address
// must still point into the code area in order to avoid assertion
// failures when searching for the corresponding bci => add a nop
// (was bug 5/14/1999 - gri)
__
nop
();
// generate code for exception handler
...
...
@@ -490,17 +494,23 @@ int LIR_Assembler::emit_deopt_handler() {
if
(
handler_base
==
NULL
)
{
// not enough space left for the handler
bailout
(
"deopt handler overflow"
);
return
-
1
;
return
;
}
#ifdef ASSERT
int
offset
=
code_offset
();
#endif // ASSERT
compilation
()
->
offsets
()
->
set_value
(
CodeOffsets
::
Deopt
,
code_offset
());
InternalAddress
here
(
__
pc
());
__
pushptr
(
here
.
addr
());
__
jump
(
RuntimeAddress
(
SharedRuntime
::
deopt_blob
()
->
unpack
()));
assert
(
code_offset
()
-
offset
<=
deopt_handler_size
,
"overflow"
);
__
end_a_stub
();
return
offset
;
}
...
...
src/cpu/x86/vm/frame_x86.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -222,9 +222,9 @@ void frame::patch_pc(Thread* thread, address pc) {
}
((
address
*
)
sp
())[
-
1
]
=
pc
;
_cb
=
CodeCache
::
find_blob
(
pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
);
if
(
original_pc
!=
NULL
)
{
assert
(
orig
inal_pc
==
_pc
,
"expected original PC
to be stored before patching"
);
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
))
{
address
orig
=
(((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
));
assert
(
orig
==
_pc
,
"expected original
to be stored before patching"
);
_deopt_state
=
is_deoptimized
;
// leave _pc as is
}
else
{
...
...
@@ -323,39 +323,19 @@ frame frame::sender_for_entry_frame(RegisterMap* map) const {
return
fr
;
}
//------------------------------------------------------------------------------
// frame::sender_for_interpreter_frame
frame
frame
::
sender_for_interpreter_frame
(
RegisterMap
*
map
)
const
{
// SP is the raw SP from the sender after adapter or interpreter
// extension.
intptr_t
*
sender_sp
=
this
->
sender_sp
();
// sp is the raw sp from the sender after adapter or interpreter extension
intptr_t
*
sp
=
(
intptr_t
*
)
addr_at
(
sender_sp_offset
);
// This is the sp before any possible extension (adapter/locals).
intptr_t
*
unextended_sp
=
interpreter_frame_sender_sp
();
// Stored FP.
intptr_t
*
saved_fp
=
link
();
address
sender_pc
=
this
->
sender_pc
();
CodeBlob
*
sender_cb
=
CodeCache
::
find_blob_unsafe
(
sender_pc
);
assert
(
sender_cb
,
"sanity"
);
nmethod
*
sender_nm
=
sender_cb
->
as_nmethod_or_null
();
if
(
sender_nm
!=
NULL
)
{
// If the sender PC is a deoptimization point, get the original
// PC. For MethodHandle call site the unextended_sp is stored in
// saved_fp.
if
(
sender_nm
->
is_deopt_mh_entry
(
sender_pc
))
{
DEBUG_ONLY
(
verify_deopt_mh_original_pc
(
sender_nm
,
saved_fp
));
unextended_sp
=
saved_fp
;
}
else
if
(
sender_nm
->
is_deopt_entry
(
sender_pc
))
{
DEBUG_ONLY
(
verify_deopt_original_pc
(
sender_nm
,
unextended_sp
));
}
else
if
(
sender_nm
->
is_method_handle_return
(
sender_pc
))
{
unextended_sp
=
saved_fp
;
}
if
(
sender_nm
!=
NULL
&&
sender_nm
->
is_method_handle_return
(
sender_pc
))
{
unextended_sp
=
(
intptr_t
*
)
at
(
link_offset
);
}
// The interpreter and compiler(s) always save EBP/RBP in a known
...
...
@@ -379,51 +359,40 @@ frame frame::sender_for_interpreter_frame(RegisterMap* map) const {
}
#endif // AMD64
}
#endif // COMPILER2
return
frame
(
sender_sp
,
unextended_sp
,
saved_fp
,
sender_pc
);
#endif
/* COMPILER2 */
return
frame
(
sp
,
unextended_sp
,
link
(),
sender_pc
);
}
//------------------------------------------------------------------------------
// frame::sender_for_compiled_frame
//------------------------------sender_for_compiled_frame-----------------------
frame
frame
::
sender_for_compiled_frame
(
RegisterMap
*
map
)
const
{
assert
(
map
!=
NULL
,
"map must be set"
);
const
bool
c1_compiled
=
_cb
->
is_compiled_by_c1
();
// frame owned by optimizing compiler
intptr_t
*
sender_sp
=
NULL
;
assert
(
_cb
->
frame_size
()
>=
0
,
"must have non-zero frame size"
);
intptr_t
*
sender_sp
=
unextended_sp
()
+
_cb
->
frame_size
();
intptr_t
*
unextended_sp
=
sender_sp
;
sender_sp
=
unextended_sp
()
+
_cb
->
frame_size
();
// On Intel the return_address is always the word on the stack
address
sender_pc
=
(
address
)
*
(
sender_sp
-
1
);
// This is the saved value of EBP which may or may not really be an FP.
// It is only an FP if the sender is an interpreter frame (or C1?).
intptr_t
*
saved_fp
=
(
intptr_t
*
)
*
(
sender_sp
-
frame
::
sender_sp_offset
);
// This is the saved value of ebp which may or may not really be an fp.
// it is only an fp if the sender is an interpreter frame (or c1?)
intptr_t
*
saved_fp
=
(
intptr_t
*
)
*
(
sender_sp
-
frame
::
sender_sp_offset
);
// If we are returning to a compiled MethodHandle call site, the
// saved_fp will in fact be a saved value of the unextended SP. The
// simplest way to tell whether we are returning to such a call site
// is as follows:
intptr_t
*
unextended_sp
=
sender_sp
;
// If we are returning to a compiled method handle call site,
// the saved_fp will in fact be a saved value of the unextended SP.
// The simplest way to tell whether we are returning to such a call
// site is as follows:
CodeBlob
*
sender_cb
=
CodeCache
::
find_blob_unsafe
(
sender_pc
);
assert
(
sender_cb
,
"sanity"
);
nmethod
*
sender_nm
=
sender_cb
->
as_nmethod_or_null
();
if
(
sender_nm
!=
NULL
)
{
// If the sender PC is a deoptimization point, get the original
// PC. For MethodHandle call site the unextended_sp is stored in
// saved_fp.
if
(
sender_nm
->
is_deopt_mh_entry
(
sender_pc
))
{
DEBUG_ONLY
(
verify_deopt_mh_original_pc
(
sender_nm
,
saved_fp
));
unextended_sp
=
saved_fp
;
}
else
if
(
sender_nm
->
is_deopt_entry
(
sender_pc
))
{
DEBUG_ONLY
(
verify_deopt_original_pc
(
sender_nm
,
unextended_sp
));
}
else
if
(
sender_nm
->
is_method_handle_return
(
sender_pc
))
{
unextended_sp
=
saved_fp
;
}
if
(
sender_nm
!=
NULL
&&
sender_nm
->
is_method_handle_return
(
sender_pc
))
{
unextended_sp
=
saved_fp
;
}
if
(
map
->
update_map
())
{
...
...
@@ -434,7 +403,7 @@ frame frame::sender_for_compiled_frame(RegisterMap* map) const {
if
(
_cb
->
oop_maps
()
!=
NULL
)
{
OopMapSet
::
update_register_map
(
this
,
map
);
}
// Since the prolog does the save and restore of
EBP
there is no oopmap
// Since the prolog does the save and restore of
epb
there is no oopmap
// for it so we must fill in its location as if there was an oopmap entry
// since if our caller was compiled code there could be live jvm state in it.
map
->
set_location
(
rbp
->
as_VMReg
(),
(
address
)
(
sender_sp
-
frame
::
sender_sp_offset
));
...
...
@@ -453,9 +422,6 @@ frame frame::sender_for_compiled_frame(RegisterMap* map) const {
return
frame
(
sender_sp
,
unextended_sp
,
saved_fp
,
sender_pc
);
}
//------------------------------------------------------------------------------
// frame::sender
frame
frame
::
sender
(
RegisterMap
*
map
)
const
{
// Default is we done have to follow them. The sender_for_xxx will
// update it accordingly
...
...
src/cpu/x86/vm/frame_x86.inline.hpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -35,35 +35,32 @@ inline frame::frame() {
_deopt_state
=
unknown
;
}
inline
frame
::
frame
(
intptr_t
*
sp
,
intptr_t
*
fp
,
address
pc
)
{
inline
frame
::
frame
(
intptr_t
*
sp
,
intptr_t
*
fp
,
address
pc
)
{
_sp
=
sp
;
_unextended_sp
=
sp
;
_fp
=
fp
;
_pc
=
pc
;
assert
(
pc
!=
NULL
,
"no pc?"
);
_cb
=
CodeCache
::
find_blob
(
pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
);
if
(
original_pc
!=
NULL
)
{
_pc
=
original_pc
;
_deopt_state
=
not_deoptimized
;
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
))
{
_pc
=
(((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
));
_deopt_state
=
is_deoptimized
;
}
else
{
_deopt_state
=
not_deoptimized
;
}
}
inline
frame
::
frame
(
intptr_t
*
sp
,
intptr_t
*
unextended_sp
,
intptr_t
*
fp
,
address
pc
)
{
inline
frame
::
frame
(
intptr_t
*
sp
,
intptr_t
*
unextended_sp
,
intptr_t
*
fp
,
address
pc
)
{
_sp
=
sp
;
_unextended_sp
=
unextended_sp
;
_fp
=
fp
;
_pc
=
pc
;
assert
(
pc
!=
NULL
,
"no pc?"
);
_cb
=
CodeCache
::
find_blob
(
pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
);
if
(
original_pc
!=
NULL
)
{
_pc
=
original_pc
;
assert
(((
nmethod
*
)
_cb
)
->
code_contains
(
_pc
),
"original PC must be in nmethod"
);
_deopt_state
=
not_deoptimized
;
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
))
{
_pc
=
(((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
));
_deopt_state
=
is_deoptimized
;
}
else
{
_deopt_state
=
not_deoptimized
;
...
...
@@ -89,9 +86,9 @@ inline frame::frame(intptr_t* sp, intptr_t* fp) {
_cb
=
CodeCache
::
find_blob
(
_pc
);
address
original_pc
=
nmethod
::
get_deopt_original_pc
(
this
)
;
if
(
original_pc
!=
NULL
)
{
_pc
=
original_pc
;
_deopt_state
=
not_deoptimized
;
if
(
_cb
!=
NULL
&&
_cb
->
is_nmethod
()
&&
((
nmethod
*
)
_cb
)
->
is_deopt_pc
(
_pc
)
)
{
_pc
=
(((
nmethod
*
)
_cb
)
->
get_original_pc
(
this
))
;
_deopt_state
=
is_deoptimized
;
}
else
{
_deopt_state
=
not_deoptimized
;
...
...
src/share/vm/asm/codeBuffer.hpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
08
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -39,7 +39,6 @@ public:
Dtrace_trap
=
OSR_Entry
,
// dtrace probes can never have an OSR entry so reuse it
Exceptions
,
// Offset where exception handler lives
Deopt
,
// Offset where deopt handler lives
DeoptMH
,
// Offset where MethodHandle deopt handler lives
max_Entries
};
// special value to note codeBlobs where profile (forte) stack walking is
...
...
@@ -52,13 +51,12 @@ private:
public:
CodeOffsets
()
{
_values
[
Entry
]
=
0
;
_values
[
Entry
]
=
0
;
_values
[
Verified_Entry
]
=
0
;
_values
[
Frame_Complete
]
=
frame_never_safe
;
_values
[
OSR_Entry
]
=
0
;
_values
[
Exceptions
]
=
-
1
;
_values
[
Deopt
]
=
-
1
;
_values
[
DeoptMH
]
=
-
1
;
_values
[
OSR_Entry
]
=
0
;
_values
[
Exceptions
]
=
-
1
;
_values
[
Deopt
]
=
-
1
;
}
int
value
(
Entries
e
)
{
return
_values
[
e
];
}
...
...
src/share/vm/c1/c1_Compilation.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1999-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1999-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -205,8 +205,6 @@ void Compilation::emit_lir() {
void
Compilation
::
emit_code_epilog
(
LIR_Assembler
*
assembler
)
{
CHECK_BAILOUT
();
CodeOffsets
*
code_offsets
=
assembler
->
offsets
();
// generate code or slow cases
assembler
->
emit_slow_case_stubs
();
CHECK_BAILOUT
();
...
...
@@ -215,18 +213,10 @@ void Compilation::emit_code_epilog(LIR_Assembler* assembler) {
assembler
->
emit_exception_entries
(
exception_info_list
());
CHECK_BAILOUT
();
// Generate code for exception handler.
code_offsets
->
set_value
(
CodeOffsets
::
Exceptions
,
assembler
->
emit_exception_handler
());
CHECK_BAILOUT
();
// Generate code for deopt handler.
code_offsets
->
set_value
(
CodeOffsets
::
Deopt
,
assembler
->
emit_deopt_handler
());
// generate code for exception handler
assembler
->
emit_exception_handler
();
CHECK_BAILOUT
();
// Generate code for MethodHandle deopt handler. We can use the
// same code as for the normal deopt handler, we just need a
// different entry point address.
code_offsets
->
set_value
(
CodeOffsets
::
DeoptMH
,
assembler
->
emit_deopt_handler
());
assembler
->
emit_deopt_handler
();
CHECK_BAILOUT
();
// done
...
...
src/share/vm/c1/c1_LIRAssembler.hpp
浏览文件 @
7dc56cff
/*
* Copyright 2000-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 2000-20
08
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -133,9 +133,9 @@ class LIR_Assembler: public CompilationResourceObj {
void
add_call_info_here
(
CodeEmitInfo
*
info
)
{
add_call_info
(
code_offset
(),
info
);
}
// code patterns
int
emit_exception_handler
();
void
emit_exception_handler
();
void
emit_exception_entries
(
ExceptionInfoList
*
info_list
);
int
emit_deopt_handler
();
void
emit_deopt_handler
();
void
emit_code
(
BlockList
*
hir
);
void
emit_block
(
BlockBegin
*
block
);
...
...
src/share/vm/code/nmethod.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -592,7 +592,6 @@ nmethod::nmethod(
// values something that will never match a pc like the nmethod vtable entry
_exception_offset
=
0
;
_deoptimize_offset
=
0
;
_deoptimize_mh_offset
=
0
;
_orig_pc_offset
=
0
;
#ifdef HAVE_DTRACE_H
_trap_offset
=
0
;
...
...
@@ -683,7 +682,6 @@ nmethod::nmethod(
// values something that will never match a pc like the nmethod vtable entry
_exception_offset
=
0
;
_deoptimize_offset
=
0
;
_deoptimize_mh_offset
=
0
;
_trap_offset
=
offsets
->
value
(
CodeOffsets
::
Dtrace_trap
);
_orig_pc_offset
=
0
;
_stub_offset
=
data_offset
();
...
...
@@ -796,7 +794,6 @@ nmethod::nmethod(
// Exception handler and deopt handler are in the stub section
_exception_offset
=
_stub_offset
+
offsets
->
value
(
CodeOffsets
::
Exceptions
);
_deoptimize_offset
=
_stub_offset
+
offsets
->
value
(
CodeOffsets
::
Deopt
);
_deoptimize_mh_offset
=
_stub_offset
+
offsets
->
value
(
CodeOffsets
::
DeoptMH
);
_consts_offset
=
instructions_offset
()
+
code_buffer
->
total_offset_of
(
code_buffer
->
consts
()
->
start
());
_scopes_data_offset
=
data_offset
();
_scopes_pcs_offset
=
_scopes_data_offset
+
round_to
(
debug_info
->
data_size
(),
oopSize
);
...
...
@@ -2034,21 +2031,9 @@ void nmethodLocker::unlock_nmethod(nmethod* nm) {
guarantee
(
nm
->
_lock_count
>=
0
,
"unmatched nmethod lock/unlock"
);
}
// -----------------------------------------------------------------------------
// nmethod::get_deopt_original_pc
//
// Return the original PC for the given PC if:
// (a) the given PC belongs to a nmethod and
// (b) it is a deopt PC
address
nmethod
::
get_deopt_original_pc
(
const
frame
*
fr
)
{
if
(
fr
->
cb
()
==
NULL
)
return
NULL
;
nmethod
*
nm
=
fr
->
cb
()
->
as_nmethod_or_null
();
if
(
nm
!=
NULL
&&
nm
->
is_deopt_pc
(
fr
->
pc
()))
return
nm
->
get_original_pc
(
fr
);
return
NULL
;
bool
nmethod
::
is_deopt_pc
(
address
pc
)
{
bool
ret
=
pc
==
deopt_handler_begin
();
return
ret
;
}
...
...
@@ -2419,8 +2404,6 @@ void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) {
if
(
block_begin
==
verified_entry_point
())
stream
->
print_cr
(
"[Verified Entry Point]"
);
if
(
block_begin
==
exception_begin
())
stream
->
print_cr
(
"[Exception Handler]"
);
if
(
block_begin
==
stub_begin
())
stream
->
print_cr
(
"[Stub Code]"
);
if
(
block_begin
==
deopt_handler_begin
())
stream
->
print_cr
(
"[Deopt Handler Code]"
);
if
(
block_begin
==
deopt_mh_handler_begin
())
stream
->
print_cr
(
"[Deopt MH Handler Code]"
);
if
(
block_begin
==
consts_begin
())
stream
->
print_cr
(
"[Constants]"
);
if
(
block_begin
==
entry_point
())
{
methodHandle
m
=
method
();
...
...
src/share/vm/code/nmethod.hpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -145,12 +145,8 @@ class nmethod : public CodeBlob {
// Offsets for different nmethod parts
int
_exception_offset
;
// All deoptee's will resume execution at this location described by
// this offset.
// All deoptee's will resume execution at this location described by this offset
int
_deoptimize_offset
;
// All deoptee's at a MethodHandle call site will resume execution
// at this location described by this offset.
int
_deoptimize_mh_offset
;
#ifdef HAVE_DTRACE_H
int
_trap_offset
;
#endif // def HAVE_DTRACE_H
...
...
@@ -333,25 +329,24 @@ class nmethod : public CodeBlob {
bool
is_compiled_by_c2
()
const
;
// boundaries for different parts
address
code_begin
()
const
{
return
_entry_point
;
}
address
code_end
()
const
{
return
header_begin
()
+
_stub_offset
;
}
address
exception_begin
()
const
{
return
header_begin
()
+
_exception_offset
;
}
address
deopt_handler_begin
()
const
{
return
header_begin
()
+
_deoptimize_offset
;
}
address
deopt_mh_handler_begin
()
const
{
return
header_begin
()
+
_deoptimize_mh_offset
;
}
address
stub_begin
()
const
{
return
header_begin
()
+
_stub_offset
;
}
address
stub_end
()
const
{
return
header_begin
()
+
_consts_offset
;
}
address
consts_begin
()
const
{
return
header_begin
()
+
_consts_offset
;
}
address
consts_end
()
const
{
return
header_begin
()
+
_scopes_data_offset
;
}
address
scopes_data_begin
()
const
{
return
header_begin
()
+
_scopes_data_offset
;
}
address
scopes_data_end
()
const
{
return
header_begin
()
+
_scopes_pcs_offset
;
}
PcDesc
*
scopes_pcs_begin
()
const
{
return
(
PcDesc
*
)(
header_begin
()
+
_scopes_pcs_offset
);
}
PcDesc
*
scopes_pcs_end
()
const
{
return
(
PcDesc
*
)(
header_begin
()
+
_dependencies_offset
)
;
}
address
dependencies_begin
()
const
{
return
header_begin
()
+
_dependencies_offset
;
}
address
dependencies_end
()
const
{
return
header_begin
()
+
_handler_table_offset
;
}
address
handler_table_begin
()
const
{
return
header_begin
()
+
_handler_table_offset
;
}
address
handler_table_end
()
const
{
return
header_begin
()
+
_nul_chk_table_offset
;
}
address
nul_chk_table_begin
()
const
{
return
header_begin
()
+
_nul_chk_table_offset
;
}
address
nul_chk_table_end
()
const
{
return
header_begin
()
+
_nmethod_end_offset
;
}
address
code_begin
()
const
{
return
_entry_point
;
}
address
code_end
()
const
{
return
header_begin
()
+
_stub_offset
;
}
address
exception_begin
()
const
{
return
header_begin
()
+
_exception_offset
;
}
address
deopt_handler_begin
()
const
{
return
header_begin
()
+
_deoptimize_offset
;
}
address
stub_begin
()
const
{
return
header_begin
()
+
_stub_offset
;
}
address
stub_end
()
const
{
return
header_begin
()
+
_consts_offset
;
}
address
consts_begin
()
const
{
return
header_begin
()
+
_consts_offset
;
}
address
consts_end
()
const
{
return
header_begin
()
+
_scopes_data_offset
;
}
address
scopes_data_begin
()
const
{
return
header_begin
()
+
_scopes_data_offset
;
}
address
scopes_data_end
()
const
{
return
header_begin
()
+
_scopes_pcs_offset
;
}
PcDesc
*
scopes_pcs_begin
()
const
{
return
(
PcDesc
*
)(
header_begin
()
+
_scopes_pcs_offset
);
}
PcDesc
*
scopes_pcs_end
()
const
{
return
(
PcDesc
*
)(
header_begin
()
+
_dependencies_offset
);
}
address
dependencies_begin
()
const
{
return
header_begin
()
+
_dependencies_offset
;
}
address
dependencies_end
()
const
{
return
header_begin
()
+
_handler_table_offset
;
}
address
handler_table_begin
()
const
{
return
header_begin
()
+
_handler_table_offset
;
}
address
handler_table_end
()
const
{
return
header_begin
()
+
_nul_chk_table_offset
;
}
address
nul_chk_table_begin
()
const
{
return
header_begin
()
+
_nul_chk_table_offset
;
}
address
nul_chk_table_end
()
const
{
return
header_begin
()
+
_nmethod_end_offset
;
}
int
code_size
()
const
{
return
code_end
()
-
code_begin
();
}
int
stub_size
()
const
{
return
stub_end
()
-
stub_begin
();
}
...
...
@@ -520,7 +515,7 @@ class nmethod : public CodeBlob {
private:
ScopeDesc
*
scope_desc_in
(
address
begin
,
address
end
);
address
*
orig_pc_addr
(
const
frame
*
fr
)
{
return
(
address
*
)
((
address
)
fr
->
unextended_sp
()
+
_orig_pc_offset
);
}
address
*
orig_pc_addr
(
const
frame
*
fr
)
{
return
(
address
*
)
((
address
)
fr
->
unextended_sp
()
+
_orig_pc_offset
);
}
PcDesc
*
find_pc_desc_internal
(
address
pc
,
bool
approximate
);
...
...
@@ -543,17 +538,13 @@ class nmethod : public CodeBlob {
void
copy_scopes_pcs
(
PcDesc
*
pcs
,
int
count
);
void
copy_scopes_data
(
address
buffer
,
int
size
);
// Deopt
// Return true is the PC is one would expect if the frame is being deopted.
bool
is_deopt_pc
(
address
pc
)
{
return
is_deopt_entry
(
pc
)
||
is_deopt_mh_entry
(
pc
);
}
bool
is_deopt_entry
(
address
pc
)
{
return
pc
==
deopt_handler_begin
();
}
bool
is_deopt_mh_entry
(
address
pc
)
{
return
pc
==
deopt_mh_handler_begin
();
}
// deopt
// return true is the pc is one would expect if the frame is being deopted.
bool
is_deopt_pc
(
address
pc
);
// Accessor/mutator for the original pc of a frame before a frame was deopted.
address
get_original_pc
(
const
frame
*
fr
)
{
return
*
orig_pc_addr
(
fr
);
}
void
set_original_pc
(
const
frame
*
fr
,
address
pc
)
{
*
orig_pc_addr
(
fr
)
=
pc
;
}
static
address
get_deopt_original_pc
(
const
frame
*
fr
);
// MethodHandle
bool
is_method_handle_return
(
address
return_pc
);
...
...
src/share/vm/opto/output.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1998-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1998-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -1430,10 +1430,6 @@ void Compile::Fill_buffer() {
_code_offsets
.
set_value
(
CodeOffsets
::
Exceptions
,
emit_exception_handler
(
*
cb
));
// Emit the deopt handler code.
_code_offsets
.
set_value
(
CodeOffsets
::
Deopt
,
emit_deopt_handler
(
*
cb
));
// Emit the MethodHandle deopt handler code. We can use the same
// code as for the normal deopt handler, we just need a different
// entry point address.
_code_offsets
.
set_value
(
CodeOffsets
::
DeoptMH
,
emit_deopt_handler
(
*
cb
));
}
// One last check for failed CodeBuffer::expand:
...
...
src/share/vm/runtime/deoptimization.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -235,12 +235,6 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread
assert
(
cb
->
frame_size
()
>=
0
,
"Unexpected frame size"
);
intptr_t
*
unpack_sp
=
stub_frame
.
sp
()
+
cb
->
frame_size
();
// If the deopt call site is a MethodHandle invoke call site we have
// to adjust the unpack_sp.
nmethod
*
deoptee_nm
=
deoptee
.
cb
()
->
as_nmethod_or_null
();
if
(
deoptee_nm
!=
NULL
&&
deoptee_nm
->
is_method_handle_return
(
deoptee
.
pc
()))
unpack_sp
=
deoptee
.
unextended_sp
();
#ifdef ASSERT
assert
(
cb
->
is_deoptimization_stub
()
||
cb
->
is_uncommon_trap_stub
(),
"just checking"
);
Events
::
log
(
"fetch unroll sp "
INTPTR_FORMAT
,
unpack_sp
);
...
...
src/share/vm/runtime/frame.cpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -107,11 +107,7 @@ void RegisterMap::print() const {
address
frame
::
raw_pc
()
const
{
if
(
is_deoptimized_frame
())
{
nmethod
*
nm
=
cb
()
->
as_nmethod_or_null
();
if
(
nm
->
is_method_handle_return
(
pc
()))
return
nm
->
deopt_mh_handler_begin
()
-
pc_return_offset
;
else
return
nm
->
deopt_handler_begin
()
-
pc_return_offset
;
return
((
nmethod
*
)
cb
())
->
deopt_handler_begin
()
-
pc_return_offset
;
}
else
{
return
(
pc
()
-
pc_return_offset
);
}
...
...
@@ -273,16 +269,10 @@ void frame::deoptimize(JavaThread* thread, bool thread_is_known_safe) {
}
// NeedsDeoptSuspend
// If the call site is a MethodHandle call site use the MH deopt
// handler.
address
deopt
=
nm
->
is_method_handle_return
(
pc
())
?
nm
->
deopt_mh_handler_begin
()
:
nm
->
deopt_handler_begin
();
address
deopt
=
nm
->
deopt_handler_begin
();
// Save the original pc before we patch in the new one
nm
->
set_original_pc
(
this
,
pc
());
patch_pc
(
thread
,
deopt
);
#ifdef ASSERT
{
RegisterMap
map
(
thread
,
false
);
...
...
@@ -311,29 +301,6 @@ frame frame::real_sender(RegisterMap* map) const {
return
result
;
}
//------------------------------------------------------------------------------
// frame::verify_deopt_original_pc
//
// Verifies the calculated original PC of a deoptimization PC for the
// given unextended SP. The unextended SP might also be the saved SP
// for MethodHandle call sites.
#if ASSERT
void
frame
::
verify_deopt_original_pc
(
nmethod
*
nm
,
intptr_t
*
unextended_sp
,
bool
is_method_handle_return
)
{
frame
fr
;
// This is ugly but it's better than to change {get,set}_original_pc
// to take an SP value as argument. And it's only a debugging
// method anyway.
fr
.
_unextended_sp
=
unextended_sp
;
address
original_pc
=
nm
->
get_original_pc
(
&
fr
);
assert
(
nm
->
code_contains
(
original_pc
),
"original PC must be in nmethod"
);
assert
(
nm
->
is_method_handle_return
(
original_pc
)
==
is_method_handle_return
,
"must be"
);
}
#endif
// Note: called by profiler - NOT for current thread
frame
frame
::
profile_find_Java_sender_frame
(
JavaThread
*
thread
)
{
// If we don't recognize this frame, walk back up the stack until we do
...
...
src/share/vm/runtime/frame.hpp
浏览文件 @
7dc56cff
/*
* Copyright 1997-20
10
Sun Microsystems, Inc. All Rights Reserved.
* Copyright 1997-20
09
Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -141,14 +141,6 @@ class frame VALUE_OBJ_CLASS_SPEC {
frame
sender_for_interpreter_frame
(
RegisterMap
*
map
)
const
;
frame
sender_for_native_frame
(
RegisterMap
*
map
)
const
;
#if ASSERT
// Used in frame::sender_for_{interpreter,compiled}_frame
static
void
verify_deopt_original_pc
(
nmethod
*
nm
,
intptr_t
*
unextended_sp
,
bool
is_method_handle_return
=
false
);
static
void
verify_deopt_mh_original_pc
(
nmethod
*
nm
,
intptr_t
*
unextended_sp
)
{
verify_deopt_original_pc
(
nm
,
unextended_sp
,
true
);
}
#endif
// All frames:
// A low-level interface for vframes:
...
...
src/share/vm/runtime/sharedRuntime.cpp
浏览文件 @
7dc56cff
...
...
@@ -1033,20 +1033,10 @@ JRT_BLOCK_ENTRY(address, SharedRuntime::handle_wrong_method(JavaThread* thread))
address
sender_pc
=
caller_frame
.
pc
();
CodeBlob
*
sender_cb
=
caller_frame
.
cb
();
nmethod
*
sender_nm
=
sender_cb
->
as_nmethod_or_null
();
bool
is_mh_invoke_via_adapter
=
false
;
// Direct c2c call or via adapter?
if
(
sender_nm
!=
NULL
&&
sender_nm
->
is_method_handle_return
(
sender_pc
))
{
// If the callee_target is set, then we have come here via an i2c
// adapter.
methodOop
callee
=
thread
->
callee_target
();
if
(
callee
!=
NULL
)
{
assert
(
callee
->
is_method
(),
"sanity"
);
is_mh_invoke_via_adapter
=
true
;
}
}
if
(
caller_frame
.
is_interpreted_frame
()
||
caller_frame
.
is_entry_frame
()
||
is_mh_invoke_via_adapter
)
{
caller_frame
.
is_entry_frame
()
||
(
sender_nm
!=
NULL
&&
sender_nm
->
is_method_handle_return
(
sender_pc
))
)
{
methodOop
callee
=
thread
->
callee_target
();
guarantee
(
callee
!=
NULL
&&
callee
->
is_method
(),
"bad handshake"
);
thread
->
set_vm_result
(
callee
);
...
...
@@ -1427,7 +1417,7 @@ IRT_LEAF(void, SharedRuntime::fixup_callers_callsite(methodOopDesc* method, addr
if
(
callee
==
cb
||
callee
->
is_adapter_blob
())
{
// static call or optimized virtual
if
(
TraceCallFixup
)
{
tty
->
print
(
"fixup callsite
at "
INTPTR_FORMAT
" to compiled code for"
,
caller_pc
);
tty
->
print
(
"fixup callsite at "
INTPTR_FORMAT
" to compiled code for"
,
caller_pc
);
moop
->
print_short_name
(
tty
);
tty
->
print_cr
(
" to "
INTPTR_FORMAT
,
entry_point
);
}
...
...
@@ -1443,7 +1433,7 @@ IRT_LEAF(void, SharedRuntime::fixup_callers_callsite(methodOopDesc* method, addr
}
}
else
{
if
(
TraceCallFixup
)
{
tty
->
print
(
"already patched callsite at "
INTPTR_FORMAT
" to compiled code for"
,
caller_pc
);
tty
->
print
(
"already patched
callsite at "
INTPTR_FORMAT
" to compiled code for"
,
caller_pc
);
moop
->
print_short_name
(
tty
);
tty
->
print_cr
(
" to "
INTPTR_FORMAT
,
entry_point
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录