changeset 5150:fdd9dd4508fa

some GC fixes avoid non-Java bytecodes in code() array passed to Graal
author Christian Haeubl <christian.haeubl@oracle.com>
date Thu, 22 Mar 2012 18:54:02 -0700
parents c5eaee66bfa1
children 5717fc2be01c
files graal/com.oracle.graal.java/src/com/oracle/graal/java/bytecode/BytecodeStream.java graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiResolvedMethod.java src/share/vm/graal/graalCompiler.cpp src/share/vm/graal/graalCompilerToVM.cpp src/share/vm/oops/klassKlass.cpp src/share/vm/oops/methodDataOop.cpp src/share/vm/oops/methodKlass.cpp
diffstat 7 files changed, 54 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/bytecode/BytecodeStream.java	Wed Mar 21 16:33:58 2012 -0700
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/bytecode/BytecodeStream.java	Thu Mar 22 18:54:02 2012 -0700
@@ -183,6 +183,7 @@
         curBCI = bci;
         if (curBCI < code.length) {
             opcode = Bytes.beU1(code, bci);
+            assert opcode < Bytecodes.BREAKPOINT : "illegal bytecode";
             nextBCI = bci + lengthOf();
         } else {
             opcode = Bytecodes.END;
--- a/graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiResolvedMethod.java	Wed Mar 21 16:33:58 2012 -0700
+++ b/graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiResolvedMethod.java	Thu Mar 22 18:54:02 2012 -0700
@@ -38,6 +38,7 @@
 
     /**
      * Gets the bytecode of the method, if the method {@linkplain #isResolved()} and has code.
+     * The returned byte array does not contain breakpoints or non-Java bytecodes.
      * @return the bytecode of the method or {@code null} if none is available
      */
     byte[] code();
--- a/src/share/vm/graal/graalCompiler.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/graal/graalCompiler.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -31,6 +31,7 @@
 #include "c1/c1_Runtime1.hpp"
 #include "compiler/compilerOracle.hpp"
 #include "runtime/arguments.hpp"
+#include "runtime/compilationPolicy.hpp"
 
 GraalCompiler* GraalCompiler::_instance = NULL;
 
@@ -168,6 +169,7 @@
   JavaThread::current()->set_env(current_env);
   if (success != JNI_TRUE) {
     method->clear_queued_for_compilation();
+    CompilationPolicy::policy()->delay_compilation(method());
   }
 }
 
@@ -297,7 +299,6 @@
     assert(method->graal_mirror()->is_a(HotSpotMethodResolved::klass()), "unexpected class...");
     return method->graal_mirror();
   }
-
   Handle name = VmIds::toString<Handle>(method->name(), CHECK_NULL);
 
   instanceKlass::cast(HotSpotMethodResolved::klass())->initialize(CHECK_NULL);
--- a/src/share/vm/graal/graalCompilerToVM.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/graal/graalCompilerToVM.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -52,9 +52,32 @@
 JNIEXPORT jbyteArray JNICALL Java_com_oracle_graal_hotspot_bridge_CompilerToVMImpl_RiMethod_1code(JNIEnv *env, jobject, jobject hotspot_method) {
   TRACE_graal_3("CompilerToVM::RiMethod_code");
   methodHandle method = getMethodFromHotSpotMethod(hotspot_method);
+  
+  // copy all bytecodes
   int code_size = method->code_size();
   jbyteArray result = env->NewByteArray(code_size);
   env->SetByteArrayRegion(result, 0, code_size, (const jbyte *) method->code_base());
+  
+  // iterate over all bytecodes and replace non-Java bytecodes
+  if (RewriteBytecodes || RewriteFrequentPairs) {
+    BytecodeStream s(method);
+    while(!s.is_last_bytecode()) {
+      jbyte code = s.next();
+      env->SetByteArrayRegion(result, s.bci(), 1, &code);
+    }
+  }
+
+  // replace all breakpoints
+  if (method->number_of_breakpoints() > 0) {
+    BreakpointInfo* bp = instanceKlass::cast(method->method_holder())->breakpoints();
+    for (; bp != NULL; bp = bp->next()) {
+      if (bp->match(method())) {
+        jbyte code = bp->orig_bytecode();
+        env->SetByteArrayRegion(result, bp->bci(), 1, &code);
+      }
+    }
+  }
+
   return result;
 }
 
--- a/src/share/vm/oops/klassKlass.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/oops/klassKlass.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -201,6 +201,11 @@
   if (PSScavenge::should_scavenge(p)) {
     pm->claim_or_forward_depth(p);
   }
+
+  p = k->adr_graal_mirror();
+  if (PSScavenge::should_scavenge(p)) {
+    pm->claim_or_forward_depth(p);
+  }
 }
 
 int klassKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
--- a/src/share/vm/oops/methodDataOop.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/oops/methodDataOop.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -762,7 +762,7 @@
   // Set the method back-pointer.
   _method = method();
 #ifdef GRAAL
-  _graal_mirror = NULL;
+  set_graal_mirror(NULL);
 #endif
 
   if (TieredCompilation) {
--- a/src/share/vm/oops/methodKlass.cpp	Wed Mar 21 16:33:58 2012 -0700
+++ b/src/share/vm/oops/methodKlass.cpp	Thu Mar 22 18:54:02 2012 -0700
@@ -38,6 +38,10 @@
 #include "oops/oop.inline2.hpp"
 #include "oops/symbol.hpp"
 #include "runtime/handles.inline.hpp"
+#ifndef SERIALGC
+#include "gc_implementation/parallelScavenge/psScavenge.inline.hpp"
+#include "oops/oop.pcgc.inline.hpp"
+#endif
 
 klassOop methodKlass::create_klass(TRAPS) {
   methodKlass o;
@@ -134,9 +138,7 @@
 #ifdef GRAAL
   MarkSweep::mark_and_push(m->adr_graal_mirror());
 #endif
-  if (m->method_data() != NULL) {
-    MarkSweep::mark_and_push(m->adr_method_data());
-  }
+  MarkSweep::mark_and_push(m->adr_method_data());
 }
 
 #ifndef SERIALGC
@@ -151,11 +153,7 @@
 #ifdef GRAAL
   PSParallelCompact::mark_and_push(cm, m->adr_graal_mirror());
 #endif
-#ifdef COMPILER2
-  if (m->method_data() != NULL) {
-    PSParallelCompact::mark_and_push(cm, m->adr_method_data());
-  }
-#endif
+  PSParallelCompact::mark_and_push(cm, m->adr_method_data());
 }
 #endif // SERIALGC
 
@@ -172,9 +170,8 @@
 #ifdef GRAAL
   blk->do_oop(m->adr_graal_mirror());
 #endif
-  if (m->method_data() != NULL) {
-    blk->do_oop(m->adr_method_data());
-  }
+  blk->do_oop(m->adr_method_data());
+
   return size;
 }
 
@@ -196,10 +193,9 @@
   adr = m->adr_graal_mirror();
   if (mr.contains(adr)) blk->do_oop(adr);
 #endif
-  if (m->method_data() != NULL) {
-    adr = m->adr_method_data();
-    if (mr.contains(adr)) blk->do_oop(adr);
-  }
+  adr = m->adr_method_data();
+  if (mr.contains(adr)) blk->do_oop(adr);
+
   return size;
 }
 
@@ -217,15 +213,21 @@
 #ifdef GRAAL
   MarkSweep::adjust_pointer(m->adr_graal_mirror());
 #endif
-  if (m->method_data() != NULL) {
-    MarkSweep::adjust_pointer(m->adr_method_data());
-  }
+  MarkSweep::adjust_pointer(m->adr_method_data());
+
   return size;
 }
 
 #ifndef SERIALGC
 void methodKlass::oop_push_contents(PSPromotionManager* pm, oop obj) {
   assert(obj->is_method(), "should be method");
+  methodOop m = methodOop(obj);
+#ifdef GRAAL
+  oop* adr = m->adr_graal_mirror();
+  if(PSScavenge::should_scavenge(adr)) {
+    pm->claim_or_forward_depth(adr);
+  }
+#endif
 }
 
 int methodKlass::oop_update_pointers(ParCompactionManager* cm, oop obj) {
@@ -236,11 +238,7 @@
 #ifdef GRAAL
   PSParallelCompact::adjust_pointer(m->adr_graal_mirror());
 #endif
-#ifdef COMPILER2
-  if (m->method_data() != NULL) {
-    PSParallelCompact::adjust_pointer(m->adr_method_data());
-  }
-#endif // COMPILER2
+  PSParallelCompact::adjust_pointer(m->adr_method_data());
   return m->object_size();
 }
 #endif // SERIALGC