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_" );