hotspot/src/share/vm/ci/ciReplay.cpp
changeset 24476 912595db2e75
parent 24324 e18584aa83e2
child 25325 e3af4e02b0d5
equal deleted inserted replaced
24445:518f34b4384e 24476:912595db2e75
    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