annotate src/share/vm/runtime/javaCalls.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents f94bb5d20e5d
children cefad50507d8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3960
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1506
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1506
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: 1506
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "compiler/compileBroker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34 #include "prims/jniCheck.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
35 #include "runtime/compilationPolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
36 #include "runtime/handles.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
37 #include "runtime/interfaceSupport.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
38 #include "runtime/javaCalls.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
39 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
40 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
41 #include "runtime/stubRoutines.hpp"
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
42 #include "runtime/thread.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // -----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // Implementation of JavaCallWrapper
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 JavaCallWrapper::JavaCallWrapper(methodHandle callee_method, Handle receiver, JavaValue* result, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
48 JavaThread* thread = (JavaThread *)THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 bool clear_pending_exception = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 guarantee(thread->is_Java_thread(), "crucial check - the VM thread cannot and must not escape to Java code");
a61af66fc99e Initial load
duke
parents:
diff changeset
52 assert(!thread->owns_locks(), "must release all locks when leaving VM");
a61af66fc99e Initial load
duke
parents:
diff changeset
53 guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler");
a61af66fc99e Initial load
duke
parents:
diff changeset
54 _result = result;
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // Allocate handle block for Java code. This must be done before we change thread_state to _thread_in_Java_or_stub,
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // since it can potentially block.
a61af66fc99e Initial load
duke
parents:
diff changeset
58 JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // After this, we are official in JavaCode. This needs to be done before we change any of the thread local
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // info, since we cannot find oops before the new information is set up completely.
a61af66fc99e Initial load
duke
parents:
diff changeset
62 ThreadStateTransition::transition(thread, _thread_in_vm, _thread_in_Java);
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // Make sure that we handle asynchronous stops and suspends _before_ we clear all thread state
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // in JavaCallWrapper::JavaCallWrapper(). This way, we can decide if we need to do any pd actions
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // to prepare for stop/suspend (flush register windows on sparcs, cache sp, or other state).
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (thread->has_special_runtime_exit_condition()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 thread->handle_special_runtime_exit_condition();
a61af66fc99e Initial load
duke
parents:
diff changeset
69 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 clear_pending_exception = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // Make sure to set the oop's after the thread transition - since we can block there. No one is GC'ing
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // the JavaCallWrapper before the entry frame is on the stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 _callee_method = callee_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
78 _receiver = receiver();
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 #ifdef CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
81 THREAD->allow_unhandled_oop(&_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 #endif // CHECK_UNHANDLED_OOPS
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 _thread = (JavaThread *)thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _handles = _thread->active_handles(); // save previous handle block & Java frame linkage
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // For the profiler, the last_Java_frame information in thread must always be in
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // legal state. We have no last Java frame if last_Java_sp == NULL so
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // the valid transition is to clear _last_Java_sp and then reset the rest of
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // the (platform specific) state.
a61af66fc99e Initial load
duke
parents:
diff changeset
91
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _anchor.copy(_thread->frame_anchor());
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _thread->frame_anchor()->clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 debug_only(_thread->inc_java_call_counter());
a61af66fc99e Initial load
duke
parents:
diff changeset
96 _thread->set_active_handles(new_handles); // install new handle block and reset Java frame linkage
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 assert (_thread->thread_state() != _thread_in_native, "cannot set native pc to NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // clear any pending exception in thread (native calls start with no exception pending)
a61af66fc99e Initial load
duke
parents:
diff changeset
101 if(clear_pending_exception) {
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _thread->clear_pending_exception();
a61af66fc99e Initial load
duke
parents:
diff changeset
103 }
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 if (_anchor.last_Java_sp() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 _thread->record_base_of_stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110
a61af66fc99e Initial load
duke
parents:
diff changeset
111 JavaCallWrapper::~JavaCallWrapper() {
a61af66fc99e Initial load
duke
parents:
diff changeset
112 assert(_thread == JavaThread::current(), "must still be the same thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 // restore previous handle block & Java frame linkage
a61af66fc99e Initial load
duke
parents:
diff changeset
115 JNIHandleBlock *_old_handles = _thread->active_handles();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 _thread->set_active_handles(_handles);
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 _thread->frame_anchor()->zap();
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 debug_only(_thread->dec_java_call_counter());
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 if (_anchor.last_Java_sp() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 _thread->set_base_of_stack_pointer(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
124 }
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Old thread-local info. has been restored. We are not back in the VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
128 ThreadStateTransition::transition_from_java(_thread, _thread_in_vm);
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // State has been restored now make the anchor frame visible for the profiler.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // Do this after the transition because this allows us to put an assert
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // the Java->vm transition which checks to see that stack is not walkable
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // on sparc/ia64 which will catch violations of the reseting of last_Java_frame
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // invariants (i.e. _flags always cleared on return to Java)
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _thread->frame_anchor()->copy(&_anchor);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // Release handles after we are marked as being inside the VM again, since this
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // operation might block
a61af66fc99e Initial load
duke
parents:
diff changeset
140 JNIHandleBlock::release_block(_old_handles, _thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 void JavaCallWrapper::oops_do(OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 f->do_oop((oop*)&_receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 handles()->oops_do(f);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // Helper methods
a61af66fc99e Initial load
duke
parents:
diff changeset
151 static BasicType runtime_type_from(JavaValue* result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 switch (result->get_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
153 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
154 case T_CHAR : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
155 case T_SHORT : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
156 case T_INT : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
157 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
158 case T_OBJECT : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
159 case T_ARRAY : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
160 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
161 case T_BYTE : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
162 case T_VOID : return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 case T_LONG : return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
164 case T_FLOAT : return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
165 case T_DOUBLE : return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #ifdef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
167 case T_ARRAY : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
168 case T_OBJECT: return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
169 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
172 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174
a61af66fc99e Initial load
duke
parents:
diff changeset
175 // ===== object constructor calls =====
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void JavaCalls::call_default_constructor(JavaThread* thread, methodHandle method, Handle receiver, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 assert(method->name() == vmSymbols::object_initializer_name(), "Should only be called for default constructor");
a61af66fc99e Initial load
duke
parents:
diff changeset
179 assert(method->signature() == vmSymbols::void_method_signature(), "Should only be called for default constructor");
a61af66fc99e Initial load
duke
parents:
diff changeset
180
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
181 InstanceKlass* ik = method->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
182 if (ik->is_initialized() && ik->has_vanilla_constructor()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // safe to skip constructor call
a61af66fc99e Initial load
duke
parents:
diff changeset
184 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 static JavaValue result(T_VOID);
a61af66fc99e Initial load
duke
parents:
diff changeset
186 JavaCallArguments args(receiver);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 call(&result, method, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
1421
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
191 // ============ Interface calls ============
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
192
2182
9569fdf936ff Made merge compile.
Thomas Wuerthinger <wuerthinger@ssw.jku.at>
parents: 2181
diff changeset
193 void JavaCalls::call_interface(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
1421
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
194 CallInfo callinfo;
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
195 Handle receiver = args->receiver();
6948
e522a00b91aa Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
Doug Simon <doug.simon@oracle.com>
parents: 5765 6940
diff changeset
196 KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
1421
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
197 LinkResolver::resolve_interface_call(
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
198 callinfo, receiver, recvrKlass, spec_klass, name, signature,
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
199 KlassHandle(), false, true, CHECK);
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
200 methodHandle method = callinfo.selected_method();
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
201 assert(method.not_null(), "should have thrown exception");
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
202
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
203 // Invoke the method
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
204 JavaCalls::call(result, method, args, CHECK);
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
205 }
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
206
6223633ce7dd changed VMExit/VMEntries to non-static, added eclipse c++ project, CIR interface changes
Lukas Stadler <lukas.stadler@oracle.com>
parents: 1407
diff changeset
207
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // ============ Virtual calls ============
a61af66fc99e Initial load
duke
parents:
diff changeset
209
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
210 void JavaCalls::call_virtual(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 CallInfo callinfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Handle receiver = args->receiver();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 3960
diff changeset
213 KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 LinkResolver::resolve_virtual_call(
a61af66fc99e Initial load
duke
parents:
diff changeset
215 callinfo, receiver, recvrKlass, spec_klass, name, signature,
a61af66fc99e Initial load
duke
parents:
diff changeset
216 KlassHandle(), false, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 methodHandle method = callinfo.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
218 assert(method.not_null(), "should have thrown exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // Invoke the method
a61af66fc99e Initial load
duke
parents:
diff changeset
221 JavaCalls::call(result, method, args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
225 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
227 call_virtual(result, spec_klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
231 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
232 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
233 args.push_oop(arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 call_virtual(result, spec_klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
239 void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
240 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
241 args.push_oop(arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
242 args.push_oop(arg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 call_virtual(result, spec_klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
244 }
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // ============ Special calls ============
a61af66fc99e Initial load
duke
parents:
diff changeset
248
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
249 void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 CallInfo callinfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
251 LinkResolver::resolve_special_call(callinfo, klass, name, signature, KlassHandle(), false, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 methodHandle method = callinfo.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(method.not_null(), "should have thrown exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 // Invoke the method
a61af66fc99e Initial load
duke
parents:
diff changeset
256 JavaCalls::call(result, method, args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 }
a61af66fc99e Initial load
duke
parents:
diff changeset
258
a61af66fc99e Initial load
duke
parents:
diff changeset
259
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
260 void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
262 call_special(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
266 void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
268 args.push_oop(arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 call_special(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
273 void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 JavaCallArguments args(receiver); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
275 args.push_oop(arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 args.push_oop(arg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 call_special(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 // ============ Static calls ============
a61af66fc99e Initial load
duke
parents:
diff changeset
282
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
283 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
284 CallInfo callinfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 LinkResolver::resolve_static_call(callinfo, klass, name, signature, KlassHandle(), false, true, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
286 methodHandle method = callinfo.selected_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 assert(method.not_null(), "should have thrown exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 // Invoke the method
a61af66fc99e Initial load
duke
parents:
diff changeset
290 JavaCalls::call(result, method, args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
294 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 JavaCallArguments args; // No argument
a61af66fc99e Initial load
duke
parents:
diff changeset
296 call_static(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
300 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
301 JavaCallArguments args(arg1); // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
302 call_static(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
306 void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
307 JavaCallArguments args; // One oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
308 args.push_oop(arg1);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 args.push_oop(arg2);
a61af66fc99e Initial load
duke
parents:
diff changeset
310 call_static(result, klass, name, signature, &args, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // -------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // Implementation of JavaCalls (low level)
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317
a61af66fc99e Initial load
duke
parents:
diff changeset
318 void JavaCalls::call(JavaValue* result, methodHandle method, JavaCallArguments* args, TRAPS) {
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Check if we need to wrap a potential OS exception handler around thread
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // This is used for e.g. Win32 structured exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
321 assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls");
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // Need to wrap each and everytime, since there might be native code down the
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // stack that has installed its own exception handlers
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
324 os::os_exception_wrapper(call_helper, result, &method, args, THREAD);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
327 void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArguments* args, TRAPS) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
328 methodHandle method = *m;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 JavaThread* thread = (JavaThread*)THREAD;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 assert(thread->is_Java_thread(), "must be called by a java thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
331 assert(method.not_null(), "must have a method to call");
a61af66fc99e Initial load
duke
parents:
diff changeset
332 assert(!SafepointSynchronize::is_at_safepoint(), "call to Java code during VM operation");
a61af66fc99e Initial load
duke
parents:
diff changeset
333 assert(!thread->handle_area()->no_handle_mark_active(), "cannot call out to Java here");
a61af66fc99e Initial load
duke
parents:
diff changeset
334
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
a61af66fc99e Initial load
duke
parents:
diff changeset
337
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
338 // Verify the arguments
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
339
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
340 if (CheckJNICalls) {
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
341 args->verify(method, result->get_type(), thread);
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
342 }
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
343 else debug_only(args->verify(method, result->get_type(), thread));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
344
7771
f10843a2d961 Remove assumption that methods without bytecodes are empty.
Roland Schatz <roland.schatz@oracle.com>
parents: 7212
diff changeset
345 #ifndef GRAAL
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // Ignore call if method is empty
a61af66fc99e Initial load
duke
parents:
diff changeset
347 if (method->is_empty_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 assert(result->get_type() == T_VOID, "an empty method must return a void value");
a61af66fc99e Initial load
duke
parents:
diff changeset
349 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
7771
f10843a2d961 Remove assumption that methods without bytecodes are empty.
Roland Schatz <roland.schatz@oracle.com>
parents: 7212
diff changeset
351 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
352
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
353
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 #ifdef ASSERT
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
355 { InstanceKlass* holder = method->method_holder();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
356 // A klass might not be initialized since JavaCall's might be used during the executing of
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // the <clinit>. For example, a Thread.start might start executing on an object that is
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // not fully initialized! (bad Java programming style)
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6725
diff changeset
359 assert(holder->is_linked(), "rewritting must have taken place");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 assert(!thread->is_Compiler_thread(), "cannot compile from the compiler");
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
365 if (CompilationPolicy::must_be_compiled(method)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366 CompileBroker::compile_method(method, InvocationEntryBci,
3837
43f9d800f276 7066339: Tiered: policy should make consistent decisions about osr levels
iveresov
parents: 3272
diff changeset
367 CompilationPolicy::policy()->initial_compile_level(),
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
368 methodHandle(), 0, "must_be_compiled", CHECK);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
369 }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 // Since the call stub sets up like the interpreter we call the from_interpreted_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // so we can go compiled via a i2c. Otherwise initial entry method will always
a61af66fc99e Initial load
duke
parents:
diff changeset
373 // run interpreted.
a61af66fc99e Initial load
duke
parents:
diff changeset
374 address entry_point = method->from_interpreted_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (JvmtiExport::can_post_interpreter_events() && thread->is_interp_only_mode()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 entry_point = method->interpreter_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Figure out if the result value is an oop or not (Note: This is a different value
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // than result_type. result_type will be T_INT of oops. (it is about size)
a61af66fc99e Initial load
duke
parents:
diff changeset
381 BasicType result_type = runtime_type_from(result);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 bool oop_result_flag = (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY);
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // NOTE: if we move the computation of the result_val_address inside
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // the call to call_stub, the optimizer produces wrong code.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
387
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // Find receiver
a61af66fc99e Initial load
duke
parents:
diff changeset
389 Handle receiver = (!method->is_static()) ? args->receiver() : Handle();
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // When we reenter Java, we need to reenable the yellow zone which
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // might already be disabled when we are in VM.
a61af66fc99e Initial load
duke
parents:
diff changeset
393 if (thread->stack_yellow_zone_disabled()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 thread->reguard_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
395 }
a61af66fc99e Initial load
duke
parents:
diff changeset
396
a61af66fc99e Initial load
duke
parents:
diff changeset
397 // Check that there are shadow pages available before changing thread state
a61af66fc99e Initial load
duke
parents:
diff changeset
398 // to Java
a61af66fc99e Initial load
duke
parents:
diff changeset
399 if (!os::stack_shadow_pages_available(THREAD, method)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // Throw stack overflow exception with preinitialized exception.
3272
01147d8aac1d 7009923: JSR 292: VM crash in JavaThread::last_frame
coleenp
parents: 2426
diff changeset
401 Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__, method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
402 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // Touch pages checked if the OS needs them to be touched to be mapped.
a61af66fc99e Initial load
duke
parents:
diff changeset
405 os::bang_stack_shadow_pages();
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
408 #ifdef GRAAL
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
409 nmethod* nm = args->alternative_target();
4993
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
410 if (nm != NULL) {
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
411 if (nm->is_alive()) {
4996
11ce128f8d28 fix for RiCompiledMethod.execute
Lukas Stadler <lukas.stadler@jku.at>
parents: 4993
diff changeset
412 ((JavaThread*) THREAD)->set_graal_alternate_call_target(nm->verified_entry_point());
4993
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
413 entry_point = method->adapter()->get_i2c_entry();
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
414 } else {
9023
f94bb5d20e5d Rename MethodInvalidatedException to InvalidInstalledCodeException (and make it a checked exception). Make sure that a compiled code object can always be directly called without first doing a check on the native method pointer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 8151
diff changeset
415 THROW(vmSymbols::com_oracle_graal_api_code_InvalidInstalledCodeException());
4993
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
416 }
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
417 }
4993
897b7d18bebc added RiCompiledMethod.execute and the required VM infrastructure
Lukas Stadler <lukas.stadler@jku.at>
parents: 4981
diff changeset
418 #endif
5747
120820e30baa added basic high-level interpreter support to HotSpot
Christian Haeubl <haeubl@ssw.jku.at>
parents: 4996
diff changeset
419
0
a61af66fc99e Initial load
duke
parents:
diff changeset
420 // do call
a61af66fc99e Initial load
duke
parents:
diff changeset
421 { JavaCallWrapper link(method, receiver, result, CHECK);
a61af66fc99e Initial load
duke
parents:
diff changeset
422 { HandleMark hm(thread); // HandleMark used by HandleMarkCleaner
a61af66fc99e Initial load
duke
parents:
diff changeset
423
a61af66fc99e Initial load
duke
parents:
diff changeset
424 StubRoutines::call_stub()(
a61af66fc99e Initial load
duke
parents:
diff changeset
425 (address)&link,
a61af66fc99e Initial load
duke
parents:
diff changeset
426 // (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
a61af66fc99e Initial load
duke
parents:
diff changeset
427 result_val_address, // see NOTE above (compiler problem)
a61af66fc99e Initial load
duke
parents:
diff changeset
428 result_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
429 method(),
a61af66fc99e Initial load
duke
parents:
diff changeset
430 entry_point,
a61af66fc99e Initial load
duke
parents:
diff changeset
431 args->parameters(),
a61af66fc99e Initial load
duke
parents:
diff changeset
432 args->size_of_parameters(),
a61af66fc99e Initial load
duke
parents:
diff changeset
433 CHECK
a61af66fc99e Initial load
duke
parents:
diff changeset
434 );
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436 result = link.result(); // circumvent MS C++ 5.0 compiler bug (result is clobbered across call)
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // Preserve oop return value across possible gc points
a61af66fc99e Initial load
duke
parents:
diff changeset
438 if (oop_result_flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 thread->set_vm_result((oop) result->get_jobject());
a61af66fc99e Initial load
duke
parents:
diff changeset
440 }
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 } // Exit JavaCallWrapper (can block - potential return oop must be preserved)
a61af66fc99e Initial load
duke
parents:
diff changeset
443
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // Check if a thread stop or suspend should be executed
a61af66fc99e Initial load
duke
parents:
diff changeset
445 // The following assert was not realistic. Thread.stop can set that bit at any moment.
a61af66fc99e Initial load
duke
parents:
diff changeset
446 //assert(!thread->has_special_runtime_exit_condition(), "no async. exceptions should be installed");
a61af66fc99e Initial load
duke
parents:
diff changeset
447
a61af66fc99e Initial load
duke
parents:
diff changeset
448 // Restore possible oop return
a61af66fc99e Initial load
duke
parents:
diff changeset
449 if (oop_result_flag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
450 result->set_jobject((jobject)thread->vm_result());
a61af66fc99e Initial load
duke
parents:
diff changeset
451 thread->set_vm_result(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
8151
b8f261ba79c6 Minimize diff to plain HotSpot version.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 7771
diff changeset
455
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 //--------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // Implementation of JavaCallArguments
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 intptr_t* JavaCallArguments::parameters() {
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // First convert all handles to oops
a61af66fc99e Initial load
duke
parents:
diff changeset
461 for(int i = 0; i < _size; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 if (_is_oop[i]) {
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // Handle conversion
a61af66fc99e Initial load
duke
parents:
diff changeset
464 _value[i] = (intptr_t)Handle::raw_resolve((oop *)_value[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
465 }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 // Return argument vector
1506
2338d41fbd81 6943304: remove tagged stack interpreter
twisti
parents: 702
diff changeset
468 return _value;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 }
a61af66fc99e Initial load
duke
parents:
diff changeset
470
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 class SignatureChekker : public SignatureIterator {
a61af66fc99e Initial load
duke
parents:
diff changeset
473 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
474 bool *_is_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
475 int _pos;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 BasicType _return_type;
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
477 intptr_t* _value;
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
478 Thread* _thread;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
481 bool _is_return;
a61af66fc99e Initial load
duke
parents:
diff changeset
482
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
483 SignatureChekker(Symbol* signature, BasicType return_type, bool is_static, bool* is_oop, intptr_t* value, Thread* thread) : SignatureIterator(signature) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
484 _is_oop = is_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 _is_return = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
486 _return_type = return_type;
a61af66fc99e Initial load
duke
parents:
diff changeset
487 _pos = 0;
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
488 _value = value;
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
489 _thread = thread;
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
490
0
a61af66fc99e Initial load
duke
parents:
diff changeset
491 if (!is_static) {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 check_value(true); // Receiver must be an oop
a61af66fc99e Initial load
duke
parents:
diff changeset
493 }
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495
a61af66fc99e Initial load
duke
parents:
diff changeset
496 void check_value(bool type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 guarantee(_is_oop[_pos++] == type, "signature does not match pushed arguments");
a61af66fc99e Initial load
duke
parents:
diff changeset
498 }
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 void check_doing_return(bool state) { _is_return = state; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 void check_return_type(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 guarantee(_is_return && t == _return_type, "return type does not match");
a61af66fc99e Initial load
duke
parents:
diff changeset
504 }
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void check_int(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 if (_is_return) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 check_return_type(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511 check_value(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
512 }
a61af66fc99e Initial load
duke
parents:
diff changeset
513
a61af66fc99e Initial load
duke
parents:
diff changeset
514 void check_double(BasicType t) { check_long(t); }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 void check_long(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 if (_is_return) {
a61af66fc99e Initial load
duke
parents:
diff changeset
518 check_return_type(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
519 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
520 }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 check_value(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
523 check_value(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 }
a61af66fc99e Initial load
duke
parents:
diff changeset
525
a61af66fc99e Initial load
duke
parents:
diff changeset
526 void check_obj(BasicType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if (_is_return) {
a61af66fc99e Initial load
duke
parents:
diff changeset
528 check_return_type(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
529 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 }
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
531
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
532 // verify handle and the oop pointed to by handle
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
533 int p = _pos;
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
534 bool bad = false;
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
535 // If argument is oop
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
536 if (_is_oop[p]) {
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
537 intptr_t v = _value[p];
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
538 if (v != 0 ) {
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
539 size_t t = (size_t)v;
498
c6065343356f 6786340: hs14b09a pit: a lot of tests failed in "-server -Xcomp" on solaris-amd64 using fastdebug bits
poonam
parents: 465
diff changeset
540 bad = (t < (size_t)os::vm_page_size() ) || !Handle::raw_resolve((oop *)v)->is_oop_or_null(true);
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
541 if (CheckJNICalls && bad) {
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
542 ReportJNIFatalError((JavaThread*)_thread, "Bad JNI oop argument");
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
543 }
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
544 }
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
545 // for the regular debug case.
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
546 assert(!bad, "Bad JNI oop argument");
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
547 }
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
548
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 check_value(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 void do_bool() { check_int(T_BOOLEAN); }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 void do_char() { check_int(T_CHAR); }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 void do_float() { check_int(T_FLOAT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 void do_double() { check_double(T_DOUBLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 void do_byte() { check_int(T_BYTE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void do_short() { check_int(T_SHORT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 void do_int() { check_int(T_INT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 void do_long() { check_long(T_LONG); }
a61af66fc99e Initial load
duke
parents:
diff changeset
560 void do_void() { check_return_type(T_VOID); }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 void do_object(int begin, int end) { check_obj(T_OBJECT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void do_array(int begin, int end) { check_obj(T_OBJECT); }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 };
a61af66fc99e Initial load
duke
parents:
diff changeset
564
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
565
0
a61af66fc99e Initial load
duke
parents:
diff changeset
566 void JavaCallArguments::verify(methodHandle method, BasicType return_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
567 Thread *thread) {
a61af66fc99e Initial load
duke
parents:
diff changeset
568 guarantee(method->size_of_parameters() == size_of_parameters(), "wrong no. of arguments pushed");
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 // Treat T_OBJECT and T_ARRAY as the same
a61af66fc99e Initial load
duke
parents:
diff changeset
571 if (return_type == T_ARRAY) return_type = T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Check that oop information is correct
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 1972
diff changeset
574 Symbol* signature = method->signature();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575
465
dc16daa0329d 6739363: Xcheck jni doesn't check native function arguments
poonam
parents: 0
diff changeset
576 SignatureChekker sc(signature, return_type, method->is_static(),_is_oop, _value, thread);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
577 sc.iterate_parameters();
a61af66fc99e Initial load
duke
parents:
diff changeset
578 sc.check_doing_return(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 sc.iterate_returntype();
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }