# HG changeset patch # User redestad # Date 1499089321 -7200 # Mon Jul 03 15:42:01 2017 +0200 # Node ID 3ac9d852248187ac79d35f086cf4233556518db8 # Parent 16e7ba4b426e456875e067cdb1321eaacca947c9 8183299: Improve inlining of CompiledMethod methods into frame::sender Reviewed-by: duke diff --git a/src/share/vm/code/compiledMethod.cpp b/src/share/vm/code/compiledMethod.cpp --- a/src/share/vm/code/compiledMethod.cpp +++ b/src/share/vm/code/compiledMethod.cpp @@ -24,6 +24,7 @@ #include "precompiled.hpp" #include "code/compiledIC.hpp" +#include "code/compiledMethod.inline.hpp" #include "code/scopeDesc.hpp" #include "code/codeCache.hpp" #include "prims/methodHandles.hpp" @@ -59,15 +60,6 @@ return pd->is_method_handle_invoke(); } -// When using JVMCI the address might be off by the size of a call instruction. -bool CompiledMethod::is_deopt_entry(address pc) { - return pc == deopt_handler_begin() -#if INCLUDE_JVMCI - || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::instruction_size)) -#endif - ; -} - // Returns a string version of the method state. const char* CompiledMethod::state() const { int state = get_state(); @@ -321,15 +313,7 @@ // Return the original PC for the given PC if: // (a) the given PC belongs to a nmethod and // (b) it is a deopt PC -address CompiledMethod::get_deopt_original_pc(const frame* fr) { - if (fr->cb() == NULL) return NULL; - CompiledMethod* cm = fr->cb()->as_compiled_method_or_null(); - if (cm != NULL && cm->is_deopt_pc(fr->pc())) - return cm->get_original_pc(fr); - - return NULL; -} Method* CompiledMethod::attached_method(address call_instr) { assert(code_contains(call_instr), "not part of the nmethod"); diff --git a/src/share/vm/code/compiledMethod.inline.hpp b/src/share/vm/code/compiledMethod.inline.hpp new file mode 100644 --- /dev/null +++ b/src/share/vm/code/compiledMethod.inline.hpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CODE_COMPILEDMETHOD_INLINE_HPP +#define SHARE_VM_CODE_COMPILEDMETHOD_INLINE_HPP + +#include "code/compiledMethod.hpp" +#include "code/nativeInst.hpp" +#include "runtime/frame.hpp" + +// When using JVMCI the address might be off by the size of a call instruction. +inline bool CompiledMethod::is_deopt_entry(address pc) { + return pc == deopt_handler_begin() +#if INCLUDE_JVMCI + || (is_compiled_by_jvmci() && pc == (deopt_handler_begin() + NativeCall::instruction_size)) +#endif + ; +} + +inline address CompiledMethod::get_deopt_original_pc(const frame* fr) { + if (fr->cb() == NULL) return NULL; + + CompiledMethod* cm = fr->cb()->as_compiled_method_or_null(); + if (cm != NULL && cm->is_deopt_pc(fr->pc())) + return cm->get_original_pc(fr); + + return NULL; +} +#endif //SHARE_VM_CODE_COMPILEDMETHOD_INLINE_HPP diff --git a/src/share/vm/runtime/frame.inline.hpp b/src/share/vm/runtime/frame.inline.hpp --- a/src/share/vm/runtime/frame.inline.hpp +++ b/src/share/vm/runtime/frame.inline.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_VM_RUNTIME_FRAME_INLINE_HPP #define SHARE_VM_RUNTIME_FRAME_INLINE_HPP +#include "code/compiledMethod.inline.hpp" #include "interpreter/bytecodeInterpreter.hpp" #include "interpreter/bytecodeInterpreter.inline.hpp" #include "interpreter/interpreter.hpp"