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 "classfile/vmSymbols.hpp"
26 #include "interpreter/bytecodeStream.hpp"
27 #include "logging/log.hpp"
28 #include "logging/logStream.hpp"
29 #include "memory/allocation.inline.hpp"
30 #include "memory/resourceArea.hpp"
31 #include "oops/constantPool.hpp"
32 #include "oops/generateOopMap.hpp"
33 #include "oops/oop.inline.hpp"
34 #include "oops/symbol.hpp"
35 #include "runtime/handles.inline.hpp"
36 #include "runtime/java.hpp"
37 #include "runtime/os.hpp"
38 #include "runtime/relocator.hpp"
39 #include "runtime/timerTrace.hpp"
40 #include "utilities/bitMap.inline.hpp"
41 #include "utilities/ostream.hpp"
42
43 //
44 //
45 // Compute stack layouts for each instruction in method.
46 //
47 // Problems:
48 // - What to do about jsr with different types of local vars?
49 // Need maps that are conditional on jsr path?
50 // - Jsr and exceptions should be done more efficiently (the retAddr stuff)
51 //
52 // Alternative:
53 // - Could extend verifier to provide this information.
54 // For: one fewer abstract interpreter to maintain. Against: the verifier
55 // solves a bigger problem so slower (undesirable to force verification of
56 // everything?).
57 //
58 // Algorithm:
59 // Partition bytecodes into basic blocks
60 // For each basic block: store entry state (vars, stack). For instructions
61 // inside basic blocks we do not store any state (instead we recompute it
62 // from state produced by previous instruction).
63 //
64 // Perform abstract interpretation of bytecodes over this lattice:
65 //
66 // _--'#'--_
67 // / / \ \
68 // / / \ \
69 // / | | \
70 // 'r' 'v' 'p' ' '
71 // \ | | /
72 // \ \ / /
73 // \ \ / /
74 // -- '@' --
75 //
76 // '#' top, result of conflict merge
77 // 'r' reference type
78 // 'v' value type
79 // 'p' pc type for jsr/ret
80 // ' ' uninitialized; never occurs on operand stack in Java
81 // '@' bottom/unexecuted; initial state each bytecode.
82 //
83 // Basic block headers are the only merge points. We use this iteration to
84 // compute the information:
85 //
86 // find basic blocks;
87 // initialize them with uninitialized state;
88 // initialize first BB according to method signature;
89 // mark first BB changed
90 // while (some BB is changed) do {
91 // perform abstract interpration of all bytecodes in BB;
92 // merge exit state of BB into entry state of all successor BBs,
93 // noting if any of these change;
94 // }
95 //
96 // One additional complication is necessary. The jsr instruction pushes
97 // a return PC on the stack (a 'p' type in the abstract interpretation).
98 // To be able to process "ret" bytecodes, we keep track of these return
99 // PC's in a 'retAddrs' structure in abstract interpreter context (when
100 // processing a "ret" bytecodes, it is not sufficient to know that it gets
101 // an argument of the right type 'p'; we need to know which address it
102 // returns to).
103 //
104 // (Note this comment is borrowed form the original author of the algorithm)
105
106 // ComputeCallStack
107 //
108 // Specialization of SignatureIterator - compute the effects of a call
109 //
110 class ComputeCallStack : public SignatureIterator {
111 CellTypeState *_effect;
112 int _idx;
113
114 void setup();
115 void set(CellTypeState state) { _effect[_idx++] = state; }
116 int length() { return _idx; };
117
118 friend class SignatureIterator; // so do_parameters_on can call do_type
119 void do_type(BasicType type, bool for_return = false) {
120 if (for_return && type == T_VOID) {
121 set(CellTypeState::bottom);
122 } else if (is_reference_type(type)) {
123 set(CellTypeState::ref);
124 } else {
125 assert(is_java_primitive(type), "");
126 set(CellTypeState::value);
127 if (is_double_word_type(type)) {
128 set(CellTypeState::value);
129 }
130 }
131 }
132
133 public:
134 ComputeCallStack(Symbol* signature) : SignatureIterator(signature) {};
135
136 // Compute methods
137 int compute_for_parameters(bool is_static, CellTypeState *effect) {
138 _idx = 0;
139 _effect = effect;
140
141 if (!is_static)
142 effect[_idx++] = CellTypeState::ref;
143
144 do_parameters_on(this);
145
146 return length();
147 };
148
149 int compute_for_returntype(CellTypeState *effect) {
150 _idx = 0;
151 _effect = effect;
152 do_type(return_type(), true);
153 set(CellTypeState::bottom); // Always terminate with a bottom state, so ppush works
154
155 return length();
156 }
157 };
158
159 //=========================================================================================
160 // ComputeEntryStack
161 //
162 // Specialization of SignatureIterator - in order to set up first stack frame
163 //
164 class ComputeEntryStack : public SignatureIterator {
165 CellTypeState *_effect;
166 int _idx;
167
168 void setup();
169 void set(CellTypeState state) { _effect[_idx++] = state; }
170 int length() { return _idx; };
171
172 friend class SignatureIterator; // so do_parameters_on can call do_type
173 void do_type(BasicType type, bool for_return = false) {
174 if (for_return && type == T_VOID) {
175 set(CellTypeState::bottom);
176 } else if (is_reference_type(type)) {
177 set(CellTypeState::make_slot_ref(_idx));
178 } else {
179 assert(is_java_primitive(type), "");
180 set(CellTypeState::value);
181 if (is_double_word_type(type)) {
182 set(CellTypeState::value);
183 }
184 }
185 }
186
187 public:
188 ComputeEntryStack(Symbol* signature) : SignatureIterator(signature) {};
189
190 // Compute methods
191 int compute_for_parameters(bool is_static, CellTypeState *effect) {
192 _idx = 0;
193 _effect = effect;
194
195 if (!is_static)
196 effect[_idx++] = CellTypeState::make_slot_ref(0);
197
198 do_parameters_on(this);
199
200 return length();
201 };
202
203 int compute_for_returntype(CellTypeState *effect) {
204 _idx = 0;
205 _effect = effect;
206 do_type(return_type(), true);
207 set(CellTypeState::bottom); // Always terminate with a bottom state, so ppush works
208
209 return length();
210 }
211 };
212
213 //=====================================================================================
214 //
215 // Implementation of RetTable/RetTableEntry
216 //
217 // Contains function to itereate through all bytecodes
218 // and find all return entry points
219 //
220 int RetTable::_init_nof_entries = 10;
221 int RetTableEntry::_init_nof_jsrs = 5;
222
223 RetTableEntry::RetTableEntry(int target, RetTableEntry *next) {
224 _target_bci = target;
225 _jsrs = new GrowableArray<int>(_init_nof_jsrs);
226 _next = next;
227 }
228
229 void RetTableEntry::add_delta(int bci, int delta) {
230 if (_target_bci > bci) _target_bci += delta;
231
232 for (int k = 0; k < _jsrs->length(); k++) {
233 int jsr = _jsrs->at(k);
234 if (jsr > bci) _jsrs->at_put(k, jsr+delta);
235 }
236 }
237
238 void RetTable::compute_ret_table(const methodHandle& method) {
239 BytecodeStream i(method);
240 Bytecodes::Code bytecode;
241
242 while( (bytecode = i.next()) >= 0) {
243 switch (bytecode) {
244 case Bytecodes::_jsr:
245 add_jsr(i.next_bci(), i.dest());
246 break;
247 case Bytecodes::_jsr_w:
248 add_jsr(i.next_bci(), i.dest_w());
249 break;
250 default:
251 break;
252 }
253 }
254 }
255
256 void RetTable::add_jsr(int return_bci, int target_bci) {
257 RetTableEntry* entry = _first;
258
259 // Scan table for entry
260 for (;entry && entry->target_bci() != target_bci; entry = entry->next());
261
262 if (!entry) {
263 // Allocate new entry and put in list
264 entry = new RetTableEntry(target_bci, _first);
265 _first = entry;
266 }
267
268 // Now "entry" is set. Make sure that the entry is initialized
269 // and has room for the new jsr.
270 entry->add_jsr(return_bci);
271 }
272
273 RetTableEntry* RetTable::find_jsrs_for_target(int targBci) {
274 RetTableEntry *cur = _first;
275
276 while(cur) {
277 assert(cur->target_bci() != -1, "sanity check");
278 if (cur->target_bci() == targBci) return cur;
279 cur = cur->next();
280 }
281 ShouldNotReachHere();
282 return nullptr;
283 }
284
285 // The instruction at bci is changing size by "delta". Update the return map.
286 void RetTable::update_ret_table(int bci, int delta) {
287 RetTableEntry *cur = _first;
288 while(cur) {
289 cur->add_delta(bci, delta);
290 cur = cur->next();
291 }
292 }
293
294 //
295 // Celltype state
296 //
297
298 CellTypeState CellTypeState::bottom = CellTypeState::make_bottom();
299 CellTypeState CellTypeState::uninit = CellTypeState::make_any(uninit_value);
300 CellTypeState CellTypeState::ref = CellTypeState::make_any(ref_conflict);
301 CellTypeState CellTypeState::value = CellTypeState::make_any(val_value);
302 CellTypeState CellTypeState::refUninit = CellTypeState::make_any(ref_conflict | uninit_value);
303 CellTypeState CellTypeState::top = CellTypeState::make_top();
304 CellTypeState CellTypeState::addr = CellTypeState::make_any(addr_conflict);
305
306 // Commonly used constants
307 static CellTypeState epsilonCTS[1] = { CellTypeState::bottom };
308 static CellTypeState refCTS = CellTypeState::ref;
309 static CellTypeState valCTS = CellTypeState::value;
310 static CellTypeState vCTS[2] = { CellTypeState::value, CellTypeState::bottom };
311 static CellTypeState rCTS[2] = { CellTypeState::ref, CellTypeState::bottom };
312 static CellTypeState rrCTS[3] = { CellTypeState::ref, CellTypeState::ref, CellTypeState::bottom };
313 static CellTypeState vrCTS[3] = { CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
314 static CellTypeState vvCTS[3] = { CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
315 static CellTypeState rvrCTS[4] = { CellTypeState::ref, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
316 static CellTypeState vvrCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
317 static CellTypeState vvvCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
318 static CellTypeState vvvrCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
319 static CellTypeState vvvvCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
320
321 char CellTypeState::to_char() const {
322 if (can_be_reference()) {
323 if (can_be_value() || can_be_address())
324 return '#'; // Conflict that needs to be rewritten
325 else
326 return 'r';
327 } else if (can_be_value())
328 return 'v';
329 else if (can_be_address())
330 return 'p';
331 else if (can_be_uninit())
332 return ' ';
333 else
334 return '@';
335 }
336
337
338 // Print a detailed CellTypeState. Indicate all bits that are set. If
339 // the CellTypeState represents an address or a reference, print the
340 // value of the additional information.
341 void CellTypeState::print(outputStream *os) {
342 if (can_be_address()) {
343 os->print("(p");
344 } else {
345 os->print("( ");
346 }
347 if (can_be_reference()) {
348 os->print("r");
349 } else {
350 os->print(" ");
351 }
352 if (can_be_value()) {
353 os->print("v");
354 } else {
355 os->print(" ");
356 }
357 if (can_be_uninit()) {
358 os->print("u|");
359 } else {
360 os->print(" |");
361 }
362 if (is_info_top()) {
363 os->print("Top)");
364 } else if (is_info_bottom()) {
365 os->print("Bot)");
366 } else {
367 if (is_reference()) {
368 int info = get_info();
369 int data = info & ~(ref_not_lock_bit | ref_slot_bit);
370 if (info & ref_not_lock_bit) {
371 // Not a monitor lock reference.
372 if (info & ref_slot_bit) {
373 // slot
374 os->print("slot%d)", data);
375 } else {
376 // line
377 os->print("line%d)", data);
378 }
379 } else {
380 // lock
381 os->print("lock%d)", data);
382 }
383 } else {
384 os->print("%d)", get_info());
385 }
386 }
387 }
388
389 //
390 // Basicblock handling methods
391 //
392
393 void GenerateOopMap::initialize_bb() {
394 _gc_points = 0;
395 _bb_count = 0;
396 _bb_hdr_bits.reinitialize(method()->code_size());
397 }
398
399 void GenerateOopMap::bb_mark_fct(GenerateOopMap *c, int bci, int *data) {
400 assert(bci>= 0 && bci < c->method()->code_size(), "index out of bounds");
401 if (c->is_bb_header(bci))
402 return;
403
404 if (TraceNewOopMapGeneration) {
405 tty->print_cr("Basicblock#%d begins at: %d", c->_bb_count, bci);
406 }
407 c->set_bbmark_bit(bci);
408 c->_bb_count++;
409 }
410
411
412 void GenerateOopMap::mark_bbheaders_and_count_gc_points() {
413 initialize_bb();
414
415 bool fellThrough = false; // False to get first BB marked.
416
417 // First mark all exception handlers as start of a basic-block
418 ExceptionTable excps(method());
419 for(int i = 0; i < excps.length(); i ++) {
420 bb_mark_fct(this, excps.handler_pc(i), nullptr);
421 }
422
423 // Then iterate through the code
424 BytecodeStream bcs(_method);
425 Bytecodes::Code bytecode;
426
427 while( (bytecode = bcs.next()) >= 0) {
428 int bci = bcs.bci();
429
430 if (!fellThrough)
431 bb_mark_fct(this, bci, nullptr);
432
433 fellThrough = jump_targets_do(&bcs, &GenerateOopMap::bb_mark_fct, nullptr);
434
435 /* We will also mark successors of jsr's as basic block headers. */
436 switch (bytecode) {
437 case Bytecodes::_jsr:
438 case Bytecodes::_jsr_w:
439 assert(!fellThrough, "should not happen");
440 // If this is the last bytecode, there is no successor to mark
441 if (bci + Bytecodes::length_for(bytecode) < method()->code_size()) {
442 bb_mark_fct(this, bci + Bytecodes::length_for(bytecode), nullptr);
443 }
444 break;
445 default:
446 break;
447 }
448
449 if (possible_gc_point(&bcs))
450 _gc_points++;
451 }
452 }
453
454 void GenerateOopMap::set_bbmark_bit(int bci) {
455 _bb_hdr_bits.at_put(bci, true);
456 }
457
458 void GenerateOopMap::reachable_basicblock(GenerateOopMap *c, int bci, int *data) {
459 assert(bci>= 0 && bci < c->method()->code_size(), "index out of bounds");
460 BasicBlock* bb = c->get_basic_block_at(bci);
461 if (bb->is_dead()) {
462 bb->mark_as_alive();
463 *data = 1; // Mark basicblock as changed
464 }
465 }
466
467
468 void GenerateOopMap::mark_reachable_code() {
469 int change = 1; // int to get function pointers to work
470
471 // Mark entry basic block as alive and all exception handlers
472 _basic_blocks[0].mark_as_alive();
473 ExceptionTable excps(method());
474 for(int i = 0; i < excps.length(); i++) {
475 BasicBlock *bb = get_basic_block_at(excps.handler_pc(i));
476 // If block is not already alive (due to multiple exception handlers to same bb), then
477 // make it alive
478 if (bb->is_dead()) bb->mark_as_alive();
479 }
480
481 BytecodeStream bcs(_method);
482
483 // Iterate through all basic blocks until we reach a fixpoint
484 while (change) {
485 change = 0;
486
487 for (int i = 0; i < _bb_count; i++) {
488 BasicBlock *bb = &_basic_blocks[i];
489 if (bb->is_alive()) {
490 // Position bytecodestream at last bytecode in basicblock
491 bcs.set_start(bb->_end_bci);
492 bcs.next();
493 Bytecodes::Code bytecode = bcs.code();
494 int bci = bcs.bci();
495 assert(bci == bb->_end_bci, "wrong bci");
496
497 bool fell_through = jump_targets_do(&bcs, &GenerateOopMap::reachable_basicblock, &change);
498
499 // We will also mark successors of jsr's as alive.
500 switch (bytecode) {
501 case Bytecodes::_jsr:
502 case Bytecodes::_jsr_w:
503 assert(!fell_through, "should not happen");
504 // If this is the last bytecode, there is no successor to mark
505 if (bci + Bytecodes::length_for(bytecode) < method()->code_size()) {
506 reachable_basicblock(this, bci + Bytecodes::length_for(bytecode), &change);
507 }
508 break;
509 default:
510 break;
511 }
512 if (fell_through) {
513 // Mark successor as alive
514 if (bb[1].is_dead()) {
515 bb[1].mark_as_alive();
516 change = 1;
517 }
518 }
519 }
520 }
521 }
522 }
523
524 /* If the current instruction in "c" has no effect on control flow,
525 returns "true". Otherwise, calls "jmpFct" one or more times, with
526 "c", an appropriate "pcDelta", and "data" as arguments, then
527 returns "false". There is one exception: if the current
528 instruction is a "ret", returns "false" without calling "jmpFct".
529 Arrangements for tracking the control flow of a "ret" must be made
530 externally. */
531 bool GenerateOopMap::jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int *data) {
532 int bci = bcs->bci();
533
534 switch (bcs->code()) {
535 case Bytecodes::_ifeq:
536 case Bytecodes::_ifne:
537 case Bytecodes::_iflt:
538 case Bytecodes::_ifge:
539 case Bytecodes::_ifgt:
540 case Bytecodes::_ifle:
541 case Bytecodes::_if_icmpeq:
542 case Bytecodes::_if_icmpne:
543 case Bytecodes::_if_icmplt:
544 case Bytecodes::_if_icmpge:
545 case Bytecodes::_if_icmpgt:
546 case Bytecodes::_if_icmple:
547 case Bytecodes::_if_acmpeq:
548 case Bytecodes::_if_acmpne:
549 case Bytecodes::_ifnull:
550 case Bytecodes::_ifnonnull:
551 (*jmpFct)(this, bcs->dest(), data);
552 // Class files verified by the old verifier can have a conditional branch
553 // as their last bytecode, provided the conditional branch is unreachable
554 // during execution. Check if this instruction is the method's last bytecode
555 // and, if so, don't call the jmpFct.
556 if (bci + 3 < method()->code_size()) {
557 (*jmpFct)(this, bci + 3, data);
558 }
559 break;
560
561 case Bytecodes::_goto:
562 (*jmpFct)(this, bcs->dest(), data);
563 break;
564 case Bytecodes::_goto_w:
565 (*jmpFct)(this, bcs->dest_w(), data);
566 break;
567 case Bytecodes::_tableswitch:
568 { Bytecode_tableswitch tableswitch(method(), bcs->bcp());
569 int len = tableswitch.length();
570
571 (*jmpFct)(this, bci + tableswitch.default_offset(), data); /* Default. jump address */
572 while (--len >= 0) {
573 (*jmpFct)(this, bci + tableswitch.dest_offset_at(len), data);
574 }
575 break;
576 }
577
578 case Bytecodes::_lookupswitch:
579 { Bytecode_lookupswitch lookupswitch(method(), bcs->bcp());
580 int npairs = lookupswitch.number_of_pairs();
581 (*jmpFct)(this, bci + lookupswitch.default_offset(), data); /* Default. */
582 while(--npairs >= 0) {
583 LookupswitchPair pair = lookupswitch.pair_at(npairs);
584 (*jmpFct)(this, bci + pair.offset(), data);
585 }
586 break;
587 }
588 case Bytecodes::_jsr:
589 assert(bcs->is_wide()==false, "sanity check");
590 (*jmpFct)(this, bcs->dest(), data);
591 break;
592 case Bytecodes::_jsr_w:
593 (*jmpFct)(this, bcs->dest_w(), data);
594 break;
595 case Bytecodes::_wide:
596 ShouldNotReachHere();
597 return true;
598 break;
599 case Bytecodes::_athrow:
600 case Bytecodes::_ireturn:
601 case Bytecodes::_lreturn:
602 case Bytecodes::_freturn:
603 case Bytecodes::_dreturn:
604 case Bytecodes::_areturn:
605 case Bytecodes::_return:
606 case Bytecodes::_ret:
607 break;
608 default:
609 return true;
610 }
611 return false;
612 }
613
614 /* Requires "pc" to be the head of a basic block; returns that basic
615 block. */
616 BasicBlock *GenerateOopMap::get_basic_block_at(int bci) const {
617 BasicBlock* bb = get_basic_block_containing(bci);
618 assert(bb->_bci == bci, "should have found BB");
619 return bb;
620 }
621
622 // Requires "pc" to be the start of an instruction; returns the basic
623 // block containing that instruction. */
624 BasicBlock *GenerateOopMap::get_basic_block_containing(int bci) const {
625 BasicBlock *bbs = _basic_blocks;
626 int lo = 0, hi = _bb_count - 1;
627
628 while (lo <= hi) {
629 int m = (lo + hi) / 2;
630 int mbci = bbs[m]._bci;
631 int nbci;
632
633 if ( m == _bb_count-1) {
634 assert( bci >= mbci && bci < method()->code_size(), "sanity check failed");
635 return bbs+m;
636 } else {
637 nbci = bbs[m+1]._bci;
638 }
639
640 if ( mbci <= bci && bci < nbci) {
641 return bbs+m;
642 } else if (mbci < bci) {
643 lo = m + 1;
644 } else {
645 assert(mbci > bci, "sanity check");
646 hi = m - 1;
647 }
648 }
649
650 fatal("should have found BB");
651 return nullptr;
652 }
653
654 void GenerateOopMap::restore_state(BasicBlock *bb)
655 {
656 memcpy(_state, bb->_state, _state_len*sizeof(CellTypeState));
657 _stack_top = bb->_stack_top;
658 _monitor_top = bb->_monitor_top;
659 }
660
661 int GenerateOopMap::next_bb_start_pc(BasicBlock *bb) {
662 intptr_t bbNum = bb - _basic_blocks + 1;
663 if (bbNum == _bb_count)
664 return method()->code_size();
665
666 return _basic_blocks[bbNum]._bci;
667 }
668
669 //
670 // CellType handling methods
671 //
672
673 // Allocate memory and throw LinkageError if failure.
674 #define ALLOC_RESOURCE_ARRAY(var, type, count) \
675 var = NEW_RESOURCE_ARRAY_RETURN_NULL(type, count); \
676 if (var == nullptr) { \
677 report_error("Cannot reserve enough memory to analyze this method"); \
678 return; \
679 }
680
681
682 void GenerateOopMap::init_state() {
683 _state_len = _max_locals + _max_stack + _max_monitors;
684 ALLOC_RESOURCE_ARRAY(_state, CellTypeState, _state_len);
685 memset(_state, 0, _state_len * sizeof(CellTypeState));
686 int count = MAX3(_max_locals, _max_stack, _max_monitors) + 1/*for null terminator char */;
687 ALLOC_RESOURCE_ARRAY(_state_vec_buf, char, count);
688 }
689
690 void GenerateOopMap::make_context_uninitialized() {
691 CellTypeState* vs = vars();
692
693 for (int i = 0; i < _max_locals; i++)
694 vs[i] = CellTypeState::uninit;
695
696 _stack_top = 0;
697 _monitor_top = 0;
698 }
699
700 int GenerateOopMap::methodsig_to_effect(Symbol* signature, bool is_static, CellTypeState* effect) {
701 ComputeEntryStack ces(signature);
702 return ces.compute_for_parameters(is_static, effect);
703 }
704
705 // Return result of merging cts1 and cts2.
706 CellTypeState CellTypeState::merge(CellTypeState cts, int slot) const {
707 CellTypeState result;
708
709 assert(!is_bottom() && !cts.is_bottom(),
710 "merge of bottom values is handled elsewhere");
711
712 result._state = _state | cts._state;
713
714 // If the top bit is set, we don't need to do any more work.
715 if (!result.is_info_top()) {
716 assert((result.can_be_address() || result.can_be_reference()),
717 "only addresses and references have non-top info");
718
719 if (!equal(cts)) {
720 // The two values being merged are different. Raise to top.
721 if (result.is_reference()) {
722 result = CellTypeState::make_slot_ref(slot);
723 } else {
724 result._state |= info_conflict;
725 }
726 }
727 }
728 assert(result.is_valid_state(), "checking that CTS merge maintains legal state");
729
730 return result;
731 }
732
733 // Merge the variable state for locals and stack from cts into bbts.
734 bool GenerateOopMap::merge_local_state_vectors(CellTypeState* cts,
735 CellTypeState* bbts) {
736 int i;
737 int len = _max_locals + _stack_top;
738 bool change = false;
739
740 for (i = len - 1; i >= 0; i--) {
741 CellTypeState v = cts[i].merge(bbts[i], i);
742 change = change || !v.equal(bbts[i]);
743 bbts[i] = v;
744 }
745
746 return change;
747 }
748
749 // Merge the monitor stack state from cts into bbts.
750 bool GenerateOopMap::merge_monitor_state_vectors(CellTypeState* cts,
751 CellTypeState* bbts) {
752 bool change = false;
753 if (_max_monitors > 0 && _monitor_top != bad_monitors) {
754 // If there are no monitors in the program, or there has been
755 // a monitor matching error before this point in the program,
756 // then we do not merge in the monitor state.
757
758 int base = _max_locals + _max_stack;
759 int len = base + _monitor_top;
760 for (int i = len - 1; i >= base; i--) {
761 CellTypeState v = cts[i].merge(bbts[i], i);
762
763 // Can we prove that, when there has been a change, it will already
764 // have been detected at this point? That would make this equal
765 // check here unnecessary.
766 change = change || !v.equal(bbts[i]);
767 bbts[i] = v;
768 }
769 }
770
771 return change;
772 }
773
774 void GenerateOopMap::copy_state(CellTypeState *dst, CellTypeState *src) {
775 int len = _max_locals + _stack_top;
776 for (int i = 0; i < len; i++) {
777 if (src[i].is_nonlock_reference()) {
778 dst[i] = CellTypeState::make_slot_ref(i);
779 } else {
780 dst[i] = src[i];
781 }
782 }
783 if (_max_monitors > 0 && _monitor_top != bad_monitors) {
784 int base = _max_locals + _max_stack;
785 len = base + _monitor_top;
786 for (int i = base; i < len; i++) {
787 dst[i] = src[i];
788 }
789 }
790 }
791
792
793 // Merge the states for the current block and the next. As long as a
794 // block is reachable the locals and stack must be merged. If the
795 // stack heights don't match then this is a verification error and
796 // it's impossible to interpret the code. Simultaneously monitor
797 // states are being check to see if they nest statically. If monitor
798 // depths match up then their states are merged. Otherwise the
799 // mismatch is simply recorded and interpretation continues since
800 // monitor matching is purely informational and doesn't say anything
801 // about the correctness of the code.
802 void GenerateOopMap::merge_state_into_bb(BasicBlock *bb) {
803 guarantee(bb != nullptr, "null basicblock");
804 assert(bb->is_alive(), "merging state into a dead basicblock");
805
806 if (_stack_top == bb->_stack_top) {
807 // always merge local state even if monitors don't match.
808 if (merge_local_state_vectors(_state, bb->_state)) {
809 bb->set_changed(true);
810 }
811 if (_monitor_top == bb->_monitor_top) {
812 // monitors still match so continue merging monitor states.
813 if (merge_monitor_state_vectors(_state, bb->_state)) {
814 bb->set_changed(true);
815 }
816 } else {
817 if (log_is_enabled(Info, monitormismatch)) {
818 report_monitor_mismatch("monitor stack height merge conflict");
819 }
820 // When the monitor stacks are not matched, we set _monitor_top to
821 // bad_monitors. This signals that, from here on, the monitor stack cannot
822 // be trusted. In particular, monitorexit bytecodes may throw
823 // exceptions. We mark this block as changed so that the change
824 // propagates properly.
825 bb->_monitor_top = bad_monitors;
826 bb->set_changed(true);
827 _monitor_safe = false;
828 }
829 } else if (!bb->is_reachable()) {
830 // First time we look at this BB
831 copy_state(bb->_state, _state);
832 bb->_stack_top = _stack_top;
833 bb->_monitor_top = _monitor_top;
834 bb->set_changed(true);
835 } else {
836 verify_error("stack height conflict: %d vs. %d", _stack_top, bb->_stack_top);
837 }
838 }
839
840 void GenerateOopMap::merge_state(GenerateOopMap *gom, int bci, int* data) {
841 gom->merge_state_into_bb(gom->get_basic_block_at(bci));
842 }
843
844 void GenerateOopMap::set_var(int localNo, CellTypeState cts) {
845 assert(cts.is_reference() || cts.is_value() || cts.is_address(),
846 "wrong celltypestate");
847 if (localNo < 0 || localNo > _max_locals) {
848 verify_error("variable write error: r%d", localNo);
849 return;
850 }
851 vars()[localNo] = cts;
852 }
853
854 CellTypeState GenerateOopMap::get_var(int localNo) {
855 assert(localNo < _max_locals + _nof_refval_conflicts, "variable read error");
856 if (localNo < 0 || localNo > _max_locals) {
857 verify_error("variable read error: r%d", localNo);
858 return valCTS; // just to pick something;
859 }
860 return vars()[localNo];
861 }
862
863 CellTypeState GenerateOopMap::pop() {
864 if ( _stack_top <= 0) {
865 verify_error("stack underflow");
866 return valCTS; // just to pick something
867 }
868 return stack()[--_stack_top];
869 }
870
871 void GenerateOopMap::push(CellTypeState cts) {
872 if ( _stack_top >= _max_stack) {
873 verify_error("stack overflow");
874 return;
875 }
876 stack()[_stack_top++] = cts;
877 }
878
879 CellTypeState GenerateOopMap::monitor_pop() {
880 assert(_monitor_top != bad_monitors, "monitor_pop called on error monitor stack");
881 if (_monitor_top == 0) {
882 // We have detected a pop of an empty monitor stack.
883 _monitor_safe = false;
884 _monitor_top = bad_monitors;
885
886 if (log_is_enabled(Info, monitormismatch)) {
887 report_monitor_mismatch("monitor stack underflow");
888 }
889 return CellTypeState::ref; // just to keep the analysis going.
890 }
891 return monitors()[--_monitor_top];
892 }
893
894 void GenerateOopMap::monitor_push(CellTypeState cts) {
895 assert(_monitor_top != bad_monitors, "monitor_push called on error monitor stack");
896 if (_monitor_top >= _max_monitors) {
897 // Some monitorenter is being executed more than once.
898 // This means that the monitor stack cannot be simulated.
899 _monitor_safe = false;
900 _monitor_top = bad_monitors;
901
902 if (log_is_enabled(Info, monitormismatch)) {
903 report_monitor_mismatch("monitor stack overflow");
904 }
905 return;
906 }
907 monitors()[_monitor_top++] = cts;
908 }
909
910 //
911 // Interpretation handling methods
912 //
913
914 void GenerateOopMap::do_interpretation()
915 {
916 // "i" is just for debugging, so we can detect cases where this loop is
917 // iterated more than once.
918 int i = 0;
919 do {
920 #ifndef PRODUCT
921 if (TraceNewOopMapGeneration) {
922 tty->print("\n\nIteration #%d of do_interpretation loop, method:\n", i);
923 method()->print_name(tty);
924 tty->print("\n\n");
925 }
926 #endif
927 _conflict = false;
928 _monitor_safe = true;
929 // init_state is now called from init_basic_blocks. The length of a
930 // state vector cannot be determined until we have made a pass through
931 // the bytecodes counting the possible monitor entries.
932 if (!_got_error) init_basic_blocks();
933 if (!_got_error) setup_method_entry_state();
934 if (!_got_error) interp_all();
935 if (!_got_error) rewrite_refval_conflicts();
936 i++;
937 } while (_conflict && !_got_error);
938 }
939
940 void GenerateOopMap::init_basic_blocks() {
941 // Note: Could consider reserving only the needed space for each BB's state
942 // (entry stack may not be of maximal height for every basic block).
943 // But cumbersome since we don't know the stack heights yet. (Nor the
944 // monitor stack heights...)
945
946 ALLOC_RESOURCE_ARRAY(_basic_blocks, BasicBlock, _bb_count);
947
948 // Make a pass through the bytecodes. Count the number of monitorenters.
949 // This can be used an upper bound on the monitor stack depth in programs
950 // which obey stack discipline with their monitor usage. Initialize the
951 // known information about basic blocks.
952 BytecodeStream j(_method);
953 Bytecodes::Code bytecode;
954
955 int bbNo = 0;
956 int monitor_count = 0;
957 int prev_bci = -1;
958 while( (bytecode = j.next()) >= 0) {
959 if (j.code() == Bytecodes::_monitorenter) {
960 monitor_count++;
961 }
962
963 int bci = j.bci();
964 if (is_bb_header(bci)) {
965 // Initialize the basicblock structure
966 BasicBlock *bb = _basic_blocks + bbNo;
967 bb->_bci = bci;
968 bb->_max_locals = _max_locals;
969 bb->_max_stack = _max_stack;
970 bb->set_changed(false);
971 bb->_stack_top = BasicBlock::_dead_basic_block; // Initialize all basicblocks are dead.
972 bb->_monitor_top = bad_monitors;
973
974 if (bbNo > 0) {
975 _basic_blocks[bbNo - 1]._end_bci = prev_bci;
976 }
977
978 bbNo++;
979 }
980 // Remember previous bci.
981 prev_bci = bci;
982 }
983 // Set
984 _basic_blocks[bbNo-1]._end_bci = prev_bci;
985
986
987 // Check that the correct number of basicblocks was found
988 if (bbNo !=_bb_count) {
989 if (bbNo < _bb_count) {
990 verify_error("jump into the middle of instruction?");
991 return;
992 } else {
993 verify_error("extra basic blocks - should not happen?");
994 return;
995 }
996 }
997
998 _max_monitors = monitor_count;
999
1000 // Now that we have a bound on the depth of the monitor stack, we can
1001 // initialize the CellTypeState-related information.
1002 init_state();
1003
1004 // We allocate space for all state-vectors for all basicblocks in one huge
1005 // chunk. Then in the next part of the code, we set a pointer in each
1006 // _basic_block that points to each piece.
1007
1008 // The product of bbNo and _state_len can get large if there are lots of
1009 // basic blocks and stack/locals/monitors. Need to check to make sure
1010 // we don't overflow the capacity of a pointer.
1011 if ((unsigned)bbNo > UINTPTR_MAX / sizeof(CellTypeState) / _state_len) {
1012 report_error("The amount of memory required to analyze this method "
1013 "exceeds addressable range");
1014 return;
1015 }
1016
1017 CellTypeState *basicBlockState;
1018 ALLOC_RESOURCE_ARRAY(basicBlockState, CellTypeState, bbNo * _state_len);
1019 memset(basicBlockState, 0, bbNo * _state_len * sizeof(CellTypeState));
1020
1021 // Make a pass over the basicblocks and assign their state vectors.
1022 for (int blockNum=0; blockNum < bbNo; blockNum++) {
1023 BasicBlock *bb = _basic_blocks + blockNum;
1024 bb->_state = basicBlockState + blockNum * _state_len;
1025
1026 #ifdef ASSERT
1027 if (blockNum + 1 < bbNo) {
1028 address bcp = _method->bcp_from(bb->_end_bci);
1029 int bc_len = Bytecodes::java_length_at(_method(), bcp);
1030 assert(bb->_end_bci + bc_len == bb[1]._bci, "unmatched bci info in basicblock");
1031 }
1032 #endif
1033 }
1034 #ifdef ASSERT
1035 { BasicBlock *bb = &_basic_blocks[bbNo-1];
1036 address bcp = _method->bcp_from(bb->_end_bci);
1037 int bc_len = Bytecodes::java_length_at(_method(), bcp);
1038 assert(bb->_end_bci + bc_len == _method->code_size(), "wrong end bci");
1039 }
1040 #endif
1041
1042 // Mark all alive blocks
1043 mark_reachable_code();
1044 }
1045
1046 void GenerateOopMap::setup_method_entry_state() {
1047
1048 // Initialize all locals to 'uninit' and set stack-height to 0
1049 make_context_uninitialized();
1050
1051 // Initialize CellState type of arguments
1052 methodsig_to_effect(method()->signature(), method()->is_static(), vars());
1053
1054 // If some references must be pre-assigned to null, then set that up
1055 initialize_vars();
1056
1057 // This is the start state
1058 merge_state_into_bb(&_basic_blocks[0]);
1059
1060 assert(_basic_blocks[0].changed(), "we are not getting off the ground");
1061 }
1062
1063 // The instruction at bci is changing size by "delta". Update the basic blocks.
1064 void GenerateOopMap::update_basic_blocks(int bci, int delta,
1065 int new_method_size) {
1066 assert(new_method_size >= method()->code_size() + delta,
1067 "new method size is too small");
1068
1069 _bb_hdr_bits.reinitialize(new_method_size);
1070
1071 for(int k = 0; k < _bb_count; k++) {
1072 if (_basic_blocks[k]._bci > bci) {
1073 _basic_blocks[k]._bci += delta;
1074 _basic_blocks[k]._end_bci += delta;
1075 }
1076 _bb_hdr_bits.at_put(_basic_blocks[k]._bci, true);
1077 }
1078 }
1079
1080 //
1081 // Initvars handling
1082 //
1083
1084 void GenerateOopMap::initialize_vars() {
1085 for (int k = 0; k < _init_vars->length(); k++)
1086 _state[_init_vars->at(k)] = CellTypeState::make_slot_ref(k);
1087 }
1088
1089 void GenerateOopMap::add_to_ref_init_set(int localNo) {
1090
1091 if (TraceNewOopMapGeneration)
1092 tty->print_cr("Added init vars: %d", localNo);
1093
1094 // Is it already in the set?
1095 if (_init_vars->contains(localNo) )
1096 return;
1097
1098 _init_vars->append(localNo);
1099 }
1100
1101 //
1102 // Interpreration code
1103 //
1104
1105 void GenerateOopMap::interp_all() {
1106 bool change = true;
1107
1108 while (change && !_got_error) {
1109 change = false;
1110 for (int i = 0; i < _bb_count && !_got_error; i++) {
1111 BasicBlock *bb = &_basic_blocks[i];
1112 if (bb->changed()) {
1113 if (_got_error) return;
1114 change = true;
1115 bb->set_changed(false);
1116 interp_bb(bb);
1117 }
1118 }
1119 }
1120 }
1121
1122 void GenerateOopMap::interp_bb(BasicBlock *bb) {
1123
1124 // We do not want to do anything in case the basic-block has not been initialized. This
1125 // will happen in the case where there is dead-code hang around in a method.
1126 assert(bb->is_reachable(), "should be reachable or deadcode exist");
1127 restore_state(bb);
1128
1129 BytecodeStream itr(_method);
1130
1131 // Set iterator interval to be the current basicblock
1132 int lim_bci = next_bb_start_pc(bb);
1133 itr.set_interval(bb->_bci, lim_bci);
1134 assert(lim_bci != bb->_bci, "must be at least one instruction in a basicblock");
1135 itr.next(); // read first instruction
1136
1137 // Iterates through all bytecodes except the last in a basic block.
1138 // We handle the last one special, since there is controlflow change.
1139 while(itr.next_bci() < lim_bci && !_got_error) {
1140 if (_has_exceptions || _monitor_top != 0) {
1141 // We do not need to interpret the results of exceptional
1142 // continuation from this instruction when the method has no
1143 // exception handlers and the monitor stack is currently
1144 // empty.
1145 do_exception_edge(&itr);
1146 }
1147 interp1(&itr);
1148 itr.next();
1149 }
1150
1151 // Handle last instruction.
1152 if (!_got_error) {
1153 assert(itr.next_bci() == lim_bci, "must point to end");
1154 if (_has_exceptions || _monitor_top != 0) {
1155 do_exception_edge(&itr);
1156 }
1157 interp1(&itr);
1158
1159 bool fall_through = jump_targets_do(&itr, GenerateOopMap::merge_state, nullptr);
1160 if (_got_error) return;
1161
1162 if (itr.code() == Bytecodes::_ret) {
1163 assert(!fall_through, "cannot be set if ret instruction");
1164 // Automatically handles 'wide' ret indices
1165 ret_jump_targets_do(&itr, GenerateOopMap::merge_state, itr.get_index(), nullptr);
1166 } else if (fall_through) {
1167 // Hit end of BB, but the instr. was a fall-through instruction,
1168 // so perform transition as if the BB ended in a "jump".
1169 if (lim_bci != bb[1]._bci) {
1170 verify_error("bytecodes fell through last instruction");
1171 return;
1172 }
1173 merge_state_into_bb(bb + 1);
1174 }
1175 }
1176 }
1177
1178 void GenerateOopMap::do_exception_edge(BytecodeStream* itr) {
1179 // Only check exception edge, if bytecode can trap
1180 if (!Bytecodes::can_trap(itr->code())) return;
1181 switch (itr->code()) {
1182 case Bytecodes::_aload_0:
1183 // These bytecodes can trap for rewriting. We need to assume that
1184 // they do not throw exceptions to make the monitor analysis work.
1185 return;
1186
1187 case Bytecodes::_ireturn:
1188 case Bytecodes::_lreturn:
1189 case Bytecodes::_freturn:
1190 case Bytecodes::_dreturn:
1191 case Bytecodes::_areturn:
1192 case Bytecodes::_return:
1193 // If the monitor stack height is not zero when we leave the method,
1194 // then we are either exiting with a non-empty stack or we have
1195 // found monitor trouble earlier in our analysis. In either case,
1196 // assume an exception could be taken here.
1197 if (_monitor_top == 0) {
1198 return;
1199 }
1200 break;
1201
1202 case Bytecodes::_monitorexit:
1203 // If the monitor stack height is bad_monitors, then we have detected a
1204 // monitor matching problem earlier in the analysis. If the
1205 // monitor stack height is 0, we are about to pop a monitor
1206 // off of an empty stack. In either case, the bytecode
1207 // could throw an exception.
1208 if (_monitor_top != bad_monitors && _monitor_top != 0) {
1209 return;
1210 }
1211 break;
1212
1213 default:
1214 break;
1215 }
1216
1217 if (_has_exceptions) {
1218 int bci = itr->bci();
1219 ExceptionTable exct(method());
1220 for(int i = 0; i< exct.length(); i++) {
1221 int start_pc = exct.start_pc(i);
1222 int end_pc = exct.end_pc(i);
1223 int handler_pc = exct.handler_pc(i);
1224 int catch_type = exct.catch_type_index(i);
1225
1226 if (start_pc <= bci && bci < end_pc) {
1227 BasicBlock *excBB = get_basic_block_at(handler_pc);
1228 guarantee(excBB != nullptr, "no basic block for exception");
1229 CellTypeState *excStk = excBB->stack();
1230 CellTypeState *cOpStck = stack();
1231 CellTypeState cOpStck_0 = cOpStck[0];
1232 int cOpStackTop = _stack_top;
1233
1234 // Exception stacks are always the same.
1235 assert(method()->max_stack() > 0, "sanity check");
1236
1237 // We remembered the size and first element of "cOpStck"
1238 // above; now we temporarily set them to the appropriate
1239 // values for an exception handler. */
1240 cOpStck[0] = CellTypeState::make_slot_ref(_max_locals);
1241 _stack_top = 1;
1242
1243 merge_state_into_bb(excBB);
1244
1245 // Now undo the temporary change.
1246 cOpStck[0] = cOpStck_0;
1247 _stack_top = cOpStackTop;
1248
1249 // If this is a "catch all" handler, then we do not need to
1250 // consider any additional handlers.
1251 if (catch_type == 0) {
1252 return;
1253 }
1254 }
1255 }
1256 }
1257
1258 // It is possible that none of the exception handlers would have caught
1259 // the exception. In this case, we will exit the method. We must
1260 // ensure that the monitor stack is empty in this case.
1261 if (_monitor_top == 0) {
1262 return;
1263 }
1264
1265 // We pessimistically assume that this exception can escape the
1266 // method. (It is possible that it will always be caught, but
1267 // we don't care to analyse the types of the catch clauses.)
1268
1269 // We don't set _monitor_top to bad_monitors because there are no successors
1270 // to this exceptional exit.
1271
1272 if (log_is_enabled(Info, monitormismatch) && _monitor_safe) {
1273 // We check _monitor_safe so that we only report the first mismatched
1274 // exceptional exit.
1275 report_monitor_mismatch("non-empty monitor stack at exceptional exit");
1276 }
1277 _monitor_safe = false;
1278
1279 }
1280
1281 void GenerateOopMap::report_monitor_mismatch(const char *msg) {
1282 LogStream ls(Log(monitormismatch)::info());
1283 ls.print("Monitor mismatch in method ");
1284 method()->print_short_name(&ls);
1285 ls.print_cr(": %s", msg);
1286 }
1287
1288 void GenerateOopMap::print_states(outputStream *os,
1289 CellTypeState* vec, int num) {
1290 for (int i = 0; i < num; i++) {
1291 vec[i].print(tty);
1292 }
1293 }
1294
1295 // Print the state values at the current bytecode.
1296 void GenerateOopMap::print_current_state(outputStream *os,
1297 BytecodeStream *currentBC,
1298 bool detailed) {
1299 if (detailed) {
1300 os->print(" %4d vars = ", currentBC->bci());
1301 print_states(os, vars(), _max_locals);
1302 os->print(" %s", Bytecodes::name(currentBC->code()));
1303 } else {
1304 os->print(" %4d vars = '%s' ", currentBC->bci(), state_vec_to_string(vars(), _max_locals));
1305 os->print(" stack = '%s' ", state_vec_to_string(stack(), _stack_top));
1306 if (_monitor_top != bad_monitors) {
1307 os->print(" monitors = '%s' \t%s", state_vec_to_string(monitors(), _monitor_top), Bytecodes::name(currentBC->code()));
1308 } else {
1309 os->print(" [bad monitor stack]");
1310 }
1311 }
1312
1313 switch(currentBC->code()) {
1314 case Bytecodes::_invokevirtual:
1315 case Bytecodes::_invokespecial:
1316 case Bytecodes::_invokestatic:
1317 case Bytecodes::_invokedynamic:
1318 case Bytecodes::_invokeinterface: {
1319 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2();
1320 ConstantPool* cp = method()->constants();
1321 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx, currentBC->code());
1322 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1323 Symbol* signature = cp->symbol_at(signatureIdx);
1324 os->print("%s", signature->as_C_string());
1325 }
1326 default:
1327 break;
1328 }
1329
1330 if (detailed) {
1331 os->cr();
1332 os->print(" stack = ");
1333 print_states(os, stack(), _stack_top);
1334 os->cr();
1335 if (_monitor_top != bad_monitors) {
1336 os->print(" monitors = ");
1337 print_states(os, monitors(), _monitor_top);
1338 } else {
1339 os->print(" [bad monitor stack]");
1340 }
1341 }
1342
1343 os->cr();
1344 }
1345
1346 // Sets the current state to be the state after executing the
1347 // current instruction, starting in the current state.
1348 void GenerateOopMap::interp1(BytecodeStream *itr) {
1349 if (TraceNewOopMapGeneration) {
1350 print_current_state(tty, itr, TraceNewOopMapGenerationDetailed);
1351 }
1352
1353 // Should we report the results? Result is reported *before* the instruction at the current bci is executed.
1354 // However, not for calls. For calls we do not want to include the arguments, so we postpone the reporting until
1355 // they have been popped (in method ppl).
1356 if (_report_result == true) {
1357 switch(itr->code()) {
1358 case Bytecodes::_invokevirtual:
1359 case Bytecodes::_invokespecial:
1360 case Bytecodes::_invokestatic:
1361 case Bytecodes::_invokedynamic:
1362 case Bytecodes::_invokeinterface:
1363 _itr_send = itr;
1364 _report_result_for_send = true;
1365 break;
1366 default:
1367 fill_stackmap_for_opcodes(itr, vars(), stack(), _stack_top);
1368 break;
1369 }
1370 }
1371
1372 // abstract interpretation of current opcode
1373 switch(itr->code()) {
1374 case Bytecodes::_nop: break;
1375 case Bytecodes::_goto: break;
1376 case Bytecodes::_goto_w: break;
1377 case Bytecodes::_iinc: break;
1378 case Bytecodes::_return: do_return_monitor_check();
1379 break;
1380
1381 case Bytecodes::_aconst_null:
1382 case Bytecodes::_new: ppush1(CellTypeState::make_line_ref(itr->bci()));
1383 break;
1384
1385 case Bytecodes::_iconst_m1:
1386 case Bytecodes::_iconst_0:
1387 case Bytecodes::_iconst_1:
1388 case Bytecodes::_iconst_2:
1389 case Bytecodes::_iconst_3:
1390 case Bytecodes::_iconst_4:
1391 case Bytecodes::_iconst_5:
1392 case Bytecodes::_fconst_0:
1393 case Bytecodes::_fconst_1:
1394 case Bytecodes::_fconst_2:
1395 case Bytecodes::_bipush:
1396 case Bytecodes::_sipush: ppush1(valCTS); break;
1397
1398 case Bytecodes::_lconst_0:
1399 case Bytecodes::_lconst_1:
1400 case Bytecodes::_dconst_0:
1401 case Bytecodes::_dconst_1: ppush(vvCTS); break;
1402
1403 case Bytecodes::_ldc2_w: ppush(vvCTS); break;
1404
1405 case Bytecodes::_ldc: // fall through:
1406 case Bytecodes::_ldc_w: do_ldc(itr->bci()); break;
1407
1408 case Bytecodes::_iload:
1409 case Bytecodes::_fload: ppload(vCTS, itr->get_index()); break;
1410
1411 case Bytecodes::_lload:
1412 case Bytecodes::_dload: ppload(vvCTS,itr->get_index()); break;
1413
1414 case Bytecodes::_aload: ppload(rCTS, itr->get_index()); break;
1415
1416 case Bytecodes::_iload_0:
1417 case Bytecodes::_fload_0: ppload(vCTS, 0); break;
1418 case Bytecodes::_iload_1:
1419 case Bytecodes::_fload_1: ppload(vCTS, 1); break;
1420 case Bytecodes::_iload_2:
1421 case Bytecodes::_fload_2: ppload(vCTS, 2); break;
1422 case Bytecodes::_iload_3:
1423 case Bytecodes::_fload_3: ppload(vCTS, 3); break;
1424
1425 case Bytecodes::_lload_0:
1426 case Bytecodes::_dload_0: ppload(vvCTS, 0); break;
1427 case Bytecodes::_lload_1:
1428 case Bytecodes::_dload_1: ppload(vvCTS, 1); break;
1429 case Bytecodes::_lload_2:
1430 case Bytecodes::_dload_2: ppload(vvCTS, 2); break;
1431 case Bytecodes::_lload_3:
1432 case Bytecodes::_dload_3: ppload(vvCTS, 3); break;
1433
1434 case Bytecodes::_aload_0: ppload(rCTS, 0); break;
1435 case Bytecodes::_aload_1: ppload(rCTS, 1); break;
1436 case Bytecodes::_aload_2: ppload(rCTS, 2); break;
1437 case Bytecodes::_aload_3: ppload(rCTS, 3); break;
1438
1439 case Bytecodes::_iaload:
1440 case Bytecodes::_faload:
1441 case Bytecodes::_baload:
1442 case Bytecodes::_caload:
1443 case Bytecodes::_saload: pp(vrCTS, vCTS); break;
1444
1445 case Bytecodes::_laload: pp(vrCTS, vvCTS); break;
1446 case Bytecodes::_daload: pp(vrCTS, vvCTS); break;
1447
1448 case Bytecodes::_aaload: pp_new_ref(vrCTS, itr->bci()); break;
1449
1450 case Bytecodes::_istore:
1451 case Bytecodes::_fstore: ppstore(vCTS, itr->get_index()); break;
1452
1453 case Bytecodes::_lstore:
1454 case Bytecodes::_dstore: ppstore(vvCTS, itr->get_index()); break;
1455
1456 case Bytecodes::_astore: do_astore(itr->get_index()); break;
1457
1458 case Bytecodes::_istore_0:
1459 case Bytecodes::_fstore_0: ppstore(vCTS, 0); break;
1460 case Bytecodes::_istore_1:
1461 case Bytecodes::_fstore_1: ppstore(vCTS, 1); break;
1462 case Bytecodes::_istore_2:
1463 case Bytecodes::_fstore_2: ppstore(vCTS, 2); break;
1464 case Bytecodes::_istore_3:
1465 case Bytecodes::_fstore_3: ppstore(vCTS, 3); break;
1466
1467 case Bytecodes::_lstore_0:
1468 case Bytecodes::_dstore_0: ppstore(vvCTS, 0); break;
1469 case Bytecodes::_lstore_1:
1470 case Bytecodes::_dstore_1: ppstore(vvCTS, 1); break;
1471 case Bytecodes::_lstore_2:
1472 case Bytecodes::_dstore_2: ppstore(vvCTS, 2); break;
1473 case Bytecodes::_lstore_3:
1474 case Bytecodes::_dstore_3: ppstore(vvCTS, 3); break;
1475
1476 case Bytecodes::_astore_0: do_astore(0); break;
1477 case Bytecodes::_astore_1: do_astore(1); break;
1478 case Bytecodes::_astore_2: do_astore(2); break;
1479 case Bytecodes::_astore_3: do_astore(3); break;
1480
1481 case Bytecodes::_iastore:
1482 case Bytecodes::_fastore:
1483 case Bytecodes::_bastore:
1484 case Bytecodes::_castore:
1485 case Bytecodes::_sastore: ppop(vvrCTS); break;
1486 case Bytecodes::_lastore:
1487 case Bytecodes::_dastore: ppop(vvvrCTS); break;
1488 case Bytecodes::_aastore: ppop(rvrCTS); break;
1489
1490 case Bytecodes::_pop: ppop_any(1); break;
1491 case Bytecodes::_pop2: ppop_any(2); break;
1492
1493 case Bytecodes::_dup: ppdupswap(1, "11"); break;
1494 case Bytecodes::_dup_x1: ppdupswap(2, "121"); break;
1495 case Bytecodes::_dup_x2: ppdupswap(3, "1321"); break;
1496 case Bytecodes::_dup2: ppdupswap(2, "2121"); break;
1497 case Bytecodes::_dup2_x1: ppdupswap(3, "21321"); break;
1498 case Bytecodes::_dup2_x2: ppdupswap(4, "214321"); break;
1499 case Bytecodes::_swap: ppdupswap(2, "12"); break;
1500
1501 case Bytecodes::_iadd:
1502 case Bytecodes::_fadd:
1503 case Bytecodes::_isub:
1504 case Bytecodes::_fsub:
1505 case Bytecodes::_imul:
1506 case Bytecodes::_fmul:
1507 case Bytecodes::_idiv:
1508 case Bytecodes::_fdiv:
1509 case Bytecodes::_irem:
1510 case Bytecodes::_frem:
1511 case Bytecodes::_ishl:
1512 case Bytecodes::_ishr:
1513 case Bytecodes::_iushr:
1514 case Bytecodes::_iand:
1515 case Bytecodes::_ior:
1516 case Bytecodes::_ixor:
1517 case Bytecodes::_l2f:
1518 case Bytecodes::_l2i:
1519 case Bytecodes::_d2f:
1520 case Bytecodes::_d2i:
1521 case Bytecodes::_fcmpl:
1522 case Bytecodes::_fcmpg: pp(vvCTS, vCTS); break;
1523
1524 case Bytecodes::_ladd:
1525 case Bytecodes::_dadd:
1526 case Bytecodes::_lsub:
1527 case Bytecodes::_dsub:
1528 case Bytecodes::_lmul:
1529 case Bytecodes::_dmul:
1530 case Bytecodes::_ldiv:
1531 case Bytecodes::_ddiv:
1532 case Bytecodes::_lrem:
1533 case Bytecodes::_drem:
1534 case Bytecodes::_land:
1535 case Bytecodes::_lor:
1536 case Bytecodes::_lxor: pp(vvvvCTS, vvCTS); break;
1537
1538 case Bytecodes::_ineg:
1539 case Bytecodes::_fneg:
1540 case Bytecodes::_i2f:
1541 case Bytecodes::_f2i:
1542 case Bytecodes::_i2c:
1543 case Bytecodes::_i2s:
1544 case Bytecodes::_i2b: pp(vCTS, vCTS); break;
1545
1546 case Bytecodes::_lneg:
1547 case Bytecodes::_dneg:
1548 case Bytecodes::_l2d:
1549 case Bytecodes::_d2l: pp(vvCTS, vvCTS); break;
1550
1551 case Bytecodes::_lshl:
1552 case Bytecodes::_lshr:
1553 case Bytecodes::_lushr: pp(vvvCTS, vvCTS); break;
1554
1555 case Bytecodes::_i2l:
1556 case Bytecodes::_i2d:
1557 case Bytecodes::_f2l:
1558 case Bytecodes::_f2d: pp(vCTS, vvCTS); break;
1559
1560 case Bytecodes::_lcmp: pp(vvvvCTS, vCTS); break;
1561 case Bytecodes::_dcmpl:
1562 case Bytecodes::_dcmpg: pp(vvvvCTS, vCTS); break;
1563
1564 case Bytecodes::_ifeq:
1565 case Bytecodes::_ifne:
1566 case Bytecodes::_iflt:
1567 case Bytecodes::_ifge:
1568 case Bytecodes::_ifgt:
1569 case Bytecodes::_ifle:
1570 case Bytecodes::_tableswitch: ppop1(valCTS);
1571 break;
1572 case Bytecodes::_ireturn:
1573 case Bytecodes::_freturn: do_return_monitor_check();
1574 ppop1(valCTS);
1575 break;
1576 case Bytecodes::_if_icmpeq:
1577 case Bytecodes::_if_icmpne:
1578 case Bytecodes::_if_icmplt:
1579 case Bytecodes::_if_icmpge:
1580 case Bytecodes::_if_icmpgt:
1581 case Bytecodes::_if_icmple: ppop(vvCTS);
1582 break;
1583
1584 case Bytecodes::_lreturn: do_return_monitor_check();
1585 ppop(vvCTS);
1586 break;
1587
1588 case Bytecodes::_dreturn: do_return_monitor_check();
1589 ppop(vvCTS);
1590 break;
1591
1592 case Bytecodes::_if_acmpeq:
1593 case Bytecodes::_if_acmpne: ppop(rrCTS); break;
1594
1595 case Bytecodes::_jsr: do_jsr(itr->dest()); break;
1596 case Bytecodes::_jsr_w: do_jsr(itr->dest_w()); break;
1597
1598 case Bytecodes::_getstatic: do_field(true, true, itr->get_index_u2(), itr->bci(), itr->code()); break;
1599 case Bytecodes::_putstatic: do_field(false, true, itr->get_index_u2(), itr->bci(), itr->code()); break;
1600 case Bytecodes::_getfield: do_field(true, false, itr->get_index_u2(), itr->bci(), itr->code()); break;
1601 case Bytecodes::_putfield: do_field(false, false, itr->get_index_u2(), itr->bci(), itr->code()); break;
1602
1603 case Bytecodes::_invokevirtual:
1604 case Bytecodes::_invokespecial: do_method(false, false, itr->get_index_u2(), itr->bci(), itr->code()); break;
1605 case Bytecodes::_invokestatic: do_method(true, false, itr->get_index_u2(), itr->bci(), itr->code()); break;
1606 case Bytecodes::_invokedynamic: do_method(true, false, itr->get_index_u4(), itr->bci(), itr->code()); break;
1607 case Bytecodes::_invokeinterface: do_method(false, true, itr->get_index_u2(), itr->bci(), itr->code()); break;
1608 case Bytecodes::_newarray:
1609 case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break;
1610 case Bytecodes::_checkcast: do_checkcast(); break;
1611 case Bytecodes::_arraylength:
1612 case Bytecodes::_instanceof: pp(rCTS, vCTS); break;
1613 case Bytecodes::_monitorenter: do_monitorenter(itr->bci()); break;
1614 case Bytecodes::_monitorexit: do_monitorexit(itr->bci()); break;
1615
1616 case Bytecodes::_athrow: // handled by do_exception_edge() BUT ...
1617 // vlh(apple): do_exception_edge() does not get
1618 // called if method has no exception handlers
1619 if ((!_has_exceptions) && (_monitor_top > 0)) {
1620 _monitor_safe = false;
1621 }
1622 break;
1623
1624 case Bytecodes::_areturn: do_return_monitor_check();
1625 ppop1(refCTS);
1626 break;
1627 case Bytecodes::_ifnull:
1628 case Bytecodes::_ifnonnull: ppop1(refCTS); break;
1629 case Bytecodes::_multianewarray: do_multianewarray(*(itr->bcp()+3), itr->bci()); break;
1630
1631 case Bytecodes::_wide: fatal("Iterator should skip this bytecode"); break;
1632 case Bytecodes::_ret: break;
1633
1634 // Java opcodes
1635 case Bytecodes::_lookupswitch: ppop1(valCTS); break;
1636
1637 default:
1638 tty->print("unexpected opcode: %d\n", itr->code());
1639 ShouldNotReachHere();
1640 break;
1641 }
1642 }
1643
1644 void GenerateOopMap::check_type(CellTypeState expected, CellTypeState actual) {
1645 if (!expected.equal_kind(actual)) {
1646 verify_error("wrong type on stack (found: %c expected: %c)", actual.to_char(), expected.to_char());
1647 }
1648 }
1649
1650 void GenerateOopMap::ppstore(CellTypeState *in, int loc_no) {
1651 while(!(*in).is_bottom()) {
1652 CellTypeState expected =*in++;
1653 CellTypeState actual = pop();
1654 check_type(expected, actual);
1655 assert(loc_no >= 0, "sanity check");
1656 set_var(loc_no++, actual);
1657 }
1658 }
1659
1660 void GenerateOopMap::ppload(CellTypeState *out, int loc_no) {
1661 while(!(*out).is_bottom()) {
1662 CellTypeState out1 = *out++;
1663 CellTypeState vcts = get_var(loc_no);
1664 assert(out1.can_be_reference() || out1.can_be_value(),
1665 "can only load refs. and values.");
1666 if (out1.is_reference()) {
1667 assert(loc_no>=0, "sanity check");
1668 if (!vcts.is_reference()) {
1669 // We were asked to push a reference, but the type of the
1670 // variable can be something else
1671 _conflict = true;
1672 if (vcts.can_be_uninit()) {
1673 // It is a ref-uninit conflict (at least). If there are other
1674 // problems, we'll get them in the next round
1675 add_to_ref_init_set(loc_no);
1676 vcts = out1;
1677 } else {
1678 // It wasn't a ref-uninit conflict. So must be a
1679 // ref-val or ref-pc conflict. Split the variable.
1680 record_refval_conflict(loc_no);
1681 vcts = out1;
1682 }
1683 push(out1); // recover...
1684 } else {
1685 push(vcts); // preserve reference.
1686 }
1687 // Otherwise it is a conflict, but one that verification would
1688 // have caught if illegal. In particular, it can't be a topCTS
1689 // resulting from mergeing two difference pcCTS's since the verifier
1690 // would have rejected any use of such a merge.
1691 } else {
1692 push(out1); // handle val/init conflict
1693 }
1694 loc_no++;
1695 }
1696 }
1697
1698 void GenerateOopMap::ppdupswap(int poplen, const char *out) {
1699 CellTypeState actual[5];
1700 assert(poplen < 5, "this must be less than length of actual vector");
1701
1702 // Pop all arguments.
1703 for (int i = 0; i < poplen; i++) {
1704 actual[i] = pop();
1705 }
1706 // Field _state is uninitialized when calling push.
1707 for (int i = poplen; i < 5; i++) {
1708 actual[i] = CellTypeState::uninit;
1709 }
1710
1711 // put them back
1712 char push_ch = *out++;
1713 while (push_ch != '\0') {
1714 int idx = push_ch - '1';
1715 assert(idx >= 0 && idx < poplen, "wrong arguments");
1716 push(actual[idx]);
1717 push_ch = *out++;
1718 }
1719 }
1720
1721 void GenerateOopMap::ppop1(CellTypeState out) {
1722 CellTypeState actual = pop();
1723 check_type(out, actual);
1724 }
1725
1726 void GenerateOopMap::ppop(CellTypeState *out) {
1727 while (!(*out).is_bottom()) {
1728 ppop1(*out++);
1729 }
1730 }
1731
1732 void GenerateOopMap::ppush1(CellTypeState in) {
1733 assert(in.is_reference() || in.is_value(), "sanity check");
1734 push(in);
1735 }
1736
1737 void GenerateOopMap::ppush(CellTypeState *in) {
1738 while (!(*in).is_bottom()) {
1739 ppush1(*in++);
1740 }
1741 }
1742
1743 void GenerateOopMap::pp(CellTypeState *in, CellTypeState *out) {
1744 ppop(in);
1745 ppush(out);
1746 }
1747
1748 void GenerateOopMap::pp_new_ref(CellTypeState *in, int bci) {
1749 ppop(in);
1750 ppush1(CellTypeState::make_line_ref(bci));
1751 }
1752
1753 void GenerateOopMap::ppop_any(int poplen) {
1754 if (_stack_top >= poplen) {
1755 _stack_top -= poplen;
1756 } else {
1757 verify_error("stack underflow");
1758 }
1759 }
1760
1761 // Replace all occurrences of the state 'match' with the state 'replace'
1762 // in our current state vector.
1763 void GenerateOopMap::replace_all_CTS_matches(CellTypeState match,
1764 CellTypeState replace) {
1765 int i;
1766 int len = _max_locals + _stack_top;
1767 bool change = false;
1768
1769 for (i = len - 1; i >= 0; i--) {
1770 if (match.equal(_state[i])) {
1771 _state[i] = replace;
1772 }
1773 }
1774
1775 if (_monitor_top > 0) {
1776 int base = _max_locals + _max_stack;
1777 len = base + _monitor_top;
1778 for (i = len - 1; i >= base; i--) {
1779 if (match.equal(_state[i])) {
1780 _state[i] = replace;
1781 }
1782 }
1783 }
1784 }
1785
1786 void GenerateOopMap::do_checkcast() {
1787 CellTypeState actual = pop();
1788 check_type(refCTS, actual);
1789 push(actual);
1790 }
1791
1792 void GenerateOopMap::do_monitorenter(int bci) {
1793 CellTypeState actual = pop();
1794 if (_monitor_top == bad_monitors) {
1795 return;
1796 }
1797
1798 // Bail out when we get repeated locks on an identical monitor. This case
1799 // isn't too hard to handle and can be made to work if supporting nested
1800 // redundant synchronized statements becomes a priority.
1801 //
1802 // See also "Note" in do_monitorexit(), below.
1803 if (actual.is_lock_reference()) {
1804 _monitor_top = bad_monitors;
1805 _monitor_safe = false;
1806
1807 if (log_is_enabled(Info, monitormismatch)) {
1808 report_monitor_mismatch("nested redundant lock -- bailout...");
1809 }
1810 return;
1811 }
1812
1813 CellTypeState lock = CellTypeState::make_lock_ref(bci);
1814 check_type(refCTS, actual);
1815 if (!actual.is_info_top()) {
1816 replace_all_CTS_matches(actual, lock);
1817 monitor_push(lock);
1818 }
1819 }
1820
1821 void GenerateOopMap::do_monitorexit(int bci) {
1822 CellTypeState actual = pop();
1823 if (_monitor_top == bad_monitors) {
1824 return;
1825 }
1826 check_type(refCTS, actual);
1827 CellTypeState expected = monitor_pop();
1828 if (!actual.is_lock_reference() || !expected.equal(actual)) {
1829 // The monitor we are exiting is not verifiably the one
1830 // on the top of our monitor stack. This causes a monitor
1831 // mismatch.
1832 _monitor_top = bad_monitors;
1833 _monitor_safe = false;
1834
1835 // We need to mark this basic block as changed so that
1836 // this monitorexit will be visited again. We need to
1837 // do this to ensure that we have accounted for the
1838 // possibility that this bytecode will throw an
1839 // exception.
1840 BasicBlock* bb = get_basic_block_containing(bci);
1841 guarantee(bb != nullptr, "no basic block for bci");
1842 bb->set_changed(true);
1843 bb->_monitor_top = bad_monitors;
1844
1845 if (log_is_enabled(Info, monitormismatch)) {
1846 report_monitor_mismatch("improper monitor pair");
1847 }
1848 } else {
1849 // This code is a fix for the case where we have repeated
1850 // locking of the same object in straightline code. We clear
1851 // out the lock when it is popped from the monitor stack
1852 // and replace it with an unobtrusive reference value that can
1853 // be locked again.
1854 //
1855 // Note: when generateOopMap is fixed to properly handle repeated,
1856 // nested, redundant locks on the same object, then this
1857 // fix will need to be removed at that time.
1858 replace_all_CTS_matches(actual, CellTypeState::make_line_ref(bci));
1859 }
1860 }
1861
1862 void GenerateOopMap::do_return_monitor_check() {
1863 if (_monitor_top > 0) {
1864 // The monitor stack must be empty when we leave the method
1865 // for the monitors to be properly matched.
1866 _monitor_safe = false;
1867
1868 // Since there are no successors to the *return bytecode, it
1869 // isn't necessary to set _monitor_top to bad_monitors.
1870
1871 if (log_is_enabled(Info, monitormismatch)) {
1872 report_monitor_mismatch("non-empty monitor stack at return");
1873 }
1874 }
1875 }
1876
1877 void GenerateOopMap::do_jsr(int targ_bci) {
1878 push(CellTypeState::make_addr(targ_bci));
1879 }
1880
1881
1882
1883 void GenerateOopMap::do_ldc(int bci) {
1884 Bytecode_loadconstant ldc(methodHandle(Thread::current(), method()), bci);
1885 ConstantPool* cp = method()->constants();
1886 constantTag tag = cp->tag_at(ldc.pool_index()); // idx is index in resolved_references
1887 BasicType bt = ldc.result_type();
1888 #ifdef ASSERT
1889 BasicType tag_bt = (tag.is_dynamic_constant() || tag.is_dynamic_constant_in_error()) ? bt : tag.basic_type();
1890 assert(bt == tag_bt, "same result");
1891 #endif
1892 CellTypeState cts;
1893 if (is_reference_type(bt)) { // could be T_ARRAY with condy
1894 assert(!tag.is_string_index() && !tag.is_klass_index(), "Unexpected index tag");
1895 cts = CellTypeState::make_line_ref(bci);
1896 } else {
1897 cts = valCTS;
1898 }
1899 ppush1(cts);
1900 }
1901
1902 void GenerateOopMap::do_multianewarray(int dims, int bci) {
1903 assert(dims >= 1, "sanity check");
1904 for(int i = dims -1; i >=0; i--) {
1905 ppop1(valCTS);
1906 }
1907 ppush1(CellTypeState::make_line_ref(bci));
1908 }
1909
1910 void GenerateOopMap::do_astore(int idx) {
1911 CellTypeState r_or_p = pop();
1912 if (!r_or_p.is_address() && !r_or_p.is_reference()) {
1913 // We actually expected ref or pc, but we only report that we expected a ref. It does not
1914 // really matter (at least for now)
1915 verify_error("wrong type on stack (found: %c, expected: {pr})", r_or_p.to_char());
1916 return;
1917 }
1918 set_var(idx, r_or_p);
1919 }
1920
1921 // Copies bottom/zero terminated CTS string from "src" into "dst".
1922 // Does NOT terminate with a bottom. Returns the number of cells copied.
1923 int GenerateOopMap::copy_cts(CellTypeState *dst, CellTypeState *src) {
1924 int idx = 0;
1925 while (!src[idx].is_bottom()) {
1926 dst[idx] = src[idx];
1927 idx++;
1928 }
1929 return idx;
1930 }
1931
1932 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci, Bytecodes::Code bc) {
1933 // Dig up signature for field in constant pool
1934 ConstantPool* cp = method()->constants();
1935 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx, bc);
1936 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1937 Symbol* signature = cp->symbol_at(signatureIdx);
1938
1939 CellTypeState temp[4];
1940 CellTypeState *eff = signature_to_effect(signature, bci, temp);
1941
1942 CellTypeState in[4];
1943 CellTypeState *out;
1944 int i = 0;
1945
1946 if (is_get) {
1947 out = eff;
1948 } else {
1949 out = epsilonCTS;
1950 i = copy_cts(in, eff);
1951 }
1952 if (!is_static) in[i++] = CellTypeState::ref;
1953 in[i] = CellTypeState::bottom;
1954 assert(i<=3, "sanity check");
1955 pp(in, out);
1956 }
1957
1958 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci, Bytecodes::Code bc) {
1959 // Dig up signature for field in constant pool
1960 ConstantPool* cp = _method->constants();
1961 Symbol* signature = cp->signature_ref_at(idx, bc);
1962
1963 // Parse method signature
1964 CellTypeState out[4];
1965 CellTypeState in[MAXARGSIZE+1]; // Includes result
1966 ComputeCallStack cse(signature);
1967
1968 // Compute return type
1969 int res_length= cse.compute_for_returntype(out);
1970
1971 // Temporary hack.
1972 if (out[0].equal(CellTypeState::ref) && out[1].equal(CellTypeState::bottom)) {
1973 out[0] = CellTypeState::make_line_ref(bci);
1974 }
1975
1976 assert(res_length<=4, "max value should be vv");
1977
1978 // Compute arguments
1979 int arg_length = cse.compute_for_parameters(is_static != 0, in);
1980 assert(arg_length<=MAXARGSIZE, "too many locals");
1981
1982 // Pop arguments
1983 for (int i = arg_length - 1; i >= 0; i--) ppop1(in[i]);// Do args in reverse order.
1984
1985 // Report results
1986 if (_report_result_for_send == true) {
1987 fill_stackmap_for_opcodes(_itr_send, vars(), stack(), _stack_top);
1988 _report_result_for_send = false;
1989 }
1990
1991 // Push return address
1992 ppush(out);
1993 }
1994
1995 // This is used to parse the signature for fields, since they are very simple...
1996 CellTypeState *GenerateOopMap::signature_to_effect(const Symbol* sig, int bci, CellTypeState *out) {
1997 // Object and array
1998 BasicType bt = Signature::basic_type(sig);
1999 if (is_reference_type(bt)) {
2000 out[0] = CellTypeState::make_line_ref(bci);
2001 out[1] = CellTypeState::bottom;
2002 return out;
2003 }
2004 if (is_double_word_type(bt)) return vvCTS; // Long and Double
2005 if (bt == T_VOID) return epsilonCTS; // Void
2006 return vCTS; // Otherwise
2007 }
2008
2009 uint64_t GenerateOopMap::_total_byte_count = 0;
2010 elapsedTimer GenerateOopMap::_total_oopmap_time;
2011
2012 // This function assumes "bcs" is at a "ret" instruction and that the vars
2013 // state is valid for that instruction. Furthermore, the ret instruction
2014 // must be the last instruction in "bb" (we store information about the
2015 // "ret" in "bb").
2016 void GenerateOopMap::ret_jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int varNo, int *data) {
2017 CellTypeState ra = vars()[varNo];
2018 if (!ra.is_good_address()) {
2019 verify_error("ret returns from two jsr subroutines?");
2020 return;
2021 }
2022 int target = ra.get_info();
2023
2024 RetTableEntry* rtEnt = _rt.find_jsrs_for_target(target);
2025 int bci = bcs->bci();
2026 for (int i = 0; i < rtEnt->nof_jsrs(); i++) {
2027 int target_bci = rtEnt->jsrs(i);
2028 // Make sure a jrtRet does not set the changed bit for dead basicblock.
2029 BasicBlock* jsr_bb = get_basic_block_containing(target_bci - 1);
2030 DEBUG_ONLY(BasicBlock* target_bb = &jsr_bb[1];)
2031 assert(target_bb == get_basic_block_at(target_bci), "wrong calc. of successor basicblock");
2032 bool alive = jsr_bb->is_alive();
2033 if (TraceNewOopMapGeneration) {
2034 tty->print("pc = %d, ret -> %d alive: %s\n", bci, target_bci, alive ? "true" : "false");
2035 }
2036 if (alive) jmpFct(this, target_bci, data);
2037 }
2038 }
2039
2040 //
2041 // Debug method
2042 //
2043 char* GenerateOopMap::state_vec_to_string(CellTypeState* vec, int len) {
2044 #ifdef ASSERT
2045 int checklen = MAX3(_max_locals, _max_stack, _max_monitors) + 1;
2046 assert(len < checklen, "state_vec_buf overflow");
2047 #endif
2048 for (int i = 0; i < len; i++) _state_vec_buf[i] = vec[i].to_char();
2049 _state_vec_buf[len] = 0;
2050 return _state_vec_buf;
2051 }
2052
2053 void GenerateOopMap::print_time() {
2054 tty->print_cr ("Accumulated oopmap times:");
2055 tty->print_cr ("---------------------------");
2056 tty->print_cr (" Total : %3.3f sec.", GenerateOopMap::_total_oopmap_time.seconds());
2057 tty->print_cr (" (%3.0f bytecodes per sec) ",
2058 (double)GenerateOopMap::_total_byte_count / GenerateOopMap::_total_oopmap_time.seconds());
2059 }
2060
2061 //
2062 // ============ Main Entry Point ===========
2063 //
2064 GenerateOopMap::GenerateOopMap(const methodHandle& method) {
2065 // We have to initialize all variables here, that can be queried directly
2066 _method = method;
2067 _max_locals=0;
2068 _init_vars = nullptr;
2069
2070 #ifndef PRODUCT
2071 // If we are doing a detailed trace, include the regular trace information.
2072 if (TraceNewOopMapGenerationDetailed) {
2073 TraceNewOopMapGeneration = true;
2074 }
2075 #endif
2076 }
2077
2078 bool GenerateOopMap::compute_map(Thread* current) {
2079 #ifndef PRODUCT
2080 if (TimeOopMap2) {
2081 method()->print_short_name(tty);
2082 tty->print(" ");
2083 }
2084 if (TimeOopMap) {
2085 _total_byte_count += method()->code_size();
2086 }
2087 #endif
2088 TraceTime t_single("oopmap time", TimeOopMap2);
2089 TraceTime t_all(nullptr, &_total_oopmap_time, TimeOopMap);
2090
2091 // Initialize values
2092 _got_error = false;
2093 _conflict = false;
2094 _max_locals = method()->max_locals();
2095 _max_stack = method()->max_stack();
2096 _has_exceptions = (method()->has_exception_handler());
2097 _nof_refval_conflicts = 0;
2098 _init_vars = new GrowableArray<intptr_t>(5); // There are seldom more than 5 init_vars
2099 _report_result = false;
2100 _report_result_for_send = false;
2101 _new_var_map = nullptr;
2102 _ret_adr_tos = new GrowableArray<int>(5); // 5 seems like a good number;
2103 _did_rewriting = false;
2104 _did_relocation = false;
2105
2106 if (TraceNewOopMapGeneration) {
2107 tty->print("Method name: %s\n", method()->name()->as_C_string());
2108 if (Verbose) {
2109 _method->print_codes();
2110 tty->print_cr("Exception table:");
2111 ExceptionTable excps(method());
2112 for(int i = 0; i < excps.length(); i ++) {
2113 tty->print_cr("[%d - %d] -> %d",
2114 excps.start_pc(i), excps.end_pc(i), excps.handler_pc(i));
2115 }
2116 }
2117 }
2118
2119 // if no code - do nothing
2120 // compiler needs info
2121 if (method()->code_size() == 0 || _max_locals + method()->max_stack() == 0) {
2122 fill_stackmap_prolog(0);
2123 fill_stackmap_epilog();
2124 return true;
2125 }
2126 // Step 1: Compute all jump targets and their return value
2127 if (!_got_error)
2128 _rt.compute_ret_table(_method);
2129
2130 // Step 2: Find all basic blocks and count GC points
2131 if (!_got_error)
2132 mark_bbheaders_and_count_gc_points();
2133
2134 // Step 3: Calculate stack maps
2135 if (!_got_error)
2136 do_interpretation();
2137
2138 // Step 4:Return results
2139 if (!_got_error && report_results())
2140 report_result();
2141
2142 return !_got_error;
2143 }
2144
2145 // Error handling methods
2146 //
2147 // If we compute from a suitable JavaThread then we create an exception for the GenerateOopMap
2148 // calling code to retrieve (via exception()) and throw if desired (in most cases errors are ignored).
2149 // Otherwise it is considered a fatal error to hit malformed bytecode.
2150 void GenerateOopMap::error_work(const char *format, va_list ap) {
2151 _got_error = true;
2152 char msg_buffer[512];
2153 (void) os::vsnprintf(msg_buffer, sizeof(msg_buffer), format, ap);
2154 // Append method name
2155 char msg_buffer2[512];
2156 (void) os::snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg_buffer, method()->name()->as_C_string());
2157 Thread* current = Thread::current();
2158 if (current->can_call_java()) {
2159 _exception = Exceptions::new_exception(JavaThread::cast(current),
2160 vmSymbols::java_lang_LinkageError(),
2161 msg_buffer2);
2162 } else {
2163 fatal("%s", msg_buffer2);
2164 }
2165 }
2166
2167 void GenerateOopMap::report_error(const char *format, ...) {
2168 va_list ap;
2169 va_start(ap, format);
2170 error_work(format, ap);
2171 }
2172
2173 void GenerateOopMap::verify_error(const char *format, ...) {
2174 // We do not distinguish between different types of errors for verification
2175 // errors. Let the verifier give a better message.
2176 report_error("Illegal class file encountered. Try running with -Xverify:all");
2177 }
2178
2179 //
2180 // Report result opcodes
2181 //
2182 void GenerateOopMap::report_result() {
2183
2184 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass");
2185
2186 // We now want to report the result of the parse
2187 _report_result = true;
2188
2189 // Prolog code
2190 fill_stackmap_prolog(_gc_points);
2191
2192 // Mark everything changed, then do one interpretation pass.
2193 for (int i = 0; i<_bb_count; i++) {
2194 if (_basic_blocks[i].is_reachable()) {
2195 _basic_blocks[i].set_changed(true);
2196 interp_bb(&_basic_blocks[i]);
2197 }
2198 }
2199
2200 // Note: Since we are skipping dead-code when we are reporting results, then
2201 // the no. of encountered gc-points might be fewer than the previously number
2202 // we have counted. (dead-code is a pain - it should be removed before we get here)
2203 fill_stackmap_epilog();
2204
2205 // Report initvars
2206 fill_init_vars(_init_vars);
2207
2208 _report_result = false;
2209 }
2210
2211 void GenerateOopMap::result_for_basicblock(int bci) {
2212 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass for basicblock");
2213
2214 // We now want to report the result of the parse
2215 _report_result = true;
2216
2217 // Find basicblock and report results
2218 BasicBlock* bb = get_basic_block_containing(bci);
2219 guarantee(bb != nullptr, "no basic block for bci");
2220 assert(bb->is_reachable(), "getting result from unreachable basicblock");
2221 bb->set_changed(true);
2222 interp_bb(bb);
2223 }
2224
2225 //
2226 // Conflict handling code
2227 //
2228
2229 void GenerateOopMap::record_refval_conflict(int varNo) {
2230 assert(varNo>=0 && varNo< _max_locals, "index out of range");
2231
2232 if (TraceOopMapRewrites) {
2233 tty->print("### Conflict detected (local no: %d)\n", varNo);
2234 }
2235
2236 if (!_new_var_map) {
2237 _new_var_map = NEW_RESOURCE_ARRAY(int, _max_locals);
2238 for (int k = 0; k < _max_locals; k++) _new_var_map[k] = k;
2239 }
2240
2241 if ( _new_var_map[varNo] == varNo) {
2242 // Check if max. number of locals has been reached
2243 if (_max_locals + _nof_refval_conflicts >= MAX_LOCAL_VARS) {
2244 report_error("Rewriting exceeded local variable limit");
2245 return;
2246 }
2247 _new_var_map[varNo] = _max_locals + _nof_refval_conflicts;
2248 _nof_refval_conflicts++;
2249 }
2250 }
2251
2252 void GenerateOopMap::rewrite_refval_conflicts()
2253 {
2254 // We can get here two ways: Either a rewrite conflict was detected, or
2255 // an uninitialize reference was detected. In the second case, we do not
2256 // do any rewriting, we just want to recompute the reference set with the
2257 // new information
2258
2259 int nof_conflicts = 0; // Used for debugging only
2260
2261 if ( _nof_refval_conflicts == 0 )
2262 return;
2263
2264 // Check if rewrites are allowed in this parse.
2265 if (!allow_rewrites()) {
2266 fatal("Rewriting method not allowed at this stage");
2267 }
2268
2269
2270 // Tracing flag
2271 _did_rewriting = true;
2272
2273 if (TraceOopMapRewrites) {
2274 tty->print_cr("ref/value conflict for method %s - bytecodes are getting rewritten", method()->name()->as_C_string());
2275 method()->print();
2276 method()->print_codes();
2277 }
2278
2279 assert(_new_var_map!=nullptr, "nothing to rewrite");
2280 assert(_conflict==true, "We should not be here");
2281
2282 compute_ret_adr_at_TOS();
2283 if (!_got_error) {
2284 for (int k = 0; k < _max_locals && !_got_error; k++) {
2285 if (_new_var_map[k] != k) {
2286 if (TraceOopMapRewrites) {
2287 tty->print_cr("Rewriting: %d -> %d", k, _new_var_map[k]);
2288 }
2289 rewrite_refval_conflict(k, _new_var_map[k]);
2290 if (_got_error) return;
2291 nof_conflicts++;
2292 }
2293 }
2294 }
2295
2296 assert(nof_conflicts == _nof_refval_conflicts, "sanity check");
2297
2298 // Adjust the number of locals
2299 method()->set_max_locals(_max_locals+_nof_refval_conflicts);
2300 _max_locals += _nof_refval_conflicts;
2301
2302 // That was that...
2303 _new_var_map = nullptr;
2304 _nof_refval_conflicts = 0;
2305 }
2306
2307 void GenerateOopMap::rewrite_refval_conflict(int from, int to) {
2308 bool startOver;
2309 do {
2310 // Make sure that the BytecodeStream is constructed in the loop, since
2311 // during rewriting a new method is going to be used, and the next time
2312 // around we want to use that.
2313 BytecodeStream bcs(_method);
2314 startOver = false;
2315
2316 while( !startOver && !_got_error &&
2317 // test bcs in case method changed and it became invalid
2318 bcs.next() >=0) {
2319 startOver = rewrite_refval_conflict_inst(&bcs, from, to);
2320 }
2321 } while (startOver && !_got_error);
2322 }
2323
2324 /* If the current instruction is one that uses local variable "from"
2325 in a ref way, change it to use "to". There's a subtle reason why we
2326 renumber the ref uses and not the non-ref uses: non-ref uses may be
2327 2 slots wide (double, long) which would necessitate keeping track of
2328 whether we should add one or two variables to the method. If the change
2329 affected the width of some instruction, returns "TRUE"; otherwise, returns "FALSE".
2330 Another reason for moving ref's value is for solving (addr, ref) conflicts, which
2331 both uses aload/astore methods.
2332 */
2333 bool GenerateOopMap::rewrite_refval_conflict_inst(BytecodeStream *itr, int from, int to) {
2334 Bytecodes::Code bc = itr->code();
2335 int index;
2336 int bci = itr->bci();
2337
2338 if (is_aload(itr, &index) && index == from) {
2339 if (TraceOopMapRewrites) {
2340 tty->print_cr("Rewriting aload at bci: %d", bci);
2341 }
2342 return rewrite_load_or_store(itr, Bytecodes::_aload, Bytecodes::_aload_0, to);
2343 }
2344
2345 if (is_astore(itr, &index) && index == from) {
2346 if (!stack_top_holds_ret_addr(bci)) {
2347 if (TraceOopMapRewrites) {
2348 tty->print_cr("Rewriting astore at bci: %d", bci);
2349 }
2350 return rewrite_load_or_store(itr, Bytecodes::_astore, Bytecodes::_astore_0, to);
2351 } else {
2352 if (TraceOopMapRewrites) {
2353 tty->print_cr("Suppress rewriting of astore at bci: %d", bci);
2354 }
2355 }
2356 }
2357
2358 return false;
2359 }
2360
2361 // The argument to this method is:
2362 // bc : Current bytecode
2363 // bcN : either _aload or _astore
2364 // bc0 : either _aload_0 or _astore_0
2365 bool GenerateOopMap::rewrite_load_or_store(BytecodeStream *bcs, Bytecodes::Code bcN, Bytecodes::Code bc0, unsigned int varNo) {
2366 assert(bcN == Bytecodes::_astore || bcN == Bytecodes::_aload, "wrong argument (bcN)");
2367 assert(bc0 == Bytecodes::_astore_0 || bc0 == Bytecodes::_aload_0, "wrong argument (bc0)");
2368 int ilen = Bytecodes::length_at(_method(), bcs->bcp());
2369 int newIlen;
2370
2371 if (ilen == 4) {
2372 // Original instruction was wide; keep it wide for simplicity
2373 newIlen = 4;
2374 } else if (varNo < 4)
2375 newIlen = 1;
2376 else if (varNo >= 256)
2377 newIlen = 4;
2378 else
2379 newIlen = 2;
2380
2381 // If we need to relocate in order to patch the byte, we
2382 // do the patching in a temp. buffer, that is passed to the reloc.
2383 // The patching of the bytecode stream is then done by the Relocator.
2384 // This is necessary, since relocating the instruction at a certain bci, might
2385 // also relocate that instruction, e.g., if a _goto before it gets widen to a _goto_w.
2386 // Hence, we do not know which bci to patch after relocation.
2387
2388 assert(newIlen <= 4, "sanity check");
2389 u_char inst_buffer[4]; // Max. instruction size is 4.
2390 address bcp;
2391
2392 if (newIlen != ilen) {
2393 // Relocation needed do patching in temp. buffer
2394 bcp = (address)inst_buffer;
2395 } else {
2396 bcp = _method->bcp_from(bcs->bci());
2397 }
2398
2399 // Patch either directly in Method* or in temp. buffer
2400 if (newIlen == 1) {
2401 assert(varNo < 4, "varNo too large");
2402 *bcp = (u1)(bc0 + varNo);
2403 } else if (newIlen == 2) {
2404 assert(varNo < 256, "2-byte index needed!");
2405 *(bcp + 0) = bcN;
2406 *(bcp + 1) = (u1)varNo;
2407 } else {
2408 assert(newIlen == 4, "Wrong instruction length");
2409 *(bcp + 0) = Bytecodes::_wide;
2410 *(bcp + 1) = bcN;
2411 Bytes::put_Java_u2(bcp+2, (u2)varNo);
2412 }
2413
2414 if (newIlen != ilen) {
2415 expand_current_instr(bcs->bci(), ilen, newIlen, inst_buffer);
2416 }
2417
2418
2419 return (newIlen != ilen);
2420 }
2421
2422 class RelocCallback : public RelocatorListener {
2423 private:
2424 GenerateOopMap* _gom;
2425 public:
2426 RelocCallback(GenerateOopMap* gom) { _gom = gom; };
2427
2428 // Callback method
2429 virtual void relocated(int bci, int delta, int new_code_length) {
2430 _gom->update_basic_blocks (bci, delta, new_code_length);
2431 _gom->update_ret_adr_at_TOS(bci, delta);
2432 _gom->_rt.update_ret_table (bci, delta);
2433 }
2434 };
2435
2436 // Returns true if expanding was successful. Otherwise, reports an error and
2437 // returns false.
2438 void GenerateOopMap::expand_current_instr(int bci, int ilen, int newIlen, u_char inst_buffer[]) {
2439 JavaThread* THREAD = JavaThread::current(); // For exception macros.
2440 RelocCallback rcb(this);
2441 Relocator rc(_method, &rcb);
2442 methodHandle m= rc.insert_space_at(bci, newIlen, inst_buffer, THREAD);
2443 if (m.is_null() || HAS_PENDING_EXCEPTION) {
2444 report_error("could not rewrite method - exception occurred or bytecode buffer overflow");
2445 return;
2446 }
2447
2448 // Relocator returns a new method.
2449 _did_relocation = true;
2450 _method = m;
2451 }
2452
2453
2454 bool GenerateOopMap::is_astore(BytecodeStream *itr, int *index) {
2455 Bytecodes::Code bc = itr->code();
2456 switch(bc) {
2457 case Bytecodes::_astore_0:
2458 case Bytecodes::_astore_1:
2459 case Bytecodes::_astore_2:
2460 case Bytecodes::_astore_3:
2461 *index = bc - Bytecodes::_astore_0;
2462 return true;
2463 case Bytecodes::_astore:
2464 *index = itr->get_index();
2465 return true;
2466 default:
2467 return false;
2468 }
2469 }
2470
2471 bool GenerateOopMap::is_aload(BytecodeStream *itr, int *index) {
2472 Bytecodes::Code bc = itr->code();
2473 switch(bc) {
2474 case Bytecodes::_aload_0:
2475 case Bytecodes::_aload_1:
2476 case Bytecodes::_aload_2:
2477 case Bytecodes::_aload_3:
2478 *index = bc - Bytecodes::_aload_0;
2479 return true;
2480
2481 case Bytecodes::_aload:
2482 *index = itr->get_index();
2483 return true;
2484
2485 default:
2486 return false;
2487 }
2488 }
2489
2490
2491 // Return true iff the top of the operand stack holds a return address at
2492 // the current instruction
2493 bool GenerateOopMap::stack_top_holds_ret_addr(int bci) {
2494 for(int i = 0; i < _ret_adr_tos->length(); i++) {
2495 if (_ret_adr_tos->at(i) == bci)
2496 return true;
2497 }
2498
2499 return false;
2500 }
2501
2502 void GenerateOopMap::compute_ret_adr_at_TOS() {
2503 assert(_ret_adr_tos != nullptr, "must be initialized");
2504 _ret_adr_tos->clear();
2505
2506 for (int i = 0; i < bb_count(); i++) {
2507 BasicBlock* bb = &_basic_blocks[i];
2508
2509 // Make sure to only check basicblocks that are reachable
2510 if (bb->is_reachable()) {
2511
2512 // For each Basic block we check all instructions
2513 BytecodeStream bcs(_method);
2514 bcs.set_interval(bb->_bci, next_bb_start_pc(bb));
2515
2516 restore_state(bb);
2517
2518 while (bcs.next()>=0 && !_got_error) {
2519 // TDT: should this be is_good_address() ?
2520 if (_stack_top > 0 && stack()[_stack_top-1].is_address()) {
2521 _ret_adr_tos->append(bcs.bci());
2522 if (TraceNewOopMapGeneration) {
2523 tty->print_cr("Ret_adr TOS at bci: %d", bcs.bci());
2524 }
2525 }
2526 interp1(&bcs);
2527 }
2528 }
2529 }
2530 }
2531
2532 void GenerateOopMap::update_ret_adr_at_TOS(int bci, int delta) {
2533 for(int i = 0; i < _ret_adr_tos->length(); i++) {
2534 int v = _ret_adr_tos->at(i);
2535 if (v > bci) _ret_adr_tos->at_put(i, v + delta);
2536 }
2537 }
2538
2539 // ===================================================================
2540
2541 #ifndef PRODUCT
2542 int ResolveOopMapConflicts::_nof_invocations = 0;
2543 int ResolveOopMapConflicts::_nof_rewrites = 0;
2544 int ResolveOopMapConflicts::_nof_relocations = 0;
2545 #endif
2546
2547 methodHandle ResolveOopMapConflicts::do_potential_rewrite(TRAPS) {
2548 if (!compute_map(THREAD)) {
2549 THROW_HANDLE_(exception(), methodHandle());
2550 }
2551
2552 #ifndef PRODUCT
2553 // Tracking and statistics
2554 if (PrintRewrites) {
2555 _nof_invocations++;
2556 if (did_rewriting()) {
2557 _nof_rewrites++;
2558 if (did_relocation()) _nof_relocations++;
2559 tty->print("Method was rewritten %s: ", (did_relocation()) ? "and relocated" : "");
2560 method()->print_value(); tty->cr();
2561 tty->print_cr("Cand.: %d rewrts: %d (%d%%) reloc.: %d (%d%%)",
2562 _nof_invocations,
2563 _nof_rewrites, (_nof_rewrites * 100) / _nof_invocations,
2564 _nof_relocations, (_nof_relocations * 100) / _nof_invocations);
2565 }
2566 }
2567 #endif
2568 return methodHandle(THREAD, method());
2569 }