Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
39049773
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看板
提交
39049773
编写于
6月 03, 2011
作者:
N
never
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
7045514: SPARC assembly code for JSR 292 ricochet frames
Reviewed-by: kvn, jrose
上级
debdc89e
变更
27
展开全部
隐藏空白更改
内联
并排
Showing
27 changed file
with
2039 addition
and
563 deletion
+2039
-563
src/cpu/sparc/vm/assembler_sparc.cpp
src/cpu/sparc/vm/assembler_sparc.cpp
+28
-8
src/cpu/sparc/vm/assembler_sparc.hpp
src/cpu/sparc/vm/assembler_sparc.hpp
+35
-9
src/cpu/sparc/vm/assembler_sparc.inline.hpp
src/cpu/sparc/vm/assembler_sparc.inline.hpp
+5
-1
src/cpu/sparc/vm/frame_sparc.cpp
src/cpu/sparc/vm/frame_sparc.cpp
+2
-0
src/cpu/sparc/vm/methodHandles_sparc.cpp
src/cpu/sparc/vm/methodHandles_sparc.cpp
+1600
-284
src/cpu/sparc/vm/methodHandles_sparc.hpp
src/cpu/sparc/vm/methodHandles_sparc.hpp
+224
-0
src/cpu/sparc/vm/registerMap_sparc.hpp
src/cpu/sparc/vm/registerMap_sparc.hpp
+2
-1
src/cpu/sparc/vm/runtime_sparc.cpp
src/cpu/sparc/vm/runtime_sparc.cpp
+1
-3
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
+2
-46
src/cpu/sparc/vm/stubRoutines_sparc.hpp
src/cpu/sparc/vm/stubRoutines_sparc.hpp
+1
-6
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
+1
-1
src/cpu/x86/vm/assembler_x86.cpp
src/cpu/x86/vm/assembler_x86.cpp
+2
-1
src/cpu/x86/vm/methodHandles_x86.cpp
src/cpu/x86/vm/methodHandles_x86.cpp
+9
-7
src/cpu/x86/vm/methodHandles_x86.hpp
src/cpu/x86/vm/methodHandles_x86.hpp
+8
-1
src/cpu/x86/vm/runtime_x86_32.cpp
src/cpu/x86/vm/runtime_x86_32.cpp
+1
-3
src/cpu/x86/vm/sharedRuntime_x86_32.cpp
src/cpu/x86/vm/sharedRuntime_x86_32.cpp
+2
-72
src/cpu/x86/vm/sharedRuntime_x86_64.cpp
src/cpu/x86/vm/sharedRuntime_x86_64.cpp
+3
-75
src/cpu/x86/vm/stubRoutines_x86_32.hpp
src/cpu/x86/vm/stubRoutines_x86_32.hpp
+0
-5
src/cpu/x86/vm/stubRoutines_x86_64.hpp
src/cpu/x86/vm/stubRoutines_x86_64.hpp
+1
-6
src/share/vm/compiler/oopMap.cpp
src/share/vm/compiler/oopMap.cpp
+3
-1
src/share/vm/opto/runtime.cpp
src/share/vm/opto/runtime.cpp
+1
-0
src/share/vm/prims/methodHandleWalk.cpp
src/share/vm/prims/methodHandleWalk.cpp
+10
-4
src/share/vm/prims/methodHandleWalk.hpp
src/share/vm/prims/methodHandleWalk.hpp
+2
-1
src/share/vm/prims/methodHandles.cpp
src/share/vm/prims/methodHandles.cpp
+10
-6
src/share/vm/prims/methodHandles.hpp
src/share/vm/prims/methodHandles.hpp
+2
-5
src/share/vm/runtime/sharedRuntime.cpp
src/share/vm/runtime/sharedRuntime.cpp
+67
-2
src/share/vm/runtime/sharedRuntime.hpp
src/share/vm/runtime/sharedRuntime.hpp
+17
-15
未找到文件。
src/cpu/sparc/vm/assembler_sparc.cpp
浏览文件 @
39049773
...
...
@@ -42,6 +42,12 @@
#include "gc_implementation/g1/heapRegion.hpp"
#endif
#ifdef PRODUCT
#define BLOCK_COMMENT(str)
/* nothing */
#else
#define BLOCK_COMMENT(str) block_comment(str)
#endif
// Convert the raw encoding form into the form expected by the
// constructor for Address.
Address
Address
::
make_raw
(
int
base
,
int
index
,
int
scale
,
int
disp
,
bool
disp_is_oop
)
{
...
...
@@ -1072,6 +1078,12 @@ void MacroAssembler::call_VM_base(
check_and_forward_exception
(
Gtemp
);
}
#ifdef ASSERT
set
(
badHeapWordVal
,
G3
);
set
(
badHeapWordVal
,
G4
);
set
(
badHeapWordVal
,
G5
);
#endif
// get oop result if there is one and reset the value in the thread
if
(
oop_result
->
is_valid
())
{
get_vm_result
(
oop_result
);
...
...
@@ -1177,6 +1189,11 @@ void MacroAssembler::call_VM_leaf_base(Register thread_cache, address entry_poin
call
(
entry_point
,
relocInfo
::
runtime_call_type
);
delayed
()
->
nop
();
restore_thread
(
thread_cache
);
#ifdef ASSERT
set
(
badHeapWordVal
,
G3
);
set
(
badHeapWordVal
,
G4
);
set
(
badHeapWordVal
,
G5
);
#endif
}
...
...
@@ -1518,7 +1535,7 @@ int MacroAssembler::total_frame_size_in_bytes(int extraWords) {
// save_frame: given number of "extra" words in frame,
// issue approp. save instruction (p 200, v8 manual)
void
MacroAssembler
::
save_frame
(
int
extraWords
=
0
)
{
void
MacroAssembler
::
save_frame
(
int
extraWords
)
{
int
delta
=
-
total_frame_size_in_bytes
(
extraWords
);
if
(
is_simm13
(
delta
))
{
save
(
SP
,
delta
,
SP
);
...
...
@@ -1730,6 +1747,7 @@ void MacroAssembler::_verify_oop(Register reg, const char* msg, const char * fil
if
(
reg
==
G0
)
return
;
// always NULL, which is always an oop
BLOCK_COMMENT
(
"verify_oop {"
);
char
buffer
[
64
];
#ifdef COMPILER1
if
(
CommentedAssembly
)
{
...
...
@@ -1768,6 +1786,7 @@ void MacroAssembler::_verify_oop(Register reg, const char* msg, const char * fil
delayed
()
->
nop
();
// recover frame size
add
(
SP
,
8
*
8
,
SP
);
BLOCK_COMMENT
(
"} verify_oop"
);
}
void
MacroAssembler
::
_verify_oop_addr
(
Address
addr
,
const
char
*
msg
,
const
char
*
file
,
int
line
)
{
...
...
@@ -2040,7 +2059,7 @@ void MacroAssembler::debug(char* msg, RegistersForDebugging* regs) {
}
else
::
tty
->
print_cr
(
"=============== DEBUG MESSAGE: %s ================
\n
"
,
msg
);
assert
(
false
,
"error"
);
assert
(
false
,
err_msg
(
"DEBUG MESSAGE: %s"
,
msg
)
);
}
...
...
@@ -3230,6 +3249,7 @@ void MacroAssembler::jump_to_method_handle_entry(Register mh_reg, Register temp_
RegisterOrConstant
MacroAssembler
::
argument_offset
(
RegisterOrConstant
arg_slot
,
Register
temp_reg
,
int
extra_slot_offset
)
{
// cf. TemplateTable::prepare_invoke(), if (load_receiver).
int
stackElementSize
=
Interpreter
::
stackElementSize
;
...
...
@@ -3238,18 +3258,19 @@ RegisterOrConstant MacroAssembler::argument_offset(RegisterOrConstant arg_slot,
offset
+=
arg_slot
.
as_constant
()
*
stackElementSize
;
return
offset
;
}
else
{
Register
temp
=
arg_slot
.
as_register
(
);
sll_ptr
(
temp
,
exact_log2
(
stackElementSize
),
temp
);
assert
(
temp_reg
!=
noreg
,
"must specify"
);
sll_ptr
(
arg_slot
.
as_register
(),
exact_log2
(
stackElementSize
),
temp_reg
);
if
(
offset
!=
0
)
add
(
temp
,
offset
,
temp
);
return
temp
;
add
(
temp
_reg
,
offset
,
temp_reg
);
return
temp
_reg
;
}
}
Address
MacroAssembler
::
argument_address
(
RegisterOrConstant
arg_slot
,
Register
temp_reg
,
int
extra_slot_offset
)
{
return
Address
(
Gargs
,
argument_offset
(
arg_slot
,
extra_slot_offset
));
return
Address
(
Gargs
,
argument_offset
(
arg_slot
,
temp_reg
,
extra_slot_offset
));
}
...
...
@@ -4906,4 +4927,3 @@ void MacroAssembler::char_arrays_equals(Register ary1, Register ary2,
// Caller should set it:
// add(G0, 1, result); // equals
}
src/cpu/sparc/vm/assembler_sparc.hpp
浏览文件 @
39049773
...
...
@@ -309,12 +309,14 @@ class Address VALUE_OBJ_CLASS_SPEC {
#endif
// accessors
Register
base
()
const
{
return
_base
;
}
Register
index
()
const
{
return
_index_or_disp
.
as_register
();
}
int
disp
()
const
{
return
_index_or_disp
.
as_constant
();
}
Register
base
()
const
{
return
_base
;
}
Register
index
()
const
{
return
_index_or_disp
.
as_register
();
}
int
disp
()
const
{
return
_index_or_disp
.
as_constant
();
}
bool
has_index
()
const
{
return
_index_or_disp
.
is_register
();
}
bool
has_disp
()
const
{
return
_index_or_disp
.
is_constant
();
}
bool
has_index
()
const
{
return
_index_or_disp
.
is_register
();
}
bool
has_disp
()
const
{
return
_index_or_disp
.
is_constant
();
}
bool
uses
(
Register
reg
)
const
{
return
base
()
==
reg
||
(
has_index
()
&&
index
()
==
reg
);
}
const
relocInfo
::
relocType
rtype
()
{
return
_rspec
.
type
();
}
const
RelocationHolder
&
rspec
()
{
return
_rspec
;
}
...
...
@@ -330,6 +332,10 @@ class Address VALUE_OBJ_CLASS_SPEC {
Address
a
(
base
(),
disp
()
+
plusdisp
);
return
a
;
}
bool
is_same_address
(
Address
a
)
const
{
// disregard _rspec
return
base
()
==
a
.
base
()
&&
(
has_index
()
?
index
()
==
a
.
index
()
:
disp
()
==
a
.
disp
());
}
Address
after_save
()
const
{
Address
a
=
(
*
this
);
...
...
@@ -436,6 +442,10 @@ class AddressLiteral VALUE_OBJ_CLASS_SPEC {
:
_address
((
address
)
addr
),
_rspec
(
rspec_from_rtype
(
rtype
,
(
address
)
addr
))
{}
AddressLiteral
(
oop
*
addr
,
relocInfo
::
relocType
rtype
=
relocInfo
::
none
)
:
_address
((
address
)
addr
),
_rspec
(
rspec_from_rtype
(
rtype
,
(
address
)
addr
))
{}
AddressLiteral
(
float
*
addr
,
relocInfo
::
relocType
rtype
=
relocInfo
::
none
)
:
_address
((
address
)
addr
),
_rspec
(
rspec_from_rtype
(
rtype
,
(
address
)
addr
))
{}
...
...
@@ -455,6 +465,21 @@ class AddressLiteral VALUE_OBJ_CLASS_SPEC {
}
};
// Convenience classes
class
ExternalAddress
:
public
AddressLiteral
{
private:
static
relocInfo
::
relocType
reloc_for_target
(
address
target
)
{
// Sometimes ExternalAddress is used for values which aren't
// exactly addresses, like the card table base.
// external_word_type can't be used for values in the first page
// so just skip the reloc in that case.
return
external_word_Relocation
::
can_be_relocated
(
target
)
?
relocInfo
::
external_word_type
:
relocInfo
::
none
;
}
public:
ExternalAddress
(
address
target
)
:
AddressLiteral
(
target
,
reloc_for_target
(
target
))
{}
ExternalAddress
(
oop
*
target
)
:
AddressLiteral
(
target
,
reloc_for_target
((
address
)
target
))
{}
};
inline
Address
RegisterImpl
::
address_in_saved_window
()
const
{
return
(
Address
(
SP
,
(
sp_offset_in_saved_window
()
*
wordSize
)
+
STACK_BIAS
));
...
...
@@ -855,9 +880,8 @@ class Assembler : public AbstractAssembler {
// and be sign-extended. Check the range.
static
void
assert_signed_range
(
intptr_t
x
,
int
nbits
)
{
assert
(
nbits
==
32
||
-
(
1
<<
nbits
-
1
)
<=
x
&&
x
<
(
1
<<
nbits
-
1
),
"value out of range"
);
assert
(
nbits
==
32
||
(
-
(
1
<<
nbits
-
1
)
<=
x
&&
x
<
(
1
<<
nbits
-
1
)),
err_msg
(
"value out of range: x="
INTPTR_FORMAT
", nbits=%d"
,
x
,
nbits
));
}
static
void
assert_signed_word_disp_range
(
intptr_t
x
,
int
nbits
)
{
...
...
@@ -2287,7 +2311,7 @@ public:
int
total_frame_size_in_bytes
(
int
extraWords
);
// used when extraWords known statically
void
save_frame
(
int
extraWords
);
void
save_frame
(
int
extraWords
=
0
);
void
save_frame_c1
(
int
size_in_bytes
);
// make a frame, and simultaneously pass up one or two register value
// into the new register window
...
...
@@ -2456,9 +2480,11 @@ public:
// offset relative to Gargs of argument at tos[arg_slot].
// (arg_slot == 0 means the last argument, not the first).
RegisterOrConstant
argument_offset
(
RegisterOrConstant
arg_slot
,
Register
temp_reg
,
int
extra_slot_offset
=
0
);
// Address of Gargs and argument_offset.
Address
argument_address
(
RegisterOrConstant
arg_slot
,
Register
temp_reg
,
int
extra_slot_offset
=
0
);
// Stack overflow checking
...
...
src/cpu/sparc/vm/assembler_sparc.inline.hpp
浏览文件 @
39049773
...
...
@@ -255,7 +255,11 @@ inline void Assembler::stf( FloatRegisterImpl::Width w, FloatRegister d, Regi
inline
void
Assembler
::
stf
(
FloatRegisterImpl
::
Width
w
,
FloatRegister
d
,
Register
s1
,
Register
s2
)
{
emit_long
(
op
(
ldst_op
)
|
fd
(
d
,
w
)
|
alt_op3
(
stf_op3
,
w
)
|
rs1
(
s1
)
|
rs2
(
s2
)
);
}
inline
void
Assembler
::
stf
(
FloatRegisterImpl
::
Width
w
,
FloatRegister
d
,
Register
s1
,
int
simm13a
)
{
emit_data
(
op
(
ldst_op
)
|
fd
(
d
,
w
)
|
alt_op3
(
stf_op3
,
w
)
|
rs1
(
s1
)
|
immed
(
true
)
|
simm
(
simm13a
,
13
));
}
inline
void
Assembler
::
stf
(
FloatRegisterImpl
::
Width
w
,
FloatRegister
d
,
const
Address
&
a
,
int
offset
)
{
relocate
(
a
.
rspec
(
offset
));
stf
(
w
,
d
,
a
.
base
(),
a
.
disp
()
+
offset
);
}
inline
void
Assembler
::
stf
(
FloatRegisterImpl
::
Width
w
,
FloatRegister
d
,
const
Address
&
a
,
int
offset
)
{
relocate
(
a
.
rspec
(
offset
));
if
(
a
.
has_index
())
{
assert
(
offset
==
0
,
""
);
stf
(
w
,
d
,
a
.
base
(),
a
.
index
()
);
}
else
{
stf
(
w
,
d
,
a
.
base
(),
a
.
disp
()
+
offset
);
}
}
inline
void
Assembler
::
stfsr
(
Register
s1
,
Register
s2
)
{
v9_dep
();
emit_long
(
op
(
ldst_op
)
|
op3
(
stfsr_op3
)
|
rs1
(
s1
)
|
rs2
(
s2
)
);
}
inline
void
Assembler
::
stfsr
(
Register
s1
,
int
simm13a
)
{
v9_dep
();
emit_data
(
op
(
ldst_op
)
|
op3
(
stfsr_op3
)
|
rs1
(
s1
)
|
immed
(
true
)
|
simm
(
simm13a
,
13
));
}
...
...
src/cpu/sparc/vm/frame_sparc.cpp
浏览文件 @
39049773
...
...
@@ -513,6 +513,8 @@ frame frame::sender(RegisterMap* map) const {
// interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be
// explicitly recognized.
if
(
is_ricochet_frame
())
return
sender_for_ricochet_frame
(
map
);
bool
frame_is_interpreted
=
is_interpreted_frame
();
if
(
frame_is_interpreted
)
{
map
->
make_integer_regs_unsaved
();
...
...
src/cpu/sparc/vm/methodHandles_sparc.cpp
浏览文件 @
39049773
此差异已折叠。
点击以展开。
src/cpu/sparc/vm/methodHandles_sparc.hpp
0 → 100644
浏览文件 @
39049773
/*
* Copyright (c) 2011, Oracle and/or its affiliates. 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
// Platform-specific definitions for method handles.
// These definitions are inlined into class MethodHandles.
// Adapters
enum
/* platform_dependent_constants */
{
adapter_code_size
=
NOT_LP64
(
22000
DEBUG_ONLY
(
+
40000
))
LP64_ONLY
(
32000
DEBUG_ONLY
(
+
80000
))
};
public
:
class
RicochetFrame
:
public
ResourceObj
{
friend
class
MethodHandles
;
private:
/*
RF field x86 SPARC
sender_pc *(rsp+0) I7-0x8
sender_link rbp I6+BIAS
exact_sender_sp rsi/r13 I5_savedSP
conversion *(rcx+&amh_conv) L5_conv
saved_args_base rax L4_sab (cf. Gargs = G4)
saved_args_layout #NULL L3_sal
saved_target *(rcx+&mh_vmtgt) L2_stgt
continuation #STUB_CON L1_cont
*/
static
const
Register
L1_continuation
;
// what to do when control gets back here
static
const
Register
L2_saved_target
;
// target method handle to invoke on saved_args
static
const
Register
L3_saved_args_layout
;
// caching point for MethodTypeForm.vmlayout cookie
static
const
Register
L4_saved_args_base
;
// base of pushed arguments (slot 0, arg N) (-3)
static
const
Register
L5_conversion
;
// misc. information from original AdapterMethodHandle (-2)
frame
_fr
;
RicochetFrame
(
const
frame
&
fr
)
:
_fr
(
fr
)
{
}
intptr_t
*
register_addr
(
Register
reg
)
const
{
assert
((
_fr
.
sp
()
+
reg
->
sp_offset_in_saved_window
())
==
_fr
.
register_addr
(
reg
),
"must agree"
);
return
_fr
.
register_addr
(
reg
);
}
intptr_t
register_value
(
Register
reg
)
const
{
return
*
register_addr
(
reg
);
}
public:
intptr_t
*
continuation
()
const
{
return
(
intptr_t
*
)
register_value
(
L1_continuation
);
}
oop
saved_target
()
const
{
return
(
oop
)
register_value
(
L2_saved_target
);
}
oop
saved_args_layout
()
const
{
return
(
oop
)
register_value
(
L3_saved_args_layout
);
}
intptr_t
*
saved_args_base
()
const
{
return
(
intptr_t
*
)
register_value
(
L4_saved_args_base
);
}
intptr_t
conversion
()
const
{
return
register_value
(
L5_conversion
);
}
intptr_t
*
exact_sender_sp
()
const
{
return
(
intptr_t
*
)
register_value
(
I5_savedSP
);
}
intptr_t
*
sender_link
()
const
{
return
_fr
.
sender_sp
();
}
// XXX
address
sender_pc
()
const
{
return
_fr
.
sender_pc
();
}
// This value is not used for much, but it apparently must be nonzero.
static
int
frame_size_in_bytes
()
{
return
wordSize
*
4
;
}
intptr_t
*
extended_sender_sp
()
const
{
return
saved_args_base
();
}
intptr_t
return_value_slot_number
()
const
{
return
adapter_conversion_vminfo
(
conversion
());
}
BasicType
return_value_type
()
const
{
return
adapter_conversion_dest_type
(
conversion
());
}
bool
has_return_value_slot
()
const
{
return
return_value_type
()
!=
T_VOID
;
}
intptr_t
*
return_value_slot_addr
()
const
{
assert
(
has_return_value_slot
(),
""
);
return
saved_arg_slot_addr
(
return_value_slot_number
());
}
intptr_t
*
saved_target_slot_addr
()
const
{
return
saved_arg_slot_addr
(
saved_args_length
());
}
intptr_t
*
saved_arg_slot_addr
(
int
slot
)
const
{
assert
(
slot
>=
0
,
""
);
return
(
intptr_t
*
)(
(
address
)
saved_args_base
()
+
(
slot
*
Interpreter
::
stackElementSize
)
);
}
jint
saved_args_length
()
const
;
jint
saved_arg_offset
(
int
arg
)
const
;
// GC interface
oop
*
saved_target_addr
()
{
return
(
oop
*
)
register_addr
(
L2_saved_target
);
}
oop
*
saved_args_layout_addr
()
{
return
(
oop
*
)
register_addr
(
L3_saved_args_layout
);
}
oop
compute_saved_args_layout
(
bool
read_cache
,
bool
write_cache
);
#ifdef ASSERT
// The magic number is supposed to help find ricochet frames within the bytes of stack dumps.
enum
{
MAGIC_NUMBER_1
=
0xFEED03E
,
MAGIC_NUMBER_2
=
0xBEEF03E
};
static
const
Register
L0_magic_number_1
;
// cookie for debugging, at start of RSA
static
Address
magic_number_2_addr
()
{
return
Address
(
L4_saved_args_base
,
-
wordSize
);
}
intptr_t
magic_number_1
()
const
{
return
register_value
(
L0_magic_number_1
);
}
intptr_t
magic_number_2
()
const
{
return
saved_args_base
()[
-
1
];
}
#endif //ASSERT
public:
enum
{
RETURN_VALUE_PLACEHOLDER
=
(
NOT_DEBUG
(
0
)
DEBUG_ONLY
(
42
))
};
void
verify
()
const
NOT_DEBUG_RETURN
;
// check for MAGIC_NUMBER, etc.
static
void
generate_ricochet_blob
(
MacroAssembler
*
_masm
,
// output params:
int
*
bounce_offset
,
int
*
exception_offset
,
int
*
frame_size_in_words
);
static
void
enter_ricochet_frame
(
MacroAssembler
*
_masm
,
Register
recv_reg
,
Register
argv_reg
,
address
return_handler
);
static
void
leave_ricochet_frame
(
MacroAssembler
*
_masm
,
Register
recv_reg
,
Register
new_sp_reg
,
Register
sender_pc_reg
);
static
RicochetFrame
*
from_frame
(
const
frame
&
fr
)
{
RicochetFrame
*
rf
=
new
RicochetFrame
(
fr
);
rf
->
verify
();
return
rf
;
}
static
void
verify_clean
(
MacroAssembler
*
_masm
)
NOT_DEBUG_RETURN
;
};
// Additional helper methods for MethodHandles code generation:
public
:
static
void
load_klass_from_Class
(
MacroAssembler
*
_masm
,
Register
klass_reg
,
Register
temp_reg
,
Register
temp2_reg
);
static
void
load_conversion_vminfo
(
MacroAssembler
*
_masm
,
Address
conversion_field_addr
,
Register
reg
);
static
void
extract_conversion_vminfo
(
MacroAssembler
*
_masm
,
Register
conversion_field_reg
,
Register
reg
);
static
void
extract_conversion_dest_type
(
MacroAssembler
*
_masm
,
Register
conversion_field_reg
,
Register
reg
);
static
void
load_stack_move
(
MacroAssembler
*
_masm
,
Address
G3_amh_conversion
,
Register
G5_stack_move
);
static
void
insert_arg_slots
(
MacroAssembler
*
_masm
,
RegisterOrConstant
arg_slots
,
Register
argslot_reg
,
Register
temp_reg
,
Register
temp2_reg
,
Register
temp3_reg
);
static
void
remove_arg_slots
(
MacroAssembler
*
_masm
,
RegisterOrConstant
arg_slots
,
Register
argslot_reg
,
Register
temp_reg
,
Register
temp2_reg
,
Register
temp3_reg
);
static
void
push_arg_slots
(
MacroAssembler
*
_masm
,
Register
argslot_reg
,
RegisterOrConstant
slot_count
,
Register
temp_reg
,
Register
temp2_reg
);
static
void
move_arg_slots_up
(
MacroAssembler
*
_masm
,
Register
bottom_reg
,
// invariant
Address
top_addr
,
// can use temp_reg
RegisterOrConstant
positive_distance_in_slots
,
Register
temp_reg
,
Register
temp2_reg
);
static
void
move_arg_slots_down
(
MacroAssembler
*
_masm
,
Address
bottom_addr
,
// can use temp_reg
Register
top_reg
,
// invariant
RegisterOrConstant
negative_distance_in_slots
,
Register
temp_reg
,
Register
temp2_reg
);
static
void
move_typed_arg
(
MacroAssembler
*
_masm
,
BasicType
type
,
bool
is_element
,
Address
value_src
,
Address
slot_dest
,
Register
temp_reg
);
static
void
move_return_value
(
MacroAssembler
*
_masm
,
BasicType
type
,
Address
return_slot
);
static
void
verify_argslot
(
MacroAssembler
*
_masm
,
Register
argslot_reg
,
Register
temp_reg
,
const
char
*
error_message
)
NOT_DEBUG_RETURN
;
static
void
verify_argslots
(
MacroAssembler
*
_masm
,
RegisterOrConstant
argslot_count
,
Register
argslot_reg
,
Register
temp_reg
,
Register
temp2_reg
,
bool
negate_argslot
,
const
char
*
error_message
)
NOT_DEBUG_RETURN
;
static
void
verify_stack_move
(
MacroAssembler
*
_masm
,
RegisterOrConstant
arg_slots
,
int
direction
)
NOT_DEBUG_RETURN
;
static
void
verify_klass
(
MacroAssembler
*
_masm
,
Register
obj_reg
,
KlassHandle
klass
,
Register
temp_reg
,
Register
temp2_reg
,
const
char
*
error_message
=
"wrong klass"
)
NOT_DEBUG_RETURN
;
static
void
verify_method_handle
(
MacroAssembler
*
_masm
,
Register
mh_reg
,
Register
temp_reg
,
Register
temp2_reg
)
{
verify_klass
(
_masm
,
mh_reg
,
SystemDictionaryHandles
::
MethodHandle_klass
(),
temp_reg
,
temp2_reg
,
"reference is a MH"
);
}
static
void
trace_method_handle
(
MacroAssembler
*
_masm
,
const
char
*
adaptername
)
PRODUCT_RETURN
;
src/cpu/sparc/vm/registerMap_sparc.hpp
浏览文件 @
39049773
/*
* Copyright (c) 1998, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 201
1
, Oracle and/or its affiliates. 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
...
...
@@ -27,6 +27,7 @@
// machine-dependent implemention for register maps
friend
class
frame
;
friend
class
MethodHandles
;
private
:
intptr_t
*
_window
;
// register window save area (for L and I regs)
...
...
src/cpu/sparc/vm/runtime_sparc.cpp
浏览文件 @
39049773
/*
* Copyright (c) 1998, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 201
1
, Oracle and/or its affiliates. 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
...
...
@@ -42,8 +42,6 @@
#define __ masm->
ExceptionBlob
*
OptoRuntime
::
_exception_blob
;
//------------------------------ generate_exception_blob ---------------------------
// creates exception blob at the end
// Using exception blob, this code is jumped from a compiled method.
...
...
src/cpu/sparc/vm/sharedRuntime_sparc.cpp
浏览文件 @
39049773
...
...
@@ -47,18 +47,6 @@
#define __ masm->
#ifdef COMPILER2
UncommonTrapBlob
*
SharedRuntime
::
_uncommon_trap_blob
;
#endif // COMPILER2
DeoptimizationBlob
*
SharedRuntime
::
_deopt_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_safepoint_handler_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_return_handler_blob
;
RuntimeStub
*
SharedRuntime
::
_wrong_method_blob
;
RuntimeStub
*
SharedRuntime
::
_ic_miss_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_opt_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_static_call_blob
;
class
RegisterSaver
{
...
...
@@ -3492,7 +3480,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
// the 64-bit %o's, then do a save, then fixup the caller's SP (our FP).
// Tricky, tricky, tricky...
static
SafepointBlob
*
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
SafepointBlob
*
SharedRuntime
::
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
assert
(
StubRoutines
::
forward_exception_entry
()
!=
NULL
,
"must be generated before"
);
// allocate space for the code
...
...
@@ -3587,7 +3575,7 @@ static SafepointBlob* generate_handler_blob(address call_ptr, bool cause_return)
// but since this is generic code we don't know what they are and the caller
// must do any gc of the args.
//
static
RuntimeStub
*
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
RuntimeStub
*
SharedRuntime
::
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
assert
(
StubRoutines
::
forward_exception_entry
()
!=
NULL
,
"must be generated before"
);
// allocate space for the code
...
...
@@ -3677,35 +3665,3 @@ static RuntimeStub* generate_resolve_blob(address destination, const char* name)
// frame_size_words or bytes??
return
RuntimeStub
::
new_runtime_stub
(
name
,
&
buffer
,
frame_complete
,
frame_size_words
,
oop_maps
,
true
);
}
void
SharedRuntime
::
generate_stubs
()
{
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
_polling_page_safepoint_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
false
);
_polling_page_return_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
true
);
generate_deopt_blob
();
#ifdef COMPILER2
generate_uncommon_trap_blob
();
#endif // COMPILER2
}
src/cpu/sparc/vm/stubRoutines_sparc.hpp
浏览文件 @
39049773
/*
* Copyright (c) 1997, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. 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
...
...
@@ -44,11 +44,6 @@ enum /* platform_dependent_constants */ {
code_size2
=
20000
// simply increase if too small (assembler will crash if too small)
};
// MethodHandles adapters
enum
method_handles_platform_dependent_constants
{
method_handles_adapters_code_size
=
15000
};
class
Sparc
{
friend
class
StubGenerator
;
...
...
src/cpu/sparc/vm/templateInterpreter_sparc.cpp
浏览文件 @
39049773
...
...
@@ -1712,7 +1712,7 @@ int AbstractInterpreter::layout_activation(methodOop method,
int
computed_sp_adjustment
=
(
delta
>
0
)
?
round_to
(
delta
,
WordsPerLong
)
:
0
;
*
interpreter_frame
->
register_addr
(
I5_savedSP
)
=
(
intptr_t
)
(
fp
+
computed_sp_adjustment
)
-
STACK_BIAS
;
}
else
{
assert
(
caller
->
is_compiled_frame
()
||
caller
->
is_entry_frame
(),
"only possible cases"
);
assert
(
caller
->
is_compiled_frame
()
||
caller
->
is_entry_frame
()
||
caller
->
is_ricochet_frame
()
,
"only possible cases"
);
// Don't have Lesp available; lay out locals block in the caller
// adjacent to the register window save area.
//
...
...
src/cpu/x86/vm/assembler_x86.cpp
浏览文件 @
39049773
...
...
@@ -5090,7 +5090,7 @@ void MacroAssembler::debug32(int rdi, int rsi, int rbp, int rsp, int rbx, int rd
}
else
{
ttyLocker
ttyl
;
::
tty
->
print_cr
(
"=============== DEBUG MESSAGE: %s ================
\n
"
,
msg
);
assert
(
false
,
"DEBUG MESSAGE"
);
assert
(
false
,
err_msg
(
"DEBUG MESSAGE: %s"
,
msg
)
);
}
ThreadStateTransition
::
transition
(
thread
,
_thread_in_vm
,
saved_state
);
}
...
...
@@ -5653,6 +5653,7 @@ void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[]) {
ttyLocker
ttyl
;
::
tty
->
print_cr
(
"=============== DEBUG MESSAGE: %s ================
\n
"
,
msg
);
assert
(
false
,
err_msg
(
"DEBUG MESSAGE: %s"
,
msg
));
}
}
...
...
src/cpu/x86/vm/methodHandles_x86.cpp
浏览文件 @
39049773
...
...
@@ -139,9 +139,9 @@ oop MethodHandles::RicochetFrame::compute_saved_args_layout(bool read_cache, boo
void
MethodHandles
::
RicochetFrame
::
generate_ricochet_blob
(
MacroAssembler
*
_masm
,
// output params:
int
*
frame_size_in_words
,
int
*
bounce_offset
,
int
*
exception_offset
)
{
int
*
exception_offset
,
int
*
frame_size_in_words
)
{
(
*
frame_size_in_words
)
=
RicochetFrame
::
frame_size_in_bytes
()
/
wordSize
;
address
start
=
__
pc
();
...
...
@@ -366,7 +366,7 @@ void MethodHandles::load_stack_move(MacroAssembler* _masm,
Register
rdi_stack_move
,
Register
rcx_amh
,
bool
might_be_negative
)
{
BLOCK_COMMENT
(
"load_stack_move"
);
BLOCK_COMMENT
(
"load_stack_move
{
"
);
Address
rcx_amh_conversion
(
rcx_amh
,
java_lang_invoke_AdapterMethodHandle
::
conversion_offset_in_bytes
());
__
movl
(
rdi_stack_move
,
rcx_amh_conversion
);
__
sarl
(
rdi_stack_move
,
CONV_STACK_MOVE_SHIFT
);
...
...
@@ -387,6 +387,7 @@ void MethodHandles::load_stack_move(MacroAssembler* _masm,
__
stop
(
"load_stack_move of garbage value"
);
__
BIND
(
L_ok
);
}
BLOCK_COMMENT
(
"} load_stack_move"
);
}
#ifdef ASSERT
...
...
@@ -1147,7 +1148,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
trace_method_handle
(
_masm
,
entry_name
(
ek
));
BLOCK_COMMENT
(
e
ntry_name
(
ek
));
BLOCK_COMMENT
(
e
rr_msg
(
"Entry %s {"
,
entry_name
(
ek
)
));
switch
((
int
)
ek
)
{
case
_raise_exception
:
...
...
@@ -1292,7 +1293,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
case
_bound_int_direct_mh
:
case
_bound_long_direct_mh
:
{
bool
direct_to_method
=
(
ek
>=
_bound_ref_direct_mh
);
const
bool
direct_to_method
=
(
ek
>=
_bound_ref_direct_mh
);
BasicType
arg_type
=
ek_bound_mh_arg_type
(
ek
);
int
arg_slots
=
type2size
[
arg_type
];
...
...
@@ -1929,7 +1930,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
// In the non-retaining case, this might move keep2 either up or down.
// We don't have to copy the whole | RF... collect | complex,
// but we must adjust RF.saved_args_base.
// Also, from now on, we will forget about the origial copy of |collect|.
// Also, from now on, we will forget about the origi
n
al copy of |collect|.
// If we are retaining it, we will treat it as part of |keep2|.
// For clarity we will define |keep3| = |collect|keep2| or |keep2|.
...
...
@@ -1986,7 +1987,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
// Net shift (&new_argv - &old_argv) is (close_count - open_count).
bool
zero_open_count
=
(
open_count
==
0
);
// remember this bit of info
if
(
move_keep3
&&
fix_arg_base
)
{
// It will be easier t have everything in one register:
// It will be easier t
o
have everything in one register:
if
(
close_count
.
is_register
())
{
// Deduct open_count from close_count register to get a clean +/- value.
__
subptr
(
close_count
.
as_register
(),
open_count
);
...
...
@@ -2396,6 +2397,7 @@ void MethodHandles::generate_method_handle_stub(MacroAssembler* _masm, MethodHan
__
nop
();
return
;
}
BLOCK_COMMENT
(
err_msg
(
"} Entry %s"
,
entry_name
(
ek
)));
__
hlt
();
address
me_cookie
=
MethodHandleEntry
::
start_compiled_entry
(
_masm
,
interp_entry
);
...
...
src/cpu/x86/vm/methodHandles_x86.hpp
浏览文件 @
39049773
...
...
@@ -25,6 +25,11 @@
// Platform-specific definitions for method handles.
// These definitions are inlined into class MethodHandles.
// Adapters
enum
/* platform_dependent_constants */
{
adapter_code_size
=
NOT_LP64
(
30000
DEBUG_ONLY
(
+
10000
))
LP64_ONLY
(
80000
DEBUG_ONLY
(
+
120000
))
};
public
:
// The stack just after the recursive call from a ricochet frame
...
...
@@ -188,7 +193,9 @@ class RicochetFrame {
static
void
generate_ricochet_blob
(
MacroAssembler
*
_masm
,
// output params:
int
*
frame_size_in_words
,
int
*
bounce_offset
,
int
*
exception_offset
);
int
*
bounce_offset
,
int
*
exception_offset
,
int
*
frame_size_in_words
);
static
void
enter_ricochet_frame
(
MacroAssembler
*
_masm
,
Register
rcx_recv
,
...
...
src/cpu/x86/vm/runtime_x86_32.cpp
浏览文件 @
39049773
/*
* Copyright (c) 1998, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1998, 201
1
, Oracle and/or its affiliates. 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
...
...
@@ -42,8 +42,6 @@
#define __ masm->
ExceptionBlob
*
OptoRuntime
::
_exception_blob
;
//------------------------------generate_exception_blob---------------------------
// creates exception blob at the end
// Using exception blob, this code is jumped from a compiled method.
...
...
src/cpu/x86/vm/sharedRuntime_x86_32.cpp
浏览文件 @
39049773
...
...
@@ -42,18 +42,6 @@
#endif
#define __ masm->
#ifdef COMPILER2
UncommonTrapBlob
*
SharedRuntime
::
_uncommon_trap_blob
;
#endif // COMPILER2
DeoptimizationBlob
*
SharedRuntime
::
_deopt_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_safepoint_handler_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_return_handler_blob
;
RuntimeStub
*
SharedRuntime
::
_wrong_method_blob
;
RuntimeStub
*
SharedRuntime
::
_ic_miss_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_opt_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_static_call_blob
;
const
int
StackAlignmentInSlots
=
StackAlignmentInBytes
/
VMRegImpl
::
stack_slot_size
;
...
...
@@ -2253,31 +2241,6 @@ uint SharedRuntime::out_preserve_stack_slots() {
return
0
;
}
//----------------------------generate_ricochet_blob---------------------------
void
SharedRuntime
::
generate_ricochet_blob
()
{
if
(
!
EnableInvokeDynamic
)
return
;
// leave it as a null
// allocate space for the code
ResourceMark
rm
;
// setup code generation tools
CodeBuffer
buffer
(
"ricochet_blob"
,
256
,
256
);
MacroAssembler
*
masm
=
new
MacroAssembler
(
&
buffer
);
int
frame_size_in_words
=
-
1
,
bounce_offset
=
-
1
,
exception_offset
=
-
1
;
MethodHandles
::
RicochetFrame
::
generate_ricochet_blob
(
masm
,
&
frame_size_in_words
,
&
bounce_offset
,
&
exception_offset
);
// -------------
// make sure all code is generated
masm
->
flush
();
// failed to generate?
if
(
frame_size_in_words
<
0
||
bounce_offset
<
0
||
exception_offset
<
0
)
{
assert
(
false
,
"bad ricochet blob"
);
return
;
}
_ricochet_blob
=
RicochetBlob
::
create
(
&
buffer
,
bounce_offset
,
exception_offset
,
frame_size_in_words
);
}
//------------------------------generate_deopt_blob----------------------------
void
SharedRuntime
::
generate_deopt_blob
()
{
...
...
@@ -2816,7 +2779,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
// setup oopmap, and calls safepoint code to stop the compiled code for
// a safepoint.
//
static
SafepointBlob
*
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
SafepointBlob
*
SharedRuntime
::
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
// Account for thread arg in our frame
const
int
additional_words
=
1
;
...
...
@@ -2913,7 +2876,7 @@ static SafepointBlob* generate_handler_blob(address call_ptr, bool cause_return)
// but since this is generic code we don't know what they are and the caller
// must do any gc of the args.
//
static
RuntimeStub
*
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
RuntimeStub
*
SharedRuntime
::
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
assert
(
StubRoutines
::
forward_exception_entry
()
!=
NULL
,
"must be generated before"
);
// allocate space for the code
...
...
@@ -2995,36 +2958,3 @@ static RuntimeStub* generate_resolve_blob(address destination, const char* name)
// frame_size_words or bytes??
return
RuntimeStub
::
new_runtime_stub
(
name
,
&
buffer
,
frame_complete
,
frame_size_words
,
oop_maps
,
true
);
}
void
SharedRuntime
::
generate_stubs
()
{
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
_polling_page_safepoint_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
false
);
_polling_page_return_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
true
);
generate_ricochet_blob
();
generate_deopt_blob
();
#ifdef COMPILER2
generate_uncommon_trap_blob
();
#endif // COMPILER2
}
src/cpu/x86/vm/sharedRuntime_x86_64.cpp
浏览文件 @
39049773
...
...
@@ -41,24 +41,10 @@
#include "opto/runtime.hpp"
#endif
DeoptimizationBlob
*
SharedRuntime
::
_deopt_blob
;
#ifdef COMPILER2
UncommonTrapBlob
*
SharedRuntime
::
_uncommon_trap_blob
;
ExceptionBlob
*
OptoRuntime
::
_exception_blob
;
#endif // COMPILER2
SafepointBlob
*
SharedRuntime
::
_polling_page_safepoint_handler_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_return_handler_blob
;
RuntimeStub
*
SharedRuntime
::
_wrong_method_blob
;
RuntimeStub
*
SharedRuntime
::
_ic_miss_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_opt_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_static_call_blob
;
#define __ masm->
const
int
StackAlignmentInSlots
=
StackAlignmentInBytes
/
VMRegImpl
::
stack_slot_size
;
#define __ masm->
class
SimpleRuntimeFrame
{
public:
...
...
@@ -2530,32 +2516,6 @@ uint SharedRuntime::out_preserve_stack_slots() {
}
//----------------------------generate_ricochet_blob---------------------------
void
SharedRuntime
::
generate_ricochet_blob
()
{
if
(
!
EnableInvokeDynamic
)
return
;
// leave it as a null
// allocate space for the code
ResourceMark
rm
;
// setup code generation tools
CodeBuffer
buffer
(
"ricochet_blob"
,
512
,
512
);
MacroAssembler
*
masm
=
new
MacroAssembler
(
&
buffer
);
int
frame_size_in_words
=
-
1
,
bounce_offset
=
-
1
,
exception_offset
=
-
1
;
MethodHandles
::
RicochetFrame
::
generate_ricochet_blob
(
masm
,
&
frame_size_in_words
,
&
bounce_offset
,
&
exception_offset
);
// -------------
// make sure all code is generated
masm
->
flush
();
// failed to generate?
if
(
frame_size_in_words
<
0
||
bounce_offset
<
0
||
exception_offset
<
0
)
{
assert
(
false
,
"bad ricochet blob"
);
return
;
}
_ricochet_blob
=
RicochetBlob
::
create
(
&
buffer
,
bounce_offset
,
exception_offset
,
frame_size_in_words
);
}
//------------------------------generate_deopt_blob----------------------------
void
SharedRuntime
::
generate_deopt_blob
()
{
// Allocate space for the code
...
...
@@ -3046,7 +3006,7 @@ void SharedRuntime::generate_uncommon_trap_blob() {
// Generate a special Compile2Runtime blob that saves all registers,
// and setup oopmap.
//
static
SafepointBlob
*
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
SafepointBlob
*
SharedRuntime
::
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
)
{
assert
(
StubRoutines
::
forward_exception_entry
()
!=
NULL
,
"must be generated before"
);
...
...
@@ -3132,7 +3092,7 @@ static SafepointBlob* generate_handler_blob(address call_ptr, bool cause_return)
// but since this is generic code we don't know what they are and the caller
// must do any gc of the args.
//
static
RuntimeStub
*
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
RuntimeStub
*
SharedRuntime
::
generate_resolve_blob
(
address
destination
,
const
char
*
name
)
{
assert
(
StubRoutines
::
forward_exception_entry
()
!=
NULL
,
"must be generated before"
);
// allocate space for the code
...
...
@@ -3209,38 +3169,6 @@ static RuntimeStub* generate_resolve_blob(address destination, const char* name)
}
void
SharedRuntime
::
generate_stubs
()
{
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
_polling_page_safepoint_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
false
);
_polling_page_return_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
true
);
generate_ricochet_blob
();
generate_deopt_blob
();
#ifdef COMPILER2
generate_uncommon_trap_blob
();
#endif // COMPILER2
}
#ifdef COMPILER2
// This is here instead of runtime_x86_64.cpp because it uses SimpleRuntimeFrame
//
...
...
src/cpu/x86/vm/stubRoutines_x86_32.hpp
浏览文件 @
39049773
...
...
@@ -34,11 +34,6 @@ enum platform_dependent_constants {
code_size2
=
22000
// simply increase if too small (assembler will crash if too small)
};
// MethodHandles adapters
enum
method_handles_platform_dependent_constants
{
method_handles_adapters_code_size
=
30000
DEBUG_ONLY
(
+
10000
)
};
class
x86
{
friend
class
StubGenerator
;
friend
class
VMStructs
;
...
...
src/cpu/x86/vm/stubRoutines_x86_64.hpp
浏览文件 @
39049773
/*
* Copyright (c) 2003, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 201
1
, Oracle and/or its affiliates. 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
...
...
@@ -36,11 +36,6 @@ enum platform_dependent_constants {
code_size2
=
22000
// simply increase if too small (assembler will crash if too small)
};
// MethodHandles adapters
enum
method_handles_platform_dependent_constants
{
method_handles_adapters_code_size
=
80000
DEBUG_ONLY
(
+
120000
)
};
class
x86
{
friend
class
StubGenerator
;
...
...
src/share/vm/compiler/oopMap.cpp
浏览文件 @
39049773
...
...
@@ -638,7 +638,9 @@ void DerivedPointerTable::add(oop *derived_loc, oop *base_loc) {
assert
(
*
derived_loc
!=
(
oop
)
base_loc
,
"location already added"
);
assert
(
_list
!=
NULL
,
"list must exist"
);
intptr_t
offset
=
value_of_loc
(
derived_loc
)
-
value_of_loc
(
base_loc
);
assert
(
offset
>=
-
1000000
,
"wrong derived pointer info"
);
// This assert is invalid because derived pointers can be
// arbitrarily far away from their base.
// assert(offset >= -1000000, "wrong derived pointer info");
if
(
TraceDerivedPointers
)
{
tty
->
print_cr
(
...
...
src/share/vm/opto/runtime.cpp
浏览文件 @
39049773
...
...
@@ -120,6 +120,7 @@ address OptoRuntime::_zap_dead_Java_locals_Java = NULL;
address
OptoRuntime
::
_zap_dead_native_locals_Java
=
NULL
;
# endif
ExceptionBlob
*
OptoRuntime
::
_exception_blob
;
// This should be called in an assertion at the start of OptoRuntime routines
// which are entered from compiled code (all of them)
...
...
src/share/vm/prims/methodHandleWalk.cpp
浏览文件 @
39049773
...
...
@@ -178,6 +178,12 @@ static const char* adapter_op_to_string(int op) {
return
"unknown_op"
;
}
void
MethodHandleChain
::
print
(
oopDesc
*
m
)
{
HandleMark
hm
;
ResourceMark
rm
;
Handle
mh
(
m
);
print
(
mh
);
}
void
MethodHandleChain
::
print
(
Handle
mh
)
{
EXCEPTION_MARK
;
...
...
@@ -414,8 +420,7 @@ MethodHandleWalker::walk(TRAPS) {
assert
(
dest
==
T_OBJECT
,
""
);
ArgToken
arg
=
_outgoing
.
at
(
arg_slot
);
assert
(
dest
==
arg
.
basic_type
(),
""
);
ArgToken
new_arg
=
make_conversion
(
T_OBJECT
,
dest_klass
,
Bytecodes
::
_checkcast
,
arg
,
CHECK_
(
empty
));
assert
(
!
arg
.
has_index
()
||
arg
.
index
()
==
new_arg
.
index
(),
"should be the same index"
);
arg
=
make_conversion
(
T_OBJECT
,
dest_klass
,
Bytecodes
::
_checkcast
,
arg
,
CHECK_
(
empty
));
debug_only
(
dest_klass
=
(
klassOop
)
badOop
);
break
;
}
...
...
@@ -1248,8 +1253,9 @@ MethodHandleCompiler::make_conversion(BasicType type, klassOop tk, Bytecodes::Co
index
=
src
.
index
();
}
emit_bc
(
op
,
cpool_klass_put
(
tk
));
if
(
index
==
-
1
)
index
=
new_local_index
(
type
);
// Allocate a new local for the type so that we don't hide the
// previous type from the verifier.
index
=
new_local_index
(
type
);
emit_store
(
srctype
,
index
);
break
;
...
...
src/share/vm/prims/methodHandleWalk.hpp
浏览文件 @
39049773
...
...
@@ -110,6 +110,7 @@ public:
// slot order to make it easier to understand.
void
print
();
static
void
print
(
Handle
mh
);
static
void
print
(
oopDesc
*
mh
);
#endif
};
...
...
@@ -273,7 +274,7 @@ private:
static
jvalue
one_jvalue
;
// Fake constant pool entry.
class
ConstantValue
{
class
ConstantValue
:
public
ResourceObj
{
private:
int
_tag
;
// Constant pool tag type.
JavaValue
_value
;
...
...
src/share/vm/prims/methodHandles.cpp
浏览文件 @
39049773
...
...
@@ -160,8 +160,7 @@ const char* MethodHandles::_entry_names[_EK_LIMIT+1] = {
};
// Adapters.
MethodHandlesAdapterBlob
*
MethodHandles
::
_adapter_code
=
NULL
;
int
MethodHandles
::
_adapter_code_size
=
StubRoutines
::
method_handles_adapters_code_size
;
MethodHandlesAdapterBlob
*
MethodHandles
::
_adapter_code
=
NULL
;
jobject
MethodHandles
::
_raise_exception_method
;
...
...
@@ -200,12 +199,15 @@ void MethodHandles::generate_adapters() {
ResourceMark
rm
;
TraceTime
timer
(
"MethodHandles adapters generation"
,
TraceStartupTime
);
_adapter_code
=
MethodHandlesAdapterBlob
::
create
(
_
adapter_code_size
);
_adapter_code
=
MethodHandlesAdapterBlob
::
create
(
adapter_code_size
);
if
(
_adapter_code
==
NULL
)
vm_exit_out_of_memory
(
_
adapter_code_size
,
"CodeCache: no room for MethodHandles adapters"
);
vm_exit_out_of_memory
(
adapter_code_size
,
"CodeCache: no room for MethodHandles adapters"
);
CodeBuffer
code
(
_adapter_code
);
MethodHandlesAdapterGenerator
g
(
&
code
);
g
.
generate
();
// Transfer code comments
_adapter_code
->
set_comments
(
code
.
comments
());
}
//------------------------------------------------------------------------------
...
...
@@ -1721,6 +1723,7 @@ void MethodHandles::init_BoundMethodHandle_with_receiver(Handle mh,
void
MethodHandles
::
verify_BoundMethodHandle
(
Handle
mh
,
Handle
target
,
int
argnum
,
bool
direct_to_method
,
TRAPS
)
{
ResourceMark
rm
;
Handle
ptype_handle
(
THREAD
,
java_lang_invoke_MethodType
::
ptype
(
java_lang_invoke_MethodHandle
::
type
(
target
()),
argnum
));
KlassHandle
ptype_klass
;
...
...
@@ -1884,6 +1887,7 @@ static void throw_InternalError_for_bad_conversion(int conversion, const char* e
}
void
MethodHandles
::
verify_AdapterMethodHandle
(
Handle
mh
,
int
argnum
,
TRAPS
)
{
ResourceMark
rm
;
jint
conversion
=
java_lang_invoke_AdapterMethodHandle
::
conversion
(
mh
());
int
argslot
=
java_lang_invoke_AdapterMethodHandle
::
vmargslot
(
mh
());
...
...
@@ -1987,7 +1991,7 @@ void MethodHandles::verify_AdapterMethodHandle(Handle mh, int argnum, TRAPS) {
bool
rotate_up
=
(
src_slot
>
dest_slot
);
// upward rotation
int
src_arg
=
argnum
;
int
dest_arg
=
argument_slot_to_argnum
(
dst_mtype
(),
dest_slot
);
verify_vmargslot
(
mh
,
dest_arg
,
dest_slot
,
CHECK
);
verify_vmargslot
(
target
,
dest_arg
,
dest_slot
,
CHECK
);
if
(
!
(
dest_slot
>=
src_slot
+
swap_size
)
&&
!
(
src_slot
>=
dest_slot
+
swap_size
))
{
err
=
"source, destination slots must be distinct"
;
...
...
@@ -2563,7 +2567,7 @@ void MethodHandles::init_AdapterMethodHandle(Handle mh, Handle target, int argnu
}
if
(
err
!=
NULL
)
{
throw_InternalError_for_bad_conversion
(
conversion
,
err
,
THREAD
);
throw_InternalError_for_bad_conversion
(
conversion
,
err
_msg
(
"%s: conv_op %d ek_opt %d"
,
err
,
conv_op
,
ek_opt
)
,
THREAD
);
return
;
}
...
...
src/share/vm/prims/methodHandles.hpp
浏览文件 @
39049773
...
...
@@ -217,7 +217,6 @@ class MethodHandles: AllStatic {
// Adapters.
static
MethodHandlesAdapterBlob
*
_adapter_code
;
static
int
_adapter_code_size
;
static
bool
ek_valid
(
EntryKind
ek
)
{
return
(
uint
)
ek
<
(
uint
)
_EK_LIMIT
;
}
static
bool
conv_op_valid
(
int
op
)
{
return
(
uint
)
op
<
(
uint
)
CONV_OP_LIMIT
;
}
...
...
@@ -716,12 +715,10 @@ public:
# include "methodHandles_x86.hpp"
#endif
#ifdef TARGET_ARCH_sparc
#define TARGET_ARCH_NYI_6939861 1 //FIXME
//# include "methodHandles_sparc.hpp"
# include "methodHandles_sparc.hpp"
#endif
#ifdef TARGET_ARCH_zero
#define TARGET_ARCH_NYI_6939861 1 //FIXME
//# include "methodHandles_zero.hpp"
# include "methodHandles_zero.hpp"
#endif
#ifdef TARGET_ARCH_arm
# include "methodHandles_arm.hpp"
...
...
src/share/vm/runtime/sharedRuntime.cpp
浏览文件 @
39049773
...
...
@@ -80,6 +80,72 @@
#include "c1/c1_Runtime1.hpp"
#endif
// Shared stub locations
RuntimeStub
*
SharedRuntime
::
_wrong_method_blob
;
RuntimeStub
*
SharedRuntime
::
_ic_miss_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_opt_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_virtual_call_blob
;
RuntimeStub
*
SharedRuntime
::
_resolve_static_call_blob
;
DeoptimizationBlob
*
SharedRuntime
::
_deopt_blob
;
RicochetBlob
*
SharedRuntime
::
_ricochet_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_safepoint_handler_blob
;
SafepointBlob
*
SharedRuntime
::
_polling_page_return_handler_blob
;
#ifdef COMPILER2
UncommonTrapBlob
*
SharedRuntime
::
_uncommon_trap_blob
;
#endif // COMPILER2
//----------------------------generate_stubs-----------------------------------
void
SharedRuntime
::
generate_stubs
()
{
_wrong_method_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method
),
"wrong_method_stub"
);
_ic_miss_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
handle_wrong_method_ic_miss
),
"ic_miss_stub"
);
_resolve_opt_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_opt_virtual_call_C
),
"resolve_opt_virtual_call"
);
_resolve_virtual_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_virtual_call_C
),
"resolve_virtual_call"
);
_resolve_static_call_blob
=
generate_resolve_blob
(
CAST_FROM_FN_PTR
(
address
,
SharedRuntime
::
resolve_static_call_C
),
"resolve_static_call"
);
_polling_page_safepoint_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
false
);
_polling_page_return_handler_blob
=
generate_handler_blob
(
CAST_FROM_FN_PTR
(
address
,
SafepointSynchronize
::
handle_polling_page_exception
),
true
);
generate_ricochet_blob
();
generate_deopt_blob
();
#ifdef COMPILER2
generate_uncommon_trap_blob
();
#endif // COMPILER2
}
//----------------------------generate_ricochet_blob---------------------------
void
SharedRuntime
::
generate_ricochet_blob
()
{
if
(
!
EnableInvokeDynamic
)
return
;
// leave it as a null
#ifndef TARGET_ARCH_NYI_6939861
// allocate space for the code
ResourceMark
rm
;
// setup code generation tools
CodeBuffer
buffer
(
"ricochet_blob"
,
256
LP64_ONLY
(
+
256
),
256
);
// XXX x86 LP64L: 512, 512
MacroAssembler
*
masm
=
new
MacroAssembler
(
&
buffer
);
int
bounce_offset
=
-
1
,
exception_offset
=
-
1
,
frame_size_in_words
=
-
1
;
MethodHandles
::
RicochetFrame
::
generate_ricochet_blob
(
masm
,
&
bounce_offset
,
&
exception_offset
,
&
frame_size_in_words
);
// -------------
// make sure all code is generated
masm
->
flush
();
// failed to generate?
if
(
bounce_offset
<
0
||
exception_offset
<
0
||
frame_size_in_words
<
0
)
{
assert
(
false
,
"bad ricochet blob"
);
return
;
}
_ricochet_blob
=
RicochetBlob
::
create
(
&
buffer
,
bounce_offset
,
exception_offset
,
frame_size_in_words
);
#endif
}
#include <math.h>
HS_DTRACE_PROBE_DECL4
(
hotspot
,
object__alloc
,
Thread
*
,
char
*
,
int
,
size_t
);
...
...
@@ -88,8 +154,6 @@ HS_DTRACE_PROBE_DECL7(hotspot, method__entry, int,
HS_DTRACE_PROBE_DECL7
(
hotspot
,
method__return
,
int
,
char
*
,
int
,
char
*
,
int
,
char
*
,
int
);
RicochetBlob
*
SharedRuntime
::
_ricochet_blob
=
NULL
;
// Implementation of SharedRuntime
#ifndef PRODUCT
...
...
@@ -143,6 +207,7 @@ int SharedRuntime::_ICmiss_index = 0;
int
SharedRuntime
::
_ICmiss_count
[
SharedRuntime
::
maxICmiss_count
];
address
SharedRuntime
::
_ICmiss_at
[
SharedRuntime
::
maxICmiss_count
];
void
SharedRuntime
::
trace_ic_miss
(
address
at
)
{
for
(
int
i
=
0
;
i
<
_ICmiss_index
;
i
++
)
{
if
(
_ICmiss_at
[
i
]
==
at
)
{
...
...
src/share/vm/runtime/sharedRuntime.hpp
浏览文件 @
39049773
...
...
@@ -52,28 +52,33 @@ class SharedRuntime: AllStatic {
// Shared stub locations
static
RuntimeStub
*
_wrong_method_blob
;
static
RuntimeStub
*
_ic_miss_blob
;
static
RuntimeStub
*
_resolve_opt_virtual_call_blob
;
static
RuntimeStub
*
_resolve_virtual_call_blob
;
static
RuntimeStub
*
_resolve_static_call_blob
;
static
RuntimeStub
*
_wrong_method_blob
;
static
RuntimeStub
*
_ic_miss_blob
;
static
RuntimeStub
*
_resolve_opt_virtual_call_blob
;
static
RuntimeStub
*
_resolve_virtual_call_blob
;
static
RuntimeStub
*
_resolve_static_call_blob
;
static
RicochetBlob
*
_ricochet_blob
;
static
DeoptimizationBlob
*
_deopt_blob
;
static
RicochetBlob
*
_ricochet_blob
;
static
SafepointBlob
*
_polling_page_safepoint_handler_blob
;
static
SafepointBlob
*
_polling_page_return_handler_blob
;
static
SafepointBlob
*
_polling_page_safepoint_handler_blob
;
static
SafepointBlob
*
_polling_page_return_handler_blob
;
#ifdef COMPILER2
static
ExceptionBlob
*
_exception_blob
;
static
UncommonTrapBlob
*
_uncommon_trap_blob
;
static
UncommonTrapBlob
*
_uncommon_trap_blob
;
#endif // COMPILER2
#ifndef PRODUCT
// Counters
static
int
_nof_megamorphic_calls
;
// total # of megamorphic calls (through vtable)
#endif // !PRODUCT
private:
static
SafepointBlob
*
generate_handler_blob
(
address
call_ptr
,
bool
cause_return
);
static
RuntimeStub
*
generate_resolve_blob
(
address
destination
,
const
char
*
name
);
public:
static
void
generate_stubs
(
void
);
// max bytes for each dtrace string parameter
enum
{
max_dtrace_string_size
=
256
};
...
...
@@ -326,12 +331,9 @@ class SharedRuntime: AllStatic {
bool
is_virtual
,
bool
is_optimized
,
TRAPS
);
static
void
generate_stubs
(
void
);
private:
// deopt blob
static
void
generate_deopt_blob
(
void
);
static
DeoptimizationBlob
*
_deopt_blob
;
public:
static
DeoptimizationBlob
*
deopt_blob
(
void
)
{
return
_deopt_blob
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录