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