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