Mercurial > hg > graal-compiler
diff src/share/vm/graal/graalVMToCompiler.cpp @ 15582:063ec2920d21
made Graal runtime initialization in hosted mode lazy
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Fri, 09 May 2014 18:46:41 +0200 |
parents | a20be10ad437 |
children | fe608a56e3f7 |
line wrap: on
line diff
--- a/src/share/vm/graal/graalVMToCompiler.cpp Fri May 09 17:59:15 2014 +0200 +++ b/src/share/vm/graal/graalVMToCompiler.cpp Fri May 09 18:46:41 2014 +0200 @@ -26,10 +26,10 @@ #include "graal/graalVMToCompiler.hpp" #include "runtime/gpu.hpp" -// this is a *global* handle -jobject VMToCompiler::_graalRuntimePermObject = NULL; -jobject VMToCompiler::_vmToCompilerPermObject = NULL; -Klass* VMToCompiler::_vmToCompilerPermKlass = NULL; +// these are *global* handles +jobject VMToCompiler::_HotSpotGraalRuntime_instance = NULL; +jobject VMToCompiler::_VMToCompiler_instance = NULL; +Klass* VMToCompiler::_VMToCompiler_klass = NULL; static Klass* loadClass(Symbol* name) { Klass* klass = SystemDictionary::resolve_or_null(name, SystemDictionary::java_system_loader(), Handle(), Thread::current()); @@ -40,135 +40,184 @@ return klass; } -KlassHandle VMToCompiler::vmToCompilerKlass() { - if (_vmToCompilerPermKlass == NULL) { - Klass* result = loadClass(vmSymbols::com_oracle_graal_hotspot_bridge_VMToCompiler()); - _vmToCompilerPermKlass = result; +KlassHandle VMToCompiler::VMToCompiler_klass() { + if (_VMToCompiler_klass == NULL) { + TempNewSymbol VMToCompiler = SymbolTable::new_symbol("com/oracle/graal/hotspot/bridge/VMToCompiler", Thread::current()); + Klass* result = loadClass(VMToCompiler); + _VMToCompiler_klass = result; } - return _vmToCompilerPermKlass; + return _VMToCompiler_klass; } -Handle VMToCompiler::truffleRuntime() { - Symbol* name = vmSymbols::com_oracle_graal_truffle_hotspot_HotSpotTruffleRuntime(); +Handle VMToCompiler::create_HotSpotTruffleRuntime() { + Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime", THREAD); KlassHandle klass = loadClass(name); + TempNewSymbol makeInstance = SymbolTable::new_symbol("makeInstance", THREAD); + TempNewSymbol sig = SymbolTable::new_symbol("()Lcom/oracle/graal/truffle/hotspot/HotSpotTruffleRuntime;", THREAD); JavaValue result(T_OBJECT); - JavaCalls::call_static(&result, klass, vmSymbols::makeInstance_name(), vmSymbols::makeInstance_signature(), Thread::current()); + JavaCalls::call_static(&result, klass, makeInstance, sig, THREAD); check_pending_exception("Couldn't initialize HotSpotTruffleRuntime"); return Handle((oop) result.get_jobject()); } -Handle VMToCompiler::graalRuntime() { - if (JNIHandles::resolve(_graalRuntimePermObject) == NULL) { - KlassHandle klass = loadClass(vmSymbols::com_oracle_graal_hotspot_HotSpotGraalRuntime()); +Handle VMToCompiler::get_HotSpotGraalRuntime() { + if (JNIHandles::resolve(_HotSpotGraalRuntime_instance) == NULL) { + Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/hotspot/HotSpotGraalRuntime", THREAD); + KlassHandle klass = loadClass(name); + TempNewSymbol runtime = SymbolTable::new_symbol("runtime", THREAD); + TempNewSymbol sig = SymbolTable::new_symbol("()Lcom/oracle/graal/hotspot/HotSpotGraalRuntime;", THREAD); JavaValue result(T_OBJECT); - JavaCalls::call_static(&result, klass, vmSymbols::runtime_name(), vmSymbols::runtime_signature(), Thread::current()); + JavaCalls::call_static(&result, klass, runtime, sig, THREAD); check_pending_exception("Couldn't initialize HotSpotGraalRuntime"); - _graalRuntimePermObject = JNIHandles::make_global((oop) result.get_jobject()); + _HotSpotGraalRuntime_instance = JNIHandles::make_global((oop) result.get_jobject()); } - return Handle(JNIHandles::resolve_non_null(_graalRuntimePermObject)); + return Handle(JNIHandles::resolve_non_null(_HotSpotGraalRuntime_instance)); } -Handle VMToCompiler::instance() { - if (JNIHandles::resolve(_vmToCompilerPermObject) == NULL) { - KlassHandle compilerKlass = loadClass(vmSymbols::com_oracle_graal_hotspot_HotSpotGraalRuntime()); - +Handle VMToCompiler::VMToCompiler_instance() { + if (JNIHandles::resolve(_VMToCompiler_instance) == NULL) { + Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/hotspot/HotSpotGraalRuntime", THREAD); + KlassHandle klass = loadClass(name); + TempNewSymbol getVMToCompiler = SymbolTable::new_symbol("getVMToCompiler", THREAD); + TempNewSymbol sig = SymbolTable::new_symbol("()Lcom/oracle/graal/hotspot/bridge/VMToCompiler;", THREAD); JavaValue result(T_OBJECT); JavaCallArguments args; - args.set_receiver(graalRuntime()); - JavaCalls::call_virtual(&result, compilerKlass, vmSymbols::getVMToCompiler_name(), vmSymbols::getVMToCompiler_signature(), &args, Thread::current()); + args.set_receiver(get_HotSpotGraalRuntime()); + JavaCalls::call_virtual(&result, klass, getVMToCompiler, sig, &args, THREAD); check_pending_exception("Couldn't get VMToCompiler"); - _vmToCompilerPermObject = JNIHandles::make_global((oop) result.get_jobject()); + _VMToCompiler_instance = JNIHandles::make_global((oop) result.get_jobject()); } - return Handle(JNIHandles::resolve_non_null(_vmToCompilerPermObject)); + return Handle(JNIHandles::resolve_non_null(_VMToCompiler_instance)); } void VMToCompiler::initOptions() { - KlassHandle optionsKlass = loadClass(vmSymbols::com_oracle_graal_hotspot_HotSpotOptions()); Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/hotspot/HotSpotOptions", THREAD); + KlassHandle optionsKlass = loadClass(name); optionsKlass->initialize(THREAD); check_pending_exception("Error while calling initOptions"); } jboolean VMToCompiler::setOption(Handle option) { assert(!option.is_null(), ""); - KlassHandle optionsKlass = loadClass(vmSymbols::com_oracle_graal_hotspot_HotSpotOptions()); - Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/hotspot/HotSpotOptions", THREAD); + TempNewSymbol setOption = SymbolTable::new_symbol("setOption", THREAD); + TempNewSymbol sig = SymbolTable::new_symbol("(Ljava/lang/String;)Z", THREAD); + KlassHandle optionsKlass = loadClass(name); JavaValue result(T_BOOLEAN); - JavaCalls::call_static(&result, optionsKlass, vmSymbols::setOption_name(), vmSymbols::setOption_signature(), option, THREAD); + JavaCalls::call_static(&result, optionsKlass, setOption, sig, option, THREAD); check_pending_exception("Error while calling setOption"); return result.get_jboolean(); } void VMToCompiler::finalizeOptions(jboolean ciTime) { - KlassHandle optionsKlass = loadClass(vmSymbols::com_oracle_graal_hotspot_HotSpotOptions()); Thread* THREAD = Thread::current(); + TempNewSymbol name = SymbolTable::new_symbol("com/oracle/graal/hotspot/HotSpotOptions", THREAD); + TempNewSymbol finalizeOptions = SymbolTable::new_symbol("finalizeOptions", THREAD); + TempNewSymbol sig = SymbolTable::new_symbol("(Ljava/lang/String;)Z", THREAD); + KlassHandle optionsKlass = loadClass(name); JavaValue result(T_VOID); JavaCallArguments args; args.push_int(ciTime); - JavaCalls::call_static(&result, optionsKlass, vmSymbols::finalizeOptions_name(), vmSymbols::bool_void_signature(), &args, THREAD); + JavaCalls::call_static(&result, optionsKlass, finalizeOptions, vmSymbols::bool_void_signature(), &args, THREAD); check_pending_exception("Error while calling finalizeOptions"); } +void VMToCompiler::startRuntime() { + JavaThread* THREAD = JavaThread::current(); + JavaValue result(T_VOID); + JavaCallArguments args; + TempNewSymbol startRuntime = SymbolTable::new_symbol("startRuntime", THREAD); + args.push_oop(VMToCompiler_instance()); + JavaCalls::call_interface(&result, VMToCompiler_klass(), startRuntime, vmSymbols::void_method_signature(), &args, THREAD); + check_pending_exception("Error while calling startRuntime"); +} + +#ifdef COMPILERGRAAL +void VMToCompiler::bootstrap() { + JavaThread* THREAD = JavaThread::current(); + JavaValue result(T_VOID); + JavaCallArguments args; + TempNewSymbol bootstrap = SymbolTable::new_symbol("bootstrap", THREAD); + args.push_oop(VMToCompiler_instance()); + JavaCalls::call_interface(&result, VMToCompiler_klass(), bootstrap, vmSymbols::void_method_signature(), &args, THREAD); + check_pending_exception("Error while calling bootstrap"); +} + +void VMToCompiler::startCompiler(jboolean bootstrap_enabled) { + JavaThread* THREAD = JavaThread::current(); + JavaValue result(T_VOID); + JavaCallArguments args; + TempNewSymbol startCompiler = SymbolTable::new_symbol("startCompiler", THREAD); + args.push_oop(VMToCompiler_instance()); + args.push_int(bootstrap_enabled); + JavaCalls::call_interface(&result, VMToCompiler_klass(), startCompiler, vmSymbols::bool_void_signature(), &args, THREAD); + check_pending_exception("Error while calling startCompiler"); +} + void VMToCompiler::compileMethod(Method* method, int entry_bci, jlong ctask, jboolean blocking) { assert(method != NULL, "just checking"); Thread* THREAD = Thread::current(); JavaValue result(T_VOID); JavaCallArguments args; - args.push_oop(instance()); + args.push_oop(VMToCompiler_instance()); args.push_long((jlong) (address) method); args.push_int(entry_bci); args.push_long(ctask); args.push_int(blocking); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::compileMethod_name(), vmSymbols::compileMethod_signature(), &args, THREAD); + JavaCalls::call_interface(&result, VMToCompiler_klass(), vmSymbols::compileMethod_name(), vmSymbols::compileMethod_signature(), &args, THREAD); check_pending_exception("Error while calling compileMethod"); } void VMToCompiler::shutdownCompiler() { - if (_graalRuntimePermObject != NULL) { - HandleMark hm; + JavaThread* THREAD = JavaThread::current(); + HandleMark hm(THREAD); + TempNewSymbol shutdownCompiler = SymbolTable::new_symbol("shutdownCompiler", THREAD); + JavaValue result(T_VOID); + JavaCallArguments args; + args.push_oop(VMToCompiler_instance()); + JavaCalls::call_interface(&result, VMToCompiler_klass(), shutdownCompiler, vmSymbols::void_method_signature(), &args, THREAD); + check_pending_exception("Error while calling shutdownCompiler"); +} +#endif // COMPILERGRAAL + +void VMToCompiler::shutdownRuntime() { + if (_HotSpotGraalRuntime_instance != NULL) { JavaThread* THREAD = JavaThread::current(); + HandleMark hm(THREAD); + TempNewSymbol shutdownRuntime = SymbolTable::new_symbol("shutdownRuntime", THREAD); JavaValue result(T_VOID); JavaCallArguments args; - args.push_oop(instance()); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::shutdownCompiler_name(), vmSymbols::void_method_signature(), &args, THREAD); - check_pending_exception("Error while calling shutdownCompiler"); + args.push_oop(VMToCompiler_instance()); + JavaCalls::call_interface(&result, VMToCompiler_klass(), shutdownRuntime, vmSymbols::void_method_signature(), &args, THREAD); + check_pending_exception("Error while calling shutdownRuntime"); - JNIHandles::destroy_global(_graalRuntimePermObject); - JNIHandles::destroy_global(_vmToCompilerPermObject); - //JNIHandles::destroy_global(_vmToCompilerPermKlass); + JNIHandles::destroy_global(_HotSpotGraalRuntime_instance); + JNIHandles::destroy_global(_VMToCompiler_instance); - _graalRuntimePermObject = NULL; - _vmToCompilerPermObject = NULL; - _vmToCompilerPermKlass = NULL; + _HotSpotGraalRuntime_instance = NULL; + _VMToCompiler_instance = NULL; + _VMToCompiler_klass = NULL; } } -void VMToCompiler::startCompiler(jboolean bootstrap_enabled) { +#ifndef PRODUCT +void VMToCompiler::compileTheWorld() { + // We turn off CompileTheWorld so that Graal can + // be compiled by C1/C2 when Graal does a CTW. + CompileTheWorld = false; + JavaThread* THREAD = JavaThread::current(); - JavaValue result(T_VOID); - JavaCallArguments args; - args.push_oop(instance()); - args.push_int(bootstrap_enabled); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::startCompiler_name(), vmSymbols::bool_void_signature(), &args, THREAD); - check_pending_exception("Error while calling startCompiler"); -} - -void VMToCompiler::bootstrap() { - JavaThread* THREAD = JavaThread::current(); + TempNewSymbol compileTheWorld = SymbolTable::new_symbol("compileTheWorld", THREAD); JavaValue result(T_VOID); JavaCallArguments args; - args.push_oop(instance()); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::bootstrap_name(), vmSymbols::void_method_signature(), &args, THREAD); - check_pending_exception("Error while calling bootstrap"); -} - -void VMToCompiler::compileTheWorld() { - JavaThread* THREAD = JavaThread::current(); - JavaValue result(T_VOID); - JavaCallArguments args; - args.push_oop(instance()); - JavaCalls::call_interface(&result, vmToCompilerKlass(), vmSymbols::compileTheWorld_name(), vmSymbols::void_method_signature(), &args, THREAD); + args.push_oop(VMToCompiler_instance()); + JavaCalls::call_interface(&result, VMToCompiler_klass(), compileTheWorld, vmSymbols::void_method_signature(), &args, THREAD); check_pending_exception("Error while calling compileTheWorld"); } +#endif