377 // frame owned by optimizing compiler
378 if (Assert.ASSERTS_ENABLED) {
379 Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
380 }
381 Address senderSP = getUnextendedSP().addOffsetTo(cb.getFrameSize());
382
383 // On Intel the return_address is always the word on the stack
384 Address senderPC = senderSP.getAddressAt(-1 * VM.getVM().getAddressSize());
385
386 // This is the saved value of EBP which may or may not really be an FP.
387 // It is only an FP if the sender is an interpreter frame (or C1?).
388 Address savedFPAddr = senderSP.addOffsetTo(- SENDER_SP_OFFSET * VM.getVM().getAddressSize());
389
390 if (map.getUpdateMap()) {
391 // Tell GC to use argument oopmaps for some runtime stubs that need it.
392 // For C1, the runtime stub might not have oop maps, so set this flag
393 // outside of update_register_map.
394 map.setIncludeArgumentOops(cb.callerMustGCArguments());
395
396 if (cb.getOopMaps() != null) {
397 OopMapSet.updateRegisterMap(this, cb, map, true);
398 }
399
400 // Since the prolog does the save and restore of EBP there is no oopmap
401 // for it so we must fill in its location as if there was an oopmap entry
402 // since if our caller was compiled code there could be live jvm state in it.
403 updateMapWithSavedLink(map, savedFPAddr);
404 }
405
406 return new X86Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC);
407 }
408
409 protected boolean hasSenderPD() {
410 // FIXME
411 // Check for null ebp? Need to do some tests.
412 return true;
413 }
414
415 public long frameSize() {
416 return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
417 }
|
377 // frame owned by optimizing compiler
378 if (Assert.ASSERTS_ENABLED) {
379 Assert.that(cb.getFrameSize() >= 0, "must have non-zero frame size");
380 }
381 Address senderSP = getUnextendedSP().addOffsetTo(cb.getFrameSize());
382
383 // On Intel the return_address is always the word on the stack
384 Address senderPC = senderSP.getAddressAt(-1 * VM.getVM().getAddressSize());
385
386 // This is the saved value of EBP which may or may not really be an FP.
387 // It is only an FP if the sender is an interpreter frame (or C1?).
388 Address savedFPAddr = senderSP.addOffsetTo(- SENDER_SP_OFFSET * VM.getVM().getAddressSize());
389
390 if (map.getUpdateMap()) {
391 // Tell GC to use argument oopmaps for some runtime stubs that need it.
392 // For C1, the runtime stub might not have oop maps, so set this flag
393 // outside of update_register_map.
394 map.setIncludeArgumentOops(cb.callerMustGCArguments());
395
396 if (cb.getOopMaps() != null) {
397 ImmutableOopMapSet.updateRegisterMap(this, cb, map, true);
398 }
399
400 // Since the prolog does the save and restore of EBP there is no oopmap
401 // for it so we must fill in its location as if there was an oopmap entry
402 // since if our caller was compiled code there could be live jvm state in it.
403 updateMapWithSavedLink(map, savedFPAddr);
404 }
405
406 return new X86Frame(senderSP, savedFPAddr.getAddressAt(0), senderPC);
407 }
408
409 protected boolean hasSenderPD() {
410 // FIXME
411 // Check for null ebp? Need to do some tests.
412 return true;
413 }
414
415 public long frameSize() {
416 return (getSenderSP().minus(getSP()) / VM.getVM().getAddressSize());
417 }
|