comparison src/share/vm/graal/graalCompilerToVM.cpp @ 11513:8d4e5e08d83f

Fix graalCompilerToVM::initializeBytecode regarding bytecode rewritting for methods that are not rewritten. Use the BytecodeStream in a way that does not require pre-processing for breakpoints
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 03 Sep 2013 14:14:09 +0200
parents 001c41b01d13
children a3b39ab7c453
comparison
equal deleted inserted replaced
11512:38acec26d535 11513:8d4e5e08d83f
62 C2V_ENTRY(jbyteArray, initializeBytecode, (JNIEnv *env, jobject, jlong metaspace_method, jbyteArray result)) 62 C2V_ENTRY(jbyteArray, initializeBytecode, (JNIEnv *env, jobject, jlong metaspace_method, jbyteArray result))
63 methodHandle method = asMethod(metaspace_method); 63 methodHandle method = asMethod(metaspace_method);
64 ResourceMark rm; 64 ResourceMark rm;
65 65
66 int code_size = method->code_size(); 66 int code_size = method->code_size();
67 jbyte* reconstituted_code = NULL; 67 jbyte* reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
68 68
69 // replace all breakpoints - must be done before undoing any rewriting 69 bool is_rewritten = method->method_holder()->is_rewritten();
70 if (method->number_of_breakpoints() > 0) {
71 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size);
72 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size);
73 BreakpointInfo* bp = InstanceKlass::cast(method->method_holder())->breakpoints();
74 for (; bp != NULL; bp = bp->next()) {
75 if (bp->match(method())) {
76 jbyte code = bp->orig_bytecode();
77 reconstituted_code[bp->bci()] = code;
78 }
79 }
80 }
81
82 // iterate over all bytecodes and replace non-Java bytecodes 70 // iterate over all bytecodes and replace non-Java bytecodes
83 if (RewriteBytecodes || RewriteFrequentPairs || InstanceKlass::cast(method->method_holder())->is_rewritten()) { 71
84 if (reconstituted_code == NULL) { 72 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) {
85 reconstituted_code = NEW_RESOURCE_ARRAY(jbyte, code_size); 73 Bytecodes::Code code = s.code();
86 memcpy(reconstituted_code, (jbyte *) method->code_base(), code_size); 74 Bytecodes::Code raw_code = s.raw_code();
87 } 75 int bci = s.bci();
88 76 int len = s.instruction_size();
89 for (BytecodeStream s(method); s.next() != Bytecodes::_illegal; ) { 77
90 Bytecodes::Code code = s.code(); 78 // Restore original byte code.
91 Bytecodes::Code raw_code = s.raw_code(); 79 reconstituted_code[bci] = (jbyte) (s.is_wide()? Bytecodes::_wide : code);
92 int bci = s.bci(); 80 if (len > 1) {
93 81 memcpy(&reconstituted_code[bci+1], s.bcp()+1, len-1);
94 // Restore original byte code. The Bytecodes::is_java_code check 82 }
95 // also avoids overwriting wide bytecodes. 83
96 if (!Bytecodes::is_java_code(raw_code)) { 84 if (is_rewritten && len > 1) {
97 reconstituted_code[bci] = (jbyte) code;
98 }
99
100 // Restore the big-endian constant pool indexes. 85 // Restore the big-endian constant pool indexes.
101 // Cf. Rewriter::scan_method 86 // Cf. Rewriter::scan_method
102 switch (code) { 87 switch (code) {
103 case Bytecodes::_getstatic: 88 case Bytecodes::_getstatic:
104 case Bytecodes::_putstatic: 89 case Bytecodes::_putstatic:
139 } 124 }
140 } 125 }
141 } 126 }
142 } 127 }
143 128
144 if (reconstituted_code == NULL) { 129 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code);
145 env->SetByteArrayRegion(result, 0, code_size, (jbyte *) method->code_base());
146 } else {
147 env->SetByteArrayRegion(result, 0, code_size, reconstituted_code);
148 }
149 130
150 return result; 131 return result;
151 C2V_END 132 C2V_END
152 133
153 C2V_VMENTRY(jstring, getSignature, (JNIEnv *env, jobject, jlong metaspace_method)) 134 C2V_VMENTRY(jstring, getSignature, (JNIEnv *env, jobject, jlong metaspace_method))