never@1445: /* mikael@6198: * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. twisti@1860: * Copyright 2007, 2008, 2009, 2010 Red Hat, Inc. never@1445: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. never@1445: * never@1445: * This code is free software; you can redistribute it and/or modify it never@1445: * under the terms of the GNU General Public License version 2 only, as never@1445: * published by the Free Software Foundation. never@1445: * never@1445: * This code is distributed in the hope that it will be useful, but WITHOUT never@1445: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or never@1445: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License never@1445: * version 2 for more details (a copy is included in the LICENSE file that never@1445: * accompanied this code). never@1445: * never@1445: * You should have received a copy of the GNU General Public License version never@1445: * 2 along with this work; if not, write to the Free Software Foundation, never@1445: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. never@1445: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. never@1445: * never@1445: */ never@1445: stefank@2314: #ifndef CPU_ZERO_VM_FRAME_ZERO_INLINE_HPP stefank@2314: #define CPU_ZERO_VM_FRAME_ZERO_INLINE_HPP stefank@2314: never@1445: // Constructors never@1445: never@1445: inline frame::frame() { twisti@1860: _zeroframe = NULL; never@1445: _sp = NULL; never@1445: _pc = NULL; never@1445: _cb = NULL; never@1445: _deopt_state = unknown; never@1445: } never@1445: twisti@5545: inline address frame::sender_pc() const { ShouldNotCallThis(); return NULL; } twisti@4237: twisti@1860: inline frame::frame(ZeroFrame* zf, intptr_t* sp) { twisti@1860: _zeroframe = zf; never@1445: _sp = sp; never@1445: switch (zeroframe()->type()) { never@1445: case ZeroFrame::ENTRY_FRAME: never@1445: _pc = StubRoutines::call_stub_return_pc(); never@1445: _cb = NULL; twisti@4442: _deopt_state = not_deoptimized; never@1445: break; never@1445: never@1445: case ZeroFrame::INTERPRETER_FRAME: never@1445: _pc = NULL; never@1445: _cb = NULL; twisti@4442: _deopt_state = not_deoptimized; never@1445: break; never@1445: twisti@4442: case ZeroFrame::SHARK_FRAME: { never@1445: _pc = zero_sharkframe()->pc(); never@1445: _cb = CodeCache::find_blob_unsafe(pc()); twisti@4442: address original_pc = nmethod::get_deopt_original_pc(this); twisti@4442: if (original_pc != NULL) { twisti@4442: _pc = original_pc; twisti@4442: _deopt_state = is_deoptimized; twisti@4442: } else { twisti@4442: _deopt_state = not_deoptimized; twisti@4442: } never@1445: break; twisti@4442: } never@1445: case ZeroFrame::FAKE_STUB_FRAME: never@1445: _pc = NULL; never@1445: _cb = NULL; twisti@4442: _deopt_state = not_deoptimized; never@1445: break; never@1445: never@1445: default: never@1445: ShouldNotReachHere(); never@1445: } never@1445: } never@1445: never@1445: // Accessors never@1445: never@1445: inline intptr_t* frame::sender_sp() const { twisti@1860: return fp() + 1; never@1445: } never@1445: bdelsart@3433: inline intptr_t* frame::real_fp() const { bdelsart@3433: return fp(); bdelsart@3433: } bdelsart@3433: never@1445: inline intptr_t* frame::link() const { never@1445: ShouldNotCallThis(); twisti@5545: return NULL; never@1445: } never@1445: never@1445: #ifdef CC_INTERP never@1445: inline interpreterState frame::get_interpreterState() const { never@1445: return zero_interpreterframe()->interpreter_state(); never@1445: } never@1445: never@1445: inline intptr_t** frame::interpreter_frame_locals_addr() const { never@1445: return &(get_interpreterState()->_locals); never@1445: } never@1445: never@1445: inline intptr_t* frame::interpreter_frame_bcx_addr() const { never@1445: return (intptr_t*) &(get_interpreterState()->_bcp); never@1445: } never@1445: coleenp@4037: inline ConstantPoolCache** frame::interpreter_frame_cache_addr() const { never@1445: return &(get_interpreterState()->_constants); never@1445: } never@1445: coleenp@4037: inline Method** frame::interpreter_frame_method_addr() const { never@1445: return &(get_interpreterState()->_method); never@1445: } never@1445: never@1445: inline intptr_t* frame::interpreter_frame_mdx_addr() const { never@1445: return (intptr_t*) &(get_interpreterState()->_mdx); never@1445: } never@1445: never@1445: inline intptr_t* frame::interpreter_frame_tos_address() const { never@1445: return get_interpreterState()->_stack + 1; never@1445: } never@1445: #endif // CC_INTERP never@1445: never@1445: inline int frame::interpreter_frame_monitor_size() { never@1445: return BasicObjectLock::size(); never@1445: } never@1445: never@1445: inline intptr_t* frame::interpreter_frame_expression_stack() const { never@1445: intptr_t* monitor_end = (intptr_t*) interpreter_frame_monitor_end(); never@1445: return monitor_end - 1; never@1445: } never@1445: never@1445: inline jint frame::interpreter_frame_expression_stack_direction() { never@1445: return -1; never@1445: } never@1445: never@1445: // Return a unique id for this frame. The id must have a value where never@1445: // we can distinguish identity and younger/older relationship. NULL never@1445: // represents an invalid (incomparable) frame. never@1445: inline intptr_t* frame::id() const { twisti@1860: return fp(); never@1445: } never@1445: omajid@5497: inline JavaCallWrapper** frame::entry_frame_call_wrapper_addr() const { never@1445: return zero_entryframe()->call_wrapper(); never@1445: } never@1445: never@1445: inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) { never@1445: ShouldNotCallThis(); never@1445: } never@1445: never@1445: inline oop frame::saved_oop_result(RegisterMap* map) const { never@1445: ShouldNotCallThis(); twisti@5545: return NULL; never@1445: } never@1445: never@1445: inline bool frame::is_older(intptr_t* id) const { never@1445: ShouldNotCallThis(); twisti@5545: return false; never@1445: } never@1445: never@1445: inline intptr_t* frame::entry_frame_argument_at(int offset) const { never@1445: ShouldNotCallThis(); twisti@5545: return NULL; never@1445: } never@1445: never@1445: inline intptr_t* frame::unextended_sp() const { never@1445: if (zeroframe()->is_shark_frame()) never@1445: return zero_sharkframe()->unextended_sp(); never@1445: else never@1445: return (intptr_t *) -1; never@1445: } stefank@2314: stefank@2314: #endif // CPU_ZERO_VM_FRAME_ZERO_INLINE_HPP