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