1/*
2 * Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
26#define SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
27
28#include "interpreter/bytecode.hpp"
29#include "interpreter/linkResolver.hpp"
30#include "oops/method.hpp"
31#include "runtime/frame.hpp"
32#include "runtime/signature.hpp"
33#include "runtime/thread.hpp"
34#include "utilities/macros.hpp"
35
36// The InterpreterRuntime is called by the interpreter for everything
37// that cannot/should not be dealt with in assembly and needs C support.
38
39class InterpreterRuntime: AllStatic {
40 friend class BytecodeClosure; // for method and bcp
41 friend class PrintingClosure; // for method and bcp
42
43 private:
44
45 static void set_bcp_and_mdp(address bcp, JavaThread*thread);
46 static void note_trap_inner(JavaThread* thread, int reason,
47 const methodHandle& trap_method, int trap_bci, TRAPS);
48 static void note_trap(JavaThread *thread, int reason, TRAPS);
49#ifdef CC_INTERP
50 // Profile traps in C++ interpreter.
51 static void note_trap(JavaThread* thread, int reason, Method *method, int trap_bci);
52#endif // CC_INTERP
53
54 // Inner work method for Interpreter's frequency counter overflow.
55 static nmethod* frequency_counter_overflow_inner(JavaThread* thread, address branch_bcp);
56
57 public:
58 // Constants
59 static void ldc (JavaThread* thread, bool wide);
60 static void resolve_ldc (JavaThread* thread, Bytecodes::Code bytecode);
61
62 // Allocation
63 static void _new (JavaThread* thread, ConstantPool* pool, int index);
64 static void newarray (JavaThread* thread, BasicType type, jint size);
65 static void anewarray (JavaThread* thread, ConstantPool* pool, int index, jint size);
66 static void multianewarray(JavaThread* thread, jint* first_size_address);
67 static void register_finalizer(JavaThread* thread, oopDesc* obj);
68
69 // Quicken instance-of and check-cast bytecodes
70 static void quicken_io_cc(JavaThread* thread);
71
72 // Exceptions thrown by the interpreter
73 static void throw_AbstractMethodError(JavaThread* thread);
74 static void throw_AbstractMethodErrorWithMethod(JavaThread* thread, Method* oop);
75 static void throw_AbstractMethodErrorVerbose(JavaThread* thread,
76 Klass* recvKlass,
77 Method* missingMethod);
78
79 static void throw_IncompatibleClassChangeError(JavaThread* thread);
80 static void throw_IncompatibleClassChangeErrorVerbose(JavaThread* thread,
81 Klass* resc,
82 Klass* interfaceKlass);
83 static void throw_StackOverflowError(JavaThread* thread);
84 static void throw_delayed_StackOverflowError(JavaThread* thread);
85 static void throw_ArrayIndexOutOfBoundsException(JavaThread* thread, arrayOopDesc* a, jint index);
86 static void throw_ClassCastException(JavaThread* thread, oopDesc* obj);
87 static void create_exception(JavaThread* thread, char* name, char* message);
88 static void create_klass_exception(JavaThread* thread, char* name, oopDesc* obj);
89 static address exception_handler_for_exception(JavaThread* thread, oopDesc* exception);
90#if INCLUDE_JVMTI
91 static void member_name_arg_or_null(JavaThread* thread, address dmh, Method* m, address bcp);
92#endif
93 static void throw_pending_exception(JavaThread* thread);
94
95#ifdef CC_INTERP
96 // Profile traps in C++ interpreter.
97 static void note_nullCheck_trap (JavaThread* thread, Method *method, int trap_bci);
98 static void note_div0Check_trap (JavaThread* thread, Method *method, int trap_bci);
99 static void note_rangeCheck_trap(JavaThread* thread, Method *method, int trap_bci);
100 static void note_classCheck_trap(JavaThread* thread, Method *method, int trap_bci);
101 static void note_arrayCheck_trap(JavaThread* thread, Method *method, int trap_bci);
102 // A dummy for macros that shall not profile traps.
103 static void note_no_trap(JavaThread* thread, Method *method, int trap_bci) {}
104#endif // CC_INTERP
105
106 static void resolve_from_cache(JavaThread* thread, Bytecodes::Code bytecode);
107 private:
108 // Statics & fields
109 static void resolve_get_put(JavaThread* thread, Bytecodes::Code bytecode);
110
111 // Calls
112 static void resolve_invoke(JavaThread* thread, Bytecodes::Code bytecode);
113 static void resolve_invokehandle (JavaThread* thread);
114 static void resolve_invokedynamic(JavaThread* thread);
115
116 public:
117 // Synchronization
118 static void monitorenter(JavaThread* thread, BasicObjectLock* elem);
119 static void monitorexit (JavaThread* thread, BasicObjectLock* elem);
120
121 static void throw_illegal_monitor_state_exception(JavaThread* thread);
122 static void new_illegal_monitor_state_exception(JavaThread* thread);
123
124 // Breakpoints
125 static void _breakpoint(JavaThread* thread, Method* method, address bcp);
126 static Bytecodes::Code get_original_bytecode_at(JavaThread* thread, Method* method, address bcp);
127 static void set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code);
128
129 // Safepoints
130 static void at_safepoint(JavaThread* thread);
131
132 // Debugger support
133 static void post_field_access(JavaThread *thread, oopDesc* obj,
134 ConstantPoolCacheEntry *cp_entry);
135 static void post_field_modification(JavaThread *thread, oopDesc* obj,
136 ConstantPoolCacheEntry *cp_entry, jvalue *value);
137 static void post_method_entry(JavaThread *thread);
138 static void post_method_exit (JavaThread *thread);
139 static int interpreter_contains(address pc);
140
141 // Native signature handlers
142 static void prepare_native_call(JavaThread* thread, Method* method);
143 static address slow_signature_handler(JavaThread* thread,
144 Method* method,
145 intptr_t* from, intptr_t* to);
146
147#if defined(IA32) || defined(AMD64) || defined(ARM)
148 // Popframe support (only needed on x86, AMD64 and ARM)
149 static void popframe_move_outgoing_args(JavaThread* thread, void* src_address, void* dest_address);
150#endif
151
152 // bytecode tracing is only used by the TraceBytecodes
153 static intptr_t trace_bytecode(JavaThread* thread, intptr_t preserve_this_value, intptr_t tos, intptr_t tos2) PRODUCT_RETURN0;
154
155 // Platform dependent stuff
156#include CPU_HEADER(interpreterRT)
157
158 // optional normalization of fingerprints to reduce the number of adapters
159 static uint64_t normalize_fast_native_fingerprint(uint64_t fingerprint);
160
161 // Interpreter's frequency counter overflow
162 static nmethod* frequency_counter_overflow(JavaThread* thread, address branch_bcp);
163
164 // Interpreter profiling support
165 static jint bcp_to_di(Method* method, address cur_bcp);
166 static void profile_method(JavaThread* thread);
167 static void update_mdp_for_ret(JavaThread* thread, int bci);
168#ifdef ASSERT
169 static void verify_mdp(Method* method, address bcp, address mdp);
170#endif // ASSERT
171 static MethodCounters* build_method_counters(JavaThread* thread, Method* m);
172};
173
174
175class SignatureHandlerLibrary: public AllStatic {
176 public:
177 enum { buffer_size = 1*K }; // the size of the temporary code buffer
178 enum { blob_size = 32*K }; // the size of a handler code blob.
179
180 private:
181 static BufferBlob* _handler_blob; // the current buffer blob containing the generated handlers
182 static address _handler; // next available address within _handler_blob;
183 static GrowableArray<uint64_t>* _fingerprints; // the fingerprint collection
184 static GrowableArray<address>* _handlers; // the corresponding handlers
185 static address _buffer; // the temporary code buffer
186
187 static address set_handler_blob();
188 static void initialize();
189 static address set_handler(CodeBuffer* buffer);
190 static void pd_set_handler(address handler);
191
192 public:
193 static void add(const methodHandle& method);
194 static void add(uint64_t fingerprint, address handler);
195};
196
197#endif // SHARE_INTERPRETER_INTERPRETERRUNTIME_HPP
198