Tue, 15 Nov 2011 20:17:33 +0100
7110152: assert(size_in_words <= (julong)max_jint) failed: no overflow
Summary: Reduce what arrayOopDesc::max_array_length() returns to avoid int overflow
Reviewed-by: kvn, dholmes, tonyp
1 /*
2 * Copyright (c) 1997, 2011, 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"
35 //
36 //
37 // Compute stack layouts for each instruction in method.
38 //
39 // Problems:
40 // - What to do about jsr with different types of local vars?
41 // Need maps that are conditional on jsr path?
42 // - Jsr and exceptions should be done more efficiently (the retAddr stuff)
43 //
44 // Alternative:
45 // - Could extend verifier to provide this information.
46 // For: one fewer abstract interpreter to maintain. Against: the verifier
47 // solves a bigger problem so slower (undesirable to force verification of
48 // everything?).
49 //
50 // Algorithm:
51 // Partition bytecodes into basic blocks
52 // For each basic block: store entry state (vars, stack). For instructions
53 // inside basic blocks we do not store any state (instead we recompute it
54 // from state produced by previous instruction).
55 //
56 // Perform abstract interpretation of bytecodes over this lattice:
57 //
58 // _--'#'--_
59 // / / \ \
60 // / / \ \
61 // / | | \
62 // 'r' 'v' 'p' ' '
63 // \ | | /
64 // \ \ / /
65 // \ \ / /
66 // -- '@' --
67 //
68 // '#' top, result of conflict merge
69 // 'r' reference type
70 // 'v' value type
71 // 'p' pc type for jsr/ret
72 // ' ' uninitialized; never occurs on operand stack in Java
73 // '@' bottom/unexecuted; initial state each bytecode.
74 //
75 // Basic block headers are the only merge points. We use this iteration to
76 // compute the information:
77 //
78 // find basic blocks;
79 // initialize them with uninitialized state;
80 // initialize first BB according to method signature;
81 // mark first BB changed
82 // while (some BB is changed) do {
83 // perform abstract interpration of all bytecodes in BB;
84 // merge exit state of BB into entry state of all successor BBs,
85 // noting if any of these change;
86 // }
87 //
88 // One additional complication is necessary. The jsr instruction pushes
89 // a return PC on the stack (a 'p' type in the abstract interpretation).
90 // To be able to process "ret" bytecodes, we keep track of these return
91 // PC's in a 'retAddrs' structure in abstract interpreter context (when
92 // processing a "ret" bytecodes, it is not sufficient to know that it gets
93 // an argument of the right type 'p'; we need to know which address it
94 // returns to).
95 //
96 // (Note this comment is borrowed form the original author of the algorithm)
98 // ComputeCallStack
99 //
100 // Specialization of SignatureIterator - compute the effects of a call
101 //
102 class ComputeCallStack : public SignatureIterator {
103 CellTypeState *_effect;
104 int _idx;
106 void setup();
107 void set(CellTypeState state) { _effect[_idx++] = state; }
108 int length() { return _idx; };
110 virtual void do_bool () { set(CellTypeState::value); };
111 virtual void do_char () { set(CellTypeState::value); };
112 virtual void do_float () { set(CellTypeState::value); };
113 virtual void do_byte () { set(CellTypeState::value); };
114 virtual void do_short () { set(CellTypeState::value); };
115 virtual void do_int () { set(CellTypeState::value); };
116 virtual void do_void () { set(CellTypeState::bottom);};
117 virtual void do_object(int begin, int end) { set(CellTypeState::ref); };
118 virtual void do_array (int begin, int end) { set(CellTypeState::ref); };
120 void do_double() { set(CellTypeState::value);
121 set(CellTypeState::value); }
122 void do_long () { set(CellTypeState::value);
123 set(CellTypeState::value); }
125 public:
126 ComputeCallStack(Symbol* signature) : SignatureIterator(signature) {};
128 // Compute methods
129 int compute_for_parameters(bool is_static, CellTypeState *effect) {
130 _idx = 0;
131 _effect = effect;
133 if (!is_static)
134 effect[_idx++] = CellTypeState::ref;
136 iterate_parameters();
138 return length();
139 };
141 int compute_for_returntype(CellTypeState *effect) {
142 _idx = 0;
143 _effect = effect;
144 iterate_returntype();
145 set(CellTypeState::bottom); // Always terminate with a bottom state, so ppush works
147 return length();
148 }
149 };
151 //=========================================================================================
152 // ComputeEntryStack
153 //
154 // Specialization of SignatureIterator - in order to set up first stack frame
155 //
156 class ComputeEntryStack : public SignatureIterator {
157 CellTypeState *_effect;
158 int _idx;
160 void setup();
161 void set(CellTypeState state) { _effect[_idx++] = state; }
162 int length() { return _idx; };
164 virtual void do_bool () { set(CellTypeState::value); };
165 virtual void do_char () { set(CellTypeState::value); };
166 virtual void do_float () { set(CellTypeState::value); };
167 virtual void do_byte () { set(CellTypeState::value); };
168 virtual void do_short () { set(CellTypeState::value); };
169 virtual void do_int () { set(CellTypeState::value); };
170 virtual void do_void () { set(CellTypeState::bottom);};
171 virtual void do_object(int begin, int end) { set(CellTypeState::make_slot_ref(_idx)); }
172 virtual void do_array (int begin, int end) { set(CellTypeState::make_slot_ref(_idx)); }
174 void do_double() { set(CellTypeState::value);
175 set(CellTypeState::value); }
176 void do_long () { set(CellTypeState::value);
177 set(CellTypeState::value); }
179 public:
180 ComputeEntryStack(Symbol* signature) : SignatureIterator(signature) {};
182 // Compute methods
183 int compute_for_parameters(bool is_static, CellTypeState *effect) {
184 _idx = 0;
185 _effect = effect;
187 if (!is_static)
188 effect[_idx++] = CellTypeState::make_slot_ref(0);
190 iterate_parameters();
192 return length();
193 };
195 int compute_for_returntype(CellTypeState *effect) {
196 _idx = 0;
197 _effect = effect;
198 iterate_returntype();
199 set(CellTypeState::bottom); // Always terminate with a bottom state, so ppush works
201 return length();
202 }
203 };
205 //=====================================================================================
206 //
207 // Implementation of RetTable/RetTableEntry
208 //
209 // Contains function to itereate through all bytecodes
210 // and find all return entry points
211 //
212 int RetTable::_init_nof_entries = 10;
213 int RetTableEntry::_init_nof_jsrs = 5;
215 void RetTableEntry::add_delta(int bci, int delta) {
216 if (_target_bci > bci) _target_bci += delta;
218 for (int k = 0; k < _jsrs->length(); k++) {
219 int jsr = _jsrs->at(k);
220 if (jsr > bci) _jsrs->at_put(k, jsr+delta);
221 }
222 }
224 void RetTable::compute_ret_table(methodHandle method) {
225 BytecodeStream i(method);
226 Bytecodes::Code bytecode;
228 while( (bytecode = i.next()) >= 0) {
229 switch (bytecode) {
230 case Bytecodes::_jsr:
231 add_jsr(i.next_bci(), i.dest());
232 break;
233 case Bytecodes::_jsr_w:
234 add_jsr(i.next_bci(), i.dest_w());
235 break;
236 }
237 }
238 }
240 void RetTable::add_jsr(int return_bci, int target_bci) {
241 RetTableEntry* entry = _first;
243 // Scan table for entry
244 for (;entry && entry->target_bci() != target_bci; entry = entry->next());
246 if (!entry) {
247 // Allocate new entry and put in list
248 entry = new RetTableEntry(target_bci, _first);
249 _first = entry;
250 }
252 // Now "entry" is set. Make sure that the entry is initialized
253 // and has room for the new jsr.
254 entry->add_jsr(return_bci);
255 }
257 RetTableEntry* RetTable::find_jsrs_for_target(int targBci) {
258 RetTableEntry *cur = _first;
260 while(cur) {
261 assert(cur->target_bci() != -1, "sanity check");
262 if (cur->target_bci() == targBci) return cur;
263 cur = cur->next();
264 }
265 ShouldNotReachHere();
266 return NULL;
267 }
269 // The instruction at bci is changing size by "delta". Update the return map.
270 void RetTable::update_ret_table(int bci, int delta) {
271 RetTableEntry *cur = _first;
272 while(cur) {
273 cur->add_delta(bci, delta);
274 cur = cur->next();
275 }
276 }
278 //
279 // Celltype state
280 //
282 CellTypeState CellTypeState::bottom = CellTypeState::make_bottom();
283 CellTypeState CellTypeState::uninit = CellTypeState::make_any(uninit_value);
284 CellTypeState CellTypeState::ref = CellTypeState::make_any(ref_conflict);
285 CellTypeState CellTypeState::value = CellTypeState::make_any(val_value);
286 CellTypeState CellTypeState::refUninit = CellTypeState::make_any(ref_conflict | uninit_value);
287 CellTypeState CellTypeState::top = CellTypeState::make_top();
288 CellTypeState CellTypeState::addr = CellTypeState::make_any(addr_conflict);
290 // Commonly used constants
291 static CellTypeState epsilonCTS[1] = { CellTypeState::bottom };
292 static CellTypeState refCTS = CellTypeState::ref;
293 static CellTypeState valCTS = CellTypeState::value;
294 static CellTypeState vCTS[2] = { CellTypeState::value, CellTypeState::bottom };
295 static CellTypeState rCTS[2] = { CellTypeState::ref, CellTypeState::bottom };
296 static CellTypeState rrCTS[3] = { CellTypeState::ref, CellTypeState::ref, CellTypeState::bottom };
297 static CellTypeState vrCTS[3] = { CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
298 static CellTypeState vvCTS[3] = { CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
299 static CellTypeState rvrCTS[4] = { CellTypeState::ref, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
300 static CellTypeState vvrCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
301 static CellTypeState vvvCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
302 static CellTypeState vvvrCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom };
303 static CellTypeState vvvvCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
305 char CellTypeState::to_char() const {
306 if (can_be_reference()) {
307 if (can_be_value() || can_be_address())
308 return '#'; // Conflict that needs to be rewritten
309 else
310 return 'r';
311 } else if (can_be_value())
312 return 'v';
313 else if (can_be_address())
314 return 'p';
315 else if (can_be_uninit())
316 return ' ';
317 else
318 return '@';
319 }
322 // Print a detailed CellTypeState. Indicate all bits that are set. If
323 // the CellTypeState represents an address or a reference, print the
324 // value of the additional information.
325 void CellTypeState::print(outputStream *os) {
326 if (can_be_address()) {
327 os->print("(p");
328 } else {
329 os->print("( ");
330 }
331 if (can_be_reference()) {
332 os->print("r");
333 } else {
334 os->print(" ");
335 }
336 if (can_be_value()) {
337 os->print("v");
338 } else {
339 os->print(" ");
340 }
341 if (can_be_uninit()) {
342 os->print("u|");
343 } else {
344 os->print(" |");
345 }
346 if (is_info_top()) {
347 os->print("Top)");
348 } else if (is_info_bottom()) {
349 os->print("Bot)");
350 } else {
351 if (is_reference()) {
352 int info = get_info();
353 int data = info & ~(ref_not_lock_bit | ref_slot_bit);
354 if (info & ref_not_lock_bit) {
355 // Not a monitor lock reference.
356 if (info & ref_slot_bit) {
357 // slot
358 os->print("slot%d)", data);
359 } else {
360 // line
361 os->print("line%d)", data);
362 }
363 } else {
364 // lock
365 os->print("lock%d)", data);
366 }
367 } else {
368 os->print("%d)", get_info());
369 }
370 }
371 }
373 //
374 // Basicblock handling methods
375 //
377 void GenerateOopMap ::initialize_bb() {
378 _gc_points = 0;
379 _bb_count = 0;
380 _bb_hdr_bits.clear();
381 _bb_hdr_bits.resize(method()->code_size());
382 }
384 void GenerateOopMap::bb_mark_fct(GenerateOopMap *c, int bci, int *data) {
385 assert(bci>= 0 && bci < c->method()->code_size(), "index out of bounds");
386 if (c->is_bb_header(bci))
387 return;
389 if (TraceNewOopMapGeneration) {
390 tty->print_cr("Basicblock#%d begins at: %d", c->_bb_count, bci);
391 }
392 c->set_bbmark_bit(bci);
393 c->_bb_count++;
394 }
397 void GenerateOopMap::mark_bbheaders_and_count_gc_points() {
398 initialize_bb();
400 bool fellThrough = false; // False to get first BB marked.
402 // First mark all exception handlers as start of a basic-block
403 typeArrayOop excps = method()->exception_table();
404 for(int i = 0; i < excps->length(); i += 4) {
405 int handler_pc_idx = i+2;
406 bb_mark_fct(this, excps->int_at(handler_pc_idx), 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 typeArrayOop excps = method()->exception_table();
454 for(int i = 0; i < excps->length(); i += 4) {
455 int handler_pc_idx = i+2;
456 BasicBlock *bb = get_basic_block_at(excps->int_at(handler_pc_idx));
457 // If block is not already alive (due to multiple exception handlers to same bb), then
458 // make it alive
459 if (bb->is_dead()) bb->mark_as_alive();
460 }
462 BytecodeStream bcs(_method);
464 // Iterate through all basic blocks until we reach a fixpoint
465 while (change) {
466 change = 0;
468 for (int i = 0; i < _bb_count; i++) {
469 BasicBlock *bb = &_basic_blocks[i];
470 if (bb->is_alive()) {
471 // Position bytecodestream at last bytecode in basicblock
472 bcs.set_start(bb->_end_bci);
473 bcs.next();
474 Bytecodes::Code bytecode = bcs.code();
475 int bci = bcs.bci();
476 assert(bci == bb->_end_bci, "wrong bci");
478 bool fell_through = jump_targets_do(&bcs, &GenerateOopMap::reachable_basicblock, &change);
480 // We will also mark successors of jsr's as alive.
481 switch (bytecode) {
482 case Bytecodes::_jsr:
483 case Bytecodes::_jsr_w:
484 assert(!fell_through, "should not happen");
485 reachable_basicblock(this, bci + Bytecodes::length_for(bytecode), &change);
486 break;
487 }
488 if (fell_through) {
489 // Mark successor as alive
490 if (bb[1].is_dead()) {
491 bb[1].mark_as_alive();
492 change = 1;
493 }
494 }
495 }
496 }
497 }
498 }
500 /* If the current instruction in "c" has no effect on control flow,
501 returns "true". Otherwise, calls "jmpFct" one or more times, with
502 "c", an appropriate "pcDelta", and "data" as arguments, then
503 returns "false". There is one exception: if the current
504 instruction is a "ret", returns "false" without calling "jmpFct".
505 Arrangements for tracking the control flow of a "ret" must be made
506 externally. */
507 bool GenerateOopMap::jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int *data) {
508 int bci = bcs->bci();
510 switch (bcs->code()) {
511 case Bytecodes::_ifeq:
512 case Bytecodes::_ifne:
513 case Bytecodes::_iflt:
514 case Bytecodes::_ifge:
515 case Bytecodes::_ifgt:
516 case Bytecodes::_ifle:
517 case Bytecodes::_if_icmpeq:
518 case Bytecodes::_if_icmpne:
519 case Bytecodes::_if_icmplt:
520 case Bytecodes::_if_icmpge:
521 case Bytecodes::_if_icmpgt:
522 case Bytecodes::_if_icmple:
523 case Bytecodes::_if_acmpeq:
524 case Bytecodes::_if_acmpne:
525 case Bytecodes::_ifnull:
526 case Bytecodes::_ifnonnull:
527 (*jmpFct)(this, bcs->dest(), data);
528 (*jmpFct)(this, bci + 3, data);
529 break;
531 case Bytecodes::_goto:
532 (*jmpFct)(this, bcs->dest(), data);
533 break;
534 case Bytecodes::_goto_w:
535 (*jmpFct)(this, bcs->dest_w(), data);
536 break;
537 case Bytecodes::_tableswitch:
538 { Bytecode_tableswitch tableswitch(method(), bcs->bcp());
539 int len = tableswitch.length();
541 (*jmpFct)(this, bci + tableswitch.default_offset(), data); /* Default. jump address */
542 while (--len >= 0) {
543 (*jmpFct)(this, bci + tableswitch.dest_offset_at(len), data);
544 }
545 break;
546 }
548 case Bytecodes::_lookupswitch:
549 { Bytecode_lookupswitch lookupswitch(method(), bcs->bcp());
550 int npairs = lookupswitch.number_of_pairs();
551 (*jmpFct)(this, bci + lookupswitch.default_offset(), data); /* Default. */
552 while(--npairs >= 0) {
553 LookupswitchPair pair = lookupswitch.pair_at(npairs);
554 (*jmpFct)(this, bci + pair.offset(), data);
555 }
556 break;
557 }
558 case Bytecodes::_jsr:
559 assert(bcs->is_wide()==false, "sanity check");
560 (*jmpFct)(this, bcs->dest(), data);
564 break;
565 case Bytecodes::_jsr_w:
566 (*jmpFct)(this, bcs->dest_w(), data);
567 break;
568 case Bytecodes::_wide:
569 ShouldNotReachHere();
570 return true;
571 break;
572 case Bytecodes::_athrow:
573 case Bytecodes::_ireturn:
574 case Bytecodes::_lreturn:
575 case Bytecodes::_freturn:
576 case Bytecodes::_dreturn:
577 case Bytecodes::_areturn:
578 case Bytecodes::_return:
579 case Bytecodes::_ret:
580 break;
581 default:
582 return true;
583 }
584 return false;
585 }
587 /* Requires "pc" to be the head of a basic block; returns that basic
588 block. */
589 BasicBlock *GenerateOopMap::get_basic_block_at(int bci) const {
590 BasicBlock* bb = get_basic_block_containing(bci);
591 assert(bb->_bci == bci, "should have found BB");
592 return bb;
593 }
595 // Requires "pc" to be the start of an instruction; returns the basic
596 // block containing that instruction. */
597 BasicBlock *GenerateOopMap::get_basic_block_containing(int bci) const {
598 BasicBlock *bbs = _basic_blocks;
599 int lo = 0, hi = _bb_count - 1;
601 while (lo <= hi) {
602 int m = (lo + hi) / 2;
603 int mbci = bbs[m]._bci;
604 int nbci;
606 if ( m == _bb_count-1) {
607 assert( bci >= mbci && bci < method()->code_size(), "sanity check failed");
608 return bbs+m;
609 } else {
610 nbci = bbs[m+1]._bci;
611 }
613 if ( mbci <= bci && bci < nbci) {
614 return bbs+m;
615 } else if (mbci < bci) {
616 lo = m + 1;
617 } else {
618 assert(mbci > bci, "sanity check");
619 hi = m - 1;
620 }
621 }
623 fatal("should have found BB");
624 return NULL;
625 }
627 void GenerateOopMap::restore_state(BasicBlock *bb)
628 {
629 memcpy(_state, bb->_state, _state_len*sizeof(CellTypeState));
630 _stack_top = bb->_stack_top;
631 _monitor_top = bb->_monitor_top;
632 }
634 int GenerateOopMap::next_bb_start_pc(BasicBlock *bb) {
635 int bbNum = bb - _basic_blocks + 1;
636 if (bbNum == _bb_count)
637 return method()->code_size();
639 return _basic_blocks[bbNum]._bci;
640 }
642 //
643 // CellType handling methods
644 //
646 void GenerateOopMap::init_state() {
647 _state_len = _max_locals + _max_stack + _max_monitors;
648 _state = NEW_RESOURCE_ARRAY(CellTypeState, _state_len);
649 memset(_state, 0, _state_len * sizeof(CellTypeState));
650 _state_vec_buf = NEW_RESOURCE_ARRAY(char, MAX3(_max_locals, _max_stack, _max_monitors) + 1/*for null terminator char */);
651 }
653 void GenerateOopMap::make_context_uninitialized() {
654 CellTypeState* vs = vars();
656 for (int i = 0; i < _max_locals; i++)
657 vs[i] = CellTypeState::uninit;
659 _stack_top = 0;
660 _monitor_top = 0;
661 }
663 int GenerateOopMap::methodsig_to_effect(Symbol* signature, bool is_static, CellTypeState* effect) {
664 ComputeEntryStack ces(signature);
665 return ces.compute_for_parameters(is_static, effect);
666 }
668 // Return result of merging cts1 and cts2.
669 CellTypeState CellTypeState::merge(CellTypeState cts, int slot) const {
670 CellTypeState result;
672 assert(!is_bottom() && !cts.is_bottom(),
673 "merge of bottom values is handled elsewhere");
675 result._state = _state | cts._state;
677 // If the top bit is set, we don't need to do any more work.
678 if (!result.is_info_top()) {
679 assert((result.can_be_address() || result.can_be_reference()),
680 "only addresses and references have non-top info");
682 if (!equal(cts)) {
683 // The two values being merged are different. Raise to top.
684 if (result.is_reference()) {
685 result = CellTypeState::make_slot_ref(slot);
686 } else {
687 result._state |= info_conflict;
688 }
689 }
690 }
691 assert(result.is_valid_state(), "checking that CTS merge maintains legal state");
693 return result;
694 }
696 // Merge the variable state for locals and stack from cts into bbts.
697 bool GenerateOopMap::merge_local_state_vectors(CellTypeState* cts,
698 CellTypeState* bbts) {
699 int i;
700 int len = _max_locals + _stack_top;
701 bool change = false;
703 for (i = len - 1; i >= 0; i--) {
704 CellTypeState v = cts[i].merge(bbts[i], i);
705 change = change || !v.equal(bbts[i]);
706 bbts[i] = v;
707 }
709 return change;
710 }
712 // Merge the monitor stack state from cts into bbts.
713 bool GenerateOopMap::merge_monitor_state_vectors(CellTypeState* cts,
714 CellTypeState* bbts) {
715 bool change = false;
716 if (_max_monitors > 0 && _monitor_top != bad_monitors) {
717 // If there are no monitors in the program, or there has been
718 // a monitor matching error before this point in the program,
719 // then we do not merge in the monitor state.
721 int base = _max_locals + _max_stack;
722 int len = base + _monitor_top;
723 for (int i = len - 1; i >= base; i--) {
724 CellTypeState v = cts[i].merge(bbts[i], i);
726 // Can we prove that, when there has been a change, it will already
727 // have been detected at this point? That would make this equal
728 // check here unnecessary.
729 change = change || !v.equal(bbts[i]);
730 bbts[i] = v;
731 }
732 }
734 return change;
735 }
737 void GenerateOopMap::copy_state(CellTypeState *dst, CellTypeState *src) {
738 int len = _max_locals + _stack_top;
739 for (int i = 0; i < len; i++) {
740 if (src[i].is_nonlock_reference()) {
741 dst[i] = CellTypeState::make_slot_ref(i);
742 } else {
743 dst[i] = src[i];
744 }
745 }
746 if (_max_monitors > 0 && _monitor_top != bad_monitors) {
747 int base = _max_locals + _max_stack;
748 len = base + _monitor_top;
749 for (int i = base; i < len; i++) {
750 dst[i] = src[i];
751 }
752 }
753 }
756 // Merge the states for the current block and the next. As long as a
757 // block is reachable the locals and stack must be merged. If the
758 // stack heights don't match then this is a verification error and
759 // it's impossible to interpret the code. Simultaneously monitor
760 // states are being check to see if they nest statically. If monitor
761 // depths match up then their states are merged. Otherwise the
762 // mismatch is simply recorded and interpretation continues since
763 // monitor matching is purely informational and doesn't say anything
764 // about the correctness of the code.
765 void GenerateOopMap::merge_state_into_bb(BasicBlock *bb) {
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 typeArrayOop exct = method()->exception_table();
1185 for(int i = 0; i< exct->length(); i+=4) {
1186 int start_pc = exct->int_at(i);
1187 int end_pc = exct->int_at(i+1);
1188 int handler_pc = exct->int_at(i+2);
1189 int catch_type = exct->int_at(i+3);
1191 if (start_pc <= bci && bci < end_pc) {
1192 BasicBlock *excBB = get_basic_block_at(handler_pc);
1193 CellTypeState *excStk = excBB->stack();
1194 CellTypeState *cOpStck = stack();
1195 CellTypeState cOpStck_0 = cOpStck[0];
1196 int cOpStackTop = _stack_top;
1198 // Exception stacks are always the same.
1199 assert(method()->max_stack() > 0, "sanity check");
1201 // We remembered the size and first element of "cOpStck"
1202 // above; now we temporarily set them to the appropriate
1203 // values for an exception handler. */
1204 cOpStck[0] = CellTypeState::make_slot_ref(_max_locals);
1205 _stack_top = 1;
1207 merge_state_into_bb(excBB);
1209 // Now undo the temporary change.
1210 cOpStck[0] = cOpStck_0;
1211 _stack_top = cOpStackTop;
1213 // If this is a "catch all" handler, then we do not need to
1214 // consider any additional handlers.
1215 if (catch_type == 0) {
1216 return;
1217 }
1218 }
1219 }
1220 }
1222 // It is possible that none of the exception handlers would have caught
1223 // the exception. In this case, we will exit the method. We must
1224 // ensure that the monitor stack is empty in this case.
1225 if (_monitor_top == 0) {
1226 return;
1227 }
1229 // We pessimistically assume that this exception can escape the
1230 // method. (It is possible that it will always be caught, but
1231 // we don't care to analyse the types of the catch clauses.)
1233 // We don't set _monitor_top to bad_monitors because there are no successors
1234 // to this exceptional exit.
1236 if (TraceMonitorMismatch && _monitor_safe) {
1237 // We check _monitor_safe so that we only report the first mismatched
1238 // exceptional exit.
1239 report_monitor_mismatch("non-empty monitor stack at exceptional exit");
1240 }
1241 _monitor_safe = false;
1243 }
1245 void GenerateOopMap::report_monitor_mismatch(const char *msg) {
1246 #ifndef PRODUCT
1247 tty->print(" Monitor mismatch in method ");
1248 method()->print_short_name(tty);
1249 tty->print_cr(": %s", msg);
1250 #endif
1251 }
1253 void GenerateOopMap::print_states(outputStream *os,
1254 CellTypeState* vec, int num) {
1255 for (int i = 0; i < num; i++) {
1256 vec[i].print(tty);
1257 }
1258 }
1260 // Print the state values at the current bytecode.
1261 void GenerateOopMap::print_current_state(outputStream *os,
1262 BytecodeStream *currentBC,
1263 bool detailed) {
1265 if (detailed) {
1266 os->print(" %4d vars = ", currentBC->bci());
1267 print_states(os, vars(), _max_locals);
1268 os->print(" %s", Bytecodes::name(currentBC->code()));
1269 switch(currentBC->code()) {
1270 case Bytecodes::_invokevirtual:
1271 case Bytecodes::_invokespecial:
1272 case Bytecodes::_invokestatic:
1273 case Bytecodes::_invokedynamic:
1274 case Bytecodes::_invokeinterface:
1275 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache();
1276 constantPoolOop cp = method()->constants();
1277 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1278 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1279 Symbol* signature = cp->symbol_at(signatureIdx);
1280 os->print("%s", signature->as_C_string());
1281 }
1282 os->cr();
1283 os->print(" stack = ");
1284 print_states(os, stack(), _stack_top);
1285 os->cr();
1286 if (_monitor_top != bad_monitors) {
1287 os->print(" monitors = ");
1288 print_states(os, monitors(), _monitor_top);
1289 } else {
1290 os->print(" [bad monitor stack]");
1291 }
1292 os->cr();
1293 } else {
1294 os->print(" %4d vars = '%s' ", currentBC->bci(), state_vec_to_string(vars(), _max_locals));
1295 os->print(" stack = '%s' ", state_vec_to_string(stack(), _stack_top));
1296 if (_monitor_top != bad_monitors) {
1297 os->print(" monitors = '%s' \t%s", state_vec_to_string(monitors(), _monitor_top), Bytecodes::name(currentBC->code()));
1298 } else {
1299 os->print(" [bad monitor stack]");
1300 }
1301 switch(currentBC->code()) {
1302 case Bytecodes::_invokevirtual:
1303 case Bytecodes::_invokespecial:
1304 case Bytecodes::_invokestatic:
1305 case Bytecodes::_invokedynamic:
1306 case Bytecodes::_invokeinterface:
1307 int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache();
1308 constantPoolOop cp = method()->constants();
1309 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1310 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1311 Symbol* signature = cp->symbol_at(signatureIdx);
1312 os->print("%s", signature->as_C_string());
1313 }
1314 os->cr();
1315 }
1316 }
1318 // Sets the current state to be the state after executing the
1319 // current instruction, starting in the current state.
1320 void GenerateOopMap::interp1(BytecodeStream *itr) {
1321 if (TraceNewOopMapGeneration) {
1322 print_current_state(tty, itr, TraceNewOopMapGenerationDetailed);
1323 }
1325 // Should we report the results? Result is reported *before* the instruction at the current bci is executed.
1326 // However, not for calls. For calls we do not want to include the arguments, so we postpone the reporting until
1327 // they have been popped (in method ppl).
1328 if (_report_result == true) {
1329 switch(itr->code()) {
1330 case Bytecodes::_invokevirtual:
1331 case Bytecodes::_invokespecial:
1332 case Bytecodes::_invokestatic:
1333 case Bytecodes::_invokedynamic:
1334 case Bytecodes::_invokeinterface:
1335 _itr_send = itr;
1336 _report_result_for_send = true;
1337 break;
1338 default:
1339 fill_stackmap_for_opcodes(itr, vars(), stack(), _stack_top);
1340 break;
1341 }
1342 }
1344 // abstract interpretation of current opcode
1345 switch(itr->code()) {
1346 case Bytecodes::_nop: break;
1347 case Bytecodes::_goto: break;
1348 case Bytecodes::_goto_w: break;
1349 case Bytecodes::_iinc: break;
1350 case Bytecodes::_return: do_return_monitor_check();
1351 break;
1353 case Bytecodes::_aconst_null:
1354 case Bytecodes::_new: ppush1(CellTypeState::make_line_ref(itr->bci()));
1355 break;
1357 case Bytecodes::_iconst_m1:
1358 case Bytecodes::_iconst_0:
1359 case Bytecodes::_iconst_1:
1360 case Bytecodes::_iconst_2:
1361 case Bytecodes::_iconst_3:
1362 case Bytecodes::_iconst_4:
1363 case Bytecodes::_iconst_5:
1364 case Bytecodes::_fconst_0:
1365 case Bytecodes::_fconst_1:
1366 case Bytecodes::_fconst_2:
1367 case Bytecodes::_bipush:
1368 case Bytecodes::_sipush: ppush1(valCTS); break;
1370 case Bytecodes::_lconst_0:
1371 case Bytecodes::_lconst_1:
1372 case Bytecodes::_dconst_0:
1373 case Bytecodes::_dconst_1: ppush(vvCTS); break;
1375 case Bytecodes::_ldc2_w: ppush(vvCTS); break;
1377 case Bytecodes::_ldc: // fall through:
1378 case Bytecodes::_ldc_w: do_ldc(itr->bci()); break;
1380 case Bytecodes::_iload:
1381 case Bytecodes::_fload: ppload(vCTS, itr->get_index()); break;
1383 case Bytecodes::_lload:
1384 case Bytecodes::_dload: ppload(vvCTS,itr->get_index()); break;
1386 case Bytecodes::_aload: ppload(rCTS, itr->get_index()); break;
1388 case Bytecodes::_iload_0:
1389 case Bytecodes::_fload_0: ppload(vCTS, 0); break;
1390 case Bytecodes::_iload_1:
1391 case Bytecodes::_fload_1: ppload(vCTS, 1); break;
1392 case Bytecodes::_iload_2:
1393 case Bytecodes::_fload_2: ppload(vCTS, 2); break;
1394 case Bytecodes::_iload_3:
1395 case Bytecodes::_fload_3: ppload(vCTS, 3); break;
1397 case Bytecodes::_lload_0:
1398 case Bytecodes::_dload_0: ppload(vvCTS, 0); break;
1399 case Bytecodes::_lload_1:
1400 case Bytecodes::_dload_1: ppload(vvCTS, 1); break;
1401 case Bytecodes::_lload_2:
1402 case Bytecodes::_dload_2: ppload(vvCTS, 2); break;
1403 case Bytecodes::_lload_3:
1404 case Bytecodes::_dload_3: ppload(vvCTS, 3); break;
1406 case Bytecodes::_aload_0: ppload(rCTS, 0); break;
1407 case Bytecodes::_aload_1: ppload(rCTS, 1); break;
1408 case Bytecodes::_aload_2: ppload(rCTS, 2); break;
1409 case Bytecodes::_aload_3: ppload(rCTS, 3); break;
1411 case Bytecodes::_iaload:
1412 case Bytecodes::_faload:
1413 case Bytecodes::_baload:
1414 case Bytecodes::_caload:
1415 case Bytecodes::_saload: pp(vrCTS, vCTS); break;
1417 case Bytecodes::_laload: pp(vrCTS, vvCTS); break;
1418 case Bytecodes::_daload: pp(vrCTS, vvCTS); break;
1420 case Bytecodes::_aaload: pp_new_ref(vrCTS, itr->bci()); break;
1422 case Bytecodes::_istore:
1423 case Bytecodes::_fstore: ppstore(vCTS, itr->get_index()); break;
1425 case Bytecodes::_lstore:
1426 case Bytecodes::_dstore: ppstore(vvCTS, itr->get_index()); break;
1428 case Bytecodes::_astore: do_astore(itr->get_index()); break;
1430 case Bytecodes::_istore_0:
1431 case Bytecodes::_fstore_0: ppstore(vCTS, 0); break;
1432 case Bytecodes::_istore_1:
1433 case Bytecodes::_fstore_1: ppstore(vCTS, 1); break;
1434 case Bytecodes::_istore_2:
1435 case Bytecodes::_fstore_2: ppstore(vCTS, 2); break;
1436 case Bytecodes::_istore_3:
1437 case Bytecodes::_fstore_3: ppstore(vCTS, 3); break;
1439 case Bytecodes::_lstore_0:
1440 case Bytecodes::_dstore_0: ppstore(vvCTS, 0); break;
1441 case Bytecodes::_lstore_1:
1442 case Bytecodes::_dstore_1: ppstore(vvCTS, 1); break;
1443 case Bytecodes::_lstore_2:
1444 case Bytecodes::_dstore_2: ppstore(vvCTS, 2); break;
1445 case Bytecodes::_lstore_3:
1446 case Bytecodes::_dstore_3: ppstore(vvCTS, 3); break;
1448 case Bytecodes::_astore_0: do_astore(0); break;
1449 case Bytecodes::_astore_1: do_astore(1); break;
1450 case Bytecodes::_astore_2: do_astore(2); break;
1451 case Bytecodes::_astore_3: do_astore(3); break;
1453 case Bytecodes::_iastore:
1454 case Bytecodes::_fastore:
1455 case Bytecodes::_bastore:
1456 case Bytecodes::_castore:
1457 case Bytecodes::_sastore: ppop(vvrCTS); break;
1458 case Bytecodes::_lastore:
1459 case Bytecodes::_dastore: ppop(vvvrCTS); break;
1460 case Bytecodes::_aastore: ppop(rvrCTS); break;
1462 case Bytecodes::_pop: ppop_any(1); break;
1463 case Bytecodes::_pop2: ppop_any(2); break;
1465 case Bytecodes::_dup: ppdupswap(1, "11"); break;
1466 case Bytecodes::_dup_x1: ppdupswap(2, "121"); break;
1467 case Bytecodes::_dup_x2: ppdupswap(3, "1321"); break;
1468 case Bytecodes::_dup2: ppdupswap(2, "2121"); break;
1469 case Bytecodes::_dup2_x1: ppdupswap(3, "21321"); break;
1470 case Bytecodes::_dup2_x2: ppdupswap(4, "214321"); break;
1471 case Bytecodes::_swap: ppdupswap(2, "12"); break;
1473 case Bytecodes::_iadd:
1474 case Bytecodes::_fadd:
1475 case Bytecodes::_isub:
1476 case Bytecodes::_fsub:
1477 case Bytecodes::_imul:
1478 case Bytecodes::_fmul:
1479 case Bytecodes::_idiv:
1480 case Bytecodes::_fdiv:
1481 case Bytecodes::_irem:
1482 case Bytecodes::_frem:
1483 case Bytecodes::_ishl:
1484 case Bytecodes::_ishr:
1485 case Bytecodes::_iushr:
1486 case Bytecodes::_iand:
1487 case Bytecodes::_ior:
1488 case Bytecodes::_ixor:
1489 case Bytecodes::_l2f:
1490 case Bytecodes::_l2i:
1491 case Bytecodes::_d2f:
1492 case Bytecodes::_d2i:
1493 case Bytecodes::_fcmpl:
1494 case Bytecodes::_fcmpg: pp(vvCTS, vCTS); break;
1496 case Bytecodes::_ladd:
1497 case Bytecodes::_dadd:
1498 case Bytecodes::_lsub:
1499 case Bytecodes::_dsub:
1500 case Bytecodes::_lmul:
1501 case Bytecodes::_dmul:
1502 case Bytecodes::_ldiv:
1503 case Bytecodes::_ddiv:
1504 case Bytecodes::_lrem:
1505 case Bytecodes::_drem:
1506 case Bytecodes::_land:
1507 case Bytecodes::_lor:
1508 case Bytecodes::_lxor: pp(vvvvCTS, vvCTS); break;
1510 case Bytecodes::_ineg:
1511 case Bytecodes::_fneg:
1512 case Bytecodes::_i2f:
1513 case Bytecodes::_f2i:
1514 case Bytecodes::_i2c:
1515 case Bytecodes::_i2s:
1516 case Bytecodes::_i2b: pp(vCTS, vCTS); break;
1518 case Bytecodes::_lneg:
1519 case Bytecodes::_dneg:
1520 case Bytecodes::_l2d:
1521 case Bytecodes::_d2l: pp(vvCTS, vvCTS); break;
1523 case Bytecodes::_lshl:
1524 case Bytecodes::_lshr:
1525 case Bytecodes::_lushr: pp(vvvCTS, vvCTS); break;
1527 case Bytecodes::_i2l:
1528 case Bytecodes::_i2d:
1529 case Bytecodes::_f2l:
1530 case Bytecodes::_f2d: pp(vCTS, vvCTS); break;
1532 case Bytecodes::_lcmp: pp(vvvvCTS, vCTS); break;
1533 case Bytecodes::_dcmpl:
1534 case Bytecodes::_dcmpg: pp(vvvvCTS, vCTS); break;
1536 case Bytecodes::_ifeq:
1537 case Bytecodes::_ifne:
1538 case Bytecodes::_iflt:
1539 case Bytecodes::_ifge:
1540 case Bytecodes::_ifgt:
1541 case Bytecodes::_ifle:
1542 case Bytecodes::_tableswitch: ppop1(valCTS);
1543 break;
1544 case Bytecodes::_ireturn:
1545 case Bytecodes::_freturn: do_return_monitor_check();
1546 ppop1(valCTS);
1547 break;
1548 case Bytecodes::_if_icmpeq:
1549 case Bytecodes::_if_icmpne:
1550 case Bytecodes::_if_icmplt:
1551 case Bytecodes::_if_icmpge:
1552 case Bytecodes::_if_icmpgt:
1553 case Bytecodes::_if_icmple: ppop(vvCTS);
1554 break;
1556 case Bytecodes::_lreturn: do_return_monitor_check();
1557 ppop(vvCTS);
1558 break;
1560 case Bytecodes::_dreturn: do_return_monitor_check();
1561 ppop(vvCTS);
1562 break;
1564 case Bytecodes::_if_acmpeq:
1565 case Bytecodes::_if_acmpne: ppop(rrCTS); break;
1567 case Bytecodes::_jsr: do_jsr(itr->dest()); break;
1568 case Bytecodes::_jsr_w: do_jsr(itr->dest_w()); break;
1570 case Bytecodes::_getstatic: do_field(true, true, itr->get_index_u2_cpcache(), itr->bci()); break;
1571 case Bytecodes::_putstatic: do_field(false, true, itr->get_index_u2_cpcache(), itr->bci()); break;
1572 case Bytecodes::_getfield: do_field(true, false, itr->get_index_u2_cpcache(), itr->bci()); break;
1573 case Bytecodes::_putfield: do_field(false, false, itr->get_index_u2_cpcache(), itr->bci()); break;
1575 case Bytecodes::_invokevirtual:
1576 case Bytecodes::_invokespecial: do_method(false, false, itr->get_index_u2_cpcache(), itr->bci()); break;
1577 case Bytecodes::_invokestatic: do_method(true, false, itr->get_index_u2_cpcache(), itr->bci()); break;
1578 case Bytecodes::_invokedynamic: do_method(true, false, itr->get_index_u4(), itr->bci()); break;
1579 case Bytecodes::_invokeinterface: do_method(false, true, itr->get_index_u2_cpcache(), itr->bci()); break;
1580 case Bytecodes::_newarray:
1581 case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break;
1582 case Bytecodes::_checkcast: do_checkcast(); break;
1583 case Bytecodes::_arraylength:
1584 case Bytecodes::_instanceof: pp(rCTS, vCTS); break;
1585 case Bytecodes::_monitorenter: do_monitorenter(itr->bci()); break;
1586 case Bytecodes::_monitorexit: do_monitorexit(itr->bci()); break;
1588 case Bytecodes::_athrow: // handled by do_exception_edge() BUT ...
1589 // vlh(apple): do_exception_edge() does not get
1590 // called if method has no exception handlers
1591 if ((!_has_exceptions) && (_monitor_top > 0)) {
1592 _monitor_safe = false;
1593 }
1594 break;
1596 case Bytecodes::_areturn: do_return_monitor_check();
1597 ppop1(refCTS);
1598 break;
1599 case Bytecodes::_ifnull:
1600 case Bytecodes::_ifnonnull: ppop1(refCTS); break;
1601 case Bytecodes::_multianewarray: do_multianewarray(*(itr->bcp()+3), itr->bci()); break;
1603 case Bytecodes::_wide: fatal("Iterator should skip this bytecode"); break;
1604 case Bytecodes::_ret: break;
1606 // Java opcodes
1607 case Bytecodes::_lookupswitch: ppop1(valCTS); break;
1609 default:
1610 tty->print("unexpected opcode: %d\n", itr->code());
1611 ShouldNotReachHere();
1612 break;
1613 }
1614 }
1616 void GenerateOopMap::check_type(CellTypeState expected, CellTypeState actual) {
1617 if (!expected.equal_kind(actual)) {
1618 verify_error("wrong type on stack (found: %c expected: %c)", actual.to_char(), expected.to_char());
1619 }
1620 }
1622 void GenerateOopMap::ppstore(CellTypeState *in, int loc_no) {
1623 while(!(*in).is_bottom()) {
1624 CellTypeState expected =*in++;
1625 CellTypeState actual = pop();
1626 check_type(expected, actual);
1627 assert(loc_no >= 0, "sanity check");
1628 set_var(loc_no++, actual);
1629 }
1630 }
1632 void GenerateOopMap::ppload(CellTypeState *out, int loc_no) {
1633 while(!(*out).is_bottom()) {
1634 CellTypeState out1 = *out++;
1635 CellTypeState vcts = get_var(loc_no);
1636 assert(out1.can_be_reference() || out1.can_be_value(),
1637 "can only load refs. and values.");
1638 if (out1.is_reference()) {
1639 assert(loc_no>=0, "sanity check");
1640 if (!vcts.is_reference()) {
1641 // We were asked to push a reference, but the type of the
1642 // variable can be something else
1643 _conflict = true;
1644 if (vcts.can_be_uninit()) {
1645 // It is a ref-uninit conflict (at least). If there are other
1646 // problems, we'll get them in the next round
1647 add_to_ref_init_set(loc_no);
1648 vcts = out1;
1649 } else {
1650 // It wasn't a ref-uninit conflict. So must be a
1651 // ref-val or ref-pc conflict. Split the variable.
1652 record_refval_conflict(loc_no);
1653 vcts = out1;
1654 }
1655 push(out1); // recover...
1656 } else {
1657 push(vcts); // preserve reference.
1658 }
1659 // Otherwise it is a conflict, but one that verification would
1660 // have caught if illegal. In particular, it can't be a topCTS
1661 // resulting from mergeing two difference pcCTS's since the verifier
1662 // would have rejected any use of such a merge.
1663 } else {
1664 push(out1); // handle val/init conflict
1665 }
1666 loc_no++;
1667 }
1668 }
1670 void GenerateOopMap::ppdupswap(int poplen, const char *out) {
1671 CellTypeState actual[5];
1672 assert(poplen < 5, "this must be less than length of actual vector");
1674 // pop all arguments
1675 for(int i = 0; i < poplen; i++) actual[i] = pop();
1677 // put them back
1678 char push_ch = *out++;
1679 while (push_ch != '\0') {
1680 int idx = push_ch - '1';
1681 assert(idx >= 0 && idx < poplen, "wrong arguments");
1682 push(actual[idx]);
1683 push_ch = *out++;
1684 }
1685 }
1687 void GenerateOopMap::ppop1(CellTypeState out) {
1688 CellTypeState actual = pop();
1689 check_type(out, actual);
1690 }
1692 void GenerateOopMap::ppop(CellTypeState *out) {
1693 while (!(*out).is_bottom()) {
1694 ppop1(*out++);
1695 }
1696 }
1698 void GenerateOopMap::ppush1(CellTypeState in) {
1699 assert(in.is_reference() | in.is_value(), "sanity check");
1700 push(in);
1701 }
1703 void GenerateOopMap::ppush(CellTypeState *in) {
1704 while (!(*in).is_bottom()) {
1705 ppush1(*in++);
1706 }
1707 }
1709 void GenerateOopMap::pp(CellTypeState *in, CellTypeState *out) {
1710 ppop(in);
1711 ppush(out);
1712 }
1714 void GenerateOopMap::pp_new_ref(CellTypeState *in, int bci) {
1715 ppop(in);
1716 ppush1(CellTypeState::make_line_ref(bci));
1717 }
1719 void GenerateOopMap::ppop_any(int poplen) {
1720 if (_stack_top >= poplen) {
1721 _stack_top -= poplen;
1722 } else {
1723 verify_error("stack underflow");
1724 }
1725 }
1727 // Replace all occurences of the state 'match' with the state 'replace'
1728 // in our current state vector.
1729 void GenerateOopMap::replace_all_CTS_matches(CellTypeState match,
1730 CellTypeState replace) {
1731 int i;
1732 int len = _max_locals + _stack_top;
1733 bool change = false;
1735 for (i = len - 1; i >= 0; i--) {
1736 if (match.equal(_state[i])) {
1737 _state[i] = replace;
1738 }
1739 }
1741 if (_monitor_top > 0) {
1742 int base = _max_locals + _max_stack;
1743 len = base + _monitor_top;
1744 for (i = len - 1; i >= base; i--) {
1745 if (match.equal(_state[i])) {
1746 _state[i] = replace;
1747 }
1748 }
1749 }
1750 }
1752 void GenerateOopMap::do_checkcast() {
1753 CellTypeState actual = pop();
1754 check_type(refCTS, actual);
1755 push(actual);
1756 }
1758 void GenerateOopMap::do_monitorenter(int bci) {
1759 CellTypeState actual = pop();
1760 if (_monitor_top == bad_monitors) {
1761 return;
1762 }
1764 // Bail out when we get repeated locks on an identical monitor. This case
1765 // isn't too hard to handle and can be made to work if supporting nested
1766 // redundant synchronized statements becomes a priority.
1767 //
1768 // See also "Note" in do_monitorexit(), below.
1769 if (actual.is_lock_reference()) {
1770 _monitor_top = bad_monitors;
1771 _monitor_safe = false;
1773 if (TraceMonitorMismatch) {
1774 report_monitor_mismatch("nested redundant lock -- bailout...");
1775 }
1776 return;
1777 }
1779 CellTypeState lock = CellTypeState::make_lock_ref(bci);
1780 check_type(refCTS, actual);
1781 if (!actual.is_info_top()) {
1782 replace_all_CTS_matches(actual, lock);
1783 monitor_push(lock);
1784 }
1785 }
1787 void GenerateOopMap::do_monitorexit(int bci) {
1788 CellTypeState actual = pop();
1789 if (_monitor_top == bad_monitors) {
1790 return;
1791 }
1792 check_type(refCTS, actual);
1793 CellTypeState expected = monitor_pop();
1794 if (!actual.is_lock_reference() || !expected.equal(actual)) {
1795 // The monitor we are exiting is not verifiably the one
1796 // on the top of our monitor stack. This causes a monitor
1797 // mismatch.
1798 _monitor_top = bad_monitors;
1799 _monitor_safe = false;
1801 // We need to mark this basic block as changed so that
1802 // this monitorexit will be visited again. We need to
1803 // do this to ensure that we have accounted for the
1804 // possibility that this bytecode will throw an
1805 // exception.
1806 BasicBlock* bb = get_basic_block_containing(bci);
1807 bb->set_changed(true);
1808 bb->_monitor_top = bad_monitors;
1810 if (TraceMonitorMismatch) {
1811 report_monitor_mismatch("improper monitor pair");
1812 }
1813 } else {
1814 // This code is a fix for the case where we have repeated
1815 // locking of the same object in straightline code. We clear
1816 // out the lock when it is popped from the monitor stack
1817 // and replace it with an unobtrusive reference value that can
1818 // be locked again.
1819 //
1820 // Note: when generateOopMap is fixed to properly handle repeated,
1821 // nested, redundant locks on the same object, then this
1822 // fix will need to be removed at that time.
1823 replace_all_CTS_matches(actual, CellTypeState::make_line_ref(bci));
1824 }
1825 }
1827 void GenerateOopMap::do_return_monitor_check() {
1828 if (_monitor_top > 0) {
1829 // The monitor stack must be empty when we leave the method
1830 // for the monitors to be properly matched.
1831 _monitor_safe = false;
1833 // Since there are no successors to the *return bytecode, it
1834 // isn't necessary to set _monitor_top to bad_monitors.
1836 if (TraceMonitorMismatch) {
1837 report_monitor_mismatch("non-empty monitor stack at return");
1838 }
1839 }
1840 }
1842 void GenerateOopMap::do_jsr(int targ_bci) {
1843 push(CellTypeState::make_addr(targ_bci));
1844 }
1848 void GenerateOopMap::do_ldc(int bci) {
1849 Bytecode_loadconstant ldc(method(), bci);
1850 constantPoolOop cp = method()->constants();
1851 BasicType bt = ldc.result_type();
1852 CellTypeState cts = (bt == T_OBJECT) ? CellTypeState::make_line_ref(bci) : valCTS;
1853 // Make sure bt==T_OBJECT is the same as old code (is_pointer_entry).
1854 // Note that CONSTANT_MethodHandle entries are u2 index pairs, not pointer-entries,
1855 // and they are processed by _fast_aldc and the CP cache.
1856 assert((ldc.has_cache_index() || cp->is_object_entry(ldc.pool_index()))
1857 ? (bt == T_OBJECT) : true, "expected object type");
1858 ppush1(cts);
1859 }
1861 void GenerateOopMap::do_multianewarray(int dims, int bci) {
1862 assert(dims >= 1, "sanity check");
1863 for(int i = dims -1; i >=0; i--) {
1864 ppop1(valCTS);
1865 }
1866 ppush1(CellTypeState::make_line_ref(bci));
1867 }
1869 void GenerateOopMap::do_astore(int idx) {
1870 CellTypeState r_or_p = pop();
1871 if (!r_or_p.is_address() && !r_or_p.is_reference()) {
1872 // We actually expected ref or pc, but we only report that we expected a ref. It does not
1873 // really matter (at least for now)
1874 verify_error("wrong type on stack (found: %c, expected: {pr})", r_or_p.to_char());
1875 return;
1876 }
1877 set_var(idx, r_or_p);
1878 }
1880 // Copies bottom/zero terminated CTS string from "src" into "dst".
1881 // Does NOT terminate with a bottom. Returns the number of cells copied.
1882 int GenerateOopMap::copy_cts(CellTypeState *dst, CellTypeState *src) {
1883 int idx = 0;
1884 while (!src[idx].is_bottom()) {
1885 dst[idx] = src[idx];
1886 idx++;
1887 }
1888 return idx;
1889 }
1891 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci) {
1892 // Dig up signature for field in constant pool
1893 constantPoolOop cp = method()->constants();
1894 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx);
1895 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx);
1896 Symbol* signature = cp->symbol_at(signatureIdx);
1898 // Parse signature (espcially simple for fields)
1899 assert(signature->utf8_length() > 0, "field signatures cannot have zero length");
1900 // The signature is UFT8 encoded, but the first char is always ASCII for signatures.
1901 char sigch = (char)*(signature->base());
1902 CellTypeState temp[4];
1903 CellTypeState *eff = sigchar_to_effect(sigch, bci, temp);
1905 CellTypeState in[4];
1906 CellTypeState *out;
1907 int i = 0;
1909 if (is_get) {
1910 out = eff;
1911 } else {
1912 out = epsilonCTS;
1913 i = copy_cts(in, eff);
1914 }
1915 if (!is_static) in[i++] = CellTypeState::ref;
1916 in[i] = CellTypeState::bottom;
1917 assert(i<=3, "sanity check");
1918 pp(in, out);
1919 }
1921 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) {
1922 // Dig up signature for field in constant pool
1923 constantPoolOop cp = _method->constants();
1924 Symbol* signature = cp->signature_ref_at(idx);
1926 // Parse method signature
1927 CellTypeState out[4];
1928 CellTypeState in[MAXARGSIZE+1]; // Includes result
1929 ComputeCallStack cse(signature);
1931 // Compute return type
1932 int res_length= cse.compute_for_returntype(out);
1934 // Temporary hack.
1935 if (out[0].equal(CellTypeState::ref) && out[1].equal(CellTypeState::bottom)) {
1936 out[0] = CellTypeState::make_line_ref(bci);
1937 }
1939 assert(res_length<=4, "max value should be vv");
1941 // Compute arguments
1942 int arg_length = cse.compute_for_parameters(is_static != 0, in);
1943 assert(arg_length<=MAXARGSIZE, "too many locals");
1945 // Pop arguments
1946 for (int i = arg_length - 1; i >= 0; i--) ppop1(in[i]);// Do args in reverse order.
1948 // Report results
1949 if (_report_result_for_send == true) {
1950 fill_stackmap_for_opcodes(_itr_send, vars(), stack(), _stack_top);
1951 _report_result_for_send = false;
1952 }
1954 // Push return address
1955 ppush(out);
1956 }
1958 // This is used to parse the signature for fields, since they are very simple...
1959 CellTypeState *GenerateOopMap::sigchar_to_effect(char sigch, int bci, CellTypeState *out) {
1960 // Object and array
1961 if (sigch=='L' || sigch=='[') {
1962 out[0] = CellTypeState::make_line_ref(bci);
1963 out[1] = CellTypeState::bottom;
1964 return out;
1965 }
1966 if (sigch == 'J' || sigch == 'D' ) return vvCTS; // Long and Double
1967 if (sigch == 'V' ) return epsilonCTS; // Void
1968 return vCTS; // Otherwise
1969 }
1971 long GenerateOopMap::_total_byte_count = 0;
1972 elapsedTimer GenerateOopMap::_total_oopmap_time;
1974 // This function assumes "bcs" is at a "ret" instruction and that the vars
1975 // state is valid for that instruction. Furthermore, the ret instruction
1976 // must be the last instruction in "bb" (we store information about the
1977 // "ret" in "bb").
1978 void GenerateOopMap::ret_jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int varNo, int *data) {
1979 CellTypeState ra = vars()[varNo];
1980 if (!ra.is_good_address()) {
1981 verify_error("ret returns from two jsr subroutines?");
1982 return;
1983 }
1984 int target = ra.get_info();
1986 RetTableEntry* rtEnt = _rt.find_jsrs_for_target(target);
1987 int bci = bcs->bci();
1988 for (int i = 0; i < rtEnt->nof_jsrs(); i++) {
1989 int target_bci = rtEnt->jsrs(i);
1990 // Make sure a jrtRet does not set the changed bit for dead basicblock.
1991 BasicBlock* jsr_bb = get_basic_block_containing(target_bci - 1);
1992 debug_only(BasicBlock* target_bb = &jsr_bb[1];)
1993 assert(target_bb == get_basic_block_at(target_bci), "wrong calc. of successor basicblock");
1994 bool alive = jsr_bb->is_alive();
1995 if (TraceNewOopMapGeneration) {
1996 tty->print("pc = %d, ret -> %d alive: %s\n", bci, target_bci, alive ? "true" : "false");
1997 }
1998 if (alive) jmpFct(this, target_bci, data);
1999 }
2000 }
2002 //
2003 // Debug method
2004 //
2005 char* GenerateOopMap::state_vec_to_string(CellTypeState* vec, int len) {
2006 #ifdef ASSERT
2007 int checklen = MAX3(_max_locals, _max_stack, _max_monitors) + 1;
2008 assert(len < checklen, "state_vec_buf overflow");
2009 #endif
2010 for (int i = 0; i < len; i++) _state_vec_buf[i] = vec[i].to_char();
2011 _state_vec_buf[len] = 0;
2012 return _state_vec_buf;
2013 }
2015 void GenerateOopMap::print_time() {
2016 tty->print_cr ("Accumulated oopmap times:");
2017 tty->print_cr ("---------------------------");
2018 tty->print_cr (" Total : %3.3f sec.", GenerateOopMap::_total_oopmap_time.seconds());
2019 tty->print_cr (" (%3.0f bytecodes per sec) ",
2020 GenerateOopMap::_total_byte_count / GenerateOopMap::_total_oopmap_time.seconds());
2021 }
2023 //
2024 // ============ Main Entry Point ===========
2025 //
2026 GenerateOopMap::GenerateOopMap(methodHandle method) {
2027 // We have to initialize all variables here, that can be queried directly
2028 _method = method;
2029 _max_locals=0;
2030 _init_vars = NULL;
2032 #ifndef PRODUCT
2033 // If we are doing a detailed trace, include the regular trace information.
2034 if (TraceNewOopMapGenerationDetailed) {
2035 TraceNewOopMapGeneration = true;
2036 }
2037 #endif
2038 }
2040 void GenerateOopMap::compute_map(TRAPS) {
2041 #ifndef PRODUCT
2042 if (TimeOopMap2) {
2043 method()->print_short_name(tty);
2044 tty->print(" ");
2045 }
2046 if (TimeOopMap) {
2047 _total_byte_count += method()->code_size();
2048 }
2049 #endif
2050 TraceTime t_single("oopmap time", TimeOopMap2);
2051 TraceTime t_all(NULL, &_total_oopmap_time, TimeOopMap);
2053 // Initialize values
2054 _got_error = false;
2055 _conflict = false;
2056 _max_locals = method()->max_locals();
2057 _max_stack = method()->max_stack();
2058 _has_exceptions = (method()->exception_table()->length() > 0);
2059 _nof_refval_conflicts = 0;
2060 _init_vars = new GrowableArray<intptr_t>(5); // There are seldom more than 5 init_vars
2061 _report_result = false;
2062 _report_result_for_send = false;
2063 _new_var_map = NULL;
2064 _ret_adr_tos = new GrowableArray<intptr_t>(5); // 5 seems like a good number;
2065 _did_rewriting = false;
2066 _did_relocation = false;
2068 if (TraceNewOopMapGeneration) {
2069 tty->print("Method name: %s\n", method()->name()->as_C_string());
2070 if (Verbose) {
2071 _method->print_codes();
2072 tty->print_cr("Exception table:");
2073 typeArrayOop excps = method()->exception_table();
2074 for(int i = 0; i < excps->length(); i += 4) {
2075 tty->print_cr("[%d - %d] -> %d", excps->int_at(i + 0), excps->int_at(i + 1), excps->int_at(i + 2));
2076 }
2077 }
2078 }
2080 // if no code - do nothing
2081 // compiler needs info
2082 if (method()->code_size() == 0 || _max_locals + method()->max_stack() == 0) {
2083 fill_stackmap_prolog(0);
2084 fill_stackmap_epilog();
2085 return;
2086 }
2087 // Step 1: Compute all jump targets and their return value
2088 if (!_got_error)
2089 _rt.compute_ret_table(_method);
2091 // Step 2: Find all basic blocks and count GC points
2092 if (!_got_error)
2093 mark_bbheaders_and_count_gc_points();
2095 // Step 3: Calculate stack maps
2096 if (!_got_error)
2097 do_interpretation();
2099 // Step 4:Return results
2100 if (!_got_error && report_results())
2101 report_result();
2103 if (_got_error) {
2104 THROW_HANDLE(_exception);
2105 }
2106 }
2108 // Error handling methods
2109 // These methods create an exception for the current thread which is thrown
2110 // at the bottom of the call stack, when it returns to compute_map(). The
2111 // _got_error flag controls execution. NOT TODO: The VM exception propagation
2112 // mechanism using TRAPS/CHECKs could be used here instead but it would need
2113 // to be added as a parameter to every function and checked for every call.
2114 // The tons of extra code it would generate didn't seem worth the change.
2115 //
2116 void GenerateOopMap::error_work(const char *format, va_list ap) {
2117 _got_error = true;
2118 char msg_buffer[512];
2119 vsnprintf(msg_buffer, sizeof(msg_buffer), format, ap);
2120 // Append method name
2121 char msg_buffer2[512];
2122 jio_snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg_buffer, method()->name()->as_C_string());
2123 _exception = Exceptions::new_exception(Thread::current(),
2124 vmSymbols::java_lang_LinkageError(), msg_buffer2);
2125 }
2127 void GenerateOopMap::report_error(const char *format, ...) {
2128 va_list ap;
2129 va_start(ap, format);
2130 error_work(format, ap);
2131 }
2133 void GenerateOopMap::verify_error(const char *format, ...) {
2134 // We do not distinguish between different types of errors for verification
2135 // errors. Let the verifier give a better message.
2136 const char *msg = "Illegal class file encountered. Try running with -Xverify:all";
2137 _got_error = true;
2138 // Append method name
2139 char msg_buffer2[512];
2140 jio_snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg,
2141 method()->name()->as_C_string());
2142 _exception = Exceptions::new_exception(Thread::current(),
2143 vmSymbols::java_lang_LinkageError(), msg_buffer2);
2144 }
2146 //
2147 // Report result opcodes
2148 //
2149 void GenerateOopMap::report_result() {
2151 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass");
2153 // We now want to report the result of the parse
2154 _report_result = true;
2156 // Prolog code
2157 fill_stackmap_prolog(_gc_points);
2159 // Mark everything changed, then do one interpretation pass.
2160 for (int i = 0; i<_bb_count; i++) {
2161 if (_basic_blocks[i].is_reachable()) {
2162 _basic_blocks[i].set_changed(true);
2163 interp_bb(&_basic_blocks[i]);
2164 }
2165 }
2167 // Note: Since we are skipping dead-code when we are reporting results, then
2168 // the no. of encountered gc-points might be fewer than the previously number
2169 // we have counted. (dead-code is a pain - it should be removed before we get here)
2170 fill_stackmap_epilog();
2172 // Report initvars
2173 fill_init_vars(_init_vars);
2175 _report_result = false;
2176 }
2178 void GenerateOopMap::result_for_basicblock(int bci) {
2179 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass for basicblock");
2181 // We now want to report the result of the parse
2182 _report_result = true;
2184 // Find basicblock and report results
2185 BasicBlock* bb = get_basic_block_containing(bci);
2186 assert(bb->is_reachable(), "getting result from unreachable basicblock");
2187 bb->set_changed(true);
2188 interp_bb(bb);
2189 }
2191 //
2192 // Conflict handling code
2193 //
2195 void GenerateOopMap::record_refval_conflict(int varNo) {
2196 assert(varNo>=0 && varNo< _max_locals, "index out of range");
2198 if (TraceOopMapRewrites) {
2199 tty->print("### Conflict detected (local no: %d)\n", varNo);
2200 }
2202 if (!_new_var_map) {
2203 _new_var_map = NEW_RESOURCE_ARRAY(int, _max_locals);
2204 for (int k = 0; k < _max_locals; k++) _new_var_map[k] = k;
2205 }
2207 if ( _new_var_map[varNo] == varNo) {
2208 // Check if max. number of locals has been reached
2209 if (_max_locals + _nof_refval_conflicts >= MAX_LOCAL_VARS) {
2210 report_error("Rewriting exceeded local variable limit");
2211 return;
2212 }
2213 _new_var_map[varNo] = _max_locals + _nof_refval_conflicts;
2214 _nof_refval_conflicts++;
2215 }
2216 }
2218 void GenerateOopMap::rewrite_refval_conflicts()
2219 {
2220 // We can get here two ways: Either a rewrite conflict was detected, or
2221 // an uninitialize reference was detected. In the second case, we do not
2222 // do any rewriting, we just want to recompute the reference set with the
2223 // new information
2225 int nof_conflicts = 0; // Used for debugging only
2227 if ( _nof_refval_conflicts == 0 )
2228 return;
2230 // Check if rewrites are allowed in this parse.
2231 if (!allow_rewrites() && !IgnoreRewrites) {
2232 fatal("Rewriting method not allowed at this stage");
2233 }
2236 // This following flag is to tempoary supress rewrites. The locals that might conflict will
2237 // all be set to contain values. This is UNSAFE - however, until the rewriting has been completely
2238 // tested it is nice to have.
2239 if (IgnoreRewrites) {
2240 if (Verbose) {
2241 tty->print("rewrites suppressed for local no. ");
2242 for (int l = 0; l < _max_locals; l++) {
2243 if (_new_var_map[l] != l) {
2244 tty->print("%d ", l);
2245 vars()[l] = CellTypeState::value;
2246 }
2247 }
2248 tty->cr();
2249 }
2251 // That was that...
2252 _new_var_map = NULL;
2253 _nof_refval_conflicts = 0;
2254 _conflict = false;
2256 return;
2257 }
2259 // Tracing flag
2260 _did_rewriting = true;
2262 if (TraceOopMapRewrites) {
2263 tty->print_cr("ref/value conflict for method %s - bytecodes are getting rewritten", method()->name()->as_C_string());
2264 method()->print();
2265 method()->print_codes();
2266 }
2268 assert(_new_var_map!=NULL, "nothing to rewrite");
2269 assert(_conflict==true, "We should not be here");
2271 compute_ret_adr_at_TOS();
2272 if (!_got_error) {
2273 for (int k = 0; k < _max_locals && !_got_error; k++) {
2274 if (_new_var_map[k] != k) {
2275 if (TraceOopMapRewrites) {
2276 tty->print_cr("Rewriting: %d -> %d", k, _new_var_map[k]);
2277 }
2278 rewrite_refval_conflict(k, _new_var_map[k]);
2279 if (_got_error) return;
2280 nof_conflicts++;
2281 }
2282 }
2283 }
2285 assert(nof_conflicts == _nof_refval_conflicts, "sanity check");
2287 // Adjust the number of locals
2288 method()->set_max_locals(_max_locals+_nof_refval_conflicts);
2289 _max_locals += _nof_refval_conflicts;
2291 // That was that...
2292 _new_var_map = NULL;
2293 _nof_refval_conflicts = 0;
2294 }
2296 void GenerateOopMap::rewrite_refval_conflict(int from, int to) {
2297 bool startOver;
2298 do {
2299 // Make sure that the BytecodeStream is constructed in the loop, since
2300 // during rewriting a new method oop is going to be used, and the next time
2301 // around we want to use that.
2302 BytecodeStream bcs(_method);
2303 startOver = false;
2305 while( bcs.next() >=0 && !startOver && !_got_error) {
2306 startOver = rewrite_refval_conflict_inst(&bcs, from, to);
2307 }
2308 } while (startOver && !_got_error);
2309 }
2311 /* If the current instruction is one that uses local variable "from"
2312 in a ref way, change it to use "to". There's a subtle reason why we
2313 renumber the ref uses and not the non-ref uses: non-ref uses may be
2314 2 slots wide (double, long) which would necessitate keeping track of
2315 whether we should add one or two variables to the method. If the change
2316 affected the width of some instruction, returns "TRUE"; otherwise, returns "FALSE".
2317 Another reason for moving ref's value is for solving (addr, ref) conflicts, which
2318 both uses aload/astore methods.
2319 */
2320 bool GenerateOopMap::rewrite_refval_conflict_inst(BytecodeStream *itr, int from, int to) {
2321 Bytecodes::Code bc = itr->code();
2322 int index;
2323 int bci = itr->bci();
2325 if (is_aload(itr, &index) && index == from) {
2326 if (TraceOopMapRewrites) {
2327 tty->print_cr("Rewriting aload at bci: %d", bci);
2328 }
2329 return rewrite_load_or_store(itr, Bytecodes::_aload, Bytecodes::_aload_0, to);
2330 }
2332 if (is_astore(itr, &index) && index == from) {
2333 if (!stack_top_holds_ret_addr(bci)) {
2334 if (TraceOopMapRewrites) {
2335 tty->print_cr("Rewriting astore at bci: %d", bci);
2336 }
2337 return rewrite_load_or_store(itr, Bytecodes::_astore, Bytecodes::_astore_0, to);
2338 } else {
2339 if (TraceOopMapRewrites) {
2340 tty->print_cr("Supress rewriting of astore at bci: %d", bci);
2341 }
2342 }
2343 }
2345 return false;
2346 }
2348 // The argument to this method is:
2349 // bc : Current bytecode
2350 // bcN : either _aload or _astore
2351 // bc0 : either _aload_0 or _astore_0
2352 bool GenerateOopMap::rewrite_load_or_store(BytecodeStream *bcs, Bytecodes::Code bcN, Bytecodes::Code bc0, unsigned int varNo) {
2353 assert(bcN == Bytecodes::_astore || bcN == Bytecodes::_aload, "wrong argument (bcN)");
2354 assert(bc0 == Bytecodes::_astore_0 || bc0 == Bytecodes::_aload_0, "wrong argument (bc0)");
2355 int ilen = Bytecodes::length_at(_method(), bcs->bcp());
2356 int newIlen;
2358 if (ilen == 4) {
2359 // Original instruction was wide; keep it wide for simplicity
2360 newIlen = 4;
2361 } else if (varNo < 4)
2362 newIlen = 1;
2363 else if (varNo >= 256)
2364 newIlen = 4;
2365 else
2366 newIlen = 2;
2368 // If we need to relocate in order to patch the byte, we
2369 // do the patching in a temp. buffer, that is passed to the reloc.
2370 // The patching of the bytecode stream is then done by the Relocator.
2371 // This is neccesary, since relocating the instruction at a certain bci, might
2372 // also relocate that instruction, e.g., if a _goto before it gets widen to a _goto_w.
2373 // Hence, we do not know which bci to patch after relocation.
2375 assert(newIlen <= 4, "sanity check");
2376 u_char inst_buffer[4]; // Max. instruction size is 4.
2377 address bcp;
2379 if (newIlen != ilen) {
2380 // Relocation needed do patching in temp. buffer
2381 bcp = (address)inst_buffer;
2382 } else {
2383 bcp = _method->bcp_from(bcs->bci());
2384 }
2386 // Patch either directly in methodOop or in temp. buffer
2387 if (newIlen == 1) {
2388 assert(varNo < 4, "varNo too large");
2389 *bcp = bc0 + varNo;
2390 } else if (newIlen == 2) {
2391 assert(varNo < 256, "2-byte index needed!");
2392 *(bcp + 0) = bcN;
2393 *(bcp + 1) = varNo;
2394 } else {
2395 assert(newIlen == 4, "Wrong instruction length");
2396 *(bcp + 0) = Bytecodes::_wide;
2397 *(bcp + 1) = bcN;
2398 Bytes::put_Java_u2(bcp+2, varNo);
2399 }
2401 if (newIlen != ilen) {
2402 expand_current_instr(bcs->bci(), ilen, newIlen, inst_buffer);
2403 }
2406 return (newIlen != ilen);
2407 }
2409 class RelocCallback : public RelocatorListener {
2410 private:
2411 GenerateOopMap* _gom;
2412 public:
2413 RelocCallback(GenerateOopMap* gom) { _gom = gom; };
2415 // Callback method
2416 virtual void relocated(int bci, int delta, int new_code_length) {
2417 _gom->update_basic_blocks (bci, delta, new_code_length);
2418 _gom->update_ret_adr_at_TOS(bci, delta);
2419 _gom->_rt.update_ret_table (bci, delta);
2420 }
2421 };
2423 // Returns true if expanding was succesful. Otherwise, reports an error and
2424 // returns false.
2425 void GenerateOopMap::expand_current_instr(int bci, int ilen, int newIlen, u_char inst_buffer[]) {
2426 Thread *THREAD = Thread::current(); // Could really have TRAPS argument.
2427 RelocCallback rcb(this);
2428 Relocator rc(_method, &rcb);
2429 methodHandle m= rc.insert_space_at(bci, newIlen, inst_buffer, THREAD);
2430 if (m.is_null() || HAS_PENDING_EXCEPTION) {
2431 report_error("could not rewrite method - exception occurred or bytecode buffer overflow");
2432 return;
2433 }
2435 // Relocator returns a new method oop.
2436 _did_relocation = true;
2437 _method = m;
2438 }
2441 bool GenerateOopMap::is_astore(BytecodeStream *itr, int *index) {
2442 Bytecodes::Code bc = itr->code();
2443 switch(bc) {
2444 case Bytecodes::_astore_0:
2445 case Bytecodes::_astore_1:
2446 case Bytecodes::_astore_2:
2447 case Bytecodes::_astore_3:
2448 *index = bc - Bytecodes::_astore_0;
2449 return true;
2450 case Bytecodes::_astore:
2451 *index = itr->get_index();
2452 return true;
2453 }
2454 return false;
2455 }
2457 bool GenerateOopMap::is_aload(BytecodeStream *itr, int *index) {
2458 Bytecodes::Code bc = itr->code();
2459 switch(bc) {
2460 case Bytecodes::_aload_0:
2461 case Bytecodes::_aload_1:
2462 case Bytecodes::_aload_2:
2463 case Bytecodes::_aload_3:
2464 *index = bc - Bytecodes::_aload_0;
2465 return true;
2467 case Bytecodes::_aload:
2468 *index = itr->get_index();
2469 return true;
2470 }
2471 return false;
2472 }
2475 // Return true iff the top of the operand stack holds a return address at
2476 // the current instruction
2477 bool GenerateOopMap::stack_top_holds_ret_addr(int bci) {
2478 for(int i = 0; i < _ret_adr_tos->length(); i++) {
2479 if (_ret_adr_tos->at(i) == bci)
2480 return true;
2481 }
2483 return false;
2484 }
2486 void GenerateOopMap::compute_ret_adr_at_TOS() {
2487 assert(_ret_adr_tos != NULL, "must be initialized");
2488 _ret_adr_tos->clear();
2490 for (int i = 0; i < bb_count(); i++) {
2491 BasicBlock* bb = &_basic_blocks[i];
2493 // Make sure to only check basicblocks that are reachable
2494 if (bb->is_reachable()) {
2496 // For each Basic block we check all instructions
2497 BytecodeStream bcs(_method);
2498 bcs.set_interval(bb->_bci, next_bb_start_pc(bb));
2500 restore_state(bb);
2502 while (bcs.next()>=0 && !_got_error) {
2503 // TDT: should this be is_good_address() ?
2504 if (_stack_top > 0 && stack()[_stack_top-1].is_address()) {
2505 _ret_adr_tos->append(bcs.bci());
2506 if (TraceNewOopMapGeneration) {
2507 tty->print_cr("Ret_adr TOS at bci: %d", bcs.bci());
2508 }
2509 }
2510 interp1(&bcs);
2511 }
2512 }
2513 }
2514 }
2516 void GenerateOopMap::update_ret_adr_at_TOS(int bci, int delta) {
2517 for(int i = 0; i < _ret_adr_tos->length(); i++) {
2518 int v = _ret_adr_tos->at(i);
2519 if (v > bci) _ret_adr_tos->at_put(i, v + delta);
2520 }
2521 }
2523 // ===================================================================
2525 #ifndef PRODUCT
2526 int ResolveOopMapConflicts::_nof_invocations = 0;
2527 int ResolveOopMapConflicts::_nof_rewrites = 0;
2528 int ResolveOopMapConflicts::_nof_relocations = 0;
2529 #endif
2531 methodHandle ResolveOopMapConflicts::do_potential_rewrite(TRAPS) {
2532 compute_map(CHECK_(methodHandle()));
2534 #ifndef PRODUCT
2535 // Tracking and statistics
2536 if (PrintRewrites) {
2537 _nof_invocations++;
2538 if (did_rewriting()) {
2539 _nof_rewrites++;
2540 if (did_relocation()) _nof_relocations++;
2541 tty->print("Method was rewritten %s: ", (did_relocation()) ? "and relocated" : "");
2542 method()->print_value(); tty->cr();
2543 tty->print_cr("Cand.: %d rewrts: %d (%d%%) reloc.: %d (%d%%)",
2544 _nof_invocations,
2545 _nof_rewrites, (_nof_rewrites * 100) / _nof_invocations,
2546 _nof_relocations, (_nof_relocations * 100) / _nof_invocations);
2547 }
2548 }
2549 #endif
2550 return methodHandle(THREAD, method());
2551 }