--- old/src/hotspot/share/jvmci/jvmciCompiler.cpp 2019-03-28 11:22:41.000000000 -0700 +++ new/src/hotspot/share/jvmci/jvmciCompiler.cpp 2019-03-28 11:22:41.000000000 -0700 @@ -28,7 +28,6 @@ #include "oops/oop.inline.hpp" #include "runtime/javaCalls.hpp" #include "runtime/handles.hpp" -#include "jvmci/jvmciJavaClasses.hpp" #include "jvmci/jvmciCompiler.hpp" #include "jvmci/jvmciEnv.hpp" #include "jvmci/jvmciRuntime.hpp" @@ -103,121 +102,7 @@ tty->print_cr(" in " JLONG_FORMAT " ms (compiled %d methods)", os::javaTimeMillis() - start, _methods_compiled); } _bootstrapping = false; - JVMCIRuntime::bootstrap_finished(CHECK); -} - -#define CHECK_EXIT THREAD); \ -if (HAS_PENDING_EXCEPTION) { \ - char buf[256]; \ - jio_snprintf(buf, 256, "Uncaught exception at %s:%d", __FILE__, __LINE__); \ - JVMCICompiler::exit_on_pending_exception(PENDING_EXCEPTION, buf); \ - return; \ -} \ -(void)(0 - -void JVMCICompiler::compile_method(const methodHandle& method, int entry_bci, JVMCIEnv* env) { - JVMCI_EXCEPTION_CONTEXT - - bool is_osr = entry_bci != InvocationEntryBci; - if (_bootstrapping && is_osr) { - // no OSR compilations during bootstrap - the compiler is just too slow at this point, - // and we know that there are no endless loops - env->set_failure(true, "No OSR during boostrap"); - return; - } - - JVMCIRuntime::initialize_well_known_classes(CHECK_EXIT); - - HandleMark hm; - Handle receiver = JVMCIRuntime::get_HotSpotJVMCIRuntime(CHECK_EXIT); - - JavaValue method_result(T_OBJECT); - JavaCallArguments args; - args.push_long((jlong) (address) method()); - JavaCalls::call_static(&method_result, SystemDictionary::HotSpotResolvedJavaMethodImpl_klass(), - vmSymbols::fromMetaspace_name(), vmSymbols::method_fromMetaspace_signature(), &args, THREAD); - - JavaValue result(T_OBJECT); - if (!HAS_PENDING_EXCEPTION) { - JavaCallArguments args; - args.push_oop(receiver); - args.push_oop(Handle(THREAD, (oop)method_result.get_jobject())); - args.push_int(entry_bci); - args.push_long((jlong) (address) env); - args.push_int(env->task()->compile_id()); - JavaCalls::call_special(&result, receiver->klass(), - vmSymbols::compileMethod_name(), vmSymbols::compileMethod_signature(), &args, THREAD); - } - - // An uncaught exception was thrown during compilation. Generally these - // should be handled by the Java code in some useful way but if they leak - // through to here report them instead of dying or silently ignoring them. - if (HAS_PENDING_EXCEPTION) { - Handle exception(THREAD, PENDING_EXCEPTION); - CLEAR_PENDING_EXCEPTION; - - java_lang_Throwable::java_printStackTrace(exception, THREAD); - if (HAS_PENDING_EXCEPTION) { - CLEAR_PENDING_EXCEPTION; - } - - env->set_failure(false, "unexpected exception thrown"); - } else { - oop result_object = (oop) result.get_jobject(); - if (result_object != NULL) { - oop failure_message = HotSpotCompilationRequestResult::failureMessage(result_object); - if (failure_message != NULL) { - // Copy failure reason into resource memory first ... - const char* failure_reason = java_lang_String::as_utf8_string(failure_message); - // ... and then into the C heap. - failure_reason = os::strdup(failure_reason, mtCompiler); - bool retryable = HotSpotCompilationRequestResult::retry(result_object) != 0; - env->set_failure(retryable, failure_reason, true); - } else { - if (env->task()->code() == NULL) { - env->set_failure(true, "no nmethod produced"); - } else { - env->task()->set_num_inlined_bytecodes(HotSpotCompilationRequestResult::inlinedBytecodes(result_object)); - Atomic::inc(&_methods_compiled); - } - } - } else { - assert(false, "JVMCICompiler.compileMethod should always return non-null"); - } - } - if (_bootstrapping) { - _bootstrap_compilation_request_handled = true; - } -} - -CompLevel JVMCIRuntime::adjust_comp_level(const methodHandle& method, bool is_osr, CompLevel level, JavaThread* thread) { - if (!thread->adjusting_comp_level()) { - thread->set_adjusting_comp_level(true); - level = adjust_comp_level_inner(method, is_osr, level, thread); - thread->set_adjusting_comp_level(false); - } - return level; -} - -void JVMCICompiler::exit_on_pending_exception(oop exception, const char* message) { - JavaThread* THREAD = JavaThread::current(); - CLEAR_PENDING_EXCEPTION; - - static volatile int report_error = 0; - if (!report_error && Atomic::cmpxchg(1, &report_error, 0) == 0) { - // Only report an error once - tty->print_raw_cr(message); - Handle ex(THREAD, exception); - java_lang_Throwable::java_printStackTrace(ex, THREAD); - } else { - // Allow error reporting thread to print the stack trace. Windows - // doesn't allow uninterruptible wait for JavaThreads - const bool interruptible = true; - os::sleep(THREAD, 200, interruptible); - } - - before_exit(THREAD); - vm_exit(-1); + JVMCI::compiler_runtime()->bootstrap_finished(CHECK); } // Compilation entry point for methods