oop* dummy_vframe::register_contents_addr(Location r) { const bool traceRCA = false; oop* old_result = NULL; if (isIArgRegister(r)) { // the nameDesc specifies an i register, but the actual contents are // in saved_outregs old_result = &saved_outregs[r - I0]; } else if (isExtraIArgRegister(r)) { // extra incoming args are ok, too old_result = compiled_vframe::register_contents_addr(r); } else ShouldNotReachHere(); // shouldn't ask dummy vframe for this register if (!SaveOutgoingArgumentsOfPatchedFrames) return old_result; fint i = incoming_arg_index(r); assert(i + 1 < OutgoingArgsOfReturnTrapOrRecompileFrame->length(), "bounds"); oop* argp = OutgoingArgsOfReturnTrapOrRecompileFrame->objs(i + 1); assert((*argp)->verify(), "checking arg"); if (traceRCA) lprintf("***** vframe::register_contents_addr i = %d, old_result = 0x%x, argp = 0x%x\n", i, *old_result, *argp); assert(*argp == *old_result, "checking old vs. new"); return argp; }
int32 fpOffset_abstract(Location reg, fint frameSize) { // return offset (in bytes) off of fp if (isStackRegister(reg)) { return (local_slots_offset + StackLocations - reg) * oopSize; } else if (isExtraArgRegister(reg)) { return (local_slots_offset - frameSize + ExtraArgLocations - reg + 1) * oopSize; } else { assert(isExtraIArgRegister(reg), "not a stack register"); return (arg_bottom_offset + ExtraIArgLocations - reg) * oopSize; } }
const char *locationName(Location l) { Location base; int num; if (isStackRegister(l)) { base= StackLocations; num= l - base; } else if (isExtraArgRegister(l)) { base= ExtraArgLocations; num= base - l; } else if (isExtraIArgRegister(l)) { base= ExtraIArgLocations; num= base - l; } else { assert(isRegister(l) || l == AnyLocation || l == AnyRegister || l == UnAllocated || l == Temp || l == StackTemp || l == DataRegister || l == AddressRegister, "unexpected location"); return RegisterNames[l]; } return locationNameHelper(base, num); }
int32 spOffset(Location reg, fint totalFrameSize) { // return offset (in bytes) off of sp if (isRegister(reg)) { assert(isInFrame(reg), "can't access this register"); return (first_register_offset - StackFromRegister[reg]) * oopSize; } else if (isStackRegister(reg)) { return (totalFrameSize + local_slots_offset + StackLocations - reg) * oopSize; } else if (isExtraArgRegister(reg)) { return (extra_arg_offset + ExtraArgLocations - reg) * oopSize; } else { assert(isExtraIArgRegister(reg), "not a stack register"); // reg is <= ExtraIArgLocations, arg_bottom_offset is from sp return (totalFrameSize + arg_bottom_offset + ExtraIArgLocations - reg) * oopSize; } }
void compiled_vframe::get_search_locations_for_liveness_check(NameDesc* n, frame*& fr_to_search, RegisterLocator*& rl_to_search) { // these guys are in caller frame in SPARC fr_to_search = isExtraIArgRegister(n->location()) ? fr->sender() : fr; rl_to_search = isExtraIArgRegister(n->location()) ? rl->sender() : rl; }