1 /*
2 * Copyright (c) 1997, 2025, 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 #include "interpreter/interp_masm.hpp"
26 #include "interpreter/interpreter.hpp"
27 #include "interpreter/interpreterRuntime.hpp"
28 #include "interpreter/templateInterpreter.hpp"
29 #include "interpreter/templateInterpreterGenerator.hpp"
30 #include "interpreter/templateTable.hpp"
31 #include "logging/log.hpp"
32 #include "memory/resourceArea.hpp"
33 #include "prims/jvmtiExport.hpp"
34 #include "runtime/safepoint.hpp"
35 #include "runtime/timerTrace.hpp"
36 #include "utilities/checkedCast.hpp"
37 #include "utilities/copy.hpp"
38
39 # define __ _masm->
40
41 void TemplateInterpreter::initialize_stub() {
42 // assertions
43 assert(_code == nullptr, "must only initialize once");
44 assert((int)Bytecodes::number_of_codes <= (int)DispatchTable::length,
45 "dispatch table too small");
46
47 // allocate interpreter
48 int code_size = InterpreterCodeSize;
49 NOT_PRODUCT(code_size *= 4;) // debug uses extra interpreter code space
50 // 270+ interpreter codelets are generated and each of them is aligned to HeapWordSize,
51 // plus their code section is aligned to CodeEntryAlignement. So we need additional size due to alignment.
52 int max_aligned_codelets = 280;
53 int max_aligned_bytes = checked_cast<int>(max_aligned_codelets * (HeapWordSize + CodeEntryAlignment));
54 _code = new StubQueue(new InterpreterCodeletInterface, code_size + max_aligned_bytes, nullptr,
55 "Interpreter");
56 }
57
58 void TemplateInterpreter::initialize_code() {
59 InterpreterRuntime::init_counters();
60
61 AbstractInterpreter::initialize();
62
63 TemplateTable::initialize();
64
65 // generate interpreter
66 { ResourceMark rm;
67 TraceTime timer("Interpreter generation", TRACETIME_LOG(Info, startuptime));
68 TemplateInterpreterGenerator g;
69 // Free the unused memory not occupied by the interpreter and the stubs
70 _code->deallocate_unused_tail();
71 }
72
73 if (PrintInterpreter) {
74 ResourceMark rm;
75 print();
76 }
77
78 // initialize dispatch table
79 _active_table = _normal_table;
80 }
81
82 //------------------------------------------------------------------------------------------------------------------------
83 // Implementation of EntryPoint
84
85 EntryPoint::EntryPoint() {
86 assert(number_of_states == 10, "check the code below");
87 _entry[btos] = nullptr;
88 _entry[ztos] = nullptr;
89 _entry[ctos] = nullptr;
90 _entry[stos] = nullptr;
91 _entry[atos] = nullptr;
92 _entry[itos] = nullptr;
93 _entry[ltos] = nullptr;
94 _entry[ftos] = nullptr;
95 _entry[dtos] = nullptr;
96 _entry[vtos] = nullptr;
97 }
98
99
100 EntryPoint::EntryPoint(address bentry, address zentry, address centry, address sentry, address aentry, address ientry, address lentry, address fentry, address dentry, address ventry) {
101 assert(number_of_states == 10, "check the code below");
102 _entry[btos] = bentry;
103 _entry[ztos] = zentry;
104 _entry[ctos] = centry;
105 _entry[stos] = sentry;
106 _entry[atos] = aentry;
107 _entry[itos] = ientry;
108 _entry[ltos] = lentry;
109 _entry[ftos] = fentry;
110 _entry[dtos] = dentry;
111 _entry[vtos] = ventry;
112 }
113
114 EntryPoint::EntryPoint(address aentry, address ientry, address lentry, address fentry, address dentry, address ventry) {
115 assert(number_of_states == 10, "check the code below");
116 _entry[btos] = ientry;
117 _entry[ztos] = ientry;
118 _entry[ctos] = ientry;
119 _entry[stos] = ientry;
120 _entry[atos] = aentry;
121 _entry[itos] = ientry;
122 _entry[ltos] = lentry;
123 _entry[ftos] = fentry;
124 _entry[dtos] = dentry;
125 _entry[vtos] = ventry;
126 }
127
128 void EntryPoint::set_entry(TosState state, address entry) {
129 assert(0 <= state && state < number_of_states, "state out of bounds");
130 _entry[state] = entry;
131 }
132
133
134 address EntryPoint::entry(TosState state) const {
135 assert(0 <= state && state < number_of_states, "state out of bounds");
136 return _entry[state];
137 }
138
139
140 void EntryPoint::print() {
141 tty->print("[");
142 for (int i = 0; i < number_of_states; i++) {
143 if (i > 0) tty->print(", ");
144 tty->print(INTPTR_FORMAT, p2i(_entry[i]));
145 }
146 tty->print("]");
147 }
148
149
150 bool EntryPoint::operator == (const EntryPoint& y) {
151 int i = number_of_states;
152 while (i-- > 0) {
153 if (_entry[i] != y._entry[i]) return false;
154 }
155 return true;
156 }
157
158
159 //------------------------------------------------------------------------------------------------------------------------
160 // Implementation of DispatchTable
161
162 EntryPoint DispatchTable::entry(int i) const {
163 assert(0 <= i && i < length, "index out of bounds");
164 return
165 EntryPoint(
166 _table[btos][i],
167 _table[ztos][i],
168 _table[ctos][i],
169 _table[stos][i],
170 _table[atos][i],
171 _table[itos][i],
172 _table[ltos][i],
173 _table[ftos][i],
174 _table[dtos][i],
175 _table[vtos][i]
176 );
177 }
178
179
180 void DispatchTable::set_entry(int i, EntryPoint& entry) {
181 assert(0 <= i && i < length, "index out of bounds");
182 assert(number_of_states == 10, "check the code below");
183 _table[btos][i] = entry.entry(btos);
184 _table[ztos][i] = entry.entry(ztos);
185 _table[ctos][i] = entry.entry(ctos);
186 _table[stos][i] = entry.entry(stos);
187 _table[atos][i] = entry.entry(atos);
188 _table[itos][i] = entry.entry(itos);
189 _table[ltos][i] = entry.entry(ltos);
190 _table[ftos][i] = entry.entry(ftos);
191 _table[dtos][i] = entry.entry(dtos);
192 _table[vtos][i] = entry.entry(vtos);
193 }
194
195
196 bool DispatchTable::operator == (DispatchTable& y) {
197 int i = length;
198 while (i-- > 0) {
199 EntryPoint t = y.entry(i); // for compiler compatibility (BugId 4150096)
200 if (!(entry(i) == t)) return false;
201 }
202 return true;
203 }
204
205 address TemplateInterpreter::_remove_activation_entry = nullptr;
206 address TemplateInterpreter::_remove_activation_preserving_args_entry = nullptr;
207
208
209 address TemplateInterpreter::_throw_ArrayIndexOutOfBoundsException_entry = nullptr;
210 address TemplateInterpreter::_throw_ArrayStoreException_entry = nullptr;
211 address TemplateInterpreter::_throw_ArithmeticException_entry = nullptr;
212 address TemplateInterpreter::_throw_ClassCastException_entry = nullptr;
213 address TemplateInterpreter::_throw_NullPointerException_entry = nullptr;
214 address TemplateInterpreter::_throw_StackOverflowError_entry = nullptr;
215 address TemplateInterpreter::_throw_exception_entry = nullptr;
216 address TemplateInterpreter::_cont_resume_interpreter_adapter = nullptr;
217
218 #ifndef PRODUCT
219 EntryPoint TemplateInterpreter::_trace_code;
220 #endif // !PRODUCT
221 EntryPoint TemplateInterpreter::_return_entry[TemplateInterpreter::number_of_return_entries];
222 EntryPoint TemplateInterpreter::_earlyret_entry;
223 EntryPoint TemplateInterpreter::_deopt_entry [TemplateInterpreter::number_of_deopt_entries ];
224 address TemplateInterpreter::_deopt_reexecute_return_entry;
225 EntryPoint TemplateInterpreter::_safept_entry;
226
227 address TemplateInterpreter::_invoke_return_entry[TemplateInterpreter::number_of_return_addrs];
228 address TemplateInterpreter::_invokeinterface_return_entry[TemplateInterpreter::number_of_return_addrs];
229 address TemplateInterpreter::_invokedynamic_return_entry[TemplateInterpreter::number_of_return_addrs];
230
231 DispatchTable TemplateInterpreter::_active_table;
232 DispatchTable TemplateInterpreter::_normal_table;
233 DispatchTable TemplateInterpreter::_safept_table;
234 address TemplateInterpreter::_wentry_point[DispatchTable::length];
235
236
237 //------------------------------------------------------------------------------------------------------------------------
238 // Entry points
239
240 /**
241 * Returns the return entry table for the given invoke bytecode.
242 */
243 address* TemplateInterpreter::invoke_return_entry_table_for(Bytecodes::Code code) {
244 switch (code) {
245 case Bytecodes::_invokestatic:
246 case Bytecodes::_invokespecial:
247 case Bytecodes::_invokevirtual:
248 case Bytecodes::_invokehandle:
249 case Bytecodes::_fast_invokevfinal:
250 return Interpreter::invoke_return_entry_table();
251 case Bytecodes::_invokeinterface:
252 return Interpreter::invokeinterface_return_entry_table();
253 case Bytecodes::_invokedynamic:
254 return Interpreter::invokedynamic_return_entry_table();
255 default:
256 fatal("invalid bytecode: %s", Bytecodes::name(code));
257 return nullptr;
258 }
259 }
260
261 /**
262 * Returns the return entry address for the given top-of-stack state and bytecode.
263 */
264 address TemplateInterpreter::return_entry(TosState state, int length, Bytecodes::Code code) {
265 guarantee(0 <= length && length < Interpreter::number_of_return_entries, "illegal length");
266 const int index = TosState_as_index(state);
267 switch (code) {
268 case Bytecodes::_invokestatic:
269 case Bytecodes::_invokespecial:
270 case Bytecodes::_invokevirtual:
271 case Bytecodes::_invokehandle:
272 return _invoke_return_entry[index];
273 case Bytecodes::_invokeinterface:
274 return _invokeinterface_return_entry[index];
275 case Bytecodes::_invokedynamic:
276 return _invokedynamic_return_entry[index];
277 default:
278 assert(!Bytecodes::is_invoke(code), "invoke instructions should be handled separately: %s", Bytecodes::name(code));
279 address entry = _return_entry[length].entry(state);
280 vmassert(entry != nullptr, "unsupported return entry requested, length=%d state=%d", length, index);
281 return entry;
282 }
283 }
284
285
286 address TemplateInterpreter::deopt_entry(TosState state, int length) {
287 guarantee(0 <= length && length < Interpreter::number_of_deopt_entries, "illegal length");
288 address entry = _deopt_entry[length].entry(state);
289 vmassert(entry != nullptr, "unsupported deopt entry requested, length=%d state=%d", length, TosState_as_index(state));
290 return entry;
291 }
292
293 //------------------------------------------------------------------------------------------------------------------------
294 // Support for invokes
295
296 int TemplateInterpreter::TosState_as_index(TosState state) {
297 assert( state < number_of_states , "Invalid state in TosState_as_index");
298 assert(0 <= (int)state && (int)state < TemplateInterpreter::number_of_return_addrs, "index out of bounds");
299 return (int)state;
300 }
301
302
303 //------------------------------------------------------------------------------------------------------------------------
304 // Safepoint support
305
306 static inline void copy_table(address* from, address* to, int size) {
307 // Copy non-overlapping tables.
308 if (SafepointSynchronize::is_at_safepoint()) {
309 // Nothing is using the table at a safepoint so skip atomic word copy.
310 Copy::disjoint_words((HeapWord*)from, (HeapWord*)to, (size_t)size);
311 } else {
312 // Use atomic word copy when not at a safepoint for safety.
313 Copy::disjoint_words_atomic((HeapWord*)from, (HeapWord*)to, (size_t)size);
314 }
315 }
316
317 void TemplateInterpreter::notice_safepoints() {
318 if (!_notice_safepoints) {
319 log_debug(interpreter, safepoint)("switching active_table to safept_table.");
320 // switch to safepoint dispatch table
321 _notice_safepoints = true;
322 copy_table((address*)&_safept_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
323 } else {
324 log_debug(interpreter, safepoint)("active_table is already safept_table; "
325 "notice_safepoints() call is no-op.");
326 }
327 }
328
329 // switch from the dispatch table which notices safepoints back to the
330 // normal dispatch table. So that we can notice single stepping points,
331 // keep the safepoint dispatch table if we are single stepping in JVMTI.
332 // Note that the should_post_single_step test is exactly as fast as the
333 // JvmtiExport::_enabled test and covers both cases.
334 void TemplateInterpreter::ignore_safepoints() {
335 if (_notice_safepoints) {
336 if (!JvmtiExport::should_post_single_step()) {
337 log_debug(interpreter, safepoint)("switching active_table to normal_table.");
338 // switch to normal dispatch table
339 _notice_safepoints = false;
340 copy_table((address*)&_normal_table, (address*)&_active_table, sizeof(_active_table) / sizeof(address));
341 } else {
342 log_debug(interpreter, safepoint)("single stepping is still active; "
343 "ignoring ignore_safepoints() call.");
344 }
345 } else {
346 log_debug(interpreter, safepoint)("active_table is already normal_table; "
347 "ignore_safepoints() call is no-op.");
348 }
349 }
350
351 //------------------------------------------------------------------------------------------------------------------------
352 // Deoptimization support
353
354 // If deoptimization happens, this function returns the point of next bytecode to continue execution
355 address TemplateInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
356 return AbstractInterpreter::deopt_continue_after_entry(method, bcp, callee_parameters, is_top_frame);
357 }
358
359 // If deoptimization happens, this function returns the point where the interpreter reexecutes
360 // the bytecode.
361 // Note: Bytecodes::_athrow (C1 only) and Bytecodes::_return are the special cases
362 // that do not return "Interpreter::deopt_entry(vtos, 0)"
363 address TemplateInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
364 assert(method->contains(bcp), "just checkin'");
365 Bytecodes::Code code = Bytecodes::code_at(method, bcp);
366 if (code == Bytecodes::_return_register_finalizer) {
367 // This is used for deopt during registration of finalizers
368 // during Object.<init>. We simply need to resume execution at
369 // the standard return vtos bytecode to pop the frame normally.
370 // reexecuting the real bytecode would cause double registration
371 // of the finalizable object.
372 return Interpreter::deopt_reexecute_return_entry();
373 } else {
374 return AbstractInterpreter::deopt_reexecute_entry(method, bcp);
375 }
376 }
377
378 // If deoptimization happens, the interpreter should reexecute this bytecode.
379 // This function mainly helps the compilers to set up the reexecute bit.
380 bool TemplateInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
381 if (code == Bytecodes::_return) {
382 //Yes, we consider Bytecodes::_return as a special case of reexecution
383 return true;
384 } else {
385 return AbstractInterpreter::bytecode_should_reexecute(code);
386 }
387 }
388
389 InterpreterCodelet* TemplateInterpreter::codelet_containing(address pc) {
390 return (InterpreterCodelet*)_code->stub_containing(pc);
391 }