comparison src/share/vm/oops/generateOopMap.cpp @ 0:a61af66fc99e jdk7-b24

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