src/cpu/x86/vm/templateInterpreter_x86.cpp

Fri, 16 Aug 2019 16:50:17 +0200

author
eosterlund
date
Fri, 16 Aug 2019 16:50:17 +0200
changeset 9834
bb1da64b0492
parent 0
f90c822e73f8
permissions
-rw-r--r--

8229345: Memory leak due to vtable stubs not being shared on SPARC
Reviewed-by: mdoerr, dholmes, kvn

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation.
aoqi@0 8 *
aoqi@0 9 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 12 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 13 * accompanied this code).
aoqi@0 14 *
aoqi@0 15 * You should have received a copy of the GNU General Public License version
aoqi@0 16 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 18 *
aoqi@0 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 20 * or visit www.oracle.com if you need additional information or have any
aoqi@0 21 * questions.
aoqi@0 22 *
aoqi@0 23 */
aoqi@0 24
aoqi@0 25 #include "precompiled.hpp"
aoqi@0 26 #include "ci/ciMethod.hpp"
aoqi@0 27 #include "interpreter/interpreter.hpp"
aoqi@0 28 #include "runtime/frame.inline.hpp"
aoqi@0 29
aoqi@0 30 #ifndef CC_INTERP
aoqi@0 31
aoqi@0 32 // asm based interpreter deoptimization helpers
aoqi@0 33 int AbstractInterpreter::size_activation(int max_stack,
aoqi@0 34 int temps,
aoqi@0 35 int extra_args,
aoqi@0 36 int monitors,
aoqi@0 37 int callee_params,
aoqi@0 38 int callee_locals,
aoqi@0 39 bool is_top_frame) {
aoqi@0 40 // Note: This calculation must exactly parallel the frame setup
aoqi@0 41 // in AbstractInterpreterGenerator::generate_method_entry.
aoqi@0 42
aoqi@0 43 // fixed size of an interpreter frame:
aoqi@0 44 int overhead = frame::sender_sp_offset -
aoqi@0 45 frame::interpreter_frame_initial_sp_offset;
aoqi@0 46 // Our locals were accounted for by the caller (or last_frame_adjust
aoqi@0 47 // on the transistion) Since the callee parameters already account
aoqi@0 48 // for the callee's params we only need to account for the extra
aoqi@0 49 // locals.
aoqi@0 50 int size = overhead +
aoqi@0 51 (callee_locals - callee_params)*Interpreter::stackElementWords +
aoqi@0 52 monitors * frame::interpreter_frame_monitor_size() +
aoqi@0 53 temps* Interpreter::stackElementWords + extra_args;
aoqi@0 54
aoqi@0 55 return size;
aoqi@0 56 }
aoqi@0 57
aoqi@0 58 void AbstractInterpreter::layout_activation(Method* method,
aoqi@0 59 int tempcount,
aoqi@0 60 int popframe_extra_args,
aoqi@0 61 int moncount,
aoqi@0 62 int caller_actual_parameters,
aoqi@0 63 int callee_param_count,
aoqi@0 64 int callee_locals,
aoqi@0 65 frame* caller,
aoqi@0 66 frame* interpreter_frame,
aoqi@0 67 bool is_top_frame,
aoqi@0 68 bool is_bottom_frame) {
aoqi@0 69 // The frame interpreter_frame is guaranteed to be the right size,
aoqi@0 70 // as determined by a previous call to the size_activation() method.
aoqi@0 71 // It is also guaranteed to be walkable even though it is in a
aoqi@0 72 // skeletal state
aoqi@0 73
aoqi@0 74 int max_locals = method->max_locals() * Interpreter::stackElementWords;
aoqi@0 75 int extra_locals = (method->max_locals() - method->size_of_parameters()) *
aoqi@0 76 Interpreter::stackElementWords;
aoqi@0 77
aoqi@0 78 #ifdef ASSERT
aoqi@0 79 if (!EnableInvokeDynamic) {
aoqi@0 80 // @@@ FIXME: Should we correct interpreter_frame_sender_sp in the calling sequences?
aoqi@0 81 // Probably, since deoptimization doesn't work yet.
aoqi@0 82 assert(caller->unextended_sp() == interpreter_frame->interpreter_frame_sender_sp(), "Frame not properly walkable");
aoqi@0 83 }
aoqi@0 84 assert(caller->sp() == interpreter_frame->sender_sp(), "Frame not properly walkable(2)");
aoqi@0 85 #endif
aoqi@0 86
aoqi@0 87 interpreter_frame->interpreter_frame_set_method(method);
aoqi@0 88 // NOTE the difference in using sender_sp and
aoqi@0 89 // interpreter_frame_sender_sp interpreter_frame_sender_sp is
aoqi@0 90 // the original sp of the caller (the unextended_sp) and
aoqi@0 91 // sender_sp is fp+8/16 (32bit/64bit) XXX
aoqi@0 92 intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1;
aoqi@0 93
aoqi@0 94 #ifdef ASSERT
aoqi@0 95 if (caller->is_interpreted_frame()) {
aoqi@0 96 assert(locals < caller->fp() + frame::interpreter_frame_initial_sp_offset, "bad placement");
aoqi@0 97 }
aoqi@0 98 #endif
aoqi@0 99
aoqi@0 100 interpreter_frame->interpreter_frame_set_locals(locals);
aoqi@0 101 BasicObjectLock* montop = interpreter_frame->interpreter_frame_monitor_begin();
aoqi@0 102 BasicObjectLock* monbot = montop - moncount;
aoqi@0 103 interpreter_frame->interpreter_frame_set_monitor_end(monbot);
aoqi@0 104
aoqi@0 105 // Set last_sp
aoqi@0 106 intptr_t* esp = (intptr_t*) monbot -
aoqi@0 107 tempcount*Interpreter::stackElementWords -
aoqi@0 108 popframe_extra_args;
aoqi@0 109 interpreter_frame->interpreter_frame_set_last_sp(esp);
aoqi@0 110
aoqi@0 111 // All frames but the initial (oldest) interpreter frame we fill in have
aoqi@0 112 // a value for sender_sp that allows walking the stack but isn't
aoqi@0 113 // truly correct. Correct the value here.
aoqi@0 114 if (extra_locals != 0 &&
aoqi@0 115 interpreter_frame->sender_sp() ==
aoqi@0 116 interpreter_frame->interpreter_frame_sender_sp()) {
aoqi@0 117 interpreter_frame->set_interpreter_frame_sender_sp(caller->sp() +
aoqi@0 118 extra_locals);
aoqi@0 119 }
aoqi@0 120 *interpreter_frame->interpreter_frame_cache_addr() =
aoqi@0 121 method->constants()->cache();
aoqi@0 122 }
aoqi@0 123
aoqi@0 124 #endif // CC_INTERP

mercurial