46 int _state; |
46 int _state; |
47 int _current_mileage; |
47 int _current_mileage; |
48 |
48 |
49 intptr_t* _data; |
49 intptr_t* _data; |
50 char* _orig_data; |
50 char* _orig_data; |
51 jobject* _oops_handles; |
51 Klass** _classes; |
52 int* _oops_offsets; |
52 Method** _methods; |
|
53 int* _classes_offsets; |
|
54 int* _methods_offsets; |
53 int _data_length; |
55 int _data_length; |
54 int _orig_data_length; |
56 int _orig_data_length; |
55 int _oops_length; |
57 int _classes_length; |
|
58 int _methods_length; |
56 } ciMethodDataRecord; |
59 } ciMethodDataRecord; |
57 |
60 |
58 typedef struct _ciMethodRecord { |
61 typedef struct _ciMethodRecord { |
59 const char* _klass_name; |
62 const char* _klass_name; |
60 const char* _method_name; |
63 const char* _method_name; |
563 rec->_interpreter_invocation_count = parse_int("interpreter_invocation_count"); |
566 rec->_interpreter_invocation_count = parse_int("interpreter_invocation_count"); |
564 rec->_interpreter_throwout_count = parse_int("interpreter_throwout_count"); |
567 rec->_interpreter_throwout_count = parse_int("interpreter_throwout_count"); |
565 rec->_instructions_size = parse_int("instructions_size"); |
568 rec->_instructions_size = parse_int("instructions_size"); |
566 } |
569 } |
567 |
570 |
568 // ciMethodData <klass> <name> <signature> <state> <current mileage> orig <length> # # ... data <length> # # ... oops <length> |
571 // ciMethodData <klass> <name> <signature> <state> <current mileage> orig <length> # # ... data <length> # # ... oops <length> # ... methods <length> |
569 void process_ciMethodData(TRAPS) { |
572 void process_ciMethodData(TRAPS) { |
570 Method* method = parse_method(CHECK); |
573 Method* method = parse_method(CHECK); |
571 if (had_error()) return; |
574 if (had_error()) return; |
572 /* just copied from Method, to build interpret data*/ |
575 /* just copied from Method, to build interpret data*/ |
573 if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { |
576 if (InstanceRefKlass::owns_pending_list_lock((JavaThread*)THREAD)) { |
600 } |
603 } |
601 rec->_data = parse_intptr_data("data", rec->_data_length); |
604 rec->_data = parse_intptr_data("data", rec->_data_length); |
602 if (rec->_data == NULL) { |
605 if (rec->_data == NULL) { |
603 return; |
606 return; |
604 } |
607 } |
605 if (!parse_tag_and_count("oops", rec->_oops_length)) { |
608 if (!parse_tag_and_count("oops", rec->_classes_length)) { |
606 return; |
609 return; |
607 } |
610 } |
608 rec->_oops_handles = NEW_RESOURCE_ARRAY(jobject, rec->_oops_length); |
611 rec->_classes = NEW_RESOURCE_ARRAY(Klass*, rec->_classes_length); |
609 rec->_oops_offsets = NEW_RESOURCE_ARRAY(int, rec->_oops_length); |
612 rec->_classes_offsets = NEW_RESOURCE_ARRAY(int, rec->_classes_length); |
610 for (int i = 0; i < rec->_oops_length; i++) { |
613 for (int i = 0; i < rec->_classes_length; i++) { |
611 int offset = parse_int("offset"); |
614 int offset = parse_int("offset"); |
612 if (had_error()) { |
615 if (had_error()) { |
613 return; |
616 return; |
614 } |
617 } |
615 Klass* k = parse_klass(CHECK); |
618 Klass* k = parse_klass(CHECK); |
616 rec->_oops_offsets[i] = offset; |
619 rec->_classes_offsets[i] = offset; |
617 KlassHandle *kh = NEW_C_HEAP_OBJ(KlassHandle, mtCompiler); |
620 rec->_classes[i] = k; |
618 ::new ((void*)kh) KlassHandle(THREAD, k); |
621 } |
619 rec->_oops_handles[i] = (jobject)kh; |
622 |
|
623 if (!parse_tag_and_count("methods", rec->_methods_length)) { |
|
624 return; |
|
625 } |
|
626 rec->_methods = NEW_RESOURCE_ARRAY(Method*, rec->_methods_length); |
|
627 rec->_methods_offsets = NEW_RESOURCE_ARRAY(int, rec->_methods_length); |
|
628 for (int i = 0; i < rec->_methods_length; i++) { |
|
629 int offset = parse_int("offset"); |
|
630 if (had_error()) { |
|
631 return; |
|
632 } |
|
633 Method* m = parse_method(CHECK); |
|
634 rec->_methods_offsets[i] = offset; |
|
635 rec->_methods[i] = m; |
620 } |
636 } |
621 } |
637 } |
622 |
638 |
623 // instanceKlass <name> |
639 // instanceKlass <name> |
624 // |
640 // |
1103 tty->cr(); |
1119 tty->cr(); |
1104 } else { |
1120 } else { |
1105 m->_state = rec->_state; |
1121 m->_state = rec->_state; |
1106 m->_current_mileage = rec->_current_mileage; |
1122 m->_current_mileage = rec->_current_mileage; |
1107 if (rec->_data_length != 0) { |
1123 if (rec->_data_length != 0) { |
1108 assert(m->_data_size == rec->_data_length * (int)sizeof(rec->_data[0]), "must agree"); |
1124 assert(m->_data_size + m->_extra_data_size == rec->_data_length * (int)sizeof(rec->_data[0]) || |
|
1125 m->_data_size == rec->_data_length * (int)sizeof(rec->_data[0]), "must agree"); |
1109 |
1126 |
1110 // Write the correct ciObjects back into the profile data |
1127 // Write the correct ciObjects back into the profile data |
1111 ciEnv* env = ciEnv::current(); |
1128 ciEnv* env = ciEnv::current(); |
1112 for (int i = 0; i < rec->_oops_length; i++) { |
1129 for (int i = 0; i < rec->_classes_length; i++) { |
1113 KlassHandle *h = (KlassHandle *)rec->_oops_handles[i]; |
1130 Klass *k = rec->_classes[i]; |
1114 *(ciMetadata**)(rec->_data + rec->_oops_offsets[i]) = |
1131 // In case this class pointer is is tagged, preserve the tag |
1115 env->get_metadata((*h)()); |
1132 // bits |
|
1133 rec->_data[rec->_classes_offsets[i]] = |
|
1134 ciTypeEntries::with_status(env->get_metadata(k)->as_klass(), rec->_data[rec->_classes_offsets[i]]); |
|
1135 } |
|
1136 for (int i = 0; i < rec->_methods_length; i++) { |
|
1137 Method *m = rec->_methods[i]; |
|
1138 *(ciMetadata**)(rec->_data + rec->_methods_offsets[i]) = |
|
1139 env->get_metadata(m); |
1116 } |
1140 } |
1117 // Copy the updated profile data into place as intptr_ts |
1141 // Copy the updated profile data into place as intptr_ts |
1118 #ifdef _LP64 |
1142 #ifdef _LP64 |
1119 Copy::conjoint_jlongs_atomic((jlong *)rec->_data, (jlong *)m->_data, rec->_data_length); |
1143 Copy::conjoint_jlongs_atomic((jlong *)rec->_data, (jlong *)m->_data, rec->_data_length); |
1120 #else |
1144 #else |