Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
1edc2949
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看板
提交
1edc2949
编写于
10月 24, 2013
作者:
T
twisti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8026328: Setting a breakpoint on invokedynamic crashes the JVM
Reviewed-by: jrose, roland
上级
3de7ef42
变更
18
隐藏空白更改
内联
并排
Showing
18 changed file
with
143 addition
and
129 deletion
+143
-129
src/cpu/sparc/vm/cppInterpreter_sparc.cpp
src/cpu/sparc/vm/cppInterpreter_sparc.cpp
+1
-1
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
+12
-29
src/cpu/sparc/vm/templateTable_sparc.cpp
src/cpu/sparc/vm/templateTable_sparc.cpp
+3
-5
src/cpu/x86/vm/cppInterpreter_x86.cpp
src/cpu/x86/vm/cppInterpreter_x86.cpp
+1
-1
src/cpu/x86/vm/templateInterpreter_x86_32.cpp
src/cpu/x86/vm/templateInterpreter_x86_32.cpp
+14
-26
src/cpu/x86/vm/templateInterpreter_x86_64.cpp
src/cpu/x86/vm/templateInterpreter_x86_64.cpp
+9
-21
src/cpu/x86/vm/templateTable_x86_32.cpp
src/cpu/x86/vm/templateTable_x86_32.cpp
+1
-3
src/cpu/x86/vm/templateTable_x86_64.cpp
src/cpu/x86/vm/templateTable_x86_64.cpp
+1
-3
src/cpu/zero/vm/cppInterpreter_zero.cpp
src/cpu/zero/vm/cppInterpreter_zero.cpp
+1
-1
src/cpu/zero/vm/globals_zero.hpp
src/cpu/zero/vm/globals_zero.hpp
+2
-0
src/share/vm/interpreter/abstractInterpreter.hpp
src/share/vm/interpreter/abstractInterpreter.hpp
+2
-2
src/share/vm/interpreter/cppInterpreter.hpp
src/share/vm/interpreter/cppInterpreter.hpp
+1
-1
src/share/vm/interpreter/interpreter.cpp
src/share/vm/interpreter/interpreter.cpp
+12
-6
src/share/vm/interpreter/templateInterpreter.cpp
src/share/vm/interpreter/templateInterpreter.cpp
+66
-20
src/share/vm/interpreter/templateInterpreter.hpp
src/share/vm/interpreter/templateInterpreter.hpp
+11
-7
src/share/vm/interpreter/templateInterpreterGenerator.hpp
src/share/vm/interpreter/templateInterpreterGenerator.hpp
+1
-1
src/share/vm/oops/method.cpp
src/share/vm/oops/method.cpp
+4
-1
src/share/vm/runtime/handles.cpp
src/share/vm/runtime/handles.cpp
+1
-1
未找到文件。
src/cpu/sparc/vm/cppInterpreter_sparc.cpp
浏览文件 @
1edc2949
...
...
@@ -365,7 +365,7 @@ address CppInterpreterGenerator::generate_stack_to_native_abi_converter(BasicTyp
return
entry
;
}
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
)
{
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
)
{
// make it look good in the debugger
return
CAST_FROM_FN_PTR
(
address
,
RecursiveInterpreterActivation
)
+
frame
::
pc_return_offset
;
}
...
...
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
浏览文件 @
1edc2949
...
...
@@ -153,13 +153,9 @@ address TemplateInterpreterGenerator::generate_StackOverflowError_handler() {
}
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
)
{
TosState
incoming_state
=
state
;
Label
cont
;
address
compiled_entry
=
__
pc
();
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
,
size_t
index_size
)
{
address
entry
=
__
pc
();
#if !defined(_LP64) && defined(COMPILER2)
// All return values are where we want them, except for Longs. C2 returns
// longs in G1 in the 32-bit build whereas the interpreter wants them in O0/O1.
...
...
@@ -170,14 +166,12 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
// do this here. Unfortunately if we did a rethrow we'd see an machepilog node
// first which would move g1 -> O0/O1 and destroy the exception we were throwing.
if
(
incoming_
state
==
ltos
)
{
if
(
state
==
ltos
)
{
__
srl
(
G1
,
0
,
O1
);
__
srlx
(
G1
,
32
,
O0
);
}
#endif // !_LP64 && COMPILER2
__
bind
(
cont
);
// The callee returns with the stack possibly adjusted by adapter transition
// We remove that possible adjustment here.
// All interpreter local registers are untouched. Any result is passed back
...
...
@@ -186,29 +180,18 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__
mov
(
Llast_SP
,
SP
);
// Remove any adapter added stack space.
Label
L_got_cache
,
L_giant_index
;
const
Register
cache
=
G3_scratch
;
const
Register
size
=
G1_scratch
;
if
(
EnableInvokeDynamic
)
{
__
ldub
(
Address
(
Lbcp
,
0
),
G1_scratch
);
// Load current bytecode.
__
cmp_and_br_short
(
G1_scratch
,
Bytecodes
::
_invokedynamic
,
Assembler
::
equal
,
Assembler
::
pn
,
L_giant_index
);
}
__
get_cache_and_index_at_bcp
(
cache
,
G1_scratch
,
1
);
__
bind
(
L_got_cache
);
__
ld_ptr
(
cache
,
ConstantPoolCache
::
base_offset
()
+
ConstantPoolCacheEntry
::
flags_offset
(),
size
);
__
and3
(
size
,
0xFF
,
size
);
// argument size in words
__
sll
(
size
,
Interpreter
::
logStackElementSize
,
size
);
// each argument size in bytes
__
add
(
Lesp
,
size
,
Lesp
);
// pop arguments
const
Register
index
=
G1_scratch
;
__
get_cache_and_index_at_bcp
(
cache
,
index
,
1
,
index_size
);
const
Register
flags
=
cache
;
__
ld_ptr
(
cache
,
ConstantPoolCache
::
base_offset
()
+
ConstantPoolCacheEntry
::
flags_offset
(),
flags
);
const
Register
parameter_size
=
flags
;
__
and3
(
flags
,
ConstantPoolCacheEntry
::
parameter_size_mask
,
parameter_size
);
// argument size in words
__
sll
(
parameter_size
,
Interpreter
::
logStackElementSize
,
parameter_size
);
// each argument size in bytes
__
add
(
Lesp
,
parameter_size
,
Lesp
);
// pop arguments
__
dispatch_next
(
state
,
step
);
// out of the main line of code...
if
(
EnableInvokeDynamic
)
{
__
bind
(
L_giant_index
);
__
get_cache_and_index_at_bcp
(
cache
,
G1_scratch
,
1
,
sizeof
(
u4
));
__
ba_short
(
L_got_cache
);
}
return
entry
;
}
...
...
src/cpu/sparc/vm/templateTable_sparc.cpp
浏览文件 @
1edc2949
...
...
@@ -2932,9 +2932,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry
::
verify_tos_state_shift
();
// load return address
{
const
address
table_addr
=
(
is_invokeinterface
||
is_invokedynamic
)
?
(
address
)
Interpreter
::
return_5_addrs_by_index_table
()
:
(
address
)
Interpreter
::
return_3_addrs_by_index_table
();
const
address
table_addr
=
(
address
)
Interpreter
::
invoke_return_entry_table_for
(
code
);
AddressLiteral
table
(
table_addr
);
__
set
(
table
,
temp
);
__
sll
(
ra
,
LogBytesPerWord
,
ra
);
...
...
@@ -2984,7 +2982,7 @@ void TemplateTable::invokevirtual(int byte_no) {
__
verify_oop
(
O0_recv
);
// get return address
AddressLiteral
table
(
Interpreter
::
return_3_addrs_by_index
_table
());
AddressLiteral
table
(
Interpreter
::
invoke_return_entry
_table
());
__
set
(
table
,
Rtemp
);
__
srl
(
Rret
,
ConstantPoolCacheEntry
::
tos_state_shift
,
Rret
);
// get return type
// Make sure we don't need to mask Rret after the above shift
...
...
@@ -3026,7 +3024,7 @@ void TemplateTable::invokevfinal_helper(Register Rscratch, Register Rret) {
__
profile_final_call
(
O4
);
// get return address
AddressLiteral
table
(
Interpreter
::
return_3_addrs_by_index
_table
());
AddressLiteral
table
(
Interpreter
::
invoke_return_entry
_table
());
__
set
(
table
,
Rtemp
);
__
srl
(
Rret
,
ConstantPoolCacheEntry
::
tos_state_shift
,
Rret
);
// get return type
// Make sure we don't need to mask Rret after the above shift
...
...
src/cpu/x86/vm/cppInterpreter_x86.cpp
浏览文件 @
1edc2949
...
...
@@ -367,7 +367,7 @@ address CppInterpreterGenerator::generate_stack_to_native_abi_converter(BasicTyp
return
entry
;
}
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
)
{
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
)
{
// make it look good in the debugger
return
CAST_FROM_FN_PTR
(
address
,
RecursiveInterpreterActivation
);
}
...
...
src/cpu/x86/vm/templateInterpreter_x86_32.cpp
浏览文件 @
1edc2949
...
...
@@ -150,13 +150,12 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
}
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
)
{
TosState
incoming_state
=
state
;
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
,
size_t
index_size
)
{
address
entry
=
__
pc
();
#ifdef COMPILER2
// The FPU stack is clean if UseSSE >= 2 but must be cleaned in other cases
if
((
incoming_state
==
ftos
&&
UseSSE
<
1
)
||
(
incoming_
state
==
dtos
&&
UseSSE
<
2
))
{
if
((
state
==
ftos
&&
UseSSE
<
1
)
||
(
state
==
dtos
&&
UseSSE
<
2
))
{
for
(
int
i
=
1
;
i
<
8
;
i
++
)
{
__
ffree
(
i
);
}
...
...
@@ -164,7 +163,7 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__
empty_FPU_stack
();
}
#endif
if
((
incoming_state
==
ftos
&&
UseSSE
<
1
)
||
(
incoming_
state
==
dtos
&&
UseSSE
<
2
))
{
if
((
state
==
ftos
&&
UseSSE
<
1
)
||
(
state
==
dtos
&&
UseSSE
<
2
))
{
__
MacroAssembler
::
verify_FPU
(
1
,
"generate_return_entry_for compiled"
);
}
else
{
__
MacroAssembler
::
verify_FPU
(
0
,
"generate_return_entry_for compiled"
);
...
...
@@ -172,12 +171,12 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
// In SSE mode, interpreter returns FP results in xmm0 but they need
// to end up back on the FPU so it can operate on them.
if
(
incoming_
state
==
ftos
&&
UseSSE
>=
1
)
{
if
(
state
==
ftos
&&
UseSSE
>=
1
)
{
__
subptr
(
rsp
,
wordSize
);
__
movflt
(
Address
(
rsp
,
0
),
xmm0
);
__
fld_s
(
Address
(
rsp
,
0
));
__
addptr
(
rsp
,
wordSize
);
}
else
if
(
incoming_
state
==
dtos
&&
UseSSE
>=
2
)
{
}
else
if
(
state
==
dtos
&&
UseSSE
>=
2
)
{
__
subptr
(
rsp
,
2
*
wordSize
);
__
movdbl
(
Address
(
rsp
,
0
),
xmm0
);
__
fld_d
(
Address
(
rsp
,
0
));
...
...
@@ -194,32 +193,21 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__
restore_bcp
();
__
restore_locals
();
if
(
incoming_
state
==
atos
)
{
if
(
state
==
atos
)
{
Register
mdp
=
rbx
;
Register
tmp
=
rcx
;
__
profile_return_type
(
mdp
,
rax
,
tmp
);
}
Label
L_got_cache
,
L_giant_index
;
if
(
EnableInvokeDynamic
)
{
__
cmpb
(
Address
(
rsi
,
0
),
Bytecodes
::
_invokedynamic
);
__
jcc
(
Assembler
::
equal
,
L_giant_index
);
}
__
get_cache_and_index_at_bcp
(
rbx
,
rcx
,
1
,
sizeof
(
u2
));
__
bind
(
L_got_cache
);
__
movl
(
rbx
,
Address
(
rbx
,
rcx
,
Address
::
times_ptr
,
ConstantPoolCache
::
base_offset
()
+
ConstantPoolCacheEntry
::
flags_offset
()));
__
andptr
(
rbx
,
0xFF
);
__
lea
(
rsp
,
Address
(
rsp
,
rbx
,
Interpreter
::
stackElementScale
()));
__
dispatch_next
(
state
,
step
);
const
Register
cache
=
rbx
;
const
Register
index
=
rcx
;
__
get_cache_and_index_at_bcp
(
cache
,
index
,
1
,
index_size
);
// out of the main line of code...
if
(
EnableInvokeDynamic
)
{
__
bind
(
L_giant_index
);
__
get_cache_and_index_at_bcp
(
rbx
,
rcx
,
1
,
sizeof
(
u4
));
__
jmp
(
L_got_cache
);
}
const
Register
flags
=
cache
;
__
movl
(
flags
,
Address
(
cache
,
index
,
Address
::
times_ptr
,
ConstantPoolCache
::
base_offset
()
+
ConstantPoolCacheEntry
::
flags_offset
()));
__
andl
(
flags
,
ConstantPoolCacheEntry
::
parameter_size_mask
);
__
lea
(
rsp
,
Address
(
rsp
,
flags
,
Interpreter
::
stackElementScale
()));
__
dispatch_next
(
state
,
step
);
return
entry
;
}
...
...
src/cpu/x86/vm/templateInterpreter_x86_64.cpp
浏览文件 @
1edc2949
...
...
@@ -166,7 +166,7 @@ address TemplateInterpreterGenerator::generate_continuation_for(TosState state)
}
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
)
{
address
TemplateInterpreterGenerator
::
generate_return_entry_for
(
TosState
state
,
int
step
,
size_t
index_size
)
{
address
entry
=
__
pc
();
// Restore stack bottom in case i2c adjusted stack
...
...
@@ -183,27 +183,15 @@ address TemplateInterpreterGenerator::generate_return_entry_for(TosState state,
__
profile_return_type
(
mdp
,
rax
,
tmp
);
}
Label
L_got_cache
,
L_giant_index
;
if
(
EnableInvokeDynamic
)
{
__
cmpb
(
Address
(
r13
,
0
),
Bytecodes
::
_invokedynamic
);
__
jcc
(
Assembler
::
equal
,
L_giant_index
);
}
__
get_cache_and_index_at_bcp
(
rbx
,
rcx
,
1
,
sizeof
(
u2
));
__
bind
(
L_got_cache
);
__
movl
(
rbx
,
Address
(
rbx
,
rcx
,
Address
::
times_ptr
,
in_bytes
(
ConstantPoolCache
::
base_offset
())
+
3
*
wordSize
));
__
andl
(
rbx
,
0xFF
);
__
lea
(
rsp
,
Address
(
rsp
,
rbx
,
Address
::
times_8
));
__
dispatch_next
(
state
,
step
);
const
Register
cache
=
rbx
;
const
Register
index
=
rcx
;
__
get_cache_and_index_at_bcp
(
cache
,
index
,
1
,
index_size
);
// out of the main line of code...
if
(
EnableInvokeDynamic
)
{
__
bind
(
L_giant_index
);
__
get_cache_and_index_at_bcp
(
rbx
,
rcx
,
1
,
sizeof
(
u4
));
__
jmp
(
L_got_cache
);
}
const
Register
flags
=
cache
;
__
movl
(
flags
,
Address
(
cache
,
index
,
Address
::
times_ptr
,
ConstantPoolCache
::
base_offset
()
+
ConstantPoolCacheEntry
::
flags_offset
()));
__
andl
(
flags
,
ConstantPoolCacheEntry
::
parameter_size_mask
);
__
lea
(
rsp
,
Address
(
rsp
,
flags
,
Interpreter
::
stackElementScale
()));
__
dispatch_next
(
state
,
step
);
return
entry
;
}
...
...
src/cpu/x86/vm/templateTable_x86_32.cpp
浏览文件 @
1edc2949
...
...
@@ -2925,9 +2925,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry
::
verify_tos_state_shift
();
// load return address
{
const
address
table_addr
=
(
is_invokeinterface
||
is_invokedynamic
)
?
(
address
)
Interpreter
::
return_5_addrs_by_index_table
()
:
(
address
)
Interpreter
::
return_3_addrs_by_index_table
();
const
address
table_addr
=
(
address
)
Interpreter
::
invoke_return_entry_table_for
(
code
);
ExternalAddress
table
(
table_addr
);
__
movptr
(
flags
,
ArrayAddress
(
table
,
Address
(
noreg
,
flags
,
Address
::
times_ptr
)));
}
...
...
src/cpu/x86/vm/templateTable_x86_64.cpp
浏览文件 @
1edc2949
...
...
@@ -2980,9 +2980,7 @@ void TemplateTable::prepare_invoke(int byte_no,
ConstantPoolCacheEntry
::
verify_tos_state_shift
();
// load return address
{
const
address
table_addr
=
(
is_invokeinterface
||
is_invokedynamic
)
?
(
address
)
Interpreter
::
return_5_addrs_by_index_table
()
:
(
address
)
Interpreter
::
return_3_addrs_by_index_table
();
const
address
table_addr
=
(
address
)
Interpreter
::
invoke_return_entry_table_for
(
code
);
ExternalAddress
table
(
table_addr
);
__
lea
(
rscratch1
,
table
);
__
movptr
(
flags
,
Address
(
rscratch1
,
flags
,
Address
::
times_ptr
));
...
...
src/cpu/zero/vm/cppInterpreter_zero.cpp
浏览文件 @
1edc2949
...
...
@@ -1006,7 +1006,7 @@ void BytecodeInterpreter::layout_interpreterState(interpreterState istate,
istate
->
set_stack_limit
(
stack_base
-
method
->
max_stack
()
-
1
);
}
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
)
{
address
CppInterpreter
::
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
)
{
ShouldNotCallThis
();
return
NULL
;
}
...
...
src/cpu/zero/vm/globals_zero.hpp
浏览文件 @
1edc2949
...
...
@@ -57,6 +57,8 @@ define_pd_global(bool, UseMembar, true);
// GC Ergo Flags
define_pd_global
(
uintx
,
CMSYoungGenPerWorker
,
16
*
M
);
// default max size of CMS young gen, per GC worker thread
define_pd_global
(
uintx
,
TypeProfileLevel
,
0
);
#define ARCH_FLAGS(develop, product, diagnostic, experimental, notproduct)
#endif // CPU_ZERO_VM_GLOBALS_ZERO_HPP
src/share/vm/interpreter/abstractInterpreter.hpp
浏览文件 @
1edc2949
...
...
@@ -158,8 +158,8 @@ class AbstractInterpreter: AllStatic {
// Runtime support
// length = invoke bytecode length (to advance to next bytecode)
static
address
deopt_entry
(
TosState
state
,
int
length
)
{
ShouldNotReachHere
();
return
NULL
;
}
static
address
return_entry
(
TosState
state
,
int
length
)
{
ShouldNotReachHere
();
return
NULL
;
}
static
address
deopt_entry
(
TosState
state
,
int
length
)
{
ShouldNotReachHere
();
return
NULL
;
}
static
address
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
)
{
ShouldNotReachHere
();
return
NULL
;
}
static
address
rethrow_exception_entry
()
{
return
_rethrow_exception_entry
;
}
...
...
src/share/vm/interpreter/cppInterpreter.hpp
浏览文件 @
1edc2949
...
...
@@ -78,7 +78,7 @@ class CppInterpreter: public AbstractInterpreter {
static
address
stack_result_to_stack
(
int
index
)
{
return
_stack_to_stack
[
index
];
}
static
address
stack_result_to_native
(
int
index
)
{
return
_stack_to_native_abi
[
index
];
}
static
address
return_entry
(
TosState
state
,
int
length
);
static
address
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
);
static
address
deopt_entry
(
TosState
state
,
int
length
);
#ifdef TARGET_ARCH_x86
...
...
src/share/vm/interpreter/interpreter.cpp
浏览文件 @
1edc2949
...
...
@@ -329,15 +329,21 @@ void AbstractInterpreter::print_method_kind(MethodKind kind) {
//------------------------------------------------------------------------------------------------------------------------
// Deoptimization support
// If deoptimization happens, this function returns the point of next bytecode to continue execution
/**
* If a deoptimization happens, this function returns the point of next bytecode to continue execution.
*/
address
AbstractInterpreter
::
deopt_continue_after_entry
(
Method
*
method
,
address
bcp
,
int
callee_parameters
,
bool
is_top_frame
)
{
assert
(
method
->
contains
(
bcp
),
"just checkin'"
);
Bytecodes
::
Code
code
=
Bytecodes
::
java_code_at
(
method
,
bcp
);
// Get the original and rewritten bytecode.
Bytecodes
::
Code
code
=
Bytecodes
::
java_code_at
(
method
,
bcp
);
assert
(
!
Interpreter
::
bytecode_should_reexecute
(
code
),
"should not reexecute"
);
int
bci
=
method
->
bci_from
(
bcp
);
int
length
=
-
1
;
// initial value for debugging
const
int
bci
=
method
->
bci_from
(
bcp
);
// compute continuation length
length
=
Bytecodes
::
length_at
(
method
,
bcp
);
const
int
length
=
Bytecodes
::
length_at
(
method
,
bcp
);
// compute result type
BasicType
type
=
T_ILLEGAL
;
...
...
@@ -393,7 +399,7 @@ address AbstractInterpreter::deopt_continue_after_entry(Method* method, address
return
is_top_frame
?
Interpreter
::
deopt_entry
(
as_TosState
(
type
),
length
)
:
Interpreter
::
return_entry
(
as_TosState
(
type
),
length
);
:
Interpreter
::
return_entry
(
as_TosState
(
type
),
length
,
code
);
}
// If deoptimization happens, this function returns the point where the interpreter reexecutes
...
...
src/share/vm/interpreter/templateInterpreter.cpp
浏览文件 @
1edc2949
...
...
@@ -184,8 +184,9 @@ EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deo
EntryPoint
TemplateInterpreter
::
_continuation_entry
;
EntryPoint
TemplateInterpreter
::
_safept_entry
;
address
TemplateInterpreter
::
_return_3_addrs_by_index
[
TemplateInterpreter
::
number_of_return_addrs
];
address
TemplateInterpreter
::
_return_5_addrs_by_index
[
TemplateInterpreter
::
number_of_return_addrs
];
address
TemplateInterpreter
::
_invoke_return_entry
[
TemplateInterpreter
::
number_of_return_addrs
];
address
TemplateInterpreter
::
_invokeinterface_return_entry
[
TemplateInterpreter
::
number_of_return_addrs
];
address
TemplateInterpreter
::
_invokedynamic_return_entry
[
TemplateInterpreter
::
number_of_return_addrs
];
DispatchTable
TemplateInterpreter
::
_active_table
;
DispatchTable
TemplateInterpreter
::
_normal_table
;
...
...
@@ -237,22 +238,37 @@ void TemplateInterpreterGenerator::generate_all() {
#endif // !PRODUCT
{
CodeletMark
cm
(
_masm
,
"return entry points"
);
const
int
index_size
=
sizeof
(
u2
);
for
(
int
i
=
0
;
i
<
Interpreter
::
number_of_return_entries
;
i
++
)
{
Interpreter
::
_return_entry
[
i
]
=
EntryPoint
(
generate_return_entry_for
(
itos
,
i
),
generate_return_entry_for
(
itos
,
i
),
generate_return_entry_for
(
itos
,
i
),
generate_return_entry_for
(
atos
,
i
),
generate_return_entry_for
(
itos
,
i
),
generate_return_entry_for
(
ltos
,
i
),
generate_return_entry_for
(
ftos
,
i
),
generate_return_entry_for
(
dtos
,
i
),
generate_return_entry_for
(
vtos
,
i
)
generate_return_entry_for
(
itos
,
i
,
index_size
),
generate_return_entry_for
(
itos
,
i
,
index_size
),
generate_return_entry_for
(
itos
,
i
,
index_size
),
generate_return_entry_for
(
atos
,
i
,
index_size
),
generate_return_entry_for
(
itos
,
i
,
index_size
),
generate_return_entry_for
(
ltos
,
i
,
index_size
),
generate_return_entry_for
(
ftos
,
i
,
index_size
),
generate_return_entry_for
(
dtos
,
i
,
index_size
),
generate_return_entry_for
(
vtos
,
i
,
index_size
)
);
}
}
{
CodeletMark
cm
(
_masm
,
"invoke return entry points"
);
const
TosState
states
[]
=
{
itos
,
itos
,
itos
,
itos
,
ltos
,
ftos
,
dtos
,
atos
,
vtos
};
const
int
invoke_length
=
Bytecodes
::
length_for
(
Bytecodes
::
_invokestatic
);
const
int
invokeinterface_length
=
Bytecodes
::
length_for
(
Bytecodes
::
_invokeinterface
);
const
int
invokedynamic_length
=
Bytecodes
::
length_for
(
Bytecodes
::
_invokedynamic
);
for
(
int
i
=
0
;
i
<
Interpreter
::
number_of_return_addrs
;
i
++
)
{
TosState
state
=
states
[
i
];
Interpreter
::
_invoke_return_entry
[
i
]
=
generate_return_entry_for
(
state
,
invoke_length
,
sizeof
(
u2
));
Interpreter
::
_invokeinterface_return_entry
[
i
]
=
generate_return_entry_for
(
state
,
invokeinterface_length
,
sizeof
(
u2
));
Interpreter
::
_invokedynamic_return_entry
[
i
]
=
generate_return_entry_for
(
state
,
invokedynamic_length
,
sizeof
(
u4
));
}
}
{
CodeletMark
cm
(
_masm
,
"earlyret entry points"
);
Interpreter
::
_earlyret_entry
=
EntryPoint
(
...
...
@@ -298,13 +314,6 @@ void TemplateInterpreterGenerator::generate_all() {
}
}
for
(
int
j
=
0
;
j
<
number_of_states
;
j
++
)
{
const
TosState
states
[]
=
{
btos
,
ctos
,
stos
,
itos
,
ltos
,
ftos
,
dtos
,
atos
,
vtos
};
int
index
=
Interpreter
::
TosState_as_index
(
states
[
j
]);
Interpreter
::
_return_3_addrs_by_index
[
index
]
=
Interpreter
::
return_entry
(
states
[
j
],
3
);
Interpreter
::
_return_5_addrs_by_index
[
index
]
=
Interpreter
::
return_entry
(
states
[
j
],
5
);
}
{
CodeletMark
cm
(
_masm
,
"continuation entry points"
);
Interpreter
::
_continuation_entry
=
EntryPoint
(
...
...
@@ -534,9 +543,46 @@ void TemplateInterpreterGenerator::generate_and_dispatch(Template* t, TosState t
//------------------------------------------------------------------------------------------------------------------------
// Entry points
address
TemplateInterpreter
::
return_entry
(
TosState
state
,
int
length
)
{
/**
* Returns the return entry table for the given invoke bytecode.
*/
address
*
TemplateInterpreter
::
invoke_return_entry_table_for
(
Bytecodes
::
Code
code
)
{
switch
(
code
)
{
case
Bytecodes
::
_invokestatic
:
case
Bytecodes
::
_invokespecial
:
case
Bytecodes
::
_invokevirtual
:
case
Bytecodes
::
_invokehandle
:
return
Interpreter
::
invoke_return_entry_table
();
case
Bytecodes
::
_invokeinterface
:
return
Interpreter
::
invokeinterface_return_entry_table
();
case
Bytecodes
::
_invokedynamic
:
return
Interpreter
::
invokedynamic_return_entry_table
();
default:
fatal
(
err_msg
(
"invalid bytecode: %s"
,
Bytecodes
::
name
(
code
)));
return
NULL
;
}
}
/**
* Returns the return entry address for the given top-of-stack state and bytecode.
*/
address
TemplateInterpreter
::
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
)
{
guarantee
(
0
<=
length
&&
length
<
Interpreter
::
number_of_return_entries
,
"illegal length"
);
return
_return_entry
[
length
].
entry
(
state
);
const
int
index
=
TosState_as_index
(
state
);
switch
(
code
)
{
case
Bytecodes
::
_invokestatic
:
case
Bytecodes
::
_invokespecial
:
case
Bytecodes
::
_invokevirtual
:
case
Bytecodes
::
_invokehandle
:
return
_invoke_return_entry
[
index
];
case
Bytecodes
::
_invokeinterface
:
return
_invokeinterface_return_entry
[
index
];
case
Bytecodes
::
_invokedynamic
:
return
_invokedynamic_return_entry
[
index
];
default:
assert
(
!
Bytecodes
::
is_invoke
(
code
),
err_msg
(
"invoke instructions should be handled separately: %s"
,
Bytecodes
::
name
(
code
)));
return
_return_entry
[
length
].
entry
(
state
);
}
}
...
...
src/share/vm/interpreter/templateInterpreter.hpp
浏览文件 @
1edc2949
...
...
@@ -120,8 +120,9 @@ class TemplateInterpreter: public AbstractInterpreter {
static
EntryPoint
_continuation_entry
;
static
EntryPoint
_safept_entry
;
static
address
_return_3_addrs_by_index
[
number_of_return_addrs
];
// for invokevirtual return entries
static
address
_return_5_addrs_by_index
[
number_of_return_addrs
];
// for invokeinterface return entries
static
address
_invoke_return_entry
[
number_of_return_addrs
];
// for invokestatic, invokespecial, invokevirtual return entries
static
address
_invokeinterface_return_entry
[
number_of_return_addrs
];
// for invokeinterface return entries
static
address
_invokedynamic_return_entry
[
number_of_return_addrs
];
// for invokedynamic return entries
static
DispatchTable
_active_table
;
// the active dispatch table (used by the interpreter for dispatch)
static
DispatchTable
_normal_table
;
// the normal dispatch table (used to set the active table in normal mode)
...
...
@@ -161,12 +162,15 @@ class TemplateInterpreter: public AbstractInterpreter {
static
address
*
normal_table
()
{
return
_normal_table
.
table_for
();
}
// Support for invokes
static
address
*
return_3_addrs_by_index_table
()
{
return
_return_3_addrs_by_index
;
}
static
address
*
return_5_addrs_by_index_table
()
{
return
_return_5_addrs_by_index
;
}
static
int
TosState_as_index
(
TosState
state
);
// computes index into return_3_entry_by_index table
static
address
*
invoke_return_entry_table
()
{
return
_invoke_return_entry
;
}
static
address
*
invokeinterface_return_entry_table
()
{
return
_invokeinterface_return_entry
;
}
static
address
*
invokedynamic_return_entry_table
()
{
return
_invokedynamic_return_entry
;
}
static
int
TosState_as_index
(
TosState
state
);
static
address
return_entry
(
TosState
state
,
int
length
);
static
address
deopt_entry
(
TosState
state
,
int
length
);
static
address
*
invoke_return_entry_table_for
(
Bytecodes
::
Code
code
);
static
address
deopt_entry
(
TosState
state
,
int
length
);
static
address
return_entry
(
TosState
state
,
int
length
,
Bytecodes
::
Code
code
);
// Safepoint support
static
void
notice_safepoints
();
// stops the thread when reaching a safepoint
...
...
src/share/vm/interpreter/templateInterpreterGenerator.hpp
浏览文件 @
1edc2949
...
...
@@ -53,7 +53,7 @@ class TemplateInterpreterGenerator: public AbstractInterpreterGenerator {
address
generate_ClassCastException_handler
();
address
generate_ArrayIndexOutOfBounds_handler
(
const
char
*
name
);
address
generate_continuation_for
(
TosState
state
);
address
generate_return_entry_for
(
TosState
state
,
int
step
);
address
generate_return_entry_for
(
TosState
state
,
int
step
,
size_t
index_size
);
address
generate_earlyret_entry_for
(
TosState
state
);
address
generate_deopt_entry_for
(
TosState
state
,
int
step
);
address
generate_safept_entry_for
(
TosState
state
,
address
runtime_entry
);
...
...
src/share/vm/oops/method.cpp
浏览文件 @
1edc2949
...
...
@@ -1515,7 +1515,10 @@ Bytecodes::Code Method::orig_bytecode_at(int bci) const {
return
bp
->
orig_bytecode
();
}
}
ShouldNotReachHere
();
{
ResourceMark
rm
;
fatal
(
err_msg
(
"no original bytecode found in %s at bci %d"
,
name_and_sig_as_C_string
(),
bci
));
}
return
Bytecodes
::
_shouldnotreachhere
;
}
...
...
src/share/vm/runtime/handles.cpp
浏览文件 @
1edc2949
...
...
@@ -45,7 +45,7 @@
oop
*
HandleArea
::
allocate_handle
(
oop
obj
)
{
assert
(
_handle_mark_nesting
>
1
,
"memory leak: allocating handle outside HandleMark"
);
assert
(
_no_handle_mark_nesting
==
0
,
"allocating handle inside NoHandleMark"
);
assert
(
obj
->
is_oop
(),
"sanity check"
);
assert
(
obj
->
is_oop
(),
err_msg
(
"not an oop: "
INTPTR_FORMAT
,
(
intptr_t
*
)
obj
)
);
return
real_allocate_handle
(
obj
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录