# HG changeset patch # User Christian Haeubl # Date 1332467642 25200 # Node ID fdd9dd4508fae81d4ac860f9a388fb705a045274 # Parent c5eaee66bfa12ee745032ca5a937551e339c0e19 some GC fixes avoid non-Java bytecodes in code() array passed to Graal diff -r c5eaee66bfa1 -r fdd9dd4508fa graal/com.oracle.graal.java/src/com/oracle/graal/java/bytecode/BytecodeStream.java --- 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; diff -r c5eaee66bfa1 -r fdd9dd4508fa graal/com.oracle.max.cri/src/com/oracle/max/cri/ri/RiResolvedMethod.java --- 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(); diff -r c5eaee66bfa1 -r fdd9dd4508fa src/share/vm/graal/graalCompiler.cpp --- 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(method->name(), CHECK_NULL); instanceKlass::cast(HotSpotMethodResolved::klass())->initialize(CHECK_NULL); diff -r c5eaee66bfa1 -r fdd9dd4508fa src/share/vm/graal/graalCompilerToVM.cpp --- 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; } diff -r c5eaee66bfa1 -r fdd9dd4508fa src/share/vm/oops/klassKlass.cpp --- 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) { diff -r c5eaee66bfa1 -r fdd9dd4508fa src/share/vm/oops/methodDataOop.cpp --- 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) { diff -r c5eaee66bfa1 -r fdd9dd4508fa src/share/vm/oops/methodKlass.cpp --- 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