hotspot/src/share/vm/ci/ciMethodData.cpp
changeset 36601 e791e26c8f1b
parent 33105 294e48b4f704
child 44315 1e2f842b0c96
equal deleted inserted replaced
36600:4ae7b86df4ae 36601:e791e26c8f1b
    79 }
    79 }
    80 
    80 
    81 void ciMethodData::load_extra_data() {
    81 void ciMethodData::load_extra_data() {
    82   MethodData* mdo = get_MethodData();
    82   MethodData* mdo = get_MethodData();
    83 
    83 
    84   MutexLocker(mdo->extra_data_lock());
    84   MutexLocker ml(mdo->extra_data_lock());
    85 
    85 
    86   // speculative trap entries also hold a pointer to a Method so need to be translated
    86   // speculative trap entries also hold a pointer to a Method so need to be translated
    87   DataLayout* dp_src  = mdo->extra_data_base();
    87   DataLayout* dp_src  = mdo->extra_data_base();
    88   DataLayout* end_src = mdo->args_data_limit();
    88   DataLayout* end_src = mdo->args_data_limit();
    89   DataLayout* dp_dst  = extra_data_base();
    89   DataLayout* dp_dst  = extra_data_base();
   101       memcpy(dp_dst, dp_src, ((intptr_t)MethodData::next_extra(dp_src)) - ((intptr_t)dp_src));
   101       memcpy(dp_dst, dp_src, ((intptr_t)MethodData::next_extra(dp_src)) - ((intptr_t)dp_src));
   102     }
   102     }
   103 
   103 
   104     switch(tag) {
   104     switch(tag) {
   105     case DataLayout::speculative_trap_data_tag: {
   105     case DataLayout::speculative_trap_data_tag: {
   106       ciSpeculativeTrapData* data_dst = new ciSpeculativeTrapData(dp_dst);
   106       ciSpeculativeTrapData data_dst(dp_dst);
   107       SpeculativeTrapData* data_src = new SpeculativeTrapData(dp_src);
   107       SpeculativeTrapData   data_src(dp_src);
   108 
   108 
   109       data_dst->translate_from(data_src);
   109       { // During translation a safepoint can happen or VM lock can be taken (e.g., Compile_lock).
   110 
   110         MutexUnlocker ml(mdo->extra_data_lock());
   111 #ifdef ASSERT
   111         data_dst.translate_from(&data_src);
   112       SpeculativeTrapData* data_src2 = new SpeculativeTrapData(dp_src);
   112       }
   113       assert(data_src2->method() == data_src->method() && data_src2->bci() == data_src->bci(), "entries changed while translating");
       
   114 #endif
       
   115 
       
   116       break;
   113       break;
   117     }
   114     }
   118     case DataLayout::bit_data_tag:
   115     case DataLayout::bit_data_tag:
   119       break;
   116       break;
   120     case DataLayout::no_tag:
   117     case DataLayout::no_tag:
   121     case DataLayout::arg_info_data_tag:
   118     case DataLayout::arg_info_data_tag:
   122       // An empty slot or ArgInfoData entry marks the end of the trap data
   119       // An empty slot or ArgInfoData entry marks the end of the trap data
   123       return;
   120       {
       
   121         return; // Need a block to avoid SS compiler bug
       
   122       }
   124     default:
   123     default:
   125       fatal("bad tag = %d", dp_dst->tag());
   124       fatal("bad tag = %d", tag);
   126     }
   125     }
   127   }
   126   }
   128 }
   127 }
   129 
   128 
   130 void ciMethodData::load_data() {
   129 void ciMethodData::load_data() {