src/share/vm/ci/ciReplay.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/share/vm/ci/ciReplay.cpp	Tue Mar 25 10:47:52 2014
--- new/src/share/vm/ci/ciReplay.cpp	Tue Mar 25 10:47:52 2014

*** 46,60 **** --- 46,63 ---- int _state; int _current_mileage; intptr_t* _data; char* _orig_data; ! jobject* _oops_handles; ! int* _oops_offsets; ! Klass** _classes_handles; ! Method** _methods_handles; + int* _classes_offsets; + int* _methods_offsets; int _data_length; int _orig_data_length; ! int _oops_length; ! int _classes_length; + int _methods_length; } ciMethodDataRecord; typedef struct _ciMethodRecord { const char* _klass_name; const char* _method_name;
*** 559,576 **** --- 562,583 ---- rec->_interpreter_invocation_count = parse_int("interpreter_invocation_count"); rec->_interpreter_throwout_count = parse_int("interpreter_throwout_count"); rec->_instructions_size = parse_int("instructions_size"); } ! // ciMethodData <klass> <name> <signature> <state> <current mileage> orig <length> # # ... data <length> # # ... oops <length> # ... methods <length> void process_ciMethodData(TRAPS) { Method* method = parse_method(CHECK); if (had_error()) return; ! /* jsut copied from Method, to build interpret data*/ ! /* just copied from Method, to build interpret data*/ if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { return; } + // To be properly initialized, some profiling in the MDO needs the + // method to be rewritten (number of arguments at a call for + // instance) + method->method_holder()->link_class(CHECK); // methodOopDesc::build_interpreter_method_data(method, CHECK); { // Grab a lock here to prevent multiple // MethodData*s from being created. MutexLocker ml(MethodData_lock, THREAD);
*** 592,616 **** --- 599,636 ---- } rec->_data = parse_intptr_data("data", rec->_data_length); if (rec->_data == NULL) { return; } ! if (!parse_tag_and_count("oops", rec->_oops_length)) { ! if (!parse_tag_and_count("oops", rec->_classes_length)) { return; } ! rec->_oops_handles = NEW_RESOURCE_ARRAY(jobject, rec->_oops_length); ! rec->_oops_offsets = NEW_RESOURCE_ARRAY(int, rec->_oops_length); ! for (int i = 0; i < rec->_oops_length; i++) { ! rec->_classes_handles = NEW_RESOURCE_ARRAY(Klass*, rec->_classes_length); ! rec->_classes_offsets = NEW_RESOURCE_ARRAY(int, rec->_classes_length); ! for (int i = 0; i < rec->_classes_length; i++) { int offset = parse_int("offset"); if (had_error()) { return; } Klass* k = parse_klass(CHECK); ! rec->_oops_offsets[i] = offset; ! KlassHandle *kh = NEW_C_HEAP_OBJ(KlassHandle, mtCompiler); ::new ((void*)kh) KlassHandle(THREAD, k); rec->_oops_handles[i] = (jobject)kh; ! rec->_classes_offsets[i] = offset; ! rec->_classes_handles[i] = k; + } + + if (!parse_tag_and_count("methods", rec->_methods_length)) { + return; + } + rec->_methods_handles = NEW_RESOURCE_ARRAY(Method*, rec->_methods_length); + rec->_methods_offsets = NEW_RESOURCE_ARRAY(int, rec->_methods_length); + for (int i = 0; i < rec->_methods_length; i++) { + int offset = parse_int("offset"); + if (had_error()) { + return; + } + Method* m = parse_method(CHECK); + rec->_methods_offsets[i] = offset; + rec->_methods_handles[i] = m; } } // instanceKlass <name> //
*** 1095,1112 **** --- 1115,1139 ---- tty->cr(); } else { m->_state = rec->_state; m->_current_mileage = rec->_current_mileage; if (rec->_data_length != 0) { ! assert(m->_data_size + m->_extra_data_size == rec->_data_length * (int)sizeof(rec->_data[0]), "must agree"); // Write the correct ciObjects back into the profile data ciEnv* env = ciEnv::current(); ! for (int i = 0; i < rec->_oops_length; i++) { ! KlassHandle *h = (KlassHandle *)rec->_oops_handles[i]; *(ciMetadata**)(rec->_data + rec->_oops_offsets[i]) = env->get_metadata((*h)()); ! for (int i = 0; i < rec->_classes_length; i++) { ! Klass *k = rec->_classes_handles[i]; + // In case this class pointer is is tagged, preserve the tag + // bits + rec->_data[rec->_classes_offsets[i]] = + ciTypeEntries::with_status(env->get_metadata(k)->as_klass(), rec->_data[rec->_classes_offsets[i]]); + } + for (int i = 0; i < rec->_methods_length; i++) { + Method *m = rec->_methods_handles[i]; + *(ciMetadata**)(rec->_data + rec->_methods_offsets[i]) = + env->get_metadata(m); } // Copy the updated profile data into place as intptr_ts #ifdef _LP64 Copy::conjoint_jlongs_atomic((jlong *)rec->_data, (jlong *)m->_data, rec->_data_length); #else

src/share/vm/ci/ciReplay.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File