diff src/share/vm/graal/graalCompiler.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 9c66a589ef63
children b7fb36e57da8
line wrap: on
line diff
--- a/src/share/vm/graal/graalCompiler.cpp	Fri May 09 17:59:15 2014 +0200
+++ b/src/share/vm/graal/graalCompiler.cpp	Fri May 09 18:46:41 2014 +0200
@@ -25,39 +25,35 @@
 #include "memory/oopFactory.hpp"
 #include "runtime/javaCalls.hpp"
 #include "graal/graalCompiler.hpp"
-#include "graal/graalJavaAccess.hpp"
 #include "graal/graalVMToCompiler.hpp"
-#include "graal/graalCompilerToVM.hpp"
 #include "graal/graalEnv.hpp"
 #include "graal/graalRuntime.hpp"
-#include "runtime/arguments.hpp"
 #include "runtime/compilationPolicy.hpp"
 #include "runtime/globals_extension.hpp"
 
 GraalCompiler* GraalCompiler::_instance = NULL;
 
 GraalCompiler::GraalCompiler() : AbstractCompiler(graal) {
-  _initialized = false;
+#ifdef COMPILERGRAAL
+  _started = false;
+#endif
   assert(_instance == NULL, "only one instance allowed");
   _instance = this;
 }
 
 // Initialization
 void GraalCompiler::initialize() {
-  if (!should_perform_init()) {
+#ifdef COMPILERGRAAL
+  if (!UseCompiler || !should_perform_init()) {
     return;
   }
 
-  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"));
+  GraalRuntime::initialize();
 
-  BufferBlob* buffer_blob = initialize_buffer_blob();
-#ifdef COMPILERGRAAL
+  BufferBlob* buffer_blob = GraalRuntime::initialize_buffer_blob();
   if (!UseGraalCompilationQueue) {
     // This path is used for initialization both by the native queue and the graal queue
-    // but set_state acquired a lock which might not be safe during JVM_CreateJavaVM, so
+    // but set_state acquires a lock which might not be safe during JVM_CreateJavaVM, so
     // only update the state flag for the native queue.
     if (buffer_blob == NULL) {
       set_state(failed);
@@ -65,144 +61,61 @@
       set_state(initialized);
     }
   }
-#endif
-
-  ThreadToNativeFromVM trans(JavaThread::current());
-  JavaThread* THREAD = JavaThread::current();
-  TRACE_graal_1("GraalCompiler::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");
-  }
-
-  graal_compute_offsets();
-
-  // Ensure _non_oop_bits is initialized
-  Universe::non_oop_word();
 
   {
-    GRAAL_VM_ENTRY_MARK;
     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);
 
-    if (UseCompiler) {
-      _external_deopt_i2c_entry = create_external_deopt_i2c();
-#ifdef COMPILERGRAAL
-      bool bootstrap = UseGraalCompilationQueue && (FLAG_IS_DEFAULT(BootstrapGraal) ? !TieredCompilation : BootstrapGraal);
-#else
-      bool bootstrap = false;
+    bool bootstrap = UseGraalCompilationQueue && (FLAG_IS_DEFAULT(BootstrapGraal) ? !TieredCompilation : BootstrapGraal);
+    VMToCompiler::startCompiler(bootstrap);
+    _started = true;
+    CompilationPolicy::completed_vm_startup();
+    if (bootstrap) {
+      // Avoid -Xcomp and -Xbatch problems by turning on interpreter and background compilation for bootstrapping.
+      FlagSetting a(UseInterpreter, true);
+      FlagSetting b(BackgroundCompilation, true);
+#ifndef PRODUCT
+      // Turn off CompileTheWorld during bootstrap so that a counter overflow event
+      // triggers further compilation (see NonTieredCompPolicy::event()) hence
+      // allowing a complete bootstrap
+      FlagSetting c(CompileTheWorld, false);
 #endif
-      VMToCompiler::startCompiler(bootstrap);
-      _initialized = true;
-      CompilationPolicy::completed_vm_startup();
-      if (bootstrap) {
-        // Avoid -Xcomp and -Xbatch problems by turning on interpreter and background compilation for bootstrapping.
-        FlagSetting a(UseInterpreter, true);
-        FlagSetting b(BackgroundCompilation, true);
-#ifndef PRODUCT
-        // Turn off CompileTheWorld during bootstrap so that a counter overflow event
-        // triggers further compilation (see NonTieredCompPolicy::event()) hence
-        // allowing a complete bootstrap
-        FlagSetting c(CompileTheWorld, false);
-#endif
-        VMToCompiler::bootstrap();
-      }
+      VMToCompiler::bootstrap();
+    }
 
 #ifndef PRODUCT
-      if (CompileTheWorld) {
-        // We turn off CompileTheWorld so that Graal can
-        // be compiled by C1/C2 when Graal does a CTW.
-        CompileTheWorld = false;
-        VMToCompiler::compileTheWorld();
-      }
+    if (CompileTheWorld) {
+      VMToCompiler::compileTheWorld();
+    }
 #endif
-    }
   }
+#endif // COMPILERGRAAL
 }
 
-address GraalCompiler::create_external_deopt_i2c() {
-  ResourceMark rm;
-  BufferBlob* buffer = BufferBlob::create("externalDeopt", 1*K);
-  CodeBuffer cb(buffer);
-  short buffer_locs[20];
-  cb.insts()->initialize_shared_locs((relocInfo*)buffer_locs, sizeof(buffer_locs)/sizeof(relocInfo));
-  MacroAssembler masm(&cb);
-
-  int total_args_passed = 5;
-
-  BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed);
-  VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed);
-  int i = 0;
-  sig_bt[i++] = T_INT;
-  sig_bt[i++] = T_LONG;
-  sig_bt[i++] = T_VOID; // long stakes 2 slots
-  sig_bt[i++] = T_INT;
-  sig_bt[i++] = T_OBJECT;
-
-  int comp_args_on_stack = SharedRuntime::java_calling_convention(sig_bt, regs, total_args_passed, false);
-
-  SharedRuntime::gen_i2c_adapter(&masm, total_args_passed, comp_args_on_stack, sig_bt, regs);
-  masm.flush();
-
-  return AdapterBlob::create(&cb)->content_begin();
-}
-
-
-BufferBlob* GraalCompiler::initialize_buffer_blob() {
-  JavaThread* THREAD = JavaThread::current();
-  BufferBlob* buffer_blob = THREAD->get_buffer_blob();
-  if (buffer_blob == NULL) {
-    buffer_blob = BufferBlob::create("Graal thread-local CodeBuffer", GraalNMethodSizeLimit);
-    if (buffer_blob != NULL) {
-      THREAD->set_buffer_blob(buffer_blob);
-    }
-  }
-  return buffer_blob;
-}
-
+#ifdef COMPILERGRAAL
 void GraalCompiler::compile_method(methodHandle method, int entry_bci, CompileTask* task, jboolean blocking) {
   GRAAL_EXCEPTION_CONTEXT
-  if (!_initialized) {
+  if (!_started) {
     CompilationPolicy::policy()->delay_compilation(method());
     return;
   }
 
-  assert(_initialized, "must already be initialized");
+  assert(_started, "must already be started");
   ResourceMark rm;
   thread->set_is_graal_compiling(true);
   VMToCompiler::compileMethod(method(), entry_bci, (jlong) (address) task, blocking);
   thread->set_is_graal_compiling(false);
 }
 
+
 // Compilation entry point for methods
 void GraalCompiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci) {
   ShouldNotReachHere();
 }
 
-void GraalCompiler::exit() {
-  if (_initialized) {
+void GraalCompiler::shutdown() {
+  if (_started) {
     VMToCompiler::shutdownCompiler();
+    _started = false;
   }
 }
 
@@ -211,22 +124,4 @@
   TRACE_graal_1("GraalCompiler::print_timers");
 }
 
-BasicType GraalCompiler::kindToBasicType(jchar ch) {
-  switch(ch) {
-    case 'z': return T_BOOLEAN;
-    case 'b': return T_BYTE;
-    case 's': return T_SHORT;
-    case 'c': return T_CHAR;
-    case 'i': return T_INT;
-    case 'f': return T_FLOAT;
-    case 'j': return T_LONG;
-    case 'd': return T_DOUBLE;
-    case 'a': return T_OBJECT;
-    case 'r': return T_ADDRESS;
-    case '-': return T_ILLEGAL;
-    default:
-      fatal(err_msg("unexpected Kind: %c", ch));
-      break;
-  }
-  return T_ILLEGAL;
-}
+#endif // COMPILERGRAAL