void CompiledDirectStaticCall::set_to_interpreted(const methodHandle& callee, address entry) { address stub = find_stub(/*is_aot*/ false); guarantee(stub != NULL, "stub not found"); if (TraceICs) { ResourceMark rm; tty->print_cr("CompiledDirectStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s", p2i(instruction_address()), callee->name_and_sig_as_C_string()); } // Creation also verifies the object. NativeMovConstReg* method_holder = nativeMovConstReg_at(stub + NativeCall::get_IC_pos_in_java_to_interp_stub()); NativeJump* jump = nativeJump_at(method_holder->next_instruction_address()); // A generated lambda form might be deleted from the Lambdaform // cache in MethodTypeForm. If a jit compiled lambdaform method // becomes not entrant and the cache access returns null, the new // resolve will lead to a new generated LambdaForm. assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee() || callee->is_compiled_lambda_form(), "a) MT-unsafe modification of inline cache"); assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry, "b) MT-unsafe modification of inline cache"); // Update stub. method_holder->set_data((intptr_t)callee()); jump->set_jump_destination(entry); // Update jump to call. set_destination_mt_safe(stub); }
void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry) { address stub = find_stub(); guarantee(stub != NULL, "stub not found"); if (TraceICs) { ResourceMark rm; tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s", p2i(instruction_address()), callee->name_and_sig_as_C_string()); } // Creation also verifies the object. NativeMovConstReg* method_holder = nativeMovConstReg_at(stub); NativeJump* jump = nativeJump_at(method_holder->next_instruction_address()); assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee(), "a) MT-unsafe modification of inline cache"); assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry, "b) MT-unsafe modification of inline cache"); // Update stub. method_holder->set_data((intptr_t)callee()); jump->set_jump_destination(entry); // Update jump to call. set_destination_mt_safe(stub); }
address NativeLookup::lookup_base(methodHandle method, bool& in_base_library, TRAPS) { address entry = NULL; ResourceMark rm(THREAD); entry = lookup_entry(method, in_base_library, THREAD); if (entry != NULL) return entry; // standard native method resolution has failed. Check if there are any // JVM TI prefixes which have been applied to the native method name. entry = lookup_entry_prefixed(method, in_base_library, THREAD); if (entry != NULL) return entry; // Native function not found, throw UnsatisfiedLinkError THROW_MSG_0(vmSymbols::java_lang_UnsatisfiedLinkError(), method->name_and_sig_as_C_string()); }
// Print an event. void SimpleThresholdPolicy::print_event(EventType type, methodHandle mh, methodHandle imh, int bci, CompLevel level) { bool inlinee_event = mh() != imh(); ttyLocker tty_lock; tty->print("%lf: [", os::elapsedTime()); switch(type) { case CALL: tty->print("call"); break; case LOOP: tty->print("loop"); break; case COMPILE: tty->print("compile"); break; case REMOVE_FROM_QUEUE: tty->print("remove-from-queue"); break; case UPDATE_IN_QUEUE: tty->print("update-in-queue"); break; case REPROFILE: tty->print("reprofile"); break; case MAKE_NOT_ENTRANT: tty->print("make-not-entrant"); break; default: tty->print("unknown"); } tty->print(" level=%d ", level); ResourceMark rm; char *method_name = mh->name_and_sig_as_C_string(); tty->print("[%s", method_name); if (inlinee_event) { char *inlinee_name = imh->name_and_sig_as_C_string(); tty->print(" [%s]] ", inlinee_name); } else tty->print("] "); tty->print("@%d queues=%d,%d", bci, CompileBroker::queue_size(CompLevel_full_profile), CompileBroker::queue_size(CompLevel_full_optimization)); print_specific(type, mh, imh, bci, level); if (type != COMPILE) { print_counters("", mh); if (inlinee_event) { print_counters("inlinee ", imh); } tty->print(" compilable="); bool need_comma = false; if (!mh->is_not_compilable(CompLevel_full_profile)) { tty->print("c1"); need_comma = true; } if (!mh->is_not_osr_compilable(CompLevel_full_profile)) { if (need_comma) tty->print(","); tty->print("c1-osr"); need_comma = true; } if (!mh->is_not_compilable(CompLevel_full_optimization)) { if (need_comma) tty->print(","); tty->print("c2"); need_comma = true; } if (!mh->is_not_osr_compilable(CompLevel_full_optimization)) { if (need_comma) tty->print(","); tty->print("c2-osr"); } tty->print(" status="); if (mh->queued_for_compilation()) { tty->print("in-queue"); } else tty->print("idle"); } tty->print_cr("]"); }