hotspot/src/share/vm/compiler/oopMap.cpp
changeset 360 21d113ecbf6a
parent 347 df859fcca515
child 952 38812d18eec0
child 670 ddf3e9583f2f
equal deleted inserted replaced
357:f4edb0d9f109 360:21d113ecbf6a
   167   if (ZapDeadCompiledLocals)
   167   if (ZapDeadCompiledLocals)
   168     set_xxx(reg, OopMapValue::value_value, VMRegImpl::Bad());
   168     set_xxx(reg, OopMapValue::value_value, VMRegImpl::Bad());
   169 }
   169 }
   170 
   170 
   171 
   171 
   172 void OopMap::set_dead(VMReg reg) {
   172 void OopMap::set_narrowoop(VMReg reg) {
   173   // At this time, we only need dead entries in our OopMap when ZapDeadCompiledLocals is active.
   173   set_xxx(reg, OopMapValue::narrowoop_value, VMRegImpl::Bad());
   174   if (ZapDeadCompiledLocals) {
       
   175     set_xxx(reg, OopMapValue::dead_value, VMRegImpl::Bad());
       
   176   }
       
   177 }
   174 }
   178 
   175 
   179 
   176 
   180 void OopMap::set_callee_saved(VMReg reg, VMReg caller_machine_register ) {
   177 void OopMap::set_callee_saved(VMReg reg, VMReg caller_machine_register ) {
   181   set_xxx(reg, OopMapValue::callee_saved_value, caller_machine_register);
   178   set_xxx(reg, OopMapValue::callee_saved_value, caller_machine_register);
   303   assert( m->offset() == pc_offset, "oopmap not found" );
   300   assert( m->offset() == pc_offset, "oopmap not found" );
   304   return m;
   301   return m;
   305 }
   302 }
   306 
   303 
   307 class DoNothingClosure: public OopClosure {
   304 class DoNothingClosure: public OopClosure {
   308 public: void do_oop(oop* p) {}
   305  public:
       
   306   void do_oop(oop* p)       {}
       
   307   void do_oop(narrowOop* p) {}
   309 };
   308 };
   310 static DoNothingClosure do_nothing;
   309 static DoNothingClosure do_nothing;
   311 
   310 
   312 static void add_derived_oop(oop* base, oop* derived) {
   311 static void add_derived_oop(oop* base, oop* derived) {
   313 #ifndef TIERED
   312 #ifndef TIERED
   347 }
   346 }
   348 #endif // PRODUCT
   347 #endif // PRODUCT
   349 
   348 
   350 void OopMapSet::oops_do(const frame *fr, const RegisterMap* reg_map, OopClosure* f) {
   349 void OopMapSet::oops_do(const frame *fr, const RegisterMap* reg_map, OopClosure* f) {
   351   // add derived oops to a table
   350   // add derived oops to a table
   352   all_do(fr, reg_map, f, add_derived_oop, &do_nothing, &do_nothing);
   351   all_do(fr, reg_map, f, add_derived_oop, &do_nothing);
   353 }
   352 }
   354 
   353 
   355 
   354 
   356 void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
   355 void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
   357                        OopClosure* oop_fn, void derived_oop_fn(oop*, oop*),
   356                        OopClosure* oop_fn, void derived_oop_fn(oop*, oop*),
   358                        OopClosure* value_fn, OopClosure* dead_fn) {
   357                        OopClosure* value_fn) {
   359   CodeBlob* cb = fr->cb();
   358   CodeBlob* cb = fr->cb();
   360   {
   359   assert(cb != NULL, "no codeblob");
   361     assert(cb != NULL, "no codeblob");
       
   362   }
       
   363 
   360 
   364   NOT_PRODUCT(if (TraceCodeBlobStacks) trace_codeblob_maps(fr, reg_map);)
   361   NOT_PRODUCT(if (TraceCodeBlobStacks) trace_codeblob_maps(fr, reg_map);)
   365 
   362 
   366   OopMapSet* maps = cb->oop_maps();
   363   OopMapSet* maps = cb->oop_maps();
   367   OopMap* map  = cb->oop_map_for_return_address(fr->pc());
   364   OopMap* map = cb->oop_map_for_return_address(fr->pc());
   368   assert(map != NULL, " no ptr map found");
   365   assert(map != NULL, "no ptr map found");
   369 
   366 
   370   // handle derived pointers first (otherwise base pointer may be
   367   // handle derived pointers first (otherwise base pointer may be
   371   // changed before derived pointer offset has been collected)
   368   // changed before derived pointer offset has been collected)
   372   OopMapValue omv;
   369   OopMapValue omv;
   373   {
   370   {
   391         oms.next();
   388         oms.next();
   392       }  while (!oms.is_done());
   389       }  while (!oms.is_done());
   393     }
   390     }
   394   }
   391   }
   395 
   392 
   396   // We want dead, value and oop oop_types
   393   // We want coop, value and oop oop_types
   397   int mask = OopMapValue::oop_value | OopMapValue::value_value | OopMapValue::dead_value;
   394   int mask = OopMapValue::oop_value | OopMapValue::value_value | OopMapValue::narrowoop_value;
   398   {
   395   {
   399     for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
   396     for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
   400       omv = oms.current();
   397       omv = oms.current();
   401       oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
   398       oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
   402       if ( loc != NULL ) {
   399       if ( loc != NULL ) {
   403         if ( omv.type() == OopMapValue::oop_value ) {
   400         if ( omv.type() == OopMapValue::oop_value ) {
   404 #ifdef ASSERT
   401 #ifdef ASSERT
   405           if (COMPILER2_PRESENT(!DoEscapeAnalysis &&) !Universe::heap()->is_in_or_null(*loc)) {
   402           if (COMPILER2_PRESENT(!DoEscapeAnalysis &&)
       
   403              (((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
       
   404              !Universe::heap()->is_in_or_null(*loc)) {
   406             tty->print_cr("# Found non oop pointer.  Dumping state at failure");
   405             tty->print_cr("# Found non oop pointer.  Dumping state at failure");
   407             // try to dump out some helpful debugging information
   406             // try to dump out some helpful debugging information
   408             trace_codeblob_maps(fr, reg_map);
   407             trace_codeblob_maps(fr, reg_map);
   409             omv.print();
   408             omv.print();
       
   409             tty->print_cr("register r");
       
   410             omv.reg()->print();
   410             tty->print_cr("loc = %p *loc = %p\n", loc, (address)*loc);
   411             tty->print_cr("loc = %p *loc = %p\n", loc, (address)*loc);
   411             // do the real assert.
   412             // do the real assert.
   412             assert(Universe::heap()->is_in_or_null(*loc), "found non oop pointer");
   413             assert(Universe::heap()->is_in_or_null(*loc), "found non oop pointer");
   413           }
   414           }
   414 #endif // ASSERT
   415 #endif // ASSERT
   415           oop_fn->do_oop(loc);
   416           oop_fn->do_oop(loc);
   416         } else if ( omv.type() == OopMapValue::value_value ) {
   417         } else if ( omv.type() == OopMapValue::value_value ) {
   417           value_fn->do_oop(loc);
   418           value_fn->do_oop(loc);
   418         } else if ( omv.type() == OopMapValue::dead_value ) {
   419         } else if ( omv.type() == OopMapValue::narrowoop_value ) {
   419           dead_fn->do_oop(loc);
   420           narrowOop *nl = (narrowOop*)loc;
       
   421 #ifndef VM_LITTLE_ENDIAN
       
   422           if (!omv.reg()->is_stack()) {
       
   423             // compressed oops in registers only take up 4 bytes of an
       
   424             // 8 byte register but they are in the wrong part of the
       
   425             // word so adjust loc to point at the right place.
       
   426             nl = (narrowOop*)((address)nl + 4);
       
   427           }
       
   428 #endif
       
   429           oop_fn->do_oop(nl);
   420         }
   430         }
   421       }
   431       }
   422     }
   432     }
   423   }
   433   }
   424 
   434 
   517     st->print("Oop");
   527     st->print("Oop");
   518     break;
   528     break;
   519   case OopMapValue::value_value:
   529   case OopMapValue::value_value:
   520     st->print("Value" );
   530     st->print("Value" );
   521     break;
   531     break;
   522   case OopMapValue::dead_value:
   532   case OopMapValue::narrowoop_value:
   523     st->print("Dead" );
   533     tty->print("NarrowOop" );
   524     break;
   534     break;
   525   case OopMapValue::callee_saved_value:
   535   case OopMapValue::callee_saved_value:
   526     st->print("Callers_" );
   536     st->print("Callers_" );
   527     optional->print_on(st);
   537     optional->print_on(st);
   528     break;
   538     break;