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