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