Mercurial > hg > truffle
annotate src/cpu/x86/vm/methodHandles_x86.cpp @ 15388:769fc3629f59
Add phase FlowSensitiveReductionPhase.
It is possible to remove GuardingPiNodes, CheckCastNodes, and FixedGuards during
HighTier under certain conditions (control-flow sensitive conditions).
The phase added in this commit (FlowSensitiveReductionPhase) does that,
and in addition replaces usages with "downcasting" PiNodes when possible
thus resulting in more precise object stamps (e.g., non-null).
Finally, usages of floating, side-effects free, expressions are also simplified
(as per control-flow sensitive conditions).
The newly added phase runs only during HighTier and can be deactivated
using Graal option FlowSensitiveReduction (it is active by default).
author | Miguel Garcia <miguel.m.garcia@oracle.com> |
---|---|
date | Fri, 25 Apr 2014 16:50:52 +0200 |
parents | 268e7a2178d7 |
children | 78bbf4d43a14 |
rev | line source |
---|---|
710 | 1 /* |
12332
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
710 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1507
diff
changeset
|
21 * questions. |
710 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
7199
cd3d6a6b95d9
8003240: x86: move MacroAssembler into separate file
twisti
parents:
6847
diff
changeset
|
26 #include "asm/macroAssembler.hpp" |
1972 | 27 #include "interpreter/interpreter.hpp" |
3755
5cf771a79037
7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents:
3753
diff
changeset
|
28 #include "interpreter/interpreterRuntime.hpp" |
1972 | 29 #include "memory/allocation.inline.hpp" |
30 #include "prims/methodHandles.hpp" | |
710 | 31 |
32 #define __ _masm-> | |
33 | |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
34 #ifdef PRODUCT |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
35 #define BLOCK_COMMENT(str) /* nothing */ |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
36 #define STOP(error) stop(error) |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
37 #else |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
38 #define BLOCK_COMMENT(str) __ block_comment(str) |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
39 #define STOP(error) block_comment(error); __ stop(error) |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
40 #endif |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
41 |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
42 #define BIND(label) bind(label); BLOCK_COMMENT(#label ":") |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
43 |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
44 void MethodHandles::load_klass_from_Class(MacroAssembler* _masm, Register klass_reg) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
45 if (VerifyMethodHandles) |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
46 verify_klass(_masm, klass_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_Class), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
47 "MH argument is a Class"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
48 __ movptr(klass_reg, Address(klass_reg, java_lang_Class::klass_offset_in_bytes())); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
49 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
50 |
3388
a80577f854f9
7045513: JSR 292 inlining causes crashes in methodHandleWalk.cpp
never
parents:
3371
diff
changeset
|
51 #ifdef ASSERT |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
52 static int check_nonzero(const char* xname, int x) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
53 assert(x != 0, err_msg("%s should be nonzero", xname)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
54 return x; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
55 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
56 #define NONZERO(x) check_nonzero(#x, x) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
57 #else //ASSERT |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
58 #define NONZERO(x) (x) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
59 #endif //ASSERT |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
60 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
61 #ifdef ASSERT |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
62 void MethodHandles::verify_klass(MacroAssembler* _masm, |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
63 Register obj, SystemDictionary::WKID klass_id, |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
64 const char* error_message) { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
65 Klass** klass_addr = SystemDictionary::well_known_klass_addr(klass_id); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
66 KlassHandle klass = SystemDictionary::well_known_klass(klass_id); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
67 Register temp = rdi; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
68 Register temp2 = noreg; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
69 LP64_ONLY(temp2 = rscratch1); // used by MacroAssembler::cmpptr |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
70 Label L_ok, L_bad; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
71 BLOCK_COMMENT("verify_klass {"); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
72 __ verify_oop(obj); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
73 __ testptr(obj, obj); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
74 __ jcc(Assembler::zero, L_bad); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
75 __ push(temp); if (temp2 != noreg) __ push(temp2); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
76 #define UNPUSH { if (temp2 != noreg) __ pop(temp2); __ pop(temp); } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
77 __ load_klass(temp, obj); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
78 __ cmpptr(temp, ExternalAddress((address) klass_addr)); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
79 __ jcc(Assembler::equal, L_ok); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
80 intptr_t super_check_offset = klass->super_check_offset(); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
81 __ movptr(temp, Address(temp, super_check_offset)); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
82 __ cmpptr(temp, ExternalAddress((address) klass_addr)); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
83 __ jcc(Assembler::equal, L_ok); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
84 UNPUSH; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
85 __ bind(L_bad); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
86 __ STOP(error_message); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
87 __ BIND(L_ok); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
88 UNPUSH; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
89 BLOCK_COMMENT("} verify_klass"); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
90 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
91 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
92 void MethodHandles::verify_ref_kind(MacroAssembler* _masm, int ref_kind, Register member_reg, Register temp) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
93 Label L; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
94 BLOCK_COMMENT("verify_ref_kind {"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
95 __ movl(temp, Address(member_reg, NONZERO(java_lang_invoke_MemberName::flags_offset_in_bytes()))); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
96 __ shrl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_SHIFT); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
97 __ andl(temp, java_lang_invoke_MemberName::MN_REFERENCE_KIND_MASK); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
98 __ cmpl(temp, ref_kind); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
99 __ jcc(Assembler::equal, L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
100 { char* buf = NEW_C_HEAP_ARRAY(char, 100, mtInternal); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
101 jio_snprintf(buf, 100, "verify_ref_kind expected %x", ref_kind); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
102 if (ref_kind == JVM_REF_invokeVirtual || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
103 ref_kind == JVM_REF_invokeSpecial) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
104 // could do this for all ref_kinds, but would explode assembly code size |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
105 trace_method_handle(_masm, buf); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
106 __ STOP(buf); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
107 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
108 BLOCK_COMMENT("} verify_ref_kind"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
109 __ bind(L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
110 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
111 |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
112 #endif //ASSERT |
710 | 113 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
114 void MethodHandles::jump_from_method_handle(MacroAssembler* _masm, Register method, Register temp, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
115 bool for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
116 assert(method == rbx, "interpreter calling convention"); |
12332
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
117 |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
118 Label L_no_such_method; |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
119 __ testptr(rbx, rbx); |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
120 __ jcc(Assembler::zero, L_no_such_method); |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
121 |
6740
75f33eecc1b3
7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents:
6725
diff
changeset
|
122 __ verify_method_ptr(method); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
123 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
124 if (!for_compiler_entry && JvmtiExport::can_post_interpreter_events()) { |
3808
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
125 Label run_compiled_code; |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
126 // JVMTI events, such as single-stepping, are implemented partly by avoiding running |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
127 // compiled code in threads for which the event is enabled. Check here for |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
128 // interp_only_mode if these events CAN be enabled. |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
129 #ifdef _LP64 |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
130 Register rthread = r15_thread; |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
131 #else |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
132 Register rthread = temp; |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
133 __ get_thread(rthread); |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
134 #endif |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
135 // interp_only is an int, on little endian it is sufficient to test the byte only |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
136 // Is a cmpl faster? |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
137 __ cmpb(Address(rthread, JavaThread::interp_only_mode_offset()), 0); |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
138 __ jccb(Assembler::zero, run_compiled_code); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
139 __ jmp(Address(method, Method::interpreter_entry_offset())); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
140 __ BIND(run_compiled_code); |
3808
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
141 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
142 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
143 const ByteSize entry_offset = for_compiler_entry ? Method::from_compiled_offset() : |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
144 Method::from_interpreted_offset(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
145 __ jmp(Address(method, entry_offset)); |
12332
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
146 |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
147 __ bind(L_no_such_method); |
dc261f466b6d
8025260: Methodhandles/JSR292: NullPointerException (NPE) thrown instead of AbstractMethodError (AME)
drchase
parents:
9060
diff
changeset
|
148 __ jump(RuntimeAddress(StubRoutines::throw_AbstractMethodError_entry())); |
3808
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
149 } |
341a57af9b0a
6990212: JSR 292 JVMTI MethodEnter hook is not called for JSR 292 bootstrap and target methods
never
parents:
3781
diff
changeset
|
150 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
151 void MethodHandles::jump_to_lambda_form(MacroAssembler* _masm, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
152 Register recv, Register method_temp, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
153 Register temp2, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
154 bool for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
155 BLOCK_COMMENT("jump_to_lambda_form {"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
156 // This is the initial entry point of a lazy method handle. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
157 // After type checking, it picks up the invoker from the LambdaForm. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
158 assert_different_registers(recv, method_temp, temp2); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
159 assert(recv != noreg, "required register"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
160 assert(method_temp == rbx, "required register for loading method"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
161 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
162 //NOT_PRODUCT({ FlagSetting fs(TraceMethodHandles, true); trace_method_handle(_masm, "LZMH"); }); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
163 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
164 // Load the invoker, as MH -> MH.form -> LF.vmentry |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
165 __ verify_oop(recv); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
166 __ load_heap_oop(method_temp, Address(recv, NONZERO(java_lang_invoke_MethodHandle::form_offset_in_bytes()))); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
167 __ verify_oop(method_temp); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
168 __ load_heap_oop(method_temp, Address(method_temp, NONZERO(java_lang_invoke_LambdaForm::vmentry_offset_in_bytes()))); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
169 __ verify_oop(method_temp); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
170 // the following assumes that a Method* is normally compressed in the vmtarget field: |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
171 __ movptr(method_temp, Address(method_temp, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes()))); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
172 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
173 if (VerifyMethodHandles && !for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
174 // make sure recv is already on stack |
7402
fd74228fd5ca
8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents:
7199
diff
changeset
|
175 __ movptr(temp2, Address(method_temp, Method::const_offset())); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
176 __ load_sized_value(temp2, |
7402
fd74228fd5ca
8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents:
7199
diff
changeset
|
177 Address(temp2, ConstMethod::size_of_parameters_offset()), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
178 sizeof(u2), /*is_signed*/ false); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
179 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), ""); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
180 Label L; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
181 __ cmpptr(recv, __ argument_address(temp2, -1)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
182 __ jcc(Assembler::equal, L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
183 __ movptr(rax, __ argument_address(temp2, -1)); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
184 __ STOP("receiver not on stack"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
185 __ BIND(L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
186 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
187 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
188 jump_from_method_handle(_masm, method_temp, temp2, for_compiler_entry); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
189 BLOCK_COMMENT("} jump_to_lambda_form"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
190 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
191 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
192 |
710 | 193 // Code generation |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
194 address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* _masm, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
195 vmIntrinsics::ID iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
196 const bool not_for_compiler_entry = false; // this is the interpreter entry |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
197 assert(is_signature_polymorphic(iid), "expected invoke iid"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
198 if (iid == vmIntrinsics::_invokeGeneric || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
199 iid == vmIntrinsics::_compiledLambdaForm) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
200 // Perhaps surprisingly, the symbolic references visible to Java are not directly used. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
201 // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
202 // They all allow an appendix argument. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
203 __ hlt(); // empty stubs make SG sick |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
204 return NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
205 } |
710 | 206 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
207 // rsi/r13: sender SP (must preserve; see prepare_to_jump_from_interpreted) |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
208 // rbx: Method* |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
209 // rdx: argument locator (parameter slot count, added to rsp) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
210 // rcx: used as temp to hold mh or receiver |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
211 // rax, rdi: garbage temps, blown away |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
212 Register rdx_argp = rdx; // argument list ptr, live on error paths |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
213 Register rax_temp = rax; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
214 Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
215 Register rbx_method = rbx; // eventual target of this invocation |
710 | 216 |
217 // here's where control starts out: | |
218 __ align(CodeEntryAlignment); | |
219 address entry_point = __ pc(); | |
220 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
221 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
222 Label L; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
223 BLOCK_COMMENT("verify_intrinsic_id {"); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
224 __ cmpb(Address(rbx_method, Method::intrinsic_id_offset_in_bytes()), (int) iid); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
225 __ jcc(Assembler::equal, L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
226 if (iid == vmIntrinsics::_linkToVirtual || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
227 iid == vmIntrinsics::_linkToSpecial) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
228 // could do this for all kinds, but would explode assembly code size |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
229 trace_method_handle(_masm, "bad Method*::intrinsic_id"); |
710 | 230 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
231 __ STOP("bad Method*::intrinsic_id"); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
232 __ bind(L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
233 BLOCK_COMMENT("} verify_intrinsic_id"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
234 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
235 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
236 // First task: Find out how big the argument list is. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
237 Address rdx_first_arg_addr; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
238 int ref_kind = signature_polymorphic_intrinsic_ref_kind(iid); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
239 assert(ref_kind != 0 || iid == vmIntrinsics::_invokeBasic, "must be _invokeBasic or a linkTo intrinsic"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
240 if (ref_kind == 0 || MethodHandles::ref_kind_has_receiver(ref_kind)) { |
7402
fd74228fd5ca
8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents:
7199
diff
changeset
|
241 __ movptr(rdx_argp, Address(rbx_method, Method::const_offset())); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
242 __ load_sized_value(rdx_argp, |
7402
fd74228fd5ca
8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents:
7199
diff
changeset
|
243 Address(rdx_argp, ConstMethod::size_of_parameters_offset()), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
244 sizeof(u2), /*is_signed*/ false); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
245 // assert(sizeof(u2) == sizeof(Method::_size_of_parameters), ""); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
246 rdx_first_arg_addr = __ argument_address(rdx_argp, -1); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
247 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
248 DEBUG_ONLY(rdx_argp = noreg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
249 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
250 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
251 if (!is_signature_polymorphic_static(iid)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
252 __ movptr(rcx_mh, rdx_first_arg_addr); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
253 DEBUG_ONLY(rdx_argp = noreg); |
710 | 254 } |
255 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
256 // rdx_first_arg_addr is live! |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
257 |
6847
65d07d9ee446
8000263: JSR 292: signature types may appear to be unloaded
twisti
parents:
6790
diff
changeset
|
258 trace_method_handle_interpreter_entry(_masm, iid); |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
259 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
260 if (iid == vmIntrinsics::_invokeBasic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
261 generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry); |
3755
5cf771a79037
7047697: MethodHandle.invokeExact call for wrong method causes VM failure if run with -Xcomp
jrose
parents:
3753
diff
changeset
|
262 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
263 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
264 // Adjust argument list by popping the trailing MemberName argument. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
265 Register rcx_recv = noreg; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
266 if (MethodHandles::ref_kind_has_receiver(ref_kind)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
267 // Load the receiver (not the MH; the actual MemberName's receiver) up from the interpreter stack. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
268 __ movptr(rcx_recv = rcx, rdx_first_arg_addr); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
269 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
270 DEBUG_ONLY(rdx_argp = noreg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
271 Register rbx_member = rbx_method; // MemberName ptr; incoming method ptr is dead now |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
272 __ pop(rax_temp); // return address |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
273 __ pop(rbx_member); // extract last argument |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
274 __ push(rax_temp); // re-push return address |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
275 generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry); |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
276 } |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
277 |
710 | 278 return entry_point; |
279 } | |
280 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
281 void MethodHandles::generate_method_handle_dispatch(MacroAssembler* _masm, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
282 vmIntrinsics::ID iid, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
283 Register receiver_reg, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
284 Register member_reg, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
285 bool for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
286 assert(is_signature_polymorphic(iid), "expected invoke iid"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
287 Register rbx_method = rbx; // eventual target of this invocation |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
288 // temps used in this code are not used in *either* compiled or interpreted calling sequences |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
289 #ifdef _LP64 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
290 Register temp1 = rscratch1; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
291 Register temp2 = rscratch2; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
292 Register temp3 = rax; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
293 if (for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
294 assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : j_rarg0), "only valid assignment"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
295 assert_different_registers(temp1, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
296 assert_different_registers(temp2, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
297 assert_different_registers(temp3, j_rarg0, j_rarg1, j_rarg2, j_rarg3, j_rarg4, j_rarg5); |
710 | 298 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
299 #else |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
300 Register temp1 = (for_compiler_entry ? rsi : rdx); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
301 Register temp2 = rdi; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
302 Register temp3 = rax; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
303 if (for_compiler_entry) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
304 assert(receiver_reg == (iid == vmIntrinsics::_linkToStatic ? noreg : rcx), "only valid assignment"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
305 assert_different_registers(temp1, rcx, rdx); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
306 assert_different_registers(temp2, rcx, rdx); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
307 assert_different_registers(temp3, rcx, rdx); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
308 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
309 #endif |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
310 else { |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
311 assert_different_registers(temp1, temp2, temp3, saved_last_sp_register()); // don't trash lastSP |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
312 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
313 assert_different_registers(temp1, temp2, temp3, receiver_reg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
314 assert_different_registers(temp1, temp2, temp3, member_reg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
315 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
316 if (iid == vmIntrinsics::_invokeBasic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
317 // indirect through MH.form.vmentry.vmtarget |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
318 jump_to_lambda_form(_masm, receiver_reg, rbx_method, temp1, for_compiler_entry); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
319 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
320 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
321 // The method is a member invoker used by direct method handles. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
322 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
323 // make sure the trailing argument really is a MemberName (caller responsibility) |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
324 verify_klass(_masm, member_reg, SystemDictionary::WK_KLASS_ENUM_NAME(java_lang_invoke_MemberName), |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
325 "MemberName required for invokeVirtual etc."); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
326 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
327 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
328 Address member_clazz( member_reg, NONZERO(java_lang_invoke_MemberName::clazz_offset_in_bytes())); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
329 Address member_vmindex( member_reg, NONZERO(java_lang_invoke_MemberName::vmindex_offset_in_bytes())); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
330 Address member_vmtarget( member_reg, NONZERO(java_lang_invoke_MemberName::vmtarget_offset_in_bytes())); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
331 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
332 Register temp1_recv_klass = temp1; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
333 if (iid != vmIntrinsics::_linkToStatic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
334 __ verify_oop(receiver_reg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
335 if (iid == vmIntrinsics::_linkToSpecial) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
336 // Don't actually load the klass; just null-check the receiver. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
337 __ null_check(receiver_reg); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
338 } else { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
339 // load receiver klass itself |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
340 __ null_check(receiver_reg, oopDesc::klass_offset_in_bytes()); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
341 __ load_klass(temp1_recv_klass, receiver_reg); |
6740
75f33eecc1b3
7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents:
6725
diff
changeset
|
342 __ verify_klass_ptr(temp1_recv_klass); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
343 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
344 BLOCK_COMMENT("check_receiver {"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
345 // The receiver for the MemberName must be in receiver_reg. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
346 // Check the receiver against the MemberName.clazz |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
347 if (VerifyMethodHandles && iid == vmIntrinsics::_linkToSpecial) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
348 // Did not load it above... |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
349 __ load_klass(temp1_recv_klass, receiver_reg); |
6740
75f33eecc1b3
7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents:
6725
diff
changeset
|
350 __ verify_klass_ptr(temp1_recv_klass); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
351 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
352 if (VerifyMethodHandles && iid != vmIntrinsics::_linkToInterface) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
353 Label L_ok; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
354 Register temp2_defc = temp2; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
355 __ load_heap_oop(temp2_defc, member_clazz); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
356 load_klass_from_Class(_masm, temp2_defc); |
6740
75f33eecc1b3
7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents:
6725
diff
changeset
|
357 __ verify_klass_ptr(temp2_defc); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
358 __ check_klass_subtype(temp1_recv_klass, temp2_defc, temp3, L_ok); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
359 // If we get here, the type check failed! |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
360 __ STOP("receiver class disagrees with MemberName.clazz"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
361 __ bind(L_ok); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
362 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
363 BLOCK_COMMENT("} check_receiver"); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
364 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
365 if (iid == vmIntrinsics::_linkToSpecial || |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
366 iid == vmIntrinsics::_linkToStatic) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
367 DEBUG_ONLY(temp1_recv_klass = noreg); // these guys didn't load the recv_klass |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
368 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
369 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
370 // Live registers at this point: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
371 // member_reg - MemberName that was the trailing argument |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
372 // temp1_recv_klass - klass of stacked receiver, if needed |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
373 // rsi/r13 - interpreter linkage (if interpreted) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
374 // rcx, rdx, rsi, rdi, r8, r8 - compiler arguments (if compiled) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
375 |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
376 Label L_incompatible_class_change_error; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
377 switch (iid) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
378 case vmIntrinsics::_linkToSpecial: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
379 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
380 verify_ref_kind(_masm, JVM_REF_invokeSpecial, member_reg, temp3); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
381 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
382 __ movptr(rbx_method, member_vmtarget); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
383 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
384 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
385 case vmIntrinsics::_linkToStatic: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
386 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
387 verify_ref_kind(_masm, JVM_REF_invokeStatic, member_reg, temp3); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
388 } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
389 __ movptr(rbx_method, member_vmtarget); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
390 break; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
391 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
392 case vmIntrinsics::_linkToVirtual: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
393 { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
394 // same as TemplateTable::invokevirtual, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
395 // minus the CP setup and profiling: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
396 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
397 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
398 verify_ref_kind(_masm, JVM_REF_invokeVirtual, member_reg, temp3); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
399 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
400 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
401 // pick out the vtable index from the MemberName, and then we can discard it: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
402 Register temp2_index = temp2; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
403 __ movptr(temp2_index, member_vmindex); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
404 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
405 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
406 Label L_index_ok; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
407 __ cmpl(temp2_index, 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
408 __ jcc(Assembler::greaterEqual, L_index_ok); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
409 __ STOP("no virtual index"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
410 __ BIND(L_index_ok); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
411 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
412 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
413 // Note: The verifier invariants allow us to ignore MemberName.clazz and vmtarget |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
414 // at this point. And VerifyMethodHandles has already checked clazz, if needed. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
415 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
416 // get target Method* & entry point |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
417 __ lookup_virtual_method(temp1_recv_klass, temp2_index, rbx_method); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
418 break; |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
419 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
420 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
421 case vmIntrinsics::_linkToInterface: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
422 { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
423 // same as TemplateTable::invokeinterface |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
424 // (minus the CP setup and profiling, with different argument motion) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
425 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
426 verify_ref_kind(_masm, JVM_REF_invokeInterface, member_reg, temp3); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
427 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
428 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
429 Register temp3_intf = temp3; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
430 __ load_heap_oop(temp3_intf, member_clazz); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
431 load_klass_from_Class(_masm, temp3_intf); |
6740
75f33eecc1b3
7196681: NPG: Some JSR 292 tests crash in Windows exception handler
coleenp
parents:
6725
diff
changeset
|
432 __ verify_klass_ptr(temp3_intf); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
433 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
434 Register rbx_index = rbx_method; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
435 __ movptr(rbx_index, member_vmindex); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
436 if (VerifyMethodHandles) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
437 Label L; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
438 __ cmpl(rbx_index, 0); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
439 __ jcc(Assembler::greaterEqual, L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
440 __ STOP("invalid vtable index for MH.invokeInterface"); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
441 __ bind(L); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
442 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
443 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
444 // given intf, index, and recv klass, dispatch to the implementation method |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
445 __ lookup_interface_method(temp1_recv_klass, temp3_intf, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
446 // note: next two args must be the same: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
447 rbx_index, rbx_method, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
448 temp2, |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
449 L_incompatible_class_change_error); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
450 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
451 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
452 |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
453 default: |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
454 fatal(err_msg_res("unexpected intrinsic %d: %s", iid, vmIntrinsics::name_at(iid))); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
455 break; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
456 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
457 |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
458 // Live at this point: |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
459 // rbx_method |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
460 // rsi/r13 (if interpreted) |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
461 |
6790
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
462 // After figuring out which concrete method to call, jump into it. |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
463 // Note that this works in the interpreter with no data motion. |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
464 // But the compiled version will require that rcx_recv be shifted out. |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
465 __ verify_method_ptr(rbx_method); |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
466 jump_from_method_handle(_masm, rbx_method, temp1, for_compiler_entry); |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
467 |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
468 if (iid == vmIntrinsics::_linkToInterface) { |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
469 __ bind(L_incompatible_class_change_error); |
2cb2f30450c7
7196262: JSR 292: java/lang/invoke/PrivateInvokeTest.java fails on solaris-sparc
twisti
parents:
6740
diff
changeset
|
470 __ jump(RuntimeAddress(StubRoutines::throw_IncompatibleClassChangeError_entry())); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
471 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
472 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
473 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
474 |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
475 #ifndef PRODUCT |
710 | 476 void trace_method_handle_stub(const char* adaptername, |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
477 oop mh, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
478 intptr_t* saved_regs, |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
479 intptr_t* entry_sp) { |
710 | 480 // called as a leaf from native code: do not block the JVM! |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
481 bool has_mh = (strstr(adaptername, "/static") == NULL && |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
482 strstr(adaptername, "linkTo") == NULL); // static linkers don't have MH |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
483 const char* mh_reg_name = has_mh ? "rcx_mh" : "rcx"; |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
484 tty->print_cr("MH %s %s="PTR_FORMAT" sp="PTR_FORMAT, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
485 adaptername, mh_reg_name, |
12316
190899198332
7195622: CheckUnhandledOops has limited usefulness now
hseigel
parents:
9060
diff
changeset
|
486 (void *)mh, entry_sp); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
487 |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
488 if (Verbose) { |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
489 tty->print_cr("Registers:"); |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
490 const int saved_regs_count = RegisterImpl::number_of_registers; |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
491 for (int i = 0; i < saved_regs_count; i++) { |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
492 Register r = as_Register(i); |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
493 // The registers are stored in reverse order on the stack (by pusha). |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
494 tty->print("%3s=" PTR_FORMAT, r->name(), saved_regs[((saved_regs_count - 1) - i)]); |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
495 if ((i + 1) % 4 == 0) { |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
496 tty->cr(); |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
497 } else { |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
498 tty->print(", "); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
499 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
500 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
501 tty->cr(); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
502 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
503 { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
504 // dumping last frame with frame::describe |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
505 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
506 JavaThread* p = JavaThread::active(); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
507 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
508 ResourceMark rm; |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
509 PRESERVE_EXCEPTION_MARK; // may not be needed by safer and unexpensive here |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
510 FrameValues values; |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
511 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
512 // Note: We want to allow trace_method_handle from any call site. |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
513 // While trace_method_handle creates a frame, it may be entered |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
514 // without a PC on the stack top (e.g. not just after a call). |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
515 // Walking that frame could lead to failures due to that invalid PC. |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
516 // => carefully detect that frame when doing the stack walking |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
517 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
518 // Current C frame |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
519 frame cur_frame = os::current_frame(); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
520 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
521 // Robust search of trace_calling_frame (independant of inlining). |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
522 // Assumes saved_regs comes from a pusha in the trace_calling_frame. |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
523 assert(cur_frame.sp() < saved_regs, "registers not saved on stack ?"); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
524 frame trace_calling_frame = os::get_sender_for_C_frame(&cur_frame); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
525 while (trace_calling_frame.fp() < saved_regs) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
526 trace_calling_frame = os::get_sender_for_C_frame(&trace_calling_frame); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
527 } |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
528 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
529 // safely create a frame and call frame::describe |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
530 intptr_t *dump_sp = trace_calling_frame.sender_sp(); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
531 intptr_t *dump_fp = trace_calling_frame.link(); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
532 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
533 bool walkable = has_mh; // whether the traced frame shoud be walkable |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
534 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
535 if (walkable) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
536 // The previous definition of walkable may have to be refined |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
537 // if new call sites cause the next frame constructor to start |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
538 // failing. Alternatively, frame constructors could be |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
539 // modified to support the current or future non walkable |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
540 // frames (but this is more intrusive and is not considered as |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
541 // part of this RFE, which will instead use a simpler output). |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
542 frame dump_frame = frame(dump_sp, dump_fp); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
543 dump_frame.describe(values, 1); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
544 } else { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
545 // Stack may not be walkable (invalid PC above FP): |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
546 // Add descriptions without building a Java frame to avoid issues |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
547 values.describe(-1, dump_fp, "fp for #1 <not parsed, cannot trust pc>"); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
548 values.describe(-1, dump_sp, "sp for #1"); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
549 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
550 values.describe(-1, entry_sp, "raw top of stack"); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
551 |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
552 tty->print_cr("Stack layout:"); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
553 values.print(p); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
554 } |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
555 if (has_mh && mh->is_oop()) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
556 mh->print(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
557 if (java_lang_invoke_MethodHandle::is_instance(mh)) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
558 if (java_lang_invoke_MethodHandle::form_offset_in_bytes() != 0) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
559 java_lang_invoke_MethodHandle::form(mh)->print(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
560 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
4939
diff
changeset
|
561 } |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
562 } |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
563 } |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
564 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
565 // The stub wraps the arguments in a struct on the stack to avoid |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
566 // dealing with the different calling conventions for passing 6 |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
567 // arguments. |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
568 struct MethodHandleStubArguments { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
569 const char* adaptername; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
570 oopDesc* mh; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
571 intptr_t* saved_regs; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
572 intptr_t* entry_sp; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
573 }; |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
574 void trace_method_handle_stub_wrapper(MethodHandleStubArguments* args) { |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
575 trace_method_handle_stub(args->adaptername, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
576 args->mh, |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
577 args->saved_regs, |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
578 args->entry_sp); |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
579 } |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
580 |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
581 void MethodHandles::trace_method_handle(MacroAssembler* _masm, const char* adaptername) { |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
582 if (!TraceMethodHandles) return; |
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
583 BLOCK_COMMENT("trace_method_handle {"); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
584 __ enter(); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
585 __ andptr(rsp, -16); // align stack if needed for FPU state |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
586 __ pusha(); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
587 __ mov(rbx, rsp); // for retreiving saved_regs |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
588 // Note: saved_regs must be in the entered frame for the |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
589 // robust stack walking implemented in trace_method_handle_stub. |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
590 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
591 // save FP result, valid at some call sites (adapter_opt_return_float, ...) |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
592 __ increment(rsp, -2 * wordSize); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
593 if (UseSSE >= 2) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
594 __ movdbl(Address(rsp, 0), xmm0); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
595 } else if (UseSSE == 1) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
596 __ movflt(Address(rsp, 0), xmm0); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
597 } else { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
598 __ fst_d(Address(rsp, 0)); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
599 } |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
600 |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
601 // Incoming state: |
3336
2e038ad0c1d0
7009361: JSR 292 Invalid value on stack on solaris-sparc with -Xcomp
never
parents:
2357
diff
changeset
|
602 // rcx: method handle |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
603 // |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
604 // To avoid calling convention issues, build a record on the stack |
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
605 // and pass the pointer to that instead. |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
606 __ push(rbp); // entry_sp (with extra align space) |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
607 __ push(rbx); // pusha saved_regs |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
608 __ push(rcx); // mh |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
609 __ push(rcx); // slot for adaptername |
3363
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
610 __ movptr(Address(rsp, 0), (intptr_t) adaptername); |
167b70ff3abc
6939861: JVM should handle more conversion operations
never
parents:
3336
diff
changeset
|
611 __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, trace_method_handle_stub_wrapper), rsp); |
4939
45a1bf98f1bb
7141329: Strange values of stack_size in -XX:+TraceMethodHandles output
twisti
parents:
4874
diff
changeset
|
612 __ increment(rsp, sizeof(MethodHandleStubArguments)); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
613 |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
614 if (UseSSE >= 2) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
615 __ movdbl(xmm0, Address(rsp, 0)); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
616 } else if (UseSSE == 1) { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
617 __ movflt(xmm0, Address(rsp, 0)); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
618 } else { |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
619 __ fld_d(Address(rsp, 0)); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
620 } |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
621 __ increment(rsp, 2 * wordSize); |
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
622 |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
623 __ popa(); |
4824
5dbed2f542ff
7120468: SPARC/x86: use frame::describe to enhance trace_method_handle
bdelsart
parents:
4818
diff
changeset
|
624 __ leave(); |
1793
d257356e35f0
6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents:
1552
diff
changeset
|
625 BLOCK_COMMENT("} trace_method_handle"); |
710 | 626 } |
627 #endif //PRODUCT |