src/share/vm/compiler/oopMap.cpp

changeset 548
ba764ed4b6f2
parent 535
c7c777385a15
child 631
d1605aabd0a1
child 679
524eca34ea76
     1.1 --- a/src/share/vm/compiler/oopMap.cpp	Fri Apr 11 09:56:35 2008 -0400
     1.2 +++ b/src/share/vm/compiler/oopMap.cpp	Sun Apr 13 17:43:42 2008 -0400
     1.3 @@ -169,11 +169,8 @@
     1.4  }
     1.5  
     1.6  
     1.7 -void OopMap::set_dead(VMReg reg) {
     1.8 -  // At this time, we only need dead entries in our OopMap when ZapDeadCompiledLocals is active.
     1.9 -  if (ZapDeadCompiledLocals) {
    1.10 -    set_xxx(reg, OopMapValue::dead_value, VMRegImpl::Bad());
    1.11 -  }
    1.12 +void OopMap::set_narrowoop(VMReg reg) {
    1.13 +  set_xxx(reg, OopMapValue::narrowoop_value, VMRegImpl::Bad());
    1.14  }
    1.15  
    1.16  
    1.17 @@ -305,7 +302,9 @@
    1.18  }
    1.19  
    1.20  class DoNothingClosure: public OopClosure {
    1.21 -public: void do_oop(oop* p) {}
    1.22 + public:
    1.23 +  void do_oop(oop* p)       {}
    1.24 +  void do_oop(narrowOop* p) {}
    1.25  };
    1.26  static DoNothingClosure do_nothing;
    1.27  
    1.28 @@ -349,23 +348,21 @@
    1.29  
    1.30  void OopMapSet::oops_do(const frame *fr, const RegisterMap* reg_map, OopClosure* f) {
    1.31    // add derived oops to a table
    1.32 -  all_do(fr, reg_map, f, add_derived_oop, &do_nothing, &do_nothing);
    1.33 +  all_do(fr, reg_map, f, add_derived_oop, &do_nothing);
    1.34  }
    1.35  
    1.36  
    1.37  void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
    1.38                         OopClosure* oop_fn, void derived_oop_fn(oop*, oop*),
    1.39 -                       OopClosure* value_fn, OopClosure* dead_fn) {
    1.40 +                       OopClosure* value_fn) {
    1.41    CodeBlob* cb = fr->cb();
    1.42 -  {
    1.43 -    assert(cb != NULL, "no codeblob");
    1.44 -  }
    1.45 +  assert(cb != NULL, "no codeblob");
    1.46  
    1.47    NOT_PRODUCT(if (TraceCodeBlobStacks) trace_codeblob_maps(fr, reg_map);)
    1.48  
    1.49    OopMapSet* maps = cb->oop_maps();
    1.50 -  OopMap* map  = cb->oop_map_for_return_address(fr->pc());
    1.51 -  assert(map != NULL, " no ptr map found");
    1.52 +  OopMap* map = cb->oop_map_for_return_address(fr->pc());
    1.53 +  assert(map != NULL, "no ptr map found");
    1.54  
    1.55    // handle derived pointers first (otherwise base pointer may be
    1.56    // changed before derived pointer offset has been collected)
    1.57 @@ -393,8 +390,8 @@
    1.58      }
    1.59    }
    1.60  
    1.61 -  // We want dead, value and oop oop_types
    1.62 -  int mask = OopMapValue::oop_value | OopMapValue::value_value | OopMapValue::dead_value;
    1.63 +  // We want coop, value and oop oop_types
    1.64 +  int mask = OopMapValue::oop_value | OopMapValue::value_value | OopMapValue::narrowoop_value;
    1.65    {
    1.66      for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
    1.67        omv = oms.current();
    1.68 @@ -402,11 +399,15 @@
    1.69        if ( loc != NULL ) {
    1.70          if ( omv.type() == OopMapValue::oop_value ) {
    1.71  #ifdef ASSERT
    1.72 -          if (COMPILER2_PRESENT(!DoEscapeAnalysis &&) !Universe::heap()->is_in_or_null(*loc)) {
    1.73 +          if (COMPILER2_PRESENT(!DoEscapeAnalysis &&)
    1.74 +             (((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
    1.75 +             !Universe::heap()->is_in_or_null(*loc)) {
    1.76              tty->print_cr("# Found non oop pointer.  Dumping state at failure");
    1.77              // try to dump out some helpful debugging information
    1.78              trace_codeblob_maps(fr, reg_map);
    1.79              omv.print();
    1.80 +            tty->print_cr("register r");
    1.81 +            omv.reg()->print();
    1.82              tty->print_cr("loc = %p *loc = %p\n", loc, (address)*loc);
    1.83              // do the real assert.
    1.84              assert(Universe::heap()->is_in_or_null(*loc), "found non oop pointer");
    1.85 @@ -415,8 +416,17 @@
    1.86            oop_fn->do_oop(loc);
    1.87          } else if ( omv.type() == OopMapValue::value_value ) {
    1.88            value_fn->do_oop(loc);
    1.89 -        } else if ( omv.type() == OopMapValue::dead_value ) {
    1.90 -          dead_fn->do_oop(loc);
    1.91 +        } else if ( omv.type() == OopMapValue::narrowoop_value ) {
    1.92 +          narrowOop *nl = (narrowOop*)loc;
    1.93 +#ifndef VM_LITTLE_ENDIAN
    1.94 +          if (!omv.reg()->is_stack()) {
    1.95 +            // compressed oops in registers only take up 4 bytes of an
    1.96 +            // 8 byte register but they are in the wrong part of the
    1.97 +            // word so adjust loc to point at the right place.
    1.98 +            nl = (narrowOop*)((address)nl + 4);
    1.99 +          }
   1.100 +#endif
   1.101 +          oop_fn->do_oop(nl);
   1.102          }
   1.103        }
   1.104      }
   1.105 @@ -519,8 +529,8 @@
   1.106    case OopMapValue::value_value:
   1.107      st->print("Value" );
   1.108      break;
   1.109 -  case OopMapValue::dead_value:
   1.110 -    st->print("Dead" );
   1.111 +  case OopMapValue::narrowoop_value:
   1.112 +    tty->print("NarrowOop" );
   1.113      break;
   1.114    case OopMapValue::callee_saved_value:
   1.115      st->print("Callers_" );

mercurial