8232083: Minimal VM is broken after JDK-8231586

Reviewed-by: dlong
This commit is contained in:
Tom Rodriguez 2019-10-24 22:41:24 -07:00
parent c87a6fc0b3
commit be6a893e1f

View file

@ -308,10 +308,13 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
// handle derived pointers first (otherwise base pointer may be // handle derived pointers first (otherwise base pointer may be
// changed before derived pointer offset has been collected) // changed before derived pointer offset has been collected)
OopMapValue omv;
{ {
OopMapStream oms(map); for (OopMapStream oms(map); !oms.is_done(); oms.next()) {
if (!oms.is_done()) { OopMapValue omv = oms.current();
if (omv.type() != OopMapValue::derived_oop_value) {
continue;
}
#ifndef TIERED #ifndef TIERED
COMPILER1_PRESENT(ShouldNotReachHere();) COMPILER1_PRESENT(ShouldNotReachHere();)
#if INCLUDE_JVMCI #if INCLUDE_JVMCI
@ -320,31 +323,26 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
} }
#endif #endif
#endif // !TIERED #endif // !TIERED
do { oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
omv = oms.current(); guarantee(loc != NULL, "missing saved register");
if (omv.type() == OopMapValue::derived_oop_value) { oop *derived_loc = loc;
oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map); oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map);
guarantee(loc != NULL, "missing saved register"); // Ignore NULL oops and decoded NULL narrow oops which
oop *derived_loc = loc; // equal to CompressedOops::base() when a narrow oop
oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map); // implicit null check is used in compiled code.
// Ignore NULL oops and decoded NULL narrow oops which // The narrow_oop_base could be NULL or be the address
// equal to CompressedOops::base() when a narrow oop // of the page below heap depending on compressed oops mode.
// implicit null check is used in compiled code. if (base_loc != NULL && *base_loc != NULL && !CompressedOops::is_base(*base_loc)) {
// The narrow_oop_base could be NULL or be the address derived_oop_fn(base_loc, derived_loc);
// of the page below heap depending on compressed oops mode. }
if (base_loc != NULL && *base_loc != NULL && !CompressedOops::is_base(*base_loc)) { oms.next();
derived_oop_fn(base_loc, derived_loc);
}
}
oms.next();
} while (!oms.is_done());
} }
} }
{ {
// We want coop and oop oop_types // We want coop and oop oop_types
for (OopMapStream oms(map); !oms.is_done(); oms.next()) { for (OopMapStream oms(map); !oms.is_done(); oms.next()) {
omv = oms.current(); OopMapValue omv = oms.current();
oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map); oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
// It should be an error if no location can be found for a // It should be an error if no location can be found for a
// register mentioned as contained an oop of some kind. Maybe // register mentioned as contained an oop of some kind. Maybe