1 /*
2 * Copyright (c) 1999, 2020, 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_C1_C1_CODESTUBS_HPP
26 #define SHARE_C1_C1_CODESTUBS_HPP
27
28 #include "c1/c1_FrameMap.hpp"
29 #include "c1/c1_IR.hpp"
30 #include "c1/c1_Instruction.hpp"
31 #include "c1/c1_LIR.hpp"
32 #include "c1/c1_Runtime1.hpp"
33 #include "code/nativeInst.hpp"
34 #include "utilities/growableArray.hpp"
35 #include "utilities/macros.hpp"
36
37 class CodeEmitInfo;
38 class LIR_Assembler;
39 class LIR_OpVisitState;
40
41 // CodeStubs are little 'out-of-line' pieces of code that
42 // usually handle slow cases of operations. All code stubs
43 // are collected and code is emitted at the end of the
44 // nmethod.
45
46 class CodeStub: public CompilationResourceObj {
47 protected:
48 Label _entry; // label at the stub entry point
49 Label _continuation; // label where stub continues, if any
50
51 public:
52 CodeStub() {}
53
54 // code generation
55 void assert_no_unbound_labels() { assert(!_entry.is_unbound() && !_continuation.is_unbound(), "unbound label"); }
56 virtual void emit_code(LIR_Assembler* e) = 0;
57 virtual CodeEmitInfo* info() const { return NULL; }
58 virtual bool is_exception_throw_stub() const { return false; }
59 virtual bool is_range_check_stub() const { return false; }
60 virtual bool is_divbyzero_stub() const { return false; }
61 virtual bool is_simple_exception_stub() const { return false; }
62 #ifndef PRODUCT
63 virtual void print_name(outputStream* out) const = 0;
64 #endif
65
66 // label access
67 Label* entry() { return &_entry; }
68 Label* continuation() { return &_continuation; }
69 // for LIR
70 virtual void visit(LIR_OpVisitState* visit) {
71 #ifndef PRODUCT
72 if (LIRTracePeephole && Verbose) {
73 tty->print("no visitor for ");
74 print_name(tty);
75 tty->cr();
76 }
77 #endif
78 }
79 };
80
81 class CodeStubList: public GrowableArray<CodeStub*> {
82 public:
83 CodeStubList(): GrowableArray<CodeStub*>() {}
84
85 void append(CodeStub* stub) {
86 if (!contains(stub)) {
87 GrowableArray<CodeStub*>::append(stub);
88 }
89 }
90 };
91
92 class C1SafepointPollStub: public CodeStub {
93 private:
94 uintptr_t _safepoint_offset;
95
96 public:
97 C1SafepointPollStub() :
98 _safepoint_offset(0) {
99 }
100
101 uintptr_t safepoint_offset() { return _safepoint_offset; }
102 void set_safepoint_offset(uintptr_t safepoint_offset) { _safepoint_offset = safepoint_offset; }
103
104 virtual void emit_code(LIR_Assembler* e);
105 virtual void visit(LIR_OpVisitState* visitor) {
106 // don't pass in the code emit info since it's processed in the fast path
107 visitor->do_slow_case();
108 }
109 #ifndef PRODUCT
110 virtual void print_name(outputStream* out) const { out->print("C1SafepointPollStub"); }
111 #endif // PRODUCT
112 };
113
114 class CounterOverflowStub: public CodeStub {
115 private:
116 CodeEmitInfo* _info;
117 int _bci;
118 LIR_Opr _method;
119
120 public:
121 CounterOverflowStub(CodeEmitInfo* info, int bci, LIR_Opr method) : _info(info), _bci(bci), _method(method) {
122 }
123
124 virtual void emit_code(LIR_Assembler* e);
125
126 virtual void visit(LIR_OpVisitState* visitor) {
127 visitor->do_slow_case(_info);
128 visitor->do_input(_method);
129 }
130
131 #ifndef PRODUCT
132 virtual void print_name(outputStream* out) const { out->print("CounterOverflowStub"); }
133 #endif // PRODUCT
134
135 };
136
137 class ConversionStub: public CodeStub {
138 private:
139 Bytecodes::Code _bytecode;
140 LIR_Opr _input;
141 LIR_Opr _result;
142
143 static float float_zero;
144 static double double_zero;
145 public:
146 ConversionStub(Bytecodes::Code bytecode, LIR_Opr input, LIR_Opr result)
147 : _bytecode(bytecode), _input(input), _result(result) {
148 NOT_IA32( ShouldNotReachHere(); ) // used only on x86-32
149 }
150
151 Bytecodes::Code bytecode() { return _bytecode; }
152 LIR_Opr input() { return _input; }
153 LIR_Opr result() { return _result; }
154
155 virtual void emit_code(LIR_Assembler* e);
156 virtual void visit(LIR_OpVisitState* visitor) {
157 visitor->do_slow_case();
158 visitor->do_input(_input);
159 visitor->do_output(_result);
160 }
161 #ifndef PRODUCT
162 virtual void print_name(outputStream* out) const { out->print("ConversionStub"); }
163 #endif // PRODUCT
164 };
165
166
167 // Throws ArrayIndexOutOfBoundsException by default but can be
168 // configured to throw IndexOutOfBoundsException in constructor
169 class RangeCheckStub: public CodeStub {
170 private:
171 CodeEmitInfo* _info;
172 LIR_Opr _index;
173 LIR_Opr _array;
174 bool _throw_index_out_of_bounds_exception;
175
176 public:
177 // For ArrayIndexOutOfBoundsException.
178 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, LIR_Opr array);
179 // For IndexOutOfBoundsException.
180 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index);
181 virtual void emit_code(LIR_Assembler* e);
182 virtual CodeEmitInfo* info() const { return _info; }
183 virtual bool is_exception_throw_stub() const { return true; }
184 virtual bool is_range_check_stub() const { return true; }
185 virtual void visit(LIR_OpVisitState* visitor) {
186 visitor->do_slow_case(_info);
187 visitor->do_input(_index);
188 if (_array) { visitor->do_input(_array); }
189 }
190 #ifndef PRODUCT
191 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); }
192 #endif // PRODUCT
193 };
194
195 // stub used when predicate fails and deoptimization is needed
196 class PredicateFailedStub: public CodeStub {
197 private:
198 CodeEmitInfo* _info;
199
200 public:
201 PredicateFailedStub(CodeEmitInfo* info);
202 virtual void emit_code(LIR_Assembler* e);
203 virtual CodeEmitInfo* info() const { return _info; }
204 virtual void visit(LIR_OpVisitState* visitor) {
205 visitor->do_slow_case(_info);
206 }
207 #ifndef PRODUCT
208 virtual void print_name(outputStream* out) const { out->print("PredicateFailedStub"); }
209 #endif // PRODUCT
210 };
211
212 class DivByZeroStub: public CodeStub {
213 private:
214 CodeEmitInfo* _info;
215 int _offset;
216
217 public:
218 DivByZeroStub(CodeEmitInfo* info)
219 : _info(info), _offset(-1) {
220 }
221 DivByZeroStub(int offset, CodeEmitInfo* info)
222 : _info(info), _offset(offset) {
223 }
224 virtual void emit_code(LIR_Assembler* e);
225 virtual CodeEmitInfo* info() const { return _info; }
226 virtual bool is_exception_throw_stub() const { return true; }
227 virtual bool is_divbyzero_stub() const { return true; }
228 virtual void visit(LIR_OpVisitState* visitor) {
229 visitor->do_slow_case(_info);
230 }
231 #ifndef PRODUCT
232 virtual void print_name(outputStream* out) const { out->print("DivByZeroStub"); }
233 #endif // PRODUCT
234 };
235
236
237 class ImplicitNullCheckStub: public CodeStub {
238 private:
239 CodeEmitInfo* _info;
240 int _offset;
241
242 public:
243 ImplicitNullCheckStub(int offset, CodeEmitInfo* info)
244 : _info(info), _offset(offset) {
245 }
246 virtual void emit_code(LIR_Assembler* e);
247 virtual CodeEmitInfo* info() const { return _info; }
248 virtual bool is_exception_throw_stub() const { return true; }
249 virtual void visit(LIR_OpVisitState* visitor) {
250 visitor->do_slow_case(_info);
251 }
252 #ifndef PRODUCT
253 virtual void print_name(outputStream* out) const { out->print("ImplicitNullCheckStub"); }
254 #endif // PRODUCT
255 };
256
257
258 class NewInstanceStub: public CodeStub {
259 private:
260 ciInstanceKlass* _klass;
261 LIR_Opr _klass_reg;
262 LIR_Opr _result;
263 CodeEmitInfo* _info;
264 Runtime1::StubID _stub_id;
265
266 public:
267 NewInstanceStub(LIR_Opr klass_reg, LIR_Opr result, ciInstanceKlass* klass, CodeEmitInfo* info, Runtime1::StubID stub_id);
268 virtual void emit_code(LIR_Assembler* e);
269 virtual CodeEmitInfo* info() const { return _info; }
270 virtual void visit(LIR_OpVisitState* visitor) {
271 visitor->do_slow_case(_info);
272 visitor->do_input(_klass_reg);
273 visitor->do_output(_result);
274 }
275 #ifndef PRODUCT
276 virtual void print_name(outputStream* out) const { out->print("NewInstanceStub"); }
277 #endif // PRODUCT
278 };
279
280
281 class NewTypeArrayStub: public CodeStub {
282 private:
283 LIR_Opr _klass_reg;
284 LIR_Opr _length;
285 LIR_Opr _result;
286 CodeEmitInfo* _info;
287
288 public:
289 NewTypeArrayStub(LIR_Opr klass_reg, LIR_Opr length, LIR_Opr result, CodeEmitInfo* info);
290 virtual void emit_code(LIR_Assembler* e);
291 virtual CodeEmitInfo* info() const { return _info; }
292 virtual void visit(LIR_OpVisitState* visitor) {
293 visitor->do_slow_case(_info);
294 visitor->do_input(_klass_reg);
295 visitor->do_input(_length);
296 assert(_result->is_valid(), "must be valid"); visitor->do_output(_result);
297 }
298 #ifndef PRODUCT
299 virtual void print_name(outputStream* out) const { out->print("NewTypeArrayStub"); }
300 #endif // PRODUCT
301 };
302
303
304 class NewObjectArrayStub: public CodeStub {
305 private:
306 LIR_Opr _klass_reg;
307 LIR_Opr _length;
308 LIR_Opr _result;
309 CodeEmitInfo* _info;
310
311 public:
312 NewObjectArrayStub(LIR_Opr klass_reg, LIR_Opr length, LIR_Opr result, CodeEmitInfo* info);
313 virtual void emit_code(LIR_Assembler* e);
314 virtual CodeEmitInfo* info() const { return _info; }
315 virtual void visit(LIR_OpVisitState* visitor) {
316 visitor->do_slow_case(_info);
317 visitor->do_input(_klass_reg);
318 visitor->do_input(_length);
319 assert(_result->is_valid(), "must be valid"); visitor->do_output(_result);
320 }
321 #ifndef PRODUCT
322 virtual void print_name(outputStream* out) const { out->print("NewObjectArrayStub"); }
323 #endif // PRODUCT
324 };
325
326
327 class MonitorAccessStub: public CodeStub {
328 protected:
329 LIR_Opr _obj_reg;
330 LIR_Opr _lock_reg;
331
332 public:
333 MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg) {
334 _obj_reg = obj_reg;
335 _lock_reg = lock_reg;
336 }
337
338 #ifndef PRODUCT
339 virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); }
340 #endif // PRODUCT
341 };
342
343
344 class MonitorEnterStub: public MonitorAccessStub {
345 private:
346 CodeEmitInfo* _info;
347
348 public:
349 MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info);
350
351 virtual void emit_code(LIR_Assembler* e);
352 virtual CodeEmitInfo* info() const { return _info; }
353 virtual void visit(LIR_OpVisitState* visitor) {
354 visitor->do_input(_obj_reg);
355 visitor->do_input(_lock_reg);
356 visitor->do_slow_case(_info);
357 }
358 #ifndef PRODUCT
359 virtual void print_name(outputStream* out) const { out->print("MonitorEnterStub"); }
360 #endif // PRODUCT
361 };
362
363
364 class MonitorExitStub: public MonitorAccessStub {
365 private:
366 bool _compute_lock;
367 int _monitor_ix;
368
369 public:
370 MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix)
371 : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg),
372 _compute_lock(compute_lock), _monitor_ix(monitor_ix) { }
373 virtual void emit_code(LIR_Assembler* e);
374 virtual void visit(LIR_OpVisitState* visitor) {
375 assert(_obj_reg->is_illegal(), "unused");
376 if (_compute_lock) {
377 visitor->do_temp(_lock_reg);
378 } else {
379 visitor->do_input(_lock_reg);
380 }
381 }
382 #ifndef PRODUCT
383 virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); }
384 #endif // PRODUCT
385 };
386
387
388 class PatchingStub: public CodeStub {
389 public:
390 enum PatchID {
391 access_field_id,
392 load_klass_id,
393 load_mirror_id,
394 load_appendix_id
395 };
396 enum constants {
397 patch_info_size = 3
398 };
399 private:
400 PatchID _id;
401 address _pc_start;
402 int _bytes_to_copy;
403 Label _patched_code_entry;
404 Label _patch_site_entry;
405 Label _patch_site_continuation;
406 Register _obj;
407 CodeEmitInfo* _info;
408 int _index; // index of the patchable oop or Klass* in nmethod or metadata table if needed
409 static int _patch_info_offset;
410
411 void align_patch_site(MacroAssembler* masm);
412
413 public:
414 static int patch_info_offset() { return _patch_info_offset; }
415
416 PatchingStub(MacroAssembler* masm, PatchID id, int index = -1):
417 _id(id)
418 , _info(NULL)
419 , _index(index) {
420 // force alignment of patch sites so we
421 // can guarantee atomic writes to the patch site.
422 align_patch_site(masm);
423 _pc_start = masm->pc();
424 masm->bind(_patch_site_entry);
425 }
426
427 void install(MacroAssembler* masm, LIR_PatchCode patch_code, Register obj, CodeEmitInfo* info) {
428 _info = info;
429 _obj = obj;
430 masm->bind(_patch_site_continuation);
431 _bytes_to_copy = masm->pc() - pc_start();
432 if (_id == PatchingStub::access_field_id) {
433 // embed a fixed offset to handle long patches which need to be offset by a word.
434 // the patching code will just add the field offset field to this offset so
435 // that we can reference either the high or low word of a double word field.
436 int field_offset = 0;
437 switch (patch_code) {
438 case lir_patch_low: field_offset = lo_word_offset_in_bytes; break;
439 case lir_patch_high: field_offset = hi_word_offset_in_bytes; break;
440 case lir_patch_normal: field_offset = 0; break;
441 default: ShouldNotReachHere();
442 }
443 NativeMovRegMem* n_move = nativeMovRegMem_at(pc_start());
444 n_move->set_offset(field_offset);
445 // Copy will never get executed, so only copy the part which is required for patching.
446 _bytes_to_copy = MAX2(n_move->num_bytes_to_end_of_patch(), (int)NativeGeneralJump::instruction_size);
447 } else if (_id == load_klass_id || _id == load_mirror_id || _id == load_appendix_id) {
448 assert(_obj != noreg, "must have register object for load_klass/load_mirror");
449 #ifdef ASSERT
450 // verify that we're pointing at a NativeMovConstReg
451 nativeMovConstReg_at(pc_start());
452 #endif
453 } else {
454 ShouldNotReachHere();
455 }
456 assert(_bytes_to_copy <= (masm->pc() - pc_start()), "not enough bytes");
457 }
458
459 address pc_start() const { return _pc_start; }
460 PatchID id() const { return _id; }
461
462 virtual void emit_code(LIR_Assembler* e);
463 virtual CodeEmitInfo* info() const { return _info; }
464 virtual void visit(LIR_OpVisitState* visitor) {
465 visitor->do_slow_case(_info);
466 }
467 #ifndef PRODUCT
468 virtual void print_name(outputStream* out) const { out->print("PatchingStub"); }
469 #endif // PRODUCT
470 };
471
472
473 //------------------------------------------------------------------------------
474 // DeoptimizeStub
475 //
476 class DeoptimizeStub : public CodeStub {
477 private:
478 CodeEmitInfo* _info;
479 jint _trap_request;
480
481 public:
482 DeoptimizeStub(CodeEmitInfo* info, Deoptimization::DeoptReason reason, Deoptimization::DeoptAction action) :
483 _info(new CodeEmitInfo(info)), _trap_request(Deoptimization::make_trap_request(reason, action)) {}
484
485 virtual void emit_code(LIR_Assembler* e);
486 virtual CodeEmitInfo* info() const { return _info; }
487 virtual bool is_exception_throw_stub() const { return true; }
488 virtual void visit(LIR_OpVisitState* visitor) {
489 visitor->do_slow_case(_info);
490 }
491 #ifndef PRODUCT
492 virtual void print_name(outputStream* out) const { out->print("DeoptimizeStub"); }
493 #endif // PRODUCT
494 };
495
496
497 class SimpleExceptionStub: public CodeStub {
498 private:
499 LIR_Opr _obj;
500 Runtime1::StubID _stub;
501 CodeEmitInfo* _info;
502
503 public:
504 SimpleExceptionStub(Runtime1::StubID stub, LIR_Opr obj, CodeEmitInfo* info):
505 _obj(obj), _stub(stub), _info(info) {
506 }
507
508 void set_obj(LIR_Opr obj) {
509 _obj = obj;
510 }
511
512 virtual void emit_code(LIR_Assembler* e);
513 virtual CodeEmitInfo* info() const { return _info; }
514 virtual bool is_exception_throw_stub() const { return true; }
515 virtual bool is_simple_exception_stub() const { return true; }
516 virtual void visit(LIR_OpVisitState* visitor) {
517 if (_obj->is_valid()) visitor->do_input(_obj);
518 visitor->do_slow_case(_info);
519 }
520 #ifndef PRODUCT
521 virtual void print_name(outputStream* out) const { out->print("SimpleExceptionStub"); }
522 #endif // PRODUCT
523 };
524
525
526
527 class ArrayStoreExceptionStub: public SimpleExceptionStub {
528 private:
529 CodeEmitInfo* _info;
530
531 public:
532 ArrayStoreExceptionStub(LIR_Opr obj, CodeEmitInfo* info): SimpleExceptionStub(Runtime1::throw_array_store_exception_id, obj, info) {}
533 #ifndef PRODUCT
534 virtual void print_name(outputStream* out) const { out->print("ArrayStoreExceptionStub"); }
535 #endif // PRODUCT
536 };
537
538
539 class ArrayCopyStub: public CodeStub {
540 private:
541 LIR_OpArrayCopy* _op;
542
543 public:
544 ArrayCopyStub(LIR_OpArrayCopy* op): _op(op) { }
545
546 LIR_Opr src() const { return _op->src(); }
547 LIR_Opr src_pos() const { return _op->src_pos(); }
548 LIR_Opr dst() const { return _op->dst(); }
549 LIR_Opr dst_pos() const { return _op->dst_pos(); }
550 LIR_Opr length() const { return _op->length(); }
551 LIR_Opr tmp() const { return _op->tmp(); }
552
553 virtual void emit_code(LIR_Assembler* e);
554 virtual CodeEmitInfo* info() const { return _op->info(); }
555 virtual void visit(LIR_OpVisitState* visitor) {
556 // don't pass in the code emit info since it's processed in the fast path
557 visitor->do_slow_case();
558 }
559 #ifndef PRODUCT
560 virtual void print_name(outputStream* out) const { out->print("ArrayCopyStub"); }
561 #endif // PRODUCT
562 };
563
564 #endif // SHARE_C1_C1_CODESTUBS_HPP