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