Mercurial > hg > truffle
diff src/share/vm/graal/graalRuntime.cpp @ 15603:b7fb36e57da8
made Graal initialization be driven from Java to simplify sequencing and synchronization
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 12 May 2014 23:27:07 +0200 |
parents | ddb3ef30fcd2 |
children | fe608a56e3f7 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalRuntime.cpp Mon May 12 22:37:26 2014 +0200 +++ b/src/share/vm/graal/graalRuntime.cpp Mon May 12 23:27:07 2014 +0200 @@ -37,97 +37,30 @@ #include "utilities/debug.hpp" address GraalRuntime::_external_deopt_i2c_entry = NULL; -volatile GraalRuntime::State GraalRuntime::_state = uninitialized; -Thread* GraalRuntime::_initializingThread = NULL; -bool GraalRuntime::should_perform_init() { - JavaThread* THREAD = JavaThread::current(); - if (_state != initialized) { - if (THREAD == _initializingThread) { - return false; - } - MutexLocker locker(GraalInitialization_lock); - if (_state == uninitialized) { - _state = initializing; - _initializingThread = THREAD; - return true; - } else { - while (_state == initializing) { - GraalInitialization_lock->wait(); - } - } - } - return false; -} - -void GraalRuntime::initialize() { - if (!should_perform_init()) { - return; - } - +void GraalRuntime::initialize_natives(JNIEnv *env, jclass c2vmClass) { uintptr_t heap_end = (uintptr_t) Universe::heap()->reserved_region().end(); uintptr_t allocation_end = heap_end + ((uintptr_t)16) * 1024 * 1024 * 1024; AMD64_ONLY(guarantee(heap_end < allocation_end, "heap end too close to end of address space (might lead to erroneous TLAB allocations)")); NOT_LP64(error("check TLAB allocation code for address space conflicts")); JavaThread* THREAD = JavaThread::current(); - ThreadToNativeFromVM trans(THREAD); - TRACE_graal_1("GraalRuntime::initialize"); - - JNIEnv *env = ((JavaThread *) Thread::current())->jni_environment(); - jclass klass = env->FindClass("com/oracle/graal/hotspot/bridge/CompilerToVMImpl"); - if (klass == NULL) { - tty->print_cr("graal CompilerToVMImpl class not found"); - vm_abort(false); - } - env->RegisterNatives(klass, CompilerToVM_methods, CompilerToVM_methods_count()); - - ResourceMark rm; - HandleMark hm; { - GRAAL_VM_ENTRY_MARK; - check_pending_exception("Could not register natives"); - } + ThreadToNativeFromVM trans(THREAD); - graal_compute_offsets(); - - // Ensure _non_oop_bits is initialized - Universe::non_oop_word(); - - { - GRAAL_VM_ENTRY_MARK; + ResourceMark rm; HandleMark hm; - VMToCompiler::initOptions(); - for (int i = 0; i < Arguments::num_graal_args(); ++i) { - const char* arg = Arguments::graal_args_array()[i]; - Handle option = java_lang_String::create_from_str(arg, THREAD); - jboolean result = VMToCompiler::setOption(option); - if (!result) { - tty->print_cr("Invalid option for graal: -G:%s", arg); - vm_abort(false); - } - } - VMToCompiler::finalizeOptions(CITime || CITimeEach); + + graal_compute_offsets(); _external_deopt_i2c_entry = create_external_deopt_i2c(); - VMToCompiler::startRuntime(); - - { - MutexLocker locker(GraalInitialization_lock); - _state = initialized; - _initializingThread = NULL; - } + // Ensure _non_oop_bits is initialized + Universe::non_oop_word(); -#if !defined(PRODUCT) && !defined(COMPILERGRAAL) - // In COMPILERGRAAL, we want to allow GraalBootstrap - // to happen first so GraalCompiler::initialize() - // duplicates the following code. - if (CompileTheWorld) { - VMToCompiler::compileTheWorld(); - } -#endif + env->RegisterNatives(c2vmClass, CompilerToVM_methods, CompilerToVM_methods_count()); } + check_pending_exception("Could not register natives"); } BufferBlob* GraalRuntime::initialize_buffer_blob() { @@ -703,14 +636,32 @@ } JRT_END -// JVM_InitializeGraalRuntime -JVM_ENTRY(jobject, JVM_InitializeGraalRuntime(JNIEnv *env, jclass graalclass)) - GraalRuntime::initialize(); +// private static GraalRuntime Graal.initializeRuntime() +JVM_ENTRY(jobject, JVM_GetGraalRuntime(JNIEnv *env, jclass c)) return VMToCompiler::get_HotSpotGraalRuntime_jobject(); JVM_END -// JVM_InitializeTruffleRuntime -JVM_ENTRY(jobject, JVM_InitializeTruffleRuntime(JNIEnv *env, jclass graalclass)) - GraalRuntime::initialize(); +// private static TruffleRuntime Truffle.createRuntime() +JVM_ENTRY(jobject, JVM_CreateTruffleRuntime(JNIEnv *env, jclass c)) return JNIHandles::make_local(VMToCompiler::create_HotSpotTruffleRuntime()()); JVM_END + +// private static void HotSpotGraalRuntime.init(Class compilerToVMClass) +JVM_ENTRY(void, JVM_InitializeGraalNatives(JNIEnv *env, jclass c, jclass c2vmClass)) + GraalRuntime::initialize_natives(env, c2vmClass); +JVM_END + +// private static String[] HotSpotOptions.getVMOptions(boolean[] timeCompilations) +JVM_ENTRY(jobject, JVM_GetGraalOptions(JNIEnv *env, jclass c, jobject timeCompilations)) + HandleMark hm; + int numOptions = Arguments::num_graal_args(); + objArrayOop options = oopFactory::new_objArray(SystemDictionary::String_klass(), + numOptions, CHECK_NULL); + objArrayHandle optionsHandle(THREAD, options); + for (int i = 0; i < numOptions; i++) { + Handle option = java_lang_String::create_from_str(Arguments::graal_args_array()[i], CHECK_NULL); + optionsHandle->obj_at_put(i, option()); + } + ((typeArrayOop) JNIHandles::resolve(timeCompilations))->bool_at_put(0, CITime || CITimeEach); + return JNIHandles::make_local(THREAD, optionsHandle()); +JVM_END