1 /*
2 * Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
3 * Copyright 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
25
26 #include "precompiled.hpp"
27 #include "asm/assembler.hpp"
28 #include "interpreter/bytecodeHistogram.hpp"
29 #include "interpreter/cppInterpreter.hpp"
30 #include "interpreter/cppInterpreterGenerator.hpp"
31 #include "interpreter/interpreter.hpp"
32 #include "interpreter/interpreterRuntime.hpp"
33 #include "oops/arrayOop.hpp"
34 #include "oops/cpCache.inline.hpp"
35 #include "oops/methodData.hpp"
36 #include "oops/method.hpp"
37 #include "oops/oop.inline.hpp"
38 #include "prims/jvmtiExport.hpp"
39 #include "prims/jvmtiThreadState.hpp"
40 #include "runtime/arguments.hpp"
41 #include "runtime/atomic.hpp"
42 #include "runtime/deoptimization.hpp"
43 #include "runtime/frame.inline.hpp"
44 #include "runtime/interfaceSupport.inline.hpp"
45 #include "runtime/jniHandles.inline.hpp"
46 #include "runtime/orderAccess.hpp"
47 #include "runtime/sharedRuntime.hpp"
48 #include "runtime/stubRoutines.hpp"
49 #include "runtime/synchronizer.hpp"
50 #include "runtime/timer.hpp"
51 #include "runtime/vframeArray.hpp"
52 #include "stack_zero.inline.hpp"
53 #include "utilities/debug.hpp"
54 #include "utilities/macros.hpp"
55
56 #ifdef CC_INTERP
57
58 #define fixup_after_potential_safepoint() \
59 method = istate->method()
60
61 #define CALL_VM_NOCHECK_NOFIX(func) \
62 thread->set_last_Java_frame(); \
63 func; \
64 thread->reset_last_Java_frame();
65
66 #define CALL_VM_NOCHECK(func) \
67 CALL_VM_NOCHECK_NOFIX(func) \
68 fixup_after_potential_safepoint()
69
normal_entry(Method * method,intptr_t UNUSED,TRAPS)70 int CppInterpreter::normal_entry(Method* method, intptr_t UNUSED, TRAPS) {
71 JavaThread *thread = (JavaThread *) THREAD;
72
73 // Allocate and initialize our frame.
74 InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
75 thread->push_zero_frame(frame);
76
77 // Execute those bytecodes!
78 main_loop(0, THREAD);
79
80 // No deoptimized frames on the stack
81 return 0;
82 }
83
narrow(BasicType type,intptr_t result)84 intptr_t narrow(BasicType type, intptr_t result) {
85 // mask integer result to narrower return type.
86 switch (type) {
87 case T_BOOLEAN:
88 return result&1;
89 case T_BYTE:
90 return (intptr_t)(jbyte)result;
91 case T_CHAR:
92 return (intptr_t)(uintptr_t)(jchar)result;
93 case T_SHORT:
94 return (intptr_t)(jshort)result;
95 case T_OBJECT: // nothing to do fall through
96 case T_ARRAY:
97 case T_LONG:
98 case T_INT:
99 case T_FLOAT:
100 case T_DOUBLE:
101 case T_VOID:
102 return result;
103 default:
104 ShouldNotReachHere();
105 return result; // silence compiler warnings
106 }
107 }
108
109
main_loop(int recurse,TRAPS)110 void CppInterpreter::main_loop(int recurse, TRAPS) {
111 JavaThread *thread = (JavaThread *) THREAD;
112 ZeroStack *stack = thread->zero_stack();
113
114 // If we are entering from a deopt we may need to call
115 // ourself a few times in order to get to our frame.
116 if (recurse)
117 main_loop(recurse - 1, THREAD);
118
119 InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame();
120 interpreterState istate = frame->interpreter_state();
121 Method* method = istate->method();
122
123 intptr_t *result = NULL;
124 int result_slots = 0;
125
126 while (true) {
127 // We can set up the frame anchor with everything we want at
128 // this point as we are thread_in_Java and no safepoints can
129 // occur until we go to vm mode. We do have to clear flags
130 // on return from vm but that is it.
131 thread->set_last_Java_frame();
132
133 // Call the interpreter
134 if (JvmtiExport::can_post_interpreter_events())
135 BytecodeInterpreter::runWithChecks(istate);
136 else
137 BytecodeInterpreter::run(istate);
138 fixup_after_potential_safepoint();
139
140 // Clear the frame anchor
141 thread->reset_last_Java_frame();
142
143 // Examine the message from the interpreter to decide what to do
144 if (istate->msg() == BytecodeInterpreter::call_method) {
145 Method* callee = istate->callee();
146
147 // Trim back the stack to put the parameters at the top
148 stack->set_sp(istate->stack() + 1);
149
150 // Make the call
151 Interpreter::invoke_method(callee, istate->callee_entry_point(), THREAD);
152 fixup_after_potential_safepoint();
153
154 // Convert the result
155 istate->set_stack(stack->sp() - 1);
156
157 // Restore the stack
158 stack->set_sp(istate->stack_limit() + 1);
159
160 // Resume the interpreter
161 istate->set_msg(BytecodeInterpreter::method_resume);
162 }
163 else if (istate->msg() == BytecodeInterpreter::more_monitors) {
164 int monitor_words = frame::interpreter_frame_monitor_size();
165
166 // Allocate the space
167 stack->overflow_check(monitor_words, THREAD);
168 if (HAS_PENDING_EXCEPTION)
169 break;
170 stack->alloc(monitor_words * wordSize);
171
172 // Move the expression stack contents
173 for (intptr_t *p = istate->stack() + 1; p < istate->stack_base(); p++)
174 *(p - monitor_words) = *p;
175
176 // Move the expression stack pointers
177 istate->set_stack_limit(istate->stack_limit() - monitor_words);
178 istate->set_stack(istate->stack() - monitor_words);
179 istate->set_stack_base(istate->stack_base() - monitor_words);
180
181 // Zero the new monitor so the interpreter can find it.
182 ((BasicObjectLock *) istate->stack_base())->set_obj(NULL);
183
184 // Resume the interpreter
185 istate->set_msg(BytecodeInterpreter::got_monitors);
186 }
187 else if (istate->msg() == BytecodeInterpreter::return_from_method) {
188 // Copy the result into the caller's frame
189 result_slots = type2size[method->result_type()];
190 assert(result_slots >= 0 && result_slots <= 2, "what?");
191 result = istate->stack() + result_slots;
192 break;
193 }
194 else if (istate->msg() == BytecodeInterpreter::throwing_exception) {
195 assert(HAS_PENDING_EXCEPTION, "should do");
196 break;
197 }
198 else if (istate->msg() == BytecodeInterpreter::do_osr) {
199 // Unwind the current frame
200 thread->pop_zero_frame();
201
202 // Remove any extension of the previous frame
203 int extra_locals = method->max_locals() - method->size_of_parameters();
204 stack->set_sp(stack->sp() + extra_locals);
205
206 // Jump into the OSR method
207 Interpreter::invoke_osr(
208 method, istate->osr_entry(), istate->osr_buf(), THREAD);
209 return;
210 }
211 else {
212 ShouldNotReachHere();
213 }
214 }
215
216 // Unwind the current frame
217 thread->pop_zero_frame();
218
219 // Pop our local variables
220 stack->set_sp(stack->sp() + method->max_locals());
221
222 // Push our result
223 for (int i = 0; i < result_slots; i++) {
224 // Adjust result to smaller
225 union {
226 intptr_t res;
227 jint res_jint;
228 };
229 res = result[-i];
230 if (result_slots == 1) {
231 BasicType t = method->result_type();
232 if (is_subword_type(t)) {
233 res_jint = (jint)narrow(t, res_jint);
234 }
235 }
236 stack->push(res);
237 }
238 }
239
native_entry(Method * method,intptr_t UNUSED,TRAPS)240 int CppInterpreter::native_entry(Method* method, intptr_t UNUSED, TRAPS) {
241 // Make sure method is native and not abstract
242 assert(method->is_native() && !method->is_abstract(), "should be");
243
244 JavaThread *thread = (JavaThread *) THREAD;
245 ZeroStack *stack = thread->zero_stack();
246
247 // Allocate and initialize our frame
248 InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
249 thread->push_zero_frame(frame);
250 interpreterState istate = frame->interpreter_state();
251 intptr_t *locals = istate->locals();
252
253 // Update the invocation counter
254 if ((UseCompiler || CountCompiledCalls) && !method->is_synchronized()) {
255 MethodCounters* mcs = method->method_counters();
256 if (mcs == NULL) {
257 CALL_VM_NOCHECK(mcs = InterpreterRuntime::build_method_counters(thread, method));
258 if (HAS_PENDING_EXCEPTION)
259 goto unwind_and_return;
260 }
261 InvocationCounter *counter = mcs->invocation_counter();
262 counter->increment();
263 if (counter->reached_InvocationLimit(mcs->backedge_counter())) {
264 CALL_VM_NOCHECK(
265 InterpreterRuntime::frequency_counter_overflow(thread, NULL));
266 if (HAS_PENDING_EXCEPTION)
267 goto unwind_and_return;
268 }
269 }
270
271 // Lock if necessary
272 BasicObjectLock *monitor;
273 monitor = NULL;
274 if (method->is_synchronized()) {
275 monitor = (BasicObjectLock*) istate->stack_base();
276 oop lockee = monitor->obj();
277 markOop disp = lockee->mark()->set_unlocked();
278
279 monitor->lock()->set_displaced_header(disp);
280 if (lockee->cas_set_mark((markOop)monitor, disp) != disp) {
281 if (thread->is_lock_owned((address) disp->clear_lock_bits())) {
282 monitor->lock()->set_displaced_header(NULL);
283 }
284 else {
285 CALL_VM_NOCHECK(InterpreterRuntime::monitorenter(thread, monitor));
286 if (HAS_PENDING_EXCEPTION)
287 goto unwind_and_return;
288 }
289 }
290 }
291
292 // Get the signature handler
293 InterpreterRuntime::SignatureHandler *handler; {
294 address handlerAddr = method->signature_handler();
295 if (handlerAddr == NULL) {
296 CALL_VM_NOCHECK(InterpreterRuntime::prepare_native_call(thread, method));
297 if (HAS_PENDING_EXCEPTION)
298 goto unlock_unwind_and_return;
299
300 handlerAddr = method->signature_handler();
301 assert(handlerAddr != NULL, "eh?");
302 }
303 if (handlerAddr == (address) InterpreterRuntime::slow_signature_handler) {
304 CALL_VM_NOCHECK(handlerAddr =
305 InterpreterRuntime::slow_signature_handler(thread, method, NULL,NULL));
306 if (HAS_PENDING_EXCEPTION)
307 goto unlock_unwind_and_return;
308 }
309 handler = \
310 InterpreterRuntime::SignatureHandler::from_handlerAddr(handlerAddr);
311 }
312
313 // Get the native function entry point
314 address function;
315 function = method->native_function();
316 assert(function != NULL, "should be set if signature handler is");
317
318 // Build the argument list
319 stack->overflow_check(handler->argument_count() * 2, THREAD);
320 if (HAS_PENDING_EXCEPTION)
321 goto unlock_unwind_and_return;
322
323 void **arguments;
324 void *mirror; {
325 arguments =
326 (void **) stack->alloc(handler->argument_count() * sizeof(void **));
327 void **dst = arguments;
328
329 void *env = thread->jni_environment();
330 *(dst++) = &env;
331
332 if (method->is_static()) {
333 istate->set_oop_temp(
334 method->constants()->pool_holder()->java_mirror());
335 mirror = istate->oop_temp_addr();
336 *(dst++) = &mirror;
337 }
338
339 intptr_t *src = locals;
340 for (int i = dst - arguments; i < handler->argument_count(); i++) {
341 ffi_type *type = handler->argument_type(i);
342 if (type == &ffi_type_pointer) {
343 if (*src) {
344 stack->push((intptr_t) src);
345 *(dst++) = stack->sp();
346 }
347 else {
348 *(dst++) = src;
349 }
350 src--;
351 }
352 else if (type->size == 4) {
353 *(dst++) = src--;
354 }
355 else if (type->size == 8) {
356 src--;
357 *(dst++) = src--;
358 }
359 else {
360 ShouldNotReachHere();
361 }
362 }
363 }
364
365 // Set up the Java frame anchor
366 thread->set_last_Java_frame();
367
368 // Change the thread state to _thread_in_native
369 ThreadStateTransition::transition_from_java(thread, _thread_in_native);
370
371 // Make the call
372 intptr_t result[4 - LogBytesPerWord];
373 ffi_call(handler->cif(), (void (*)()) function, result, arguments);
374
375 // Change the thread state back to _thread_in_Java.
376 // ThreadStateTransition::transition_from_native() cannot be used
377 // here because it does not check for asynchronous exceptions.
378 // We have to manage the transition ourself.
379 thread->set_thread_state(_thread_in_native_trans);
380
381 // Make sure new state is visible in the GC thread
382 InterfaceSupport::serialize_thread_state(thread);
383
384 // Handle safepoint operations, pending suspend requests,
385 // and pending asynchronous exceptions.
386 if (SafepointMechanism::poll(thread) ||
387 thread->has_special_condition_for_native_trans()) {
388 JavaThread::check_special_condition_for_native_trans(thread);
389 CHECK_UNHANDLED_OOPS_ONLY(thread->clear_unhandled_oops());
390 }
391
392 // Finally we can change the thread state to _thread_in_Java.
393 thread->set_thread_state(_thread_in_Java);
394 fixup_after_potential_safepoint();
395
396 // Clear the frame anchor
397 thread->reset_last_Java_frame();
398
399 // If the result was an oop then unbox it and store it in
400 // oop_temp where the garbage collector can see it before
401 // we release the handle it might be protected by.
402 if (handler->result_type() == &ffi_type_pointer) {
403 if (result[0] == 0) {
404 istate->set_oop_temp(NULL);
405 } else {
406 jobject handle = reinterpret_cast<jobject>(result[0]);
407 istate->set_oop_temp(JNIHandles::resolve(handle));
408 }
409 }
410
411 // Reset handle block
412 thread->active_handles()->clear();
413
414 unlock_unwind_and_return:
415
416 // Unlock if necessary
417 if (monitor) {
418 BasicLock *lock = monitor->lock();
419 markOop header = lock->displaced_header();
420 oop rcvr = monitor->obj();
421 monitor->set_obj(NULL);
422
423 if (header != NULL) {
424 markOop old_header = markOopDesc::encode(lock);
425 if (rcvr->cas_set_mark(header, old_header) != old_header) {
426 monitor->set_obj(rcvr); {
427 HandleMark hm(thread);
428 CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(thread, monitor));
429 }
430 }
431 }
432 }
433
434 unwind_and_return:
435
436 // Unwind the current activation
437 thread->pop_zero_frame();
438
439 // Pop our parameters
440 stack->set_sp(stack->sp() + method->size_of_parameters());
441
442 // Push our result
443 if (!HAS_PENDING_EXCEPTION) {
444 BasicType type = method->result_type();
445 stack->set_sp(stack->sp() - type2size[type]);
446
447 switch (type) {
448 case T_VOID:
449 break;
450
451 case T_BOOLEAN:
452 #ifndef VM_LITTLE_ENDIAN
453 result[0] <<= (BitsPerWord - BitsPerByte);
454 #endif
455 SET_LOCALS_INT(*(jboolean *) result != 0, 0);
456 break;
457
458 case T_CHAR:
459 #ifndef VM_LITTLE_ENDIAN
460 result[0] <<= (BitsPerWord - BitsPerShort);
461 #endif
462 SET_LOCALS_INT(*(jchar *) result, 0);
463 break;
464
465 case T_BYTE:
466 #ifndef VM_LITTLE_ENDIAN
467 result[0] <<= (BitsPerWord - BitsPerByte);
468 #endif
469 SET_LOCALS_INT(*(jbyte *) result, 0);
470 break;
471
472 case T_SHORT:
473 #ifndef VM_LITTLE_ENDIAN
474 result[0] <<= (BitsPerWord - BitsPerShort);
475 #endif
476 SET_LOCALS_INT(*(jshort *) result, 0);
477 break;
478
479 case T_INT:
480 #ifndef VM_LITTLE_ENDIAN
481 result[0] <<= (BitsPerWord - BitsPerInt);
482 #endif
483 SET_LOCALS_INT(*(jint *) result, 0);
484 break;
485
486 case T_LONG:
487 SET_LOCALS_LONG(*(jlong *) result, 0);
488 break;
489
490 case T_FLOAT:
491 SET_LOCALS_FLOAT(*(jfloat *) result, 0);
492 break;
493
494 case T_DOUBLE:
495 SET_LOCALS_DOUBLE(*(jdouble *) result, 0);
496 break;
497
498 case T_OBJECT:
499 case T_ARRAY:
500 SET_LOCALS_OBJECT(istate->oop_temp(), 0);
501 break;
502
503 default:
504 ShouldNotReachHere();
505 }
506 }
507
508 // No deoptimized frames on the stack
509 return 0;
510 }
511
accessor_entry(Method * method,intptr_t UNUSED,TRAPS)512 int CppInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) {
513 JavaThread *thread = (JavaThread *) THREAD;
514 ZeroStack *stack = thread->zero_stack();
515 intptr_t *locals = stack->sp();
516
517 // Drop into the slow path if we need a safepoint check
518 if (SafepointMechanism::poll(THREAD)) {
519 return normal_entry(method, 0, THREAD);
520 }
521
522 // Load the object pointer and drop into the slow path
523 // if we have a NullPointerException
524 oop object = LOCALS_OBJECT(0);
525 if (object == NULL) {
526 return normal_entry(method, 0, THREAD);
527 }
528
529 // Read the field index from the bytecode, which looks like this:
530 // 0: aload_0
531 // 1: getfield
532 // 2: index
533 // 3: index
534 // 4: ireturn/areturn/freturn/lreturn/dreturn
535 // NB this is not raw bytecode: index is in machine order
536 u1 *code = method->code_base();
537 assert(code[0] == Bytecodes::_aload_0 &&
538 code[1] == Bytecodes::_getfield &&
539 (code[4] == Bytecodes::_ireturn ||
540 code[4] == Bytecodes::_freturn ||
541 code[4] == Bytecodes::_lreturn ||
542 code[4] == Bytecodes::_dreturn ||
543 code[4] == Bytecodes::_areturn), "should do");
544 u2 index = Bytes::get_native_u2(&code[2]);
545
546 // Get the entry from the constant pool cache, and drop into
547 // the slow path if it has not been resolved
548 ConstantPoolCache* cache = method->constants()->cache();
549 ConstantPoolCacheEntry* entry = cache->entry_at(index);
550 if (!entry->is_resolved(Bytecodes::_getfield)) {
551 return normal_entry(method, 0, THREAD);
552 }
553
554 // Get the result and push it onto the stack
555 switch (entry->flag_state()) {
556 case ltos:
557 case dtos:
558 stack->overflow_check(1, CHECK_0);
559 stack->alloc(wordSize);
560 break;
561 }
562 if (entry->is_volatile()) {
563 if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
564 OrderAccess::fence();
565 }
566 switch (entry->flag_state()) {
567 case ctos:
568 SET_LOCALS_INT(object->char_field_acquire(entry->f2_as_index()), 0);
569 break;
570
571 case btos:
572 case ztos:
573 SET_LOCALS_INT(object->byte_field_acquire(entry->f2_as_index()), 0);
574 break;
575
576 case stos:
577 SET_LOCALS_INT(object->short_field_acquire(entry->f2_as_index()), 0);
578 break;
579
580 case itos:
581 SET_LOCALS_INT(object->int_field_acquire(entry->f2_as_index()), 0);
582 break;
583
584 case ltos:
585 SET_LOCALS_LONG(object->long_field_acquire(entry->f2_as_index()), 0);
586 break;
587
588 case ftos:
589 SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2_as_index()), 0);
590 break;
591
592 case dtos:
593 SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2_as_index()), 0);
594 break;
595
596 case atos:
597 SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2_as_index()), 0);
598 break;
599
600 default:
601 ShouldNotReachHere();
602 }
603 }
604 else {
605 switch (entry->flag_state()) {
606 case ctos:
607 SET_LOCALS_INT(object->char_field(entry->f2_as_index()), 0);
608 break;
609
610 case btos:
611 case ztos:
612 SET_LOCALS_INT(object->byte_field(entry->f2_as_index()), 0);
613 break;
614
615 case stos:
616 SET_LOCALS_INT(object->short_field(entry->f2_as_index()), 0);
617 break;
618
619 case itos:
620 SET_LOCALS_INT(object->int_field(entry->f2_as_index()), 0);
621 break;
622
623 case ltos:
624 SET_LOCALS_LONG(object->long_field(entry->f2_as_index()), 0);
625 break;
626
627 case ftos:
628 SET_LOCALS_FLOAT(object->float_field(entry->f2_as_index()), 0);
629 break;
630
631 case dtos:
632 SET_LOCALS_DOUBLE(object->double_field(entry->f2_as_index()), 0);
633 break;
634
635 case atos:
636 SET_LOCALS_OBJECT(object->obj_field(entry->f2_as_index()), 0);
637 break;
638
639 default:
640 ShouldNotReachHere();
641 }
642 }
643
644 // No deoptimized frames on the stack
645 return 0;
646 }
647
empty_entry(Method * method,intptr_t UNUSED,TRAPS)648 int CppInterpreter::empty_entry(Method* method, intptr_t UNUSED, TRAPS) {
649 JavaThread *thread = (JavaThread *) THREAD;
650 ZeroStack *stack = thread->zero_stack();
651
652 // Drop into the slow path if we need a safepoint check
653 if (SafepointMechanism::poll(THREAD)) {
654 return normal_entry(method, 0, THREAD);
655 }
656
657 // Pop our parameters
658 stack->set_sp(stack->sp() + method->size_of_parameters());
659
660 // No deoptimized frames on the stack
661 return 0;
662 }
663
664 // The new slots will be inserted before slot insert_before.
665 // Slots < insert_before will have the same slot number after the insert.
666 // Slots >= insert_before will become old_slot + num_slots.
insert_vmslots(int insert_before,int num_slots,TRAPS)667 void CppInterpreter::insert_vmslots(int insert_before, int num_slots, TRAPS) {
668 JavaThread *thread = (JavaThread *) THREAD;
669 ZeroStack *stack = thread->zero_stack();
670
671 // Allocate the space
672 stack->overflow_check(num_slots, CHECK);
673 stack->alloc(num_slots * wordSize);
674 intptr_t *vmslots = stack->sp();
675
676 // Shuffle everything up
677 for (int i = 0; i < insert_before; i++)
678 SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i + num_slots), i);
679 }
680
remove_vmslots(int first_slot,int num_slots,TRAPS)681 void CppInterpreter::remove_vmslots(int first_slot, int num_slots, TRAPS) {
682 JavaThread *thread = (JavaThread *) THREAD;
683 ZeroStack *stack = thread->zero_stack();
684 intptr_t *vmslots = stack->sp();
685
686 // Move everything down
687 for (int i = first_slot - 1; i >= 0; i--)
688 SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i + num_slots);
689
690 // Deallocate the space
691 stack->set_sp(stack->sp() + num_slots);
692 }
693
result_type_of_handle(oop method_handle)694 BasicType CppInterpreter::result_type_of_handle(oop method_handle) {
695 oop method_type = java_lang_invoke_MethodHandle::type(method_handle);
696 oop return_type = java_lang_invoke_MethodType::rtype(method_type);
697 return java_lang_Class::as_BasicType(return_type, (Klass* *) NULL);
698 }
699
calculate_unwind_sp(ZeroStack * stack,oop method_handle)700 intptr_t* CppInterpreter::calculate_unwind_sp(ZeroStack* stack,
701 oop method_handle) {
702 oop method_type = java_lang_invoke_MethodHandle::type(method_handle);
703 int argument_slots = java_lang_invoke_MethodType::ptype_slot_count(method_type);
704
705 return stack->sp() + argument_slots;
706 }
707
708 IRT_ENTRY(void, CppInterpreter::throw_exception(JavaThread* thread,
709 Symbol* name,
710 char* message))
711 THROW_MSG(name, message);
712 IRT_END
713
build(Method * const method,TRAPS)714 InterpreterFrame *InterpreterFrame::build(Method* const method, TRAPS) {
715 JavaThread *thread = (JavaThread *) THREAD;
716 ZeroStack *stack = thread->zero_stack();
717
718 // Calculate the size of the frame we'll build, including
719 // any adjustments to the caller's frame that we'll make.
720 int extra_locals = 0;
721 int monitor_words = 0;
722 int stack_words = 0;
723
724 if (!method->is_native()) {
725 extra_locals = method->max_locals() - method->size_of_parameters();
726 stack_words = method->max_stack();
727 }
728 if (method->is_synchronized()) {
729 monitor_words = frame::interpreter_frame_monitor_size();
730 }
731 stack->overflow_check(
732 extra_locals + header_words + monitor_words + stack_words, CHECK_NULL);
733
734 // Adjust the caller's stack frame to accomodate any additional
735 // local variables we have contiguously with our parameters.
736 for (int i = 0; i < extra_locals; i++)
737 stack->push(0);
738
739 intptr_t *locals;
740 if (method->is_native())
741 locals = stack->sp() + (method->size_of_parameters() - 1);
742 else
743 locals = stack->sp() + (method->max_locals() - 1);
744
745 stack->push(0); // next_frame, filled in later
746 intptr_t *fp = stack->sp();
747 assert(fp - stack->sp() == next_frame_off, "should be");
748
749 stack->push(INTERPRETER_FRAME);
750 assert(fp - stack->sp() == frame_type_off, "should be");
751
752 interpreterState istate =
753 (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
754 assert(fp - stack->sp() == istate_off, "should be");
755
756 istate->set_locals(locals);
757 istate->set_method(method);
758 istate->set_mirror(method->method_holder()->java_mirror());
759 istate->set_self_link(istate);
760 istate->set_prev_link(NULL);
761 istate->set_thread(thread);
762 istate->set_bcp(method->is_native() ? NULL : method->code_base());
763 istate->set_constants(method->constants()->cache());
764 istate->set_msg(BytecodeInterpreter::method_entry);
765 istate->set_oop_temp(NULL);
766 istate->set_mdx(NULL);
767 istate->set_callee(NULL);
768
769 istate->set_monitor_base((BasicObjectLock *) stack->sp());
770 if (method->is_synchronized()) {
771 BasicObjectLock *monitor =
772 (BasicObjectLock *) stack->alloc(monitor_words * wordSize);
773 oop object;
774 if (method->is_static())
775 object = method->constants()->pool_holder()->java_mirror();
776 else
777 object = (oop) (void*)locals[0];
778 monitor->set_obj(object);
779 }
780
781 istate->set_stack_base(stack->sp());
782 istate->set_stack(stack->sp() - 1);
783 if (stack_words)
784 stack->alloc(stack_words * wordSize);
785 istate->set_stack_limit(stack->sp() - 1);
786
787 return (InterpreterFrame *) fp;
788 }
789
build(int size,TRAPS)790 InterpreterFrame *InterpreterFrame::build(int size, TRAPS) {
791 ZeroStack *stack = ((JavaThread *) THREAD)->zero_stack();
792
793 int size_in_words = size >> LogBytesPerWord;
794 assert(size_in_words * wordSize == size, "unaligned");
795 assert(size_in_words >= header_words, "too small");
796 stack->overflow_check(size_in_words, CHECK_NULL);
797
798 stack->push(0); // next_frame, filled in later
799 intptr_t *fp = stack->sp();
800 assert(fp - stack->sp() == next_frame_off, "should be");
801
802 stack->push(INTERPRETER_FRAME);
803 assert(fp - stack->sp() == frame_type_off, "should be");
804
805 interpreterState istate =
806 (interpreterState) stack->alloc(sizeof(BytecodeInterpreter));
807 assert(fp - stack->sp() == istate_off, "should be");
808 istate->set_self_link(NULL); // mark invalid
809
810 stack->alloc((size_in_words - header_words) * wordSize);
811
812 return (InterpreterFrame *) fp;
813 }
814
return_entry(TosState state,int length,Bytecodes::Code code)815 address CppInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
816 ShouldNotCallThis();
817 return NULL;
818 }
819
deopt_entry(TosState state,int length)820 address CppInterpreter::deopt_entry(TosState state, int length) {
821 return NULL;
822 }
823
824 // Helper for figuring out if frames are interpreter frames
825
contains(address pc)826 bool CppInterpreter::contains(address pc) {
827 return false; // make frame::print_value_on work
828 }
829 #endif // CC_INTERP
830