comparison src/cpu/sparc/vm/frame_sparc.cpp @ 1579:e9ff18c4ace7

Merge
author jrose
date Wed, 02 Jun 2010 22:45:42 -0700
parents c18cbe5936b8 61b2245abf36
children 3e8fbc61cee8
comparison
equal deleted inserted replaced
1562:dfe27f03244a 1579:e9ff18c4ace7
334 assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant broken"); 334 assert(!((nmethod*)_cb)->is_deopt_pc(_pc), "invariant broken");
335 } 335 }
336 #endif // ASSERT 336 #endif // ASSERT
337 } 337 }
338 338
339 frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_adjusted_stack) { 339 frame::frame(intptr_t* sp, intptr_t* younger_sp, bool younger_frame_is_interpreted) :
340 _sp = sp; 340 _sp(sp),
341 _younger_sp = younger_sp; 341 _younger_sp(younger_sp),
342 _deopt_state(unknown),
343 _sp_adjustment_by_callee(0) {
342 if (younger_sp == NULL) { 344 if (younger_sp == NULL) {
343 // make a deficient frame which doesn't know where its PC is 345 // make a deficient frame which doesn't know where its PC is
344 _pc = NULL; 346 _pc = NULL;
345 _cb = NULL; 347 _cb = NULL;
346 } else { 348 } else {
350 // find_blob_unsafe 352 // find_blob_unsafe
351 // In case of native stubs, the pc retrieved here might be 353 // In case of native stubs, the pc retrieved here might be
352 // wrong. (the _last_native_pc will have the right value) 354 // wrong. (the _last_native_pc will have the right value)
353 // So do not put add any asserts on the _pc here. 355 // So do not put add any asserts on the _pc here.
354 } 356 }
355 if (younger_frame_adjusted_stack) { 357
358 if (_pc != NULL)
359 _cb = CodeCache::find_blob(_pc);
360
361 // Check for MethodHandle call sites.
362 if (_cb != NULL) {
363 nmethod* nm = _cb->as_nmethod_or_null();
364 if (nm != NULL) {
365 if (nm->is_deopt_mh_entry(_pc) || nm->is_method_handle_return(_pc)) {
366 _sp_adjustment_by_callee = (intptr_t*) ((intptr_t) sp[L7_mh_SP_save->sp_offset_in_saved_window()] + STACK_BIAS) - sp;
367 // The SP is already adjusted by this MH call site, don't
368 // overwrite this value with the wrong interpreter value.
369 younger_frame_is_interpreted = false;
370 }
371 }
372 }
373
374 if (younger_frame_is_interpreted) {
356 // compute adjustment to this frame's SP made by its interpreted callee 375 // compute adjustment to this frame's SP made by its interpreted callee
357 _sp_adjustment_by_callee = (intptr_t*)((intptr_t)younger_sp[I5_savedSP->sp_offset_in_saved_window()] + 376 _sp_adjustment_by_callee = (intptr_t*) ((intptr_t) younger_sp[I5_savedSP->sp_offset_in_saved_window()] + STACK_BIAS) - sp;
358 STACK_BIAS) - sp; 377 }
359 } else { 378
360 _sp_adjustment_by_callee = 0; 379 // It is important that the frame is fully constructed when we do
361 } 380 // this lookup as get_deopt_original_pc() needs a correct value for
362 381 // unextended_sp() which uses _sp_adjustment_by_callee.
363 _deopt_state = unknown;
364
365 // It is important that frame be fully construct when we do this lookup
366 // as get_original_pc() needs correct value for unextended_sp()
367 if (_pc != NULL) { 382 if (_pc != NULL) {
368 _cb = CodeCache::find_blob(_pc);
369 address original_pc = nmethod::get_deopt_original_pc(this); 383 address original_pc = nmethod::get_deopt_original_pc(this);
370 if (original_pc != NULL) { 384 if (original_pc != NULL) {
371 _pc = original_pc; 385 _pc = original_pc;
372 _deopt_state = is_deoptimized; 386 _deopt_state = is_deoptimized;
373 } else { 387 } else {
460 // Default is not to follow arguments; update it accordingly below 474 // Default is not to follow arguments; update it accordingly below
461 map->set_include_argument_oops(false); 475 map->set_include_argument_oops(false);
462 476
463 if (is_entry_frame()) return sender_for_entry_frame(map); 477 if (is_entry_frame()) return sender_for_entry_frame(map);
464 478
465 intptr_t* younger_sp = sp(); 479 intptr_t* younger_sp = sp();
466 intptr_t* sp = sender_sp(); 480 intptr_t* sp = sender_sp();
467 bool adjusted_stack = false;
468 481
469 // Note: The version of this operation on any platform with callee-save 482 // Note: The version of this operation on any platform with callee-save
470 // registers must update the register map (if not null). 483 // registers must update the register map (if not null).
471 // In order to do this correctly, the various subtypes of 484 // In order to do this correctly, the various subtypes of
472 // of frame (interpreted, compiled, glue, native), 485 // of frame (interpreted, compiled, glue, native),
481 // The constructor of the sender must know whether this frame is interpreted so it can set the 494 // The constructor of the sender must know whether this frame is interpreted so it can set the
482 // sender's _sp_adjustment_by_callee field. An osr adapter frame was originally 495 // sender's _sp_adjustment_by_callee field. An osr adapter frame was originally
483 // interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be 496 // interpreted but its pc is in the code cache (for c1 -> osr_frame_return_id stub), so it must be
484 // explicitly recognized. 497 // explicitly recognized.
485 498
486 adjusted_stack = is_interpreted_frame(); 499 bool frame_is_interpreted = is_interpreted_frame();
487 if (adjusted_stack) { 500 if (frame_is_interpreted) {
488 map->make_integer_regs_unsaved(); 501 map->make_integer_regs_unsaved();
489 map->shift_window(sp, younger_sp); 502 map->shift_window(sp, younger_sp);
490 } else if (_cb != NULL) { 503 } else if (_cb != NULL) {
491 // Update the locations of implicitly saved registers to be their 504 // Update the locations of implicitly saved registers to be their
492 // addresses in the register save area. 505 // addresses in the register save area.
501 if (_cb->oop_maps() != NULL) { 514 if (_cb->oop_maps() != NULL) {
502 OopMapSet::update_register_map(this, map); 515 OopMapSet::update_register_map(this, map);
503 } 516 }
504 } 517 }
505 } 518 }
506 return frame(sp, younger_sp, adjusted_stack); 519 return frame(sp, younger_sp, frame_is_interpreted);
507 } 520 }
508 521
509 522
510 void frame::patch_pc(Thread* thread, address pc) { 523 void frame::patch_pc(Thread* thread, address pc) {
511 if(thread == Thread::current()) { 524 if(thread == Thread::current()) {