frame_x86.cpp revision 304:dc7f315e41f7
175597Ssobomax/*
275597Ssobomax * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
375597Ssobomax * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
475597Ssobomax *
575597Ssobomax * This code is free software; you can redistribute it and/or modify it
675597Ssobomax * under the terms of the GNU General Public License version 2 only, as
775597Ssobomax * published by the Free Software Foundation.
875597Ssobomax *
975597Ssobomax * This code is distributed in the hope that it will be useful, but WITHOUT
1075597Ssobomax * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1175597Ssobomax * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1275597Ssobomax * version 2 for more details (a copy is included in the LICENSE file that
1375597Ssobomax * accompanied this code).
1475597Ssobomax *
1575597Ssobomax * You should have received a copy of the GNU General Public License version
1675597Ssobomax * 2 along with this work; if not, write to the Free Software Foundation,
1775597Ssobomax * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1875597Ssobomax *
1975597Ssobomax * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
2075597Ssobomax * CA 95054 USA or visit www.sun.com if you need additional information or
2175597Ssobomax * have any questions.
2275597Ssobomax *
2375597Ssobomax */
2475597Ssobomax
2575597Ssobomax# include "incls/_precompiled.incl"
2675597Ssobomax# include "incls/_frame_x86.cpp.incl"
2775597Ssobomax
2875597Ssobomax#ifdef ASSERT
2975597Ssobomaxvoid RegisterMap::check_location_valid() {
3086366Ssobomax}
3186366Ssobomax#endif
3275597Ssobomax
3375597Ssobomax
3475597Ssobomax// Profiling/safepoint support
3575597Ssobomax
3675597Ssobomaxbool frame::safe_for_sender(JavaThread *thread) {
3775597Ssobomax  address   sp = (address)_sp;
3875597Ssobomax  address   fp = (address)_fp;
3975597Ssobomax  address   unextended_sp = (address)_unextended_sp;
4075597Ssobomax  // sp must be within the stack
4175597Ssobomax  bool sp_safe = (sp <= thread->stack_base()) &&
4275597Ssobomax                 (sp >= thread->stack_base() - thread->stack_size());
4375597Ssobomax
4475597Ssobomax  if (!sp_safe) {
4575597Ssobomax    return false;
4675597Ssobomax  }
4775597Ssobomax
4875597Ssobomax  // unextended sp must be within the stack and above or equal sp
4975597Ssobomax  bool unextended_sp_safe = (unextended_sp <= thread->stack_base()) &&
5075597Ssobomax                            (unextended_sp >= sp);
5175597Ssobomax
5275597Ssobomax  if (!unextended_sp_safe) {
5375597Ssobomax    return false;
5475597Ssobomax  }
5575597Ssobomax
5675597Ssobomax  // an fp must be within the stack and above (but not equal) sp
5775597Ssobomax  bool fp_safe = (fp <= thread->stack_base()) && (fp > sp);
5875597Ssobomax
5986366Ssobomax  // We know sp/unextended_sp are safe only fp is questionable here
6075597Ssobomax
6186366Ssobomax  // If the current frame is known to the code cache then we can attempt to
6275597Ssobomax  // to construct the sender and do some validation of it. This goes a long way
6375597Ssobomax  // toward eliminating issues when we get in frame construction code
6475597Ssobomax
6575597Ssobomax  if (_cb != NULL ) {
6675597Ssobomax
6775597Ssobomax    // First check if frame is complete and tester is reliable
6875597Ssobomax    // Unfortunately we can only check frame complete for runtime stubs and nmethod
6975597Ssobomax    // other generic buffer blobs are more problematic so we just assume they are
7075597Ssobomax    // ok. adapter blobs never have a frame complete and are never ok.
7186366Ssobomax
7275597Ssobomax    if (!_cb->is_frame_complete_at(_pc)) {
7375597Ssobomax      if (_cb->is_nmethod() || _cb->is_adapter_blob() || _cb->is_runtime_stub()) {
7475597Ssobomax        return false;
7575597Ssobomax      }
7675597Ssobomax    }
7775597Ssobomax    // Entry frame checks
7875597Ssobomax    if (is_entry_frame()) {
7975597Ssobomax      // an entry frame must have a valid fp.
8075597Ssobomax
8175597Ssobomax      if (!fp_safe) return false;
8275597Ssobomax
8375597Ssobomax      // Validate the JavaCallWrapper an entry frame must have
8475597Ssobomax
8575597Ssobomax      address jcw = (address)entry_frame_call_wrapper();
8675597Ssobomax
8775597Ssobomax      bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > fp);
8875597Ssobomax
8975597Ssobomax      return jcw_safe;
9075597Ssobomax
9175597Ssobomax    }
9275597Ssobomax
9375597Ssobomax    intptr_t* sender_sp = NULL;
9475597Ssobomax    address   sender_pc = NULL;
9575597Ssobomax
9675597Ssobomax    if (is_interpreted_frame()) {
9775597Ssobomax      // fp must be safe
9875597Ssobomax      if (!fp_safe) {
9975597Ssobomax        return false;
10075597Ssobomax      }
10175597Ssobomax
10275597Ssobomax      sender_pc = (address) this->fp()[return_addr_offset];
10375597Ssobomax      sender_sp = (intptr_t*) addr_at(sender_sp_offset);
10475597Ssobomax
10575597Ssobomax    } else {
10675597Ssobomax      // must be some sort of compiled/runtime frame
10775597Ssobomax      // fp does not have to be safe (although it could be check for c1?)
10875597Ssobomax
10975597Ssobomax      sender_sp = _unextended_sp + _cb->frame_size();
11075597Ssobomax      // On Intel the return_address is always the word on the stack
11175597Ssobomax      sender_pc = (address) *(sender_sp-1);
11275597Ssobomax    }
11375597Ssobomax
11475597Ssobomax    // We must always be able to find a recognizable pc
11575597Ssobomax    CodeBlob* sender_blob = CodeCache::find_blob_unsafe(sender_pc);
11675597Ssobomax    if (sender_pc == NULL ||  sender_blob == NULL) {
11775597Ssobomax      return false;
11875597Ssobomax    }
11975597Ssobomax
12075597Ssobomax
12175597Ssobomax    // If the potential sender is the interpreter then we can do some more checking
12275597Ssobomax    if (Interpreter::contains(sender_pc)) {
12375597Ssobomax
12475597Ssobomax      // ebp is always saved in a recognizable place in any code we generate. However
12575597Ssobomax      // only if the sender is interpreted/call_stub (c1 too?) are we certain that the saved ebp
12675597Ssobomax      // is really a frame pointer.
12775597Ssobomax
12875597Ssobomax      intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
12975597Ssobomax      bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp > sender_sp);
13075597Ssobomax
13175597Ssobomax      if (!saved_fp_safe) {
13275597Ssobomax        return false;
13375597Ssobomax      }
13475597Ssobomax
13575597Ssobomax      // construct the potential sender
13675597Ssobomax
13775597Ssobomax      frame sender(sender_sp, saved_fp, sender_pc);
13875597Ssobomax
13975597Ssobomax      return sender.is_interpreted_frame_valid(thread);
14075597Ssobomax
14175597Ssobomax    }
14275597Ssobomax
14375597Ssobomax    // Could just be some random pointer within the codeBlob
14475597Ssobomax
14575597Ssobomax    if (!sender_blob->instructions_contains(sender_pc)) return false;
14675597Ssobomax
14775597Ssobomax    // We should never be able to see an adapter if the current frame is something from code cache
14875597Ssobomax
14975597Ssobomax    if ( sender_blob->is_adapter_blob()) {
15075597Ssobomax      return false;
15175597Ssobomax    }
15275597Ssobomax
15375597Ssobomax    // Could be the call_stub
15475597Ssobomax
15575597Ssobomax    if (StubRoutines::returns_to_call_stub(sender_pc)) {
15675597Ssobomax      intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
15775597Ssobomax      bool saved_fp_safe = ((address)saved_fp <= thread->stack_base()) && (saved_fp > sender_sp);
15886366Ssobomax
15986366Ssobomax      if (!saved_fp_safe) {
16075597Ssobomax        return false;
16175597Ssobomax      }
16275597Ssobomax
16375597Ssobomax      // construct the potential sender
16475597Ssobomax
16575597Ssobomax      frame sender(sender_sp, saved_fp, sender_pc);
16675597Ssobomax
16775597Ssobomax      // Validate the JavaCallWrapper an entry frame must have
16875597Ssobomax      address jcw = (address)sender.entry_frame_call_wrapper();
16975597Ssobomax
17075597Ssobomax      bool jcw_safe = (jcw <= thread->stack_base()) && ( jcw > (address)sender.fp());
17175597Ssobomax
17275597Ssobomax      return jcw_safe;
17375597Ssobomax    }
17475597Ssobomax
17575597Ssobomax    // If the frame size is 0 something is bad because every nmethod has a non-zero frame size
17675597Ssobomax    // because the return address counts against the callee's frame.
17775597Ssobomax
17875597Ssobomax    if (sender_blob->frame_size() == 0) {
17975597Ssobomax      assert(!sender_blob->is_nmethod(), "should count return address at least");
18075597Ssobomax      return false;
18175597Ssobomax    }
18275597Ssobomax
18375597Ssobomax    // We should never be able to see anything here except an nmethod. If something in the
18475597Ssobomax    // code cache (current frame) is called by an entity within the code cache that entity
18575597Ssobomax    // should not be anything but the call stub (already covered), the interpreter (already covered)
18675597Ssobomax    // or an nmethod.
18786366Ssobomax
18875597Ssobomax    assert(sender_blob->is_nmethod(), "Impossible call chain");
18986366Ssobomax
19075597Ssobomax    // Could put some more validation for the potential non-interpreted sender
19175597Ssobomax    // frame we'd create by calling sender if I could think of any. Wait for next crash in forte...
19275597Ssobomax
19375597Ssobomax    // One idea is seeing if the sender_pc we have is one that we'd expect to call to current cb
19475597Ssobomax
19575597Ssobomax    // We've validated the potential sender that would be created
19675597Ssobomax    return true;
19775597Ssobomax  }
19875597Ssobomax
19986366Ssobomax  // Must be native-compiled frame. Since sender will try and use fp to find
20075597Ssobomax  // linkages it must be safe
20175597Ssobomax
20275597Ssobomax  if (!fp_safe) {
20375597Ssobomax    return false;
20475597Ssobomax  }
20575597Ssobomax
20675597Ssobomax  // Will the pc we fetch be non-zero (which we'll find at the oldest frame)
20775597Ssobomax
20875597Ssobomax  if ( (address) this->fp()[return_addr_offset] == NULL) return false;
20975597Ssobomax
21075597Ssobomax
21175597Ssobomax  // could try and do some more potential verification of native frame if we could think of some...
21275597Ssobomax
21375597Ssobomax  return true;
21475597Ssobomax
21575597Ssobomax}
21675597Ssobomax
21775597Ssobomax
21875597Ssobomaxvoid frame::patch_pc(Thread* thread, address pc) {
21975597Ssobomax  if (TracePcPatching) {
22075597Ssobomax    tty->print_cr("patch_pc at address" INTPTR_FORMAT " [" INTPTR_FORMAT " -> " INTPTR_FORMAT "] ",
22175597Ssobomax                  &((address *)sp())[-1], ((address *)sp())[-1], pc);
22275597Ssobomax  }
22375597Ssobomax  ((address *)sp())[-1] = pc;
22475597Ssobomax  _cb = CodeCache::find_blob(pc);
22575597Ssobomax  if (_cb != NULL && _cb->is_nmethod() && ((nmethod*)_cb)->is_deopt_pc(_pc)) {
22675597Ssobomax    address orig = (((nmethod*)_cb)->get_original_pc(this));
22775597Ssobomax    assert(orig == _pc, "expected original to be stored before patching");
22875597Ssobomax    _deopt_state = is_deoptimized;
22975597Ssobomax    // leave _pc as is
23075597Ssobomax  } else {
23175597Ssobomax    _deopt_state = not_deoptimized;
23275597Ssobomax    _pc = pc;
23375597Ssobomax  }
23475597Ssobomax}
23575597Ssobomax
23675597Ssobomaxbool frame::is_interpreted_frame() const  {
23775597Ssobomax  return Interpreter::contains(pc());
23875597Ssobomax}
23975597Ssobomax
24075597Ssobomaxint frame::frame_size() const {
24175597Ssobomax  RegisterMap map(JavaThread::current(), false);
24275597Ssobomax  frame sender = this->sender(&map);
24375597Ssobomax  return sender.sp() - sp();
24475597Ssobomax}
24575597Ssobomax
24675597Ssobomaxintptr_t* frame::entry_frame_argument_at(int offset) const {
24775597Ssobomax  // convert offset to index to deal with tsi
24875597Ssobomax  int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize);
24975597Ssobomax  // Entry frame's arguments are always in relation to unextended_sp()
25075597Ssobomax  return &unextended_sp()[index];
25175597Ssobomax}
25275597Ssobomax
25375597Ssobomax// sender_sp
25475597Ssobomax#ifdef CC_INTERP
255intptr_t* frame::interpreter_frame_sender_sp() const {
256  assert(is_interpreted_frame(), "interpreted frame expected");
257  // QQQ why does this specialize method exist if frame::sender_sp() does same thing?
258  // seems odd and if we always know interpreted vs. non then sender_sp() is really
259  // doing too much work.
260  return get_interpreterState()->sender_sp();
261}
262
263// monitor elements
264
265BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
266  return get_interpreterState()->monitor_base();
267}
268
269BasicObjectLock* frame::interpreter_frame_monitor_end() const {
270  return (BasicObjectLock*) get_interpreterState()->stack_base();
271}
272
273#else // CC_INTERP
274
275intptr_t* frame::interpreter_frame_sender_sp() const {
276  assert(is_interpreted_frame(), "interpreted frame expected");
277  return (intptr_t*) at(interpreter_frame_sender_sp_offset);
278}
279
280void frame::set_interpreter_frame_sender_sp(intptr_t* sender_sp) {
281  assert(is_interpreted_frame(), "interpreted frame expected");
282  ptr_at_put(interpreter_frame_sender_sp_offset, (intptr_t) sender_sp);
283}
284
285
286// monitor elements
287
288BasicObjectLock* frame::interpreter_frame_monitor_begin() const {
289  return (BasicObjectLock*) addr_at(interpreter_frame_monitor_block_bottom_offset);
290}
291
292BasicObjectLock* frame::interpreter_frame_monitor_end() const {
293  BasicObjectLock* result = (BasicObjectLock*) *addr_at(interpreter_frame_monitor_block_top_offset);
294  // make sure the pointer points inside the frame
295  assert((intptr_t) fp() >  (intptr_t) result, "result must <  than frame pointer");
296  assert((intptr_t) sp() <= (intptr_t) result, "result must >= than stack pointer");
297  return result;
298}
299
300void frame::interpreter_frame_set_monitor_end(BasicObjectLock* value) {
301  *((BasicObjectLock**)addr_at(interpreter_frame_monitor_block_top_offset)) = value;
302}
303
304// Used by template based interpreter deoptimization
305void frame::interpreter_frame_set_last_sp(intptr_t* sp) {
306    *((intptr_t**)addr_at(interpreter_frame_last_sp_offset)) = sp;
307}
308#endif // CC_INTERP
309
310frame frame::sender_for_entry_frame(RegisterMap* map) const {
311  assert(map != NULL, "map must be set");
312  // Java frame called from C; skip all C frames and return top C
313  // frame of that chunk as the sender
314  JavaFrameAnchor* jfa = entry_frame_call_wrapper()->anchor();
315  assert(!entry_frame_is_first(), "next Java fp must be non zero");
316  assert(jfa->last_Java_sp() > sp(), "must be above this frame on stack");
317  map->clear();
318  assert(map->include_argument_oops(), "should be set by clear");
319  if (jfa->last_Java_pc() != NULL ) {
320    frame fr(jfa->last_Java_sp(), jfa->last_Java_fp(), jfa->last_Java_pc());
321    return fr;
322  }
323  frame fr(jfa->last_Java_sp(), jfa->last_Java_fp());
324  return fr;
325}
326
327frame frame::sender_for_interpreter_frame(RegisterMap* map) const {
328  // sp is the raw sp from the sender after adapter or interpreter extension
329  intptr_t* sp = (intptr_t*) addr_at(sender_sp_offset);
330
331  // This is the sp before any possible extension (adapter/locals).
332  intptr_t* unextended_sp = interpreter_frame_sender_sp();
333
334  // The interpreter and compiler(s) always save EBP/RBP in a known
335  // location on entry. We must record where that location is
336  // so this if EBP/RBP was live on callout from c2 we can find
337  // the saved copy no matter what it called.
338
339  // Since the interpreter always saves EBP/RBP if we record where it is then
340  // we don't have to always save EBP/RBP on entry and exit to c2 compiled
341  // code, on entry will be enough.
342#ifdef COMPILER2
343  if (map->update_map()) {
344    map->set_location(rbp->as_VMReg(), (address) addr_at(link_offset));
345#ifdef AMD64
346    // this is weird "H" ought to be at a higher address however the
347    // oopMaps seems to have the "H" regs at the same address and the
348    // vanilla register.
349    // XXXX make this go away
350    if (true) {
351      map->set_location(rbp->as_VMReg()->next(), (address)addr_at(link_offset));
352    }
353#endif // AMD64
354  }
355#endif /* COMPILER2 */
356  return frame(sp, unextended_sp, link(), sender_pc());
357}
358
359
360//------------------------------sender_for_compiled_frame-----------------------
361frame frame::sender_for_compiled_frame(RegisterMap* map) const {
362  assert(map != NULL, "map must be set");
363  const bool c1_compiled = _cb->is_compiled_by_c1();
364
365  // frame owned by optimizing compiler
366  intptr_t* sender_sp = NULL;
367
368  assert(_cb->frame_size() >= 0, "must have non-zero frame size");
369  sender_sp = unextended_sp() + _cb->frame_size();
370
371  // On Intel the return_address is always the word on the stack
372  address sender_pc = (address) *(sender_sp-1);
373
374  // This is the saved value of ebp which may or may not really be an fp.
375  // it is only an fp if the sender is an interpreter frame (or c1?)
376
377  intptr_t *saved_fp = (intptr_t*)*(sender_sp - frame::sender_sp_offset);
378
379  if (map->update_map()) {
380    // Tell GC to use argument oopmaps for some runtime stubs that need it.
381    // For C1, the runtime stub might not have oop maps, so set this flag
382    // outside of update_register_map.
383    map->set_include_argument_oops(_cb->caller_must_gc_arguments(map->thread()));
384    if (_cb->oop_maps() != NULL) {
385      OopMapSet::update_register_map(this, map);
386    }
387    // Since the prolog does the save and restore of epb there is no oopmap
388    // for it so we must fill in its location as if there was an oopmap entry
389    // since if our caller was compiled code there could be live jvm state in it.
390    map->set_location(rbp->as_VMReg(), (address) (sender_sp - frame::sender_sp_offset));
391#ifdef AMD64
392    // this is weird "H" ought to be at a higher address however the
393    // oopMaps seems to have the "H" regs at the same address and the
394    // vanilla register.
395    // XXXX make this go away
396    if (true) {
397      map->set_location(rbp->as_VMReg()->next(), (address) (sender_sp - frame::sender_sp_offset));
398    }
399#endif // AMD64
400  }
401
402  assert(sender_sp != sp(), "must have changed");
403  return frame(sender_sp, saved_fp, sender_pc);
404}
405
406frame frame::sender(RegisterMap* map) const {
407  // Default is we done have to follow them. The sender_for_xxx will
408  // update it accordingly
409  map->set_include_argument_oops(false);
410
411  if (is_entry_frame())       return sender_for_entry_frame(map);
412  if (is_interpreted_frame()) return sender_for_interpreter_frame(map);
413  assert(_cb == CodeCache::find_blob(pc()),"Must be the same");
414
415  if (_cb != NULL) {
416    return sender_for_compiled_frame(map);
417  }
418  // Must be native-compiled frame, i.e. the marshaling code for native
419  // methods that exists in the core system.
420  return frame(sender_sp(), link(), sender_pc());
421}
422
423
424bool frame::interpreter_frame_equals_unpacked_fp(intptr_t* fp) {
425  assert(is_interpreted_frame(), "must be interpreter frame");
426  methodOop method = interpreter_frame_method();
427  // When unpacking an optimized frame the frame pointer is
428  // adjusted with:
429  int diff = (method->max_locals() - method->size_of_parameters()) *
430             Interpreter::stackElementWords();
431  return _fp == (fp - diff);
432}
433
434void frame::pd_gc_epilog() {
435  // nothing done here now
436}
437
438bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
439// QQQ
440#ifdef CC_INTERP
441#else
442  assert(is_interpreted_frame(), "Not an interpreted frame");
443  // These are reasonable sanity checks
444  if (fp() == 0 || (intptr_t(fp()) & (wordSize-1)) != 0) {
445    return false;
446  }
447  if (sp() == 0 || (intptr_t(sp()) & (wordSize-1)) != 0) {
448    return false;
449  }
450  if (fp() + interpreter_frame_initial_sp_offset < sp()) {
451    return false;
452  }
453  // These are hacks to keep us out of trouble.
454  // The problem with these is that they mask other problems
455  if (fp() <= sp()) {        // this attempts to deal with unsigned comparison above
456    return false;
457  }
458
459  // do some validation of frame elements
460
461  // first the method
462
463  methodOop m = *interpreter_frame_method_addr();
464
465  // validate the method we'd find in this potential sender
466  if (!Universe::heap()->is_valid_method(m)) return false;
467
468  // stack frames shouldn't be much larger than max_stack elements
469
470  if (fp() - sp() > 1024 + m->max_stack()*Interpreter::stackElementSize()) {
471    return false;
472  }
473
474  // validate bci/bcx
475
476  intptr_t  bcx    = interpreter_frame_bcx();
477  if (m->validate_bci_from_bcx(bcx) < 0) {
478    return false;
479  }
480
481  // validate constantPoolCacheOop
482
483  constantPoolCacheOop cp = *interpreter_frame_cache_addr();
484
485  if (cp == NULL ||
486      !Space::is_aligned(cp) ||
487      !Universe::heap()->is_permanent((void*)cp)) return false;
488
489  // validate locals
490
491  address locals =  (address) *interpreter_frame_locals_addr();
492
493  if (locals > thread->stack_base() || locals < (address) fp()) return false;
494
495  // We'd have to be pretty unlucky to be mislead at this point
496
497#endif // CC_INTERP
498  return true;
499}
500
501BasicType frame::interpreter_frame_result(oop* oop_result, jvalue* value_result) {
502#ifdef CC_INTERP
503  // Needed for JVMTI. The result should always be in the interpreterState object
504  assert(false, "NYI");
505  interpreterState istate = get_interpreterState();
506#endif // CC_INTERP
507  assert(is_interpreted_frame(), "interpreted frame expected");
508  methodOop method = interpreter_frame_method();
509  BasicType type = method->result_type();
510
511  intptr_t* tos_addr;
512  if (method->is_native()) {
513    // Prior to calling into the runtime to report the method_exit the possible
514    // return value is pushed to the native stack. If the result is a jfloat/jdouble
515    // then ST0 is saved before EAX/EDX. See the note in generate_native_result
516    tos_addr = (intptr_t*)sp();
517    if (type == T_FLOAT || type == T_DOUBLE) {
518    // QQQ seems like this code is equivalent on the two platforms
519#ifdef AMD64
520      // This is times two because we do a push(ltos) after pushing XMM0
521      // and that takes two interpreter stack slots.
522      tos_addr += 2 * Interpreter::stackElementWords();
523#else
524      tos_addr += 2;
525#endif // AMD64
526    }
527  } else {
528    tos_addr = (intptr_t*)interpreter_frame_tos_address();
529  }
530
531  switch (type) {
532    case T_OBJECT  :
533    case T_ARRAY   : {
534      oop obj;
535      if (method->is_native()) {
536#ifdef CC_INTERP
537        obj = istate->_oop_temp;
538#else
539        obj = (oop) at(interpreter_frame_oop_temp_offset);
540#endif // CC_INTERP
541      } else {
542        oop* obj_p = (oop*)tos_addr;
543        obj = (obj_p == NULL) ? (oop)NULL : *obj_p;
544      }
545      assert(obj == NULL || Universe::heap()->is_in(obj), "sanity check");
546      *oop_result = obj;
547      break;
548    }
549    case T_BOOLEAN : value_result->z = *(jboolean*)tos_addr; break;
550    case T_BYTE    : value_result->b = *(jbyte*)tos_addr; break;
551    case T_CHAR    : value_result->c = *(jchar*)tos_addr; break;
552    case T_SHORT   : value_result->s = *(jshort*)tos_addr; break;
553    case T_INT     : value_result->i = *(jint*)tos_addr; break;
554    case T_LONG    : value_result->j = *(jlong*)tos_addr; break;
555    case T_FLOAT   : {
556#ifdef AMD64
557        value_result->f = *(jfloat*)tos_addr;
558#else
559      if (method->is_native()) {
560        jdouble d = *(jdouble*)tos_addr;  // Result was in ST0 so need to convert to jfloat
561        value_result->f = (jfloat)d;
562      } else {
563        value_result->f = *(jfloat*)tos_addr;
564      }
565#endif // AMD64
566      break;
567    }
568    case T_DOUBLE  : value_result->d = *(jdouble*)tos_addr; break;
569    case T_VOID    : /* Nothing to do */ break;
570    default        : ShouldNotReachHere();
571  }
572
573  return type;
574}
575
576
577intptr_t* frame::interpreter_frame_tos_at(jint offset) const {
578  int index = (Interpreter::expr_offset_in_bytes(offset)/wordSize);
579  return &interpreter_frame_tos_address()[index];
580}
581