Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-aarch32-jdk8u
Path: blob/jdk8u272-b10-aarch32-20201026/hotspot/src/share/vm/runtime/javaCalls.cpp
48785 views
1
/*
2
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
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
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#include "precompiled.hpp"
26
#include "classfile/systemDictionary.hpp"
27
#include "classfile/vmSymbols.hpp"
28
#include "code/nmethod.hpp"
29
#include "compiler/compileBroker.hpp"
30
#include "interpreter/interpreter.hpp"
31
#include "interpreter/linkResolver.hpp"
32
#include "memory/universe.inline.hpp"
33
#include "oops/oop.inline.hpp"
34
#include "prims/jniCheck.hpp"
35
#include "runtime/compilationPolicy.hpp"
36
#include "runtime/handles.inline.hpp"
37
#include "runtime/interfaceSupport.hpp"
38
#include "runtime/javaCalls.hpp"
39
#include "runtime/mutexLocker.hpp"
40
#include "runtime/signature.hpp"
41
#include "runtime/stubRoutines.hpp"
42
#include "runtime/thread.inline.hpp"
43
44
// -----------------------------------------------------
45
// Implementation of JavaCallWrapper
46
47
JavaCallWrapper::JavaCallWrapper(methodHandle callee_method, Handle receiver, JavaValue* result, TRAPS) {
48
JavaThread* thread = (JavaThread *)THREAD;
49
bool clear_pending_exception = true;
50
51
guarantee(thread->is_Java_thread(), "crucial check - the VM thread cannot and must not escape to Java code");
52
assert(!thread->owns_locks(), "must release all locks when leaving VM");
53
guarantee(!thread->is_Compiler_thread(), "cannot make java calls from the compiler");
54
_result = result;
55
56
// Allocate handle block for Java code. This must be done before we change thread_state to _thread_in_Java_or_stub,
57
// since it can potentially block.
58
JNIHandleBlock* new_handles = JNIHandleBlock::allocate_block(thread);
59
60
// After this, we are official in JavaCode. This needs to be done before we change any of the thread local
61
// info, since we cannot find oops before the new information is set up completely.
62
ThreadStateTransition::transition(thread, _thread_in_vm, _thread_in_Java);
63
64
// Make sure that we handle asynchronous stops and suspends _before_ we clear all thread state
65
// in JavaCallWrapper::JavaCallWrapper(). This way, we can decide if we need to do any pd actions
66
// to prepare for stop/suspend (flush register windows on sparcs, cache sp, or other state).
67
if (thread->has_special_runtime_exit_condition()) {
68
thread->handle_special_runtime_exit_condition();
69
if (HAS_PENDING_EXCEPTION) {
70
clear_pending_exception = false;
71
}
72
}
73
74
75
// Make sure to set the oop's after the thread transition - since we can block there. No one is GC'ing
76
// the JavaCallWrapper before the entry frame is on the stack.
77
_callee_method = callee_method();
78
_receiver = receiver();
79
80
#ifdef CHECK_UNHANDLED_OOPS
81
THREAD->allow_unhandled_oop(&_receiver);
82
#endif // CHECK_UNHANDLED_OOPS
83
84
_thread = (JavaThread *)thread;
85
_handles = _thread->active_handles(); // save previous handle block & Java frame linkage
86
87
// For the profiler, the last_Java_frame information in thread must always be in
88
// legal state. We have no last Java frame if last_Java_sp == NULL so
89
// the valid transition is to clear _last_Java_sp and then reset the rest of
90
// the (platform specific) state.
91
92
_anchor.copy(_thread->frame_anchor());
93
_thread->frame_anchor()->clear();
94
95
debug_only(_thread->inc_java_call_counter());
96
_thread->set_active_handles(new_handles); // install new handle block and reset Java frame linkage
97
98
assert (_thread->thread_state() != _thread_in_native, "cannot set native pc to NULL");
99
100
// clear any pending exception in thread (native calls start with no exception pending)
101
if(clear_pending_exception) {
102
_thread->clear_pending_exception();
103
}
104
105
if (_anchor.last_Java_sp() == NULL) {
106
_thread->record_base_of_stack_pointer();
107
}
108
}
109
110
111
JavaCallWrapper::~JavaCallWrapper() {
112
assert(_thread == JavaThread::current(), "must still be the same thread");
113
114
// restore previous handle block & Java frame linkage
115
JNIHandleBlock *_old_handles = _thread->active_handles();
116
_thread->set_active_handles(_handles);
117
118
_thread->frame_anchor()->zap();
119
120
debug_only(_thread->dec_java_call_counter());
121
122
if (_anchor.last_Java_sp() == NULL) {
123
_thread->set_base_of_stack_pointer(NULL);
124
}
125
126
127
// Old thread-local info. has been restored. We are not back in the VM.
128
ThreadStateTransition::transition_from_java(_thread, _thread_in_vm);
129
130
// State has been restored now make the anchor frame visible for the profiler.
131
// Do this after the transition because this allows us to put an assert
132
// the Java->vm transition which checks to see that stack is not walkable
133
// on sparc/ia64 which will catch violations of the reseting of last_Java_frame
134
// invariants (i.e. _flags always cleared on return to Java)
135
136
_thread->frame_anchor()->copy(&_anchor);
137
138
// Release handles after we are marked as being inside the VM again, since this
139
// operation might block
140
JNIHandleBlock::release_block(_old_handles, _thread);
141
}
142
143
144
void JavaCallWrapper::oops_do(OopClosure* f) {
145
f->do_oop((oop*)&_receiver);
146
handles()->oops_do(f);
147
}
148
149
150
// Helper methods
151
static BasicType runtime_type_from(JavaValue* result) {
152
switch (result->get_type()) {
153
case T_BOOLEAN: // fall through
154
case T_CHAR : // fall through
155
case T_SHORT : // fall through
156
case T_INT : // fall through
157
#ifndef _LP64
158
case T_OBJECT : // fall through
159
case T_ARRAY : // fall through
160
#endif
161
case T_BYTE : // fall through
162
case T_VOID : return T_INT;
163
case T_LONG : return T_LONG;
164
case T_FLOAT : return T_FLOAT;
165
case T_DOUBLE : return T_DOUBLE;
166
#ifdef _LP64
167
case T_ARRAY : // fall through
168
case T_OBJECT: return T_OBJECT;
169
#endif
170
}
171
ShouldNotReachHere();
172
return T_ILLEGAL;
173
}
174
175
// ===== object constructor calls =====
176
177
void JavaCalls::call_default_constructor(JavaThread* thread, methodHandle method, Handle receiver, TRAPS) {
178
assert(method->name() == vmSymbols::object_initializer_name(), "Should only be called for default constructor");
179
assert(method->signature() == vmSymbols::void_method_signature(), "Should only be called for default constructor");
180
181
InstanceKlass* ik = method->method_holder();
182
if (ik->is_initialized() && ik->has_vanilla_constructor()) {
183
// safe to skip constructor call
184
} else {
185
static JavaValue result(T_VOID);
186
JavaCallArguments args(receiver);
187
call(&result, method, &args, CHECK);
188
}
189
}
190
191
// ============ Virtual calls ============
192
193
void JavaCalls::call_virtual(JavaValue* result, KlassHandle spec_klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
194
CallInfo callinfo;
195
Handle receiver = args->receiver();
196
KlassHandle recvrKlass(THREAD, receiver.is_null() ? (Klass*)NULL : receiver->klass());
197
LinkResolver::resolve_virtual_call(
198
callinfo, receiver, recvrKlass, spec_klass, name, signature,
199
KlassHandle(), false, true, CHECK);
200
methodHandle method = callinfo.selected_method();
201
assert(method.not_null(), "should have thrown exception");
202
203
// Invoke the method
204
JavaCalls::call(result, method, args, CHECK);
205
}
206
207
208
void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, TRAPS) {
209
JavaCallArguments args(receiver); // One oop argument
210
call_virtual(result, spec_klass, name, signature, &args, CHECK);
211
}
212
213
214
void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
215
JavaCallArguments args(receiver); // One oop argument
216
args.push_oop(arg1);
217
call_virtual(result, spec_klass, name, signature, &args, CHECK);
218
}
219
220
221
222
void JavaCalls::call_virtual(JavaValue* result, Handle receiver, KlassHandle spec_klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
223
JavaCallArguments args(receiver); // One oop argument
224
args.push_oop(arg1);
225
args.push_oop(arg2);
226
call_virtual(result, spec_klass, name, signature, &args, CHECK);
227
}
228
229
230
// ============ Special calls ============
231
232
void JavaCalls::call_special(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
233
CallInfo callinfo;
234
LinkResolver::resolve_special_call(callinfo, args->receiver(), klass, name, signature, KlassHandle(), false, CHECK);
235
methodHandle method = callinfo.selected_method();
236
assert(method.not_null(), "should have thrown exception");
237
238
// Invoke the method
239
JavaCalls::call(result, method, args, CHECK);
240
}
241
242
243
void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
244
JavaCallArguments args(receiver); // One oop argument
245
call_special(result, klass, name, signature, &args, CHECK);
246
}
247
248
249
void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
250
JavaCallArguments args(receiver); // One oop argument
251
args.push_oop(arg1);
252
call_special(result, klass, name, signature, &args, CHECK);
253
}
254
255
256
void JavaCalls::call_special(JavaValue* result, Handle receiver, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
257
JavaCallArguments args(receiver); // One oop argument
258
args.push_oop(arg1);
259
args.push_oop(arg2);
260
call_special(result, klass, name, signature, &args, CHECK);
261
}
262
263
264
// ============ Static calls ============
265
266
void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, JavaCallArguments* args, TRAPS) {
267
CallInfo callinfo;
268
LinkResolver::resolve_static_call(callinfo, klass, name, signature, KlassHandle(), false, true, CHECK);
269
methodHandle method = callinfo.selected_method();
270
assert(method.not_null(), "should have thrown exception");
271
272
// Invoke the method
273
JavaCalls::call(result, method, args, CHECK);
274
}
275
276
277
void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS) {
278
JavaCallArguments args; // No argument
279
call_static(result, klass, name, signature, &args, CHECK);
280
}
281
282
283
void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS) {
284
JavaCallArguments args(arg1); // One oop argument
285
call_static(result, klass, name, signature, &args, CHECK);
286
}
287
288
289
void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS) {
290
JavaCallArguments args; // One oop argument
291
args.push_oop(arg1);
292
args.push_oop(arg2);
293
call_static(result, klass, name, signature, &args, CHECK);
294
}
295
296
297
// -------------------------------------------------
298
// Implementation of JavaCalls (low level)
299
300
301
void JavaCalls::call(JavaValue* result, methodHandle method, JavaCallArguments* args, TRAPS) {
302
// Check if we need to wrap a potential OS exception handler around thread
303
// This is used for e.g. Win32 structured exception handlers
304
assert(THREAD->is_Java_thread(), "only JavaThreads can make JavaCalls");
305
// Need to wrap each and everytime, since there might be native code down the
306
// stack that has installed its own exception handlers
307
os::os_exception_wrapper(call_helper, result, &method, args, THREAD);
308
}
309
310
void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArguments* args, TRAPS) {
311
// During dumping, Java execution environment is not fully initialized. Also, Java execution
312
// may cause undesirable side-effects in the class metadata.
313
assert(!DumpSharedSpaces, "must not execute Java bytecodes when dumping");
314
315
methodHandle method = *m;
316
JavaThread* thread = (JavaThread*)THREAD;
317
assert(thread->is_Java_thread(), "must be called by a java thread");
318
assert(method.not_null(), "must have a method to call");
319
assert(!SafepointSynchronize::is_at_safepoint(), "call to Java code during VM operation");
320
assert(!thread->handle_area()->no_handle_mark_active(), "cannot call out to Java here");
321
322
323
CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops();)
324
325
// Verify the arguments
326
327
if (CheckJNICalls) {
328
args->verify(method, result->get_type());
329
}
330
else debug_only(args->verify(method, result->get_type()));
331
332
// Ignore call if method is empty
333
if (method->is_empty_method()) {
334
assert(result->get_type() == T_VOID, "an empty method must return a void value");
335
return;
336
}
337
338
339
#ifdef ASSERT
340
{ InstanceKlass* holder = method->method_holder();
341
// A klass might not be initialized since JavaCall's might be used during the executing of
342
// the <clinit>. For example, a Thread.start might start executing on an object that is
343
// not fully initialized! (bad Java programming style)
344
assert(holder->is_linked(), "rewritting must have taken place");
345
}
346
#endif
347
348
349
assert(!thread->is_Compiler_thread(), "cannot compile from the compiler");
350
if (CompilationPolicy::must_be_compiled(method)) {
351
CompileBroker::compile_method(method, InvocationEntryBci,
352
CompilationPolicy::policy()->initial_compile_level(),
353
methodHandle(), 0, "must_be_compiled", CHECK);
354
}
355
356
// Since the call stub sets up like the interpreter we call the from_interpreted_entry
357
// so we can go compiled via a i2c. Otherwise initial entry method will always
358
// run interpreted.
359
address entry_point = method->from_interpreted_entry();
360
if (JvmtiExport::can_post_interpreter_events() && thread->is_interp_only_mode()) {
361
entry_point = method->interpreter_entry();
362
}
363
364
// Figure out if the result value is an oop or not (Note: This is a different value
365
// than result_type. result_type will be T_INT of oops. (it is about size)
366
BasicType result_type = runtime_type_from(result);
367
bool oop_result_flag = (result->get_type() == T_OBJECT || result->get_type() == T_ARRAY);
368
369
// NOTE: if we move the computation of the result_val_address inside
370
// the call to call_stub, the optimizer produces wrong code.
371
intptr_t* result_val_address = (intptr_t*)(result->get_value_addr());
372
373
// Find receiver
374
Handle receiver = (!method->is_static()) ? args->receiver() : Handle();
375
376
// When we reenter Java, we need to reenable the yellow zone which
377
// might already be disabled when we are in VM.
378
if (thread->stack_yellow_zone_disabled()) {
379
thread->reguard_stack();
380
}
381
382
// Check that there are shadow pages available before changing thread state
383
// to Java
384
if (!os::stack_shadow_pages_available(THREAD, method)) {
385
// Throw stack overflow exception with preinitialized exception.
386
Exceptions::throw_stack_overflow_exception(THREAD, __FILE__, __LINE__, method);
387
return;
388
} else {
389
// Touch pages checked if the OS needs them to be touched to be mapped.
390
os::bang_stack_shadow_pages();
391
}
392
393
// do call
394
{ JavaCallWrapper link(method, receiver, result, CHECK);
395
{ HandleMark hm(thread); // HandleMark used by HandleMarkCleaner
396
397
StubRoutines::call_stub()(
398
(address)&link,
399
// (intptr_t*)&(result->_value), // see NOTE above (compiler problem)
400
result_val_address, // see NOTE above (compiler problem)
401
result_type,
402
method(),
403
entry_point,
404
args->parameters(),
405
args->size_of_parameters(),
406
CHECK
407
);
408
409
result = link.result(); // circumvent MS C++ 5.0 compiler bug (result is clobbered across call)
410
// Preserve oop return value across possible gc points
411
if (oop_result_flag) {
412
thread->set_vm_result((oop) result->get_jobject());
413
}
414
}
415
} // Exit JavaCallWrapper (can block - potential return oop must be preserved)
416
417
// Check if a thread stop or suspend should be executed
418
// The following assert was not realistic. Thread.stop can set that bit at any moment.
419
//assert(!thread->has_special_runtime_exit_condition(), "no async. exceptions should be installed");
420
421
// Restore possible oop return
422
if (oop_result_flag) {
423
result->set_jobject((jobject)thread->vm_result());
424
thread->set_vm_result(NULL);
425
}
426
}
427
428
429
//--------------------------------------------------------------------------------------
430
// Implementation of JavaCallArguments
431
432
inline bool is_value_state_indirect_oop(uint state) {
433
assert(state != JavaCallArguments::value_state_oop,
434
"Checking for handles after removal");
435
assert(state < JavaCallArguments::value_state_limit, "Invalid value state");
436
return state != JavaCallArguments::value_state_primitive;
437
}
438
439
inline oop resolve_indirect_oop(intptr_t value, uint state) {
440
switch (state) {
441
case JavaCallArguments::value_state_handle:
442
{
443
oop* ptr = reinterpret_cast<oop*>(value);
444
return Handle::raw_resolve(ptr);
445
}
446
447
case JavaCallArguments::value_state_jobject:
448
{
449
jobject obj = reinterpret_cast<jobject>(value);
450
return JNIHandles::resolve(obj);
451
}
452
453
default:
454
ShouldNotReachHere();
455
return NULL;
456
}
457
}
458
459
intptr_t* JavaCallArguments::parameters() {
460
// First convert all handles to oops
461
for(int i = 0; i < _size; i++) {
462
uint state = _value_state[i];
463
assert(state != value_state_oop, "Multiple handle conversions");
464
if (is_value_state_indirect_oop(state)) {
465
oop obj = resolve_indirect_oop(_value[i], state);
466
_value[i] = cast_from_oop<intptr_t>(obj);
467
_value_state[i] = value_state_oop;
468
}
469
}
470
// Return argument vector
471
return _value;
472
}
473
474
475
class SignatureChekker : public SignatureIterator {
476
private:
477
int _pos;
478
BasicType _return_type;
479
u_char* _value_state;
480
intptr_t* _value;
481
482
public:
483
bool _is_return;
484
485
SignatureChekker(Symbol* signature,
486
BasicType return_type,
487
bool is_static,
488
u_char* value_state,
489
intptr_t* value) :
490
SignatureIterator(signature),
491
_pos(0),
492
_return_type(return_type),
493
_value_state(value_state),
494
_value(value),
495
_is_return(false)
496
{
497
if (!is_static) {
498
check_value(true); // Receiver must be an oop
499
}
500
}
501
502
void check_value(bool type) {
503
uint state = _value_state[_pos++];
504
if (type) {
505
guarantee(is_value_state_indirect_oop(state),
506
"signature does not match pushed arguments");
507
} else {
508
guarantee(state == JavaCallArguments::value_state_primitive,
509
"signature does not match pushed arguments");
510
}
511
}
512
513
void check_doing_return(bool state) { _is_return = state; }
514
515
void check_return_type(BasicType t) {
516
guarantee(_is_return && t == _return_type, "return type does not match");
517
}
518
519
void check_int(BasicType t) {
520
if (_is_return) {
521
check_return_type(t);
522
return;
523
}
524
check_value(false);
525
}
526
527
void check_double(BasicType t) { check_long(t); }
528
529
void check_long(BasicType t) {
530
if (_is_return) {
531
check_return_type(t);
532
return;
533
}
534
535
check_value(false);
536
check_value(false);
537
}
538
539
void check_obj(BasicType t) {
540
if (_is_return) {
541
check_return_type(t);
542
return;
543
}
544
545
intptr_t v = _value[_pos];
546
if (v != 0) {
547
// v is a "handle" referring to an oop, cast to integral type.
548
// There shouldn't be any handles in very low memory.
549
guarantee((size_t)v >= (size_t)os::vm_page_size(),
550
"Bad JNI oop argument");
551
// Verify the pointee.
552
oop vv = resolve_indirect_oop(v, _value_state[_pos]);
553
guarantee(vv->is_oop_or_null(true),
554
"Bad JNI oop argument");
555
}
556
557
check_value(true); // Verify value state.
558
}
559
560
void do_bool() { check_int(T_BOOLEAN); }
561
void do_char() { check_int(T_CHAR); }
562
void do_float() { check_int(T_FLOAT); }
563
void do_double() { check_double(T_DOUBLE); }
564
void do_byte() { check_int(T_BYTE); }
565
void do_short() { check_int(T_SHORT); }
566
void do_int() { check_int(T_INT); }
567
void do_long() { check_long(T_LONG); }
568
void do_void() { check_return_type(T_VOID); }
569
void do_object(int begin, int end) { check_obj(T_OBJECT); }
570
void do_array(int begin, int end) { check_obj(T_OBJECT); }
571
};
572
573
574
void JavaCallArguments::verify(methodHandle method, BasicType return_type) {
575
guarantee(method->size_of_parameters() == size_of_parameters(), "wrong no. of arguments pushed");
576
577
// Treat T_OBJECT and T_ARRAY as the same
578
if (return_type == T_ARRAY) return_type = T_OBJECT;
579
580
// Check that oop information is correct
581
Symbol* signature = method->signature();
582
583
SignatureChekker sc(signature,
584
return_type,
585
method->is_static(),
586
_value_state,
587
_value);
588
sc.iterate_parameters();
589
sc.check_doing_return(true);
590
sc.iterate_returntype();
591
}
592
593