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 "jvm.h" 27 #include "interpreter/bytecodeStream.hpp" 28 #include "logging/log.hpp" 29 #include "logging/logStream.hpp" 30 #include "memory/allocation.inline.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/relocator.hpp" 37 #include "runtime/timerTrace.hpp" 38 #include "utilities/bitMap.inline.hpp" 39 #include "utilities/ostream.hpp" 40 41 // 42 // 43 // Compute stack layouts for each instruction in method. 44 // 45 // Problems: 46 // - What to do about jsr with different types of local vars? 47 // Need maps that are conditional on jsr path? 48 // - Jsr and exceptions should be done more efficiently (the retAddr stuff) 49 // 50 // Alternative: 51 // - Could extend verifier to provide this information. 52 // For: one fewer abstract interpreter to maintain. Against: the verifier 53 // solves a bigger problem so slower (undesirable to force verification of 54 // everything?). 55 // 56 // Algorithm: 57 // Partition bytecodes into basic blocks 58 // For each basic block: store entry state (vars, stack). For instructions 59 // inside basic blocks we do not store any state (instead we recompute it 60 // from state produced by previous instruction). 61 // 62 // Perform abstract interpretation of bytecodes over this lattice: 63 // 64 // _--'#'--_ 65 // / / \ \ 66 // / / \ \ 67 // / | | \ 68 // 'r' 'v' 'p' ' ' 69 // \ | | / 70 // \ \ / / 71 // \ \ / / 72 // -- '@' -- 73 // 74 // '#' top, result of conflict merge 75 // 'r' reference type 76 // 'v' value type 77 // 'p' pc type for jsr/ret 78 // ' ' uninitialized; never occurs on operand stack in Java 79 // '@' bottom/unexecuted; initial state each bytecode. 80 // 81 // Basic block headers are the only merge points. We use this iteration to 82 // compute the information: 83 // 84 // find basic blocks; 85 // initialize them with uninitialized state; 86 // initialize first BB according to method signature; 87 // mark first BB changed 88 // while (some BB is changed) do { 89 // perform abstract interpration of all bytecodes in BB; 90 // merge exit state of BB into entry state of all successor BBs, 91 // noting if any of these change; 92 // } 93 // 94 // One additional complication is necessary. The jsr instruction pushes 95 // a return PC on the stack (a 'p' type in the abstract interpretation). 96 // To be able to process "ret" bytecodes, we keep track of these return 97 // PC's in a 'retAddrs' structure in abstract interpreter context (when 98 // processing a "ret" bytecodes, it is not sufficient to know that it gets 99 // an argument of the right type 'p'; we need to know which address it 100 // returns to). 101 // 102 // (Note this comment is borrowed form the original author of the algorithm) 103 104 // ComputeCallStack 105 // 106 // Specialization of SignatureIterator - compute the effects of a call 107 // 108 class ComputeCallStack : public SignatureIterator { 109 CellTypeState *_effect; 110 int _idx; 111 112 void setup(); 113 void set(CellTypeState state) { _effect[_idx++] = state; } 114 int length() { return _idx; }; 115 116 virtual void do_bool () { set(CellTypeState::value); }; 117 virtual void do_char () { set(CellTypeState::value); }; 118 virtual void do_float () { set(CellTypeState::value); }; 119 virtual void do_byte () { set(CellTypeState::value); }; 120 virtual void do_short () { set(CellTypeState::value); }; 121 virtual void do_int () { set(CellTypeState::value); }; 122 virtual void do_void () { set(CellTypeState::bottom);}; 123 virtual void do_object(int begin, int end) { set(CellTypeState::ref); }; 124 virtual void do_array (int begin, int end) { set(CellTypeState::ref); }; 125 126 void do_double() { set(CellTypeState::value); 127 set(CellTypeState::value); } 128 void do_long () { set(CellTypeState::value); 129 set(CellTypeState::value); } 130 131 public: 132 ComputeCallStack(Symbol* signature) : SignatureIterator(signature) {}; 133 134 // Compute methods 135 int compute_for_parameters(bool is_static, CellTypeState *effect) { 136 _idx = 0; 137 _effect = effect; 138 139 if (!is_static) { 140 effect[_idx++] = CellTypeState::ref; 141 } 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 // 163 class 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 186 public: 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 // 219 int RetTable::_init_nof_entries = 10; 220 int RetTableEntry::_init_nof_jsrs = 5; 221 222 RetTableEntry::RetTableEntry(int target, RetTableEntry *next) { 223 _target_bci = target; 224 _jsrs = new GrowableArray<intptr_t>(_init_nof_jsrs); 225 _next = next; 226 } 227 228 void 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 237 void 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 255 void 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 272 RetTableEntry* 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. 285 void 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 297 CellTypeState CellTypeState::bottom = CellTypeState::make_bottom(); 298 CellTypeState CellTypeState::uninit = CellTypeState::make_any(uninit_value); 299 CellTypeState CellTypeState::ref = CellTypeState::make_any(ref_conflict); 300 CellTypeState CellTypeState::value = CellTypeState::make_any(val_value); 301 CellTypeState CellTypeState::refUninit = CellTypeState::make_any(ref_conflict | uninit_value); 302 CellTypeState CellTypeState::top = CellTypeState::make_top(); 303 CellTypeState CellTypeState::addr = CellTypeState::make_any(addr_conflict); 304 305 // Commonly used constants 306 static CellTypeState epsilonCTS[1] = { CellTypeState::bottom }; 307 static CellTypeState refCTS = CellTypeState::ref; 308 static CellTypeState valCTS = CellTypeState::value; 309 static CellTypeState vCTS[2] = { CellTypeState::value, CellTypeState::bottom }; 310 static CellTypeState rCTS[2] = { CellTypeState::ref, CellTypeState::bottom }; 311 static CellTypeState rrCTS[3] = { CellTypeState::ref, CellTypeState::ref, CellTypeState::bottom }; 312 static CellTypeState vrCTS[3] = { CellTypeState::value, CellTypeState::ref, CellTypeState::bottom }; 313 static CellTypeState vvCTS[3] = { CellTypeState::value, CellTypeState::value, CellTypeState::bottom }; 314 static CellTypeState rvrCTS[4] = { CellTypeState::ref, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom }; 315 static CellTypeState vvrCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom }; 316 static CellTypeState vvvCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom }; 317 static CellTypeState vvvrCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::ref, CellTypeState::bottom }; 318 static CellTypeState vvvvCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom }; 319 320 char 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. 340 void 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 392 void GenerateOopMap::initialize_bb() { 393 _gc_points = 0; 394 _bb_count = 0; 395 _bb_hdr_bits.reinitialize(method()->code_size()); 396 } 397 398 void 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 411 void 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 453 void GenerateOopMap::set_bbmark_bit(int bci) { 454 _bb_hdr_bits.at_put(bci, true); 455 } 456 457 void 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 467 void 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. */ 527 bool 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. */ 609 BasicBlock *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. */ 617 BasicBlock *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 647 void 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 654 int 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 675 void 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 683 void 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 693 int 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. 699 CellTypeState 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. 727 bool 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. 743 bool 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 767 void 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. 795 void 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 833 void GenerateOopMap::merge_state(GenerateOopMap *gom, int bci, int* data) { 834 gom->merge_state_into_bb(gom->get_basic_block_at(bci)); 835 } 836 837 void 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 847 CellTypeState 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 856 CellTypeState 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 864 void 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 872 CellTypeState 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 887 void 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 907 void 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 933 void 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 1039 void 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. 1057 void 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 1077 void 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 1082 void 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 1098 void 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 1115 void 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 1171 void 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 1274 void 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 1282 void 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. 1290 void 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. 1342 void 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::_defaultvalue: ppush1(CellTypeState::make_line_ref(itr->bci())); break; 1380 case Bytecodes::_withfield: do_withfield(itr->get_index_u2_cpcache(), itr->bci()); break; 1381 1382 case Bytecodes::_iconst_m1: 1383 case Bytecodes::_iconst_0: 1384 case Bytecodes::_iconst_1: 1385 case Bytecodes::_iconst_2: 1386 case Bytecodes::_iconst_3: 1387 case Bytecodes::_iconst_4: 1388 case Bytecodes::_iconst_5: 1389 case Bytecodes::_fconst_0: 1390 case Bytecodes::_fconst_1: 1391 case Bytecodes::_fconst_2: 1392 case Bytecodes::_bipush: 1393 case Bytecodes::_sipush: ppush1(valCTS); break; 1394 1395 case Bytecodes::_lconst_0: 1396 case Bytecodes::_lconst_1: 1397 case Bytecodes::_dconst_0: 1398 case Bytecodes::_dconst_1: ppush(vvCTS); break; 1399 1400 case Bytecodes::_ldc2_w: ppush(vvCTS); break; 1401 1402 case Bytecodes::_ldc: // fall through: 1403 case Bytecodes::_ldc_w: do_ldc(itr->bci()); break; 1404 1405 case Bytecodes::_iload: 1406 case Bytecodes::_fload: ppload(vCTS, itr->get_index()); break; 1407 1408 case Bytecodes::_lload: 1409 case Bytecodes::_dload: ppload(vvCTS,itr->get_index()); break; 1410 1411 case Bytecodes::_aload: ppload(rCTS, itr->get_index()); break; 1412 1413 case Bytecodes::_iload_0: 1414 case Bytecodes::_fload_0: ppload(vCTS, 0); break; 1415 case Bytecodes::_iload_1: 1416 case Bytecodes::_fload_1: ppload(vCTS, 1); break; 1417 case Bytecodes::_iload_2: 1418 case Bytecodes::_fload_2: ppload(vCTS, 2); break; 1419 case Bytecodes::_iload_3: 1420 case Bytecodes::_fload_3: ppload(vCTS, 3); break; 1421 1422 case Bytecodes::_lload_0: 1423 case Bytecodes::_dload_0: ppload(vvCTS, 0); break; 1424 case Bytecodes::_lload_1: 1425 case Bytecodes::_dload_1: ppload(vvCTS, 1); break; 1426 case Bytecodes::_lload_2: 1427 case Bytecodes::_dload_2: ppload(vvCTS, 2); break; 1428 case Bytecodes::_lload_3: 1429 case Bytecodes::_dload_3: ppload(vvCTS, 3); break; 1430 1431 case Bytecodes::_aload_0: ppload(rCTS, 0); break; 1432 case Bytecodes::_aload_1: ppload(rCTS, 1); break; 1433 case Bytecodes::_aload_2: ppload(rCTS, 2); break; 1434 case Bytecodes::_aload_3: ppload(rCTS, 3); break; 1435 1436 case Bytecodes::_iaload: 1437 case Bytecodes::_faload: 1438 case Bytecodes::_baload: 1439 case Bytecodes::_caload: 1440 case Bytecodes::_saload: pp(vrCTS, vCTS); break; 1441 1442 case Bytecodes::_laload: pp(vrCTS, vvCTS); break; 1443 case Bytecodes::_daload: pp(vrCTS, vvCTS); break; 1444 1445 case Bytecodes::_aaload: pp_new_ref(vrCTS, itr->bci()); break; 1446 1447 case Bytecodes::_istore: 1448 case Bytecodes::_fstore: ppstore(vCTS, itr->get_index()); break; 1449 1450 case Bytecodes::_lstore: 1451 case Bytecodes::_dstore: ppstore(vvCTS, itr->get_index()); break; 1452 1453 case Bytecodes::_astore: do_astore(itr->get_index()); break; 1454 1455 case Bytecodes::_istore_0: 1456 case Bytecodes::_fstore_0: ppstore(vCTS, 0); break; 1457 case Bytecodes::_istore_1: 1458 case Bytecodes::_fstore_1: ppstore(vCTS, 1); break; 1459 case Bytecodes::_istore_2: 1460 case Bytecodes::_fstore_2: ppstore(vCTS, 2); break; 1461 case Bytecodes::_istore_3: 1462 case Bytecodes::_fstore_3: ppstore(vCTS, 3); break; 1463 1464 case Bytecodes::_lstore_0: 1465 case Bytecodes::_dstore_0: ppstore(vvCTS, 0); break; 1466 case Bytecodes::_lstore_1: 1467 case Bytecodes::_dstore_1: ppstore(vvCTS, 1); break; 1468 case Bytecodes::_lstore_2: 1469 case Bytecodes::_dstore_2: ppstore(vvCTS, 2); break; 1470 case Bytecodes::_lstore_3: 1471 case Bytecodes::_dstore_3: ppstore(vvCTS, 3); break; 1472 1473 case Bytecodes::_astore_0: do_astore(0); break; 1474 case Bytecodes::_astore_1: do_astore(1); break; 1475 case Bytecodes::_astore_2: do_astore(2); break; 1476 case Bytecodes::_astore_3: do_astore(3); break; 1477 1478 case Bytecodes::_iastore: 1479 case Bytecodes::_fastore: 1480 case Bytecodes::_bastore: 1481 case Bytecodes::_castore: 1482 case Bytecodes::_sastore: ppop(vvrCTS); break; 1483 case Bytecodes::_lastore: 1484 case Bytecodes::_dastore: ppop(vvvrCTS); break; 1485 case Bytecodes::_aastore: ppop(rvrCTS); break; 1486 1487 case Bytecodes::_pop: ppop_any(1); break; 1488 case Bytecodes::_pop2: ppop_any(2); break; 1489 1490 case Bytecodes::_dup: ppdupswap(1, "11"); break; 1491 case Bytecodes::_dup_x1: ppdupswap(2, "121"); break; 1492 case Bytecodes::_dup_x2: ppdupswap(3, "1321"); break; 1493 case Bytecodes::_dup2: ppdupswap(2, "2121"); break; 1494 case Bytecodes::_dup2_x1: ppdupswap(3, "21321"); break; 1495 case Bytecodes::_dup2_x2: ppdupswap(4, "214321"); break; 1496 case Bytecodes::_swap: ppdupswap(2, "12"); break; 1497 1498 case Bytecodes::_iadd: 1499 case Bytecodes::_fadd: 1500 case Bytecodes::_isub: 1501 case Bytecodes::_fsub: 1502 case Bytecodes::_imul: 1503 case Bytecodes::_fmul: 1504 case Bytecodes::_idiv: 1505 case Bytecodes::_fdiv: 1506 case Bytecodes::_irem: 1507 case Bytecodes::_frem: 1508 case Bytecodes::_ishl: 1509 case Bytecodes::_ishr: 1510 case Bytecodes::_iushr: 1511 case Bytecodes::_iand: 1512 case Bytecodes::_ior: 1513 case Bytecodes::_ixor: 1514 case Bytecodes::_l2f: 1515 case Bytecodes::_l2i: 1516 case Bytecodes::_d2f: 1517 case Bytecodes::_d2i: 1518 case Bytecodes::_fcmpl: 1519 case Bytecodes::_fcmpg: pp(vvCTS, vCTS); break; 1520 1521 case Bytecodes::_ladd: 1522 case Bytecodes::_dadd: 1523 case Bytecodes::_lsub: 1524 case Bytecodes::_dsub: 1525 case Bytecodes::_lmul: 1526 case Bytecodes::_dmul: 1527 case Bytecodes::_ldiv: 1528 case Bytecodes::_ddiv: 1529 case Bytecodes::_lrem: 1530 case Bytecodes::_drem: 1531 case Bytecodes::_land: 1532 case Bytecodes::_lor: 1533 case Bytecodes::_lxor: pp(vvvvCTS, vvCTS); break; 1534 1535 case Bytecodes::_ineg: 1536 case Bytecodes::_fneg: 1537 case Bytecodes::_i2f: 1538 case Bytecodes::_f2i: 1539 case Bytecodes::_i2c: 1540 case Bytecodes::_i2s: 1541 case Bytecodes::_i2b: pp(vCTS, vCTS); break; 1542 1543 case Bytecodes::_lneg: 1544 case Bytecodes::_dneg: 1545 case Bytecodes::_l2d: 1546 case Bytecodes::_d2l: pp(vvCTS, vvCTS); break; 1547 1548 case Bytecodes::_lshl: 1549 case Bytecodes::_lshr: 1550 case Bytecodes::_lushr: pp(vvvCTS, vvCTS); break; 1551 1552 case Bytecodes::_i2l: 1553 case Bytecodes::_i2d: 1554 case Bytecodes::_f2l: 1555 case Bytecodes::_f2d: pp(vCTS, vvCTS); break; 1556 1557 case Bytecodes::_lcmp: pp(vvvvCTS, vCTS); break; 1558 case Bytecodes::_dcmpl: 1559 case Bytecodes::_dcmpg: pp(vvvvCTS, vCTS); break; 1560 1561 case Bytecodes::_ifeq: 1562 case Bytecodes::_ifne: 1563 case Bytecodes::_iflt: 1564 case Bytecodes::_ifge: 1565 case Bytecodes::_ifgt: 1566 case Bytecodes::_ifle: 1567 case Bytecodes::_tableswitch: ppop1(valCTS); 1568 break; 1569 case Bytecodes::_ireturn: 1570 case Bytecodes::_freturn: do_return_monitor_check(); 1571 ppop1(valCTS); 1572 break; 1573 case Bytecodes::_if_icmpeq: 1574 case Bytecodes::_if_icmpne: 1575 case Bytecodes::_if_icmplt: 1576 case Bytecodes::_if_icmpge: 1577 case Bytecodes::_if_icmpgt: 1578 case Bytecodes::_if_icmple: ppop(vvCTS); 1579 break; 1580 1581 case Bytecodes::_lreturn: do_return_monitor_check(); 1582 ppop(vvCTS); 1583 break; 1584 1585 case Bytecodes::_dreturn: do_return_monitor_check(); 1586 ppop(vvCTS); 1587 break; 1588 1589 case Bytecodes::_if_acmpeq: 1590 case Bytecodes::_if_acmpne: ppop(rrCTS); break; 1591 1592 case Bytecodes::_jsr: do_jsr(itr->dest()); break; 1593 case Bytecodes::_jsr_w: do_jsr(itr->dest_w()); break; 1594 1595 case Bytecodes::_getstatic: do_field(true, true, itr->get_index_u2_cpcache(), itr->bci()); break; 1596 case Bytecodes::_putstatic: do_field(false, true, itr->get_index_u2_cpcache(), itr->bci()); break; 1597 case Bytecodes::_getfield: do_field(true, false, itr->get_index_u2_cpcache(), itr->bci()); break; 1598 case Bytecodes::_putfield: do_field(false, false, itr->get_index_u2_cpcache(), itr->bci()); break; 1599 1600 case Bytecodes::_invokeinterface: 1601 case Bytecodes::_invokevirtual: 1602 case Bytecodes::_invokespecial: do_method(false, itr->get_index_u2_cpcache(), itr->bci()); break; 1603 case Bytecodes::_invokestatic: do_method(true , itr->get_index_u2_cpcache(), itr->bci()); break; 1604 case Bytecodes::_invokedynamic: do_method(true , itr->get_index_u4(), itr->bci()); break; 1605 case Bytecodes::_newarray: 1606 case Bytecodes::_anewarray: pp_new_ref(vCTS, itr->bci()); break; 1607 case Bytecodes::_checkcast: do_checkcast(); break; 1608 case Bytecodes::_arraylength: 1609 case Bytecodes::_instanceof: pp(rCTS, vCTS); break; 1610 case Bytecodes::_monitorenter: do_monitorenter(itr->bci()); break; 1611 case Bytecodes::_monitorexit: do_monitorexit(itr->bci()); break; 1612 1613 case Bytecodes::_athrow: // handled by do_exception_edge() BUT ... 1614 // vlh(apple): do_exception_edge() does not get 1615 // called if method has no exception handlers 1616 if ((!_has_exceptions) && (_monitor_top > 0)) { 1617 _monitor_safe = false; 1618 } 1619 break; 1620 1621 case Bytecodes::_areturn: do_return_monitor_check(); 1622 ppop1(refCTS); 1623 break; 1624 1625 case Bytecodes::_ifnull: 1626 case Bytecodes::_ifnonnull: ppop1(refCTS); break; 1627 case Bytecodes::_multianewarray: do_multianewarray(*(itr->bcp()+3), itr->bci()); break; 1628 1629 case Bytecodes::_wide: fatal("Iterator should skip this bytecode"); break; 1630 case Bytecodes::_ret: break; 1631 1632 // Java opcodes 1633 case Bytecodes::_lookupswitch: ppop1(valCTS); break; 1634 1635 default: 1636 tty->print("unexpected opcode: %d\n", itr->code()); 1637 ShouldNotReachHere(); 1638 break; 1639 } 1640 } 1641 1642 void GenerateOopMap::check_type(CellTypeState expected, CellTypeState actual) { 1643 if (!expected.equal_kind(actual)) { 1644 verify_error("wrong type on stack (found: %c expected: %c)", actual.to_char(), expected.to_char()); 1645 } 1646 } 1647 1648 void GenerateOopMap::ppstore(CellTypeState *in, int loc_no) { 1649 while(!(*in).is_bottom()) { 1650 CellTypeState expected =*in++; 1651 CellTypeState actual = pop(); 1652 check_type(expected, actual); 1653 assert(loc_no >= 0, "sanity check"); 1654 set_var(loc_no++, actual); 1655 } 1656 } 1657 1658 void GenerateOopMap::ppload(CellTypeState *out, int loc_no) { 1659 while(!(*out).is_bottom()) { 1660 CellTypeState out1 = *out++; 1661 CellTypeState vcts = get_var(loc_no); 1662 assert(out1.can_be_reference() || out1.can_be_value(), 1663 "can only load refs. and values."); 1664 if (out1.is_reference()) { 1665 assert(loc_no>=0, "sanity check"); 1666 if (!vcts.is_reference()) { 1667 // We were asked to push a reference, but the type of the 1668 // variable can be something else 1669 _conflict = true; 1670 if (vcts.can_be_uninit()) { 1671 // It is a ref-uninit conflict (at least). If there are other 1672 // problems, we'll get them in the next round 1673 add_to_ref_init_set(loc_no); 1674 vcts = out1; 1675 } else { 1676 // It wasn't a ref-uninit conflict. So must be a 1677 // ref-val or ref-pc conflict. Split the variable. 1678 record_refval_conflict(loc_no); 1679 vcts = out1; 1680 } 1681 push(out1); // recover... 1682 } else { 1683 push(vcts); // preserve reference. 1684 } 1685 // Otherwise it is a conflict, but one that verification would 1686 // have caught if illegal. In particular, it can't be a topCTS 1687 // resulting from mergeing two difference pcCTS's since the verifier 1688 // would have rejected any use of such a merge. 1689 } else { 1690 push(out1); // handle val/init conflict 1691 } 1692 loc_no++; 1693 } 1694 } 1695 1696 void GenerateOopMap::ppdupswap(int poplen, const char *out) { 1697 CellTypeState actual[5]; 1698 assert(poplen < 5, "this must be less than length of actual vector"); 1699 1700 // Pop all arguments. 1701 for (int i = 0; i < poplen; i++) { 1702 actual[i] = pop(); 1703 } 1704 // Field _state is uninitialized when calling push. 1705 for (int i = poplen; i < 5; i++) { 1706 actual[i] = CellTypeState::uninit; 1707 } 1708 1709 // put them back 1710 char push_ch = *out++; 1711 while (push_ch != '\0') { 1712 int idx = push_ch - '1'; 1713 assert(idx >= 0 && idx < poplen, "wrong arguments"); 1714 push(actual[idx]); 1715 push_ch = *out++; 1716 } 1717 } 1718 1719 void GenerateOopMap::ppop1(CellTypeState out) { 1720 CellTypeState actual = pop(); 1721 check_type(out, actual); 1722 } 1723 1724 void GenerateOopMap::ppop(CellTypeState *out) { 1725 while (!(*out).is_bottom()) { 1726 ppop1(*out++); 1727 } 1728 } 1729 1730 void GenerateOopMap::ppush1(CellTypeState in) { 1731 assert(in.is_reference() || in.is_value(), "sanity check"); 1732 push(in); 1733 } 1734 1735 void GenerateOopMap::ppush(CellTypeState *in) { 1736 while (!(*in).is_bottom()) { 1737 ppush1(*in++); 1738 } 1739 } 1740 1741 void GenerateOopMap::pp(CellTypeState *in, CellTypeState *out) { 1742 ppop(in); 1743 ppush(out); 1744 } 1745 1746 void GenerateOopMap::pp_new_ref(CellTypeState *in, int bci) { 1747 ppop(in); 1748 ppush1(CellTypeState::make_line_ref(bci)); 1749 } 1750 1751 void GenerateOopMap::ppop_any(int poplen) { 1752 if (_stack_top >= poplen) { 1753 _stack_top -= poplen; 1754 } else { 1755 verify_error("stack underflow"); 1756 } 1757 } 1758 1759 // Replace all occurences of the state 'match' with the state 'replace' 1760 // in our current state vector. 1761 void GenerateOopMap::replace_all_CTS_matches(CellTypeState match, 1762 CellTypeState replace) { 1763 int i; 1764 int len = _max_locals + _stack_top; 1765 bool change = false; 1766 1767 for (i = len - 1; i >= 0; i--) { 1768 if (match.equal(_state[i])) { 1769 _state[i] = replace; 1770 } 1771 } 1772 1773 if (_monitor_top > 0) { 1774 int base = _max_locals + _max_stack; 1775 len = base + _monitor_top; 1776 for (i = len - 1; i >= base; i--) { 1777 if (match.equal(_state[i])) { 1778 _state[i] = replace; 1779 } 1780 } 1781 } 1782 } 1783 1784 void GenerateOopMap::do_checkcast() { 1785 CellTypeState actual = pop(); 1786 check_type(refCTS, actual); 1787 push(actual); 1788 } 1789 1790 void GenerateOopMap::do_monitorenter(int bci) { 1791 CellTypeState actual = pop(); 1792 if (_monitor_top == bad_monitors) { 1793 return; 1794 } 1795 1796 // Bail out when we get repeated locks on an identical monitor. This case 1797 // isn't too hard to handle and can be made to work if supporting nested 1798 // redundant synchronized statements becomes a priority. 1799 // 1800 // See also "Note" in do_monitorexit(), below. 1801 if (actual.is_lock_reference()) { 1802 _monitor_top = bad_monitors; 1803 _monitor_safe = false; 1804 1805 if (log_is_enabled(Info, monitormismatch)) { 1806 report_monitor_mismatch("nested redundant lock -- bailout..."); 1807 } 1808 return; 1809 } 1810 1811 CellTypeState lock = CellTypeState::make_lock_ref(bci); 1812 check_type(refCTS, actual); 1813 if (!actual.is_info_top()) { 1814 replace_all_CTS_matches(actual, lock); 1815 monitor_push(lock); 1816 } 1817 } 1818 1819 void GenerateOopMap::do_monitorexit(int bci) { 1820 CellTypeState actual = pop(); 1821 if (_monitor_top == bad_monitors) { 1822 return; 1823 } 1824 check_type(refCTS, actual); 1825 CellTypeState expected = monitor_pop(); 1826 if (!actual.is_lock_reference() || !expected.equal(actual)) { 1827 // The monitor we are exiting is not verifiably the one 1828 // on the top of our monitor stack. This causes a monitor 1829 // mismatch. 1830 _monitor_top = bad_monitors; 1831 _monitor_safe = false; 1832 1833 // We need to mark this basic block as changed so that 1834 // this monitorexit will be visited again. We need to 1835 // do this to ensure that we have accounted for the 1836 // possibility that this bytecode will throw an 1837 // exception. 1838 BasicBlock* bb = get_basic_block_containing(bci); 1839 guarantee(bb != NULL, "no basic block for bci"); 1840 bb->set_changed(true); 1841 bb->_monitor_top = bad_monitors; 1842 1843 if (log_is_enabled(Info, monitormismatch)) { 1844 report_monitor_mismatch("improper monitor pair"); 1845 } 1846 } else { 1847 // This code is a fix for the case where we have repeated 1848 // locking of the same object in straightline code. We clear 1849 // out the lock when it is popped from the monitor stack 1850 // and replace it with an unobtrusive reference value that can 1851 // be locked again. 1852 // 1853 // Note: when generateOopMap is fixed to properly handle repeated, 1854 // nested, redundant locks on the same object, then this 1855 // fix will need to be removed at that time. 1856 replace_all_CTS_matches(actual, CellTypeState::make_line_ref(bci)); 1857 } 1858 } 1859 1860 void GenerateOopMap::do_return_monitor_check() { 1861 if (_monitor_top > 0) { 1862 // The monitor stack must be empty when we leave the method 1863 // for the monitors to be properly matched. 1864 _monitor_safe = false; 1865 1866 // Since there are no successors to the *return bytecode, it 1867 // isn't necessary to set _monitor_top to bad_monitors. 1868 1869 if (log_is_enabled(Info, monitormismatch)) { 1870 report_monitor_mismatch("non-empty monitor stack at return"); 1871 } 1872 } 1873 } 1874 1875 void GenerateOopMap::do_jsr(int targ_bci) { 1876 push(CellTypeState::make_addr(targ_bci)); 1877 } 1878 1879 1880 1881 void GenerateOopMap::do_ldc(int bci) { 1882 Bytecode_loadconstant ldc(method(), bci); 1883 ConstantPool* cp = method()->constants(); 1884 constantTag tag = cp->tag_at(ldc.pool_index()); // idx is index in resolved_references 1885 BasicType bt = ldc.result_type(); 1886 #ifdef ASSERT 1887 BasicType tag_bt = tag.is_dynamic_constant() ? bt : tag.basic_type(); 1888 assert(bt == tag_bt, "same result"); 1889 #endif 1890 CellTypeState cts; 1891 if (is_reference_type(bt)) { // could be T_ARRAY with condy 1892 assert(!tag.is_string_index() && !tag.is_klass_index(), "Unexpected index tag"); 1893 cts = CellTypeState::make_line_ref(bci); 1894 } else { 1895 cts = valCTS; 1896 } 1897 ppush1(cts); 1898 } 1899 1900 void GenerateOopMap::do_multianewarray(int dims, int bci) { 1901 assert(dims >= 1, "sanity check"); 1902 for(int i = dims -1; i >=0; i--) { 1903 ppop1(valCTS); 1904 } 1905 ppush1(CellTypeState::make_line_ref(bci)); 1906 } 1907 1908 void GenerateOopMap::do_astore(int idx) { 1909 CellTypeState r_or_p = pop(); 1910 if (!r_or_p.is_address() && !r_or_p.is_reference()) { 1911 // We actually expected ref or pc, but we only report that we expected a ref. It does not 1912 // really matter (at least for now) 1913 verify_error("wrong type on stack (found: %c, expected: {pr})", r_or_p.to_char()); 1914 return; 1915 } 1916 set_var(idx, r_or_p); 1917 } 1918 1919 // Copies bottom/zero terminated CTS string from "src" into "dst". 1920 // Does NOT terminate with a bottom. Returns the number of cells copied. 1921 int GenerateOopMap::copy_cts(CellTypeState *dst, CellTypeState *src) { 1922 int idx = 0; 1923 while (!src[idx].is_bottom()) { 1924 dst[idx] = src[idx]; 1925 idx++; 1926 } 1927 return idx; 1928 } 1929 1930 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci) { 1931 // Dig up signature for field in constant pool 1932 ConstantPool* cp = method()->constants(); 1933 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); 1934 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); 1935 Symbol* signature = cp->symbol_at(signatureIdx); 1936 1937 // Parse signature (espcially simple for fields) 1938 assert(signature->utf8_length() > 0, "field signatures cannot have zero length"); 1939 // The signature is UFT8 encoded, but the first char is always ASCII for signatures. 1940 char sigch = (char)*(signature->base()); 1941 CellTypeState temp[4]; 1942 CellTypeState *eff = sigchar_to_effect(sigch, bci, temp); 1943 1944 CellTypeState in[4]; 1945 CellTypeState *out; 1946 int i = 0; 1947 1948 if (is_get) { 1949 out = eff; 1950 } else { 1951 out = epsilonCTS; 1952 i = copy_cts(in, eff); 1953 } 1954 if (!is_static) { 1955 in[i++] = CellTypeState::ref; 1956 } 1957 in[i] = CellTypeState::bottom; 1958 assert(i<=3, "sanity check"); 1959 pp(in, out); 1960 } 1961 1962 void GenerateOopMap::do_method(int is_static, int idx, int bci) { 1963 // Dig up signature for field in constant pool 1964 ConstantPool* cp = _method->constants(); 1965 Symbol* signature = cp->signature_ref_at(idx); 1966 1967 // Parse method signature 1968 CellTypeState out[4]; 1969 CellTypeState in[MAXARGSIZE+1]; // Includes result 1970 ComputeCallStack cse(signature); 1971 1972 // Compute return type 1973 int res_length= cse.compute_for_returntype(out); 1974 1975 // Temporary hack. 1976 if (out[0].equal(CellTypeState::ref) && out[1].equal(CellTypeState::bottom)) { 1977 out[0] = CellTypeState::make_line_ref(bci); 1978 } 1979 1980 assert(res_length<=4, "max value should be vv"); 1981 1982 // Compute arguments 1983 int arg_length = cse.compute_for_parameters(is_static != 0, in); 1984 assert(arg_length<=MAXARGSIZE, "too many locals"); 1985 1986 // Pop arguments 1987 for (int i = arg_length - 1; i >= 0; i--) ppop1(in[i]);// Do args in reverse order. 1988 1989 // Report results 1990 if (_report_result_for_send == true) { 1991 fill_stackmap_for_opcodes(_itr_send, vars(), stack(), _stack_top); 1992 _report_result_for_send = false; 1993 } 1994 1995 // Push return address 1996 ppush(out); 1997 } 1998 1999 void GenerateOopMap::do_withfield(int idx, int bci) { 2000 // Dig up signature for field in constant pool 2001 ConstantPool* cp = method()->constants(); 2002 int nameAndTypeIdx = cp->name_and_type_ref_index_at(idx); 2003 int signatureIdx = cp->signature_ref_index_at(nameAndTypeIdx); 2004 Symbol* signature = cp->symbol_at(signatureIdx); 2005 2006 // Parse signature (especially simple for fields) 2007 assert(signature->utf8_length() > 0, 2008 "field signatures cannot have zero length"); 2009 // The signature is UFT8 encoded, but the first char is always ASCII for signatures. 2010 char sigch = (char) *(signature->base()); 2011 CellTypeState temp[4]; 2012 CellTypeState *eff = sigchar_to_effect(sigch, bci, temp); 2013 2014 CellTypeState in[4]; 2015 int i = copy_cts(in, eff); 2016 in[i++] = CellTypeState::ref; 2017 in[i] = CellTypeState::bottom; 2018 assert(i <= 3, "sanity check"); 2019 2020 CellTypeState out[2]; 2021 out[0] = CellTypeState::ref; 2022 out[1] = CellTypeState::bottom; 2023 2024 pp(in, out); 2025 } 2026 2027 // This is used to parse the signature for fields, since they are very simple... 2028 CellTypeState *GenerateOopMap::sigchar_to_effect(char sigch, int bci, CellTypeState *out) { 2029 // Object and array 2030 if (sigch=='L' || sigch=='[') { 2031 out[0] = CellTypeState::make_line_ref(bci); 2032 out[1] = CellTypeState::bottom; 2033 return out; 2034 } 2035 if (sigch == 'J' || sigch == 'D' ) return vvCTS; // Long and Double 2036 if (sigch == 'V' ) return epsilonCTS; // Void 2037 return vCTS; // Otherwise 2038 } 2039 2040 long GenerateOopMap::_total_byte_count = 0; 2041 elapsedTimer GenerateOopMap::_total_oopmap_time; 2042 2043 // This function assumes "bcs" is at a "ret" instruction and that the vars 2044 // state is valid for that instruction. Furthermore, the ret instruction 2045 // must be the last instruction in "bb" (we store information about the 2046 // "ret" in "bb"). 2047 void GenerateOopMap::ret_jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int varNo, int *data) { 2048 CellTypeState ra = vars()[varNo]; 2049 if (!ra.is_good_address()) { 2050 verify_error("ret returns from two jsr subroutines?"); 2051 return; 2052 } 2053 int target = ra.get_info(); 2054 2055 RetTableEntry* rtEnt = _rt.find_jsrs_for_target(target); 2056 int bci = bcs->bci(); 2057 for (int i = 0; i < rtEnt->nof_jsrs(); i++) { 2058 int target_bci = rtEnt->jsrs(i); 2059 // Make sure a jrtRet does not set the changed bit for dead basicblock. 2060 BasicBlock* jsr_bb = get_basic_block_containing(target_bci - 1); 2061 debug_only(BasicBlock* target_bb = &jsr_bb[1];) 2062 assert(target_bb == get_basic_block_at(target_bci), "wrong calc. of successor basicblock"); 2063 bool alive = jsr_bb->is_alive(); 2064 if (TraceNewOopMapGeneration) { 2065 tty->print("pc = %d, ret -> %d alive: %s\n", bci, target_bci, alive ? "true" : "false"); 2066 } 2067 if (alive) jmpFct(this, target_bci, data); 2068 } 2069 } 2070 2071 // 2072 // Debug method 2073 // 2074 char* GenerateOopMap::state_vec_to_string(CellTypeState* vec, int len) { 2075 #ifdef ASSERT 2076 int checklen = MAX3(_max_locals, _max_stack, _max_monitors) + 1; 2077 assert(len < checklen, "state_vec_buf overflow"); 2078 #endif 2079 for (int i = 0; i < len; i++) _state_vec_buf[i] = vec[i].to_char(); 2080 _state_vec_buf[len] = 0; 2081 return _state_vec_buf; 2082 } 2083 2084 void GenerateOopMap::print_time() { 2085 tty->print_cr ("Accumulated oopmap times:"); 2086 tty->print_cr ("---------------------------"); 2087 tty->print_cr (" Total : %3.3f sec.", GenerateOopMap::_total_oopmap_time.seconds()); 2088 tty->print_cr (" (%3.0f bytecodes per sec) ", 2089 GenerateOopMap::_total_byte_count / GenerateOopMap::_total_oopmap_time.seconds()); 2090 } 2091 2092 // 2093 // ============ Main Entry Point =========== 2094 // 2095 GenerateOopMap::GenerateOopMap(const methodHandle& method) { 2096 // We have to initialize all variables here, that can be queried directly 2097 _method = method; 2098 _max_locals=0; 2099 _init_vars = NULL; 2100 2101 #ifndef PRODUCT 2102 // If we are doing a detailed trace, include the regular trace information. 2103 if (TraceNewOopMapGenerationDetailed) { 2104 TraceNewOopMapGeneration = true; 2105 } 2106 #endif 2107 } 2108 2109 void GenerateOopMap::compute_map(TRAPS) { 2110 #ifndef PRODUCT 2111 if (TimeOopMap2) { 2112 method()->print_short_name(tty); 2113 tty->print(" "); 2114 } 2115 if (TimeOopMap) { 2116 _total_byte_count += method()->code_size(); 2117 } 2118 #endif 2119 TraceTime t_single("oopmap time", TimeOopMap2); 2120 TraceTime t_all(NULL, &_total_oopmap_time, TimeOopMap); 2121 2122 // Initialize values 2123 _got_error = false; 2124 _conflict = false; 2125 _max_locals = method()->max_locals(); 2126 _max_stack = method()->max_stack(); 2127 _has_exceptions = (method()->has_exception_handler()); 2128 _nof_refval_conflicts = 0; 2129 _init_vars = new GrowableArray<intptr_t>(5); // There are seldom more than 5 init_vars 2130 _report_result = false; 2131 _report_result_for_send = false; 2132 _new_var_map = NULL; 2133 _ret_adr_tos = new GrowableArray<intptr_t>(5); // 5 seems like a good number; 2134 _did_rewriting = false; 2135 _did_relocation = false; 2136 2137 if (TraceNewOopMapGeneration) { 2138 tty->print("Method name: %s\n", method()->name()->as_C_string()); 2139 if (Verbose) { 2140 _method->print_codes(); 2141 tty->print_cr("Exception table:"); 2142 ExceptionTable excps(method()); 2143 for(int i = 0; i < excps.length(); i ++) { 2144 tty->print_cr("[%d - %d] -> %d", 2145 excps.start_pc(i), excps.end_pc(i), excps.handler_pc(i)); 2146 } 2147 } 2148 } 2149 2150 // if no code - do nothing 2151 // compiler needs info 2152 if (method()->code_size() == 0 || _max_locals + method()->max_stack() == 0) { 2153 fill_stackmap_prolog(0); 2154 fill_stackmap_epilog(); 2155 return; 2156 } 2157 // Step 1: Compute all jump targets and their return value 2158 if (!_got_error) 2159 _rt.compute_ret_table(_method); 2160 2161 // Step 2: Find all basic blocks and count GC points 2162 if (!_got_error) 2163 mark_bbheaders_and_count_gc_points(); 2164 2165 // Step 3: Calculate stack maps 2166 if (!_got_error) 2167 do_interpretation(); 2168 2169 // Step 4:Return results 2170 if (!_got_error && report_results()) 2171 report_result(); 2172 2173 if (_got_error) { 2174 THROW_HANDLE(_exception); 2175 } 2176 } 2177 2178 // Error handling methods 2179 // These methods create an exception for the current thread which is thrown 2180 // at the bottom of the call stack, when it returns to compute_map(). The 2181 // _got_error flag controls execution. NOT TODO: The VM exception propagation 2182 // mechanism using TRAPS/CHECKs could be used here instead but it would need 2183 // to be added as a parameter to every function and checked for every call. 2184 // The tons of extra code it would generate didn't seem worth the change. 2185 // 2186 void GenerateOopMap::error_work(const char *format, va_list ap) { 2187 _got_error = true; 2188 char msg_buffer[512]; 2189 vsnprintf(msg_buffer, sizeof(msg_buffer), format, ap); 2190 // Append method name 2191 char msg_buffer2[512]; 2192 jio_snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg_buffer, method()->name()->as_C_string()); 2193 if (Thread::current()->can_call_java()) { 2194 _exception = Exceptions::new_exception(Thread::current(), 2195 vmSymbols::java_lang_LinkageError(), msg_buffer2); 2196 } else { 2197 // We cannot instantiate an exception object from a compiler thread. 2198 // Exit the VM with a useful error message. 2199 fatal("%s", msg_buffer2); 2200 } 2201 } 2202 2203 void GenerateOopMap::report_error(const char *format, ...) { 2204 va_list ap; 2205 va_start(ap, format); 2206 error_work(format, ap); 2207 } 2208 2209 void GenerateOopMap::verify_error(const char *format, ...) { 2210 // We do not distinguish between different types of errors for verification 2211 // errors. Let the verifier give a better message. 2212 report_error("Illegal class file encountered. Try running with -Xverify:all"); 2213 } 2214 2215 // 2216 // Report result opcodes 2217 // 2218 void GenerateOopMap::report_result() { 2219 2220 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass"); 2221 2222 // We now want to report the result of the parse 2223 _report_result = true; 2224 2225 // Prolog code 2226 fill_stackmap_prolog(_gc_points); 2227 2228 // Mark everything changed, then do one interpretation pass. 2229 for (int i = 0; i<_bb_count; i++) { 2230 if (_basic_blocks[i].is_reachable()) { 2231 _basic_blocks[i].set_changed(true); 2232 interp_bb(&_basic_blocks[i]); 2233 } 2234 } 2235 2236 // Note: Since we are skipping dead-code when we are reporting results, then 2237 // the no. of encountered gc-points might be fewer than the previously number 2238 // we have counted. (dead-code is a pain - it should be removed before we get here) 2239 fill_stackmap_epilog(); 2240 2241 // Report initvars 2242 fill_init_vars(_init_vars); 2243 2244 _report_result = false; 2245 } 2246 2247 void GenerateOopMap::result_for_basicblock(int bci) { 2248 if (TraceNewOopMapGeneration) tty->print_cr("Report result pass for basicblock"); 2249 2250 // We now want to report the result of the parse 2251 _report_result = true; 2252 2253 // Find basicblock and report results 2254 BasicBlock* bb = get_basic_block_containing(bci); 2255 guarantee(bb != NULL, "no basic block for bci"); 2256 assert(bb->is_reachable(), "getting result from unreachable basicblock"); 2257 bb->set_changed(true); 2258 interp_bb(bb); 2259 } 2260 2261 // 2262 // Conflict handling code 2263 // 2264 2265 void GenerateOopMap::record_refval_conflict(int varNo) { 2266 assert(varNo>=0 && varNo< _max_locals, "index out of range"); 2267 2268 if (TraceOopMapRewrites) { 2269 tty->print("### Conflict detected (local no: %d)\n", varNo); 2270 } 2271 2272 if (!_new_var_map) { 2273 _new_var_map = NEW_RESOURCE_ARRAY(int, _max_locals); 2274 for (int k = 0; k < _max_locals; k++) _new_var_map[k] = k; 2275 } 2276 2277 if ( _new_var_map[varNo] == varNo) { 2278 // Check if max. number of locals has been reached 2279 if (_max_locals + _nof_refval_conflicts >= MAX_LOCAL_VARS) { 2280 report_error("Rewriting exceeded local variable limit"); 2281 return; 2282 } 2283 _new_var_map[varNo] = _max_locals + _nof_refval_conflicts; 2284 _nof_refval_conflicts++; 2285 } 2286 } 2287 2288 void GenerateOopMap::rewrite_refval_conflicts() 2289 { 2290 // We can get here two ways: Either a rewrite conflict was detected, or 2291 // an uninitialize reference was detected. In the second case, we do not 2292 // do any rewriting, we just want to recompute the reference set with the 2293 // new information 2294 2295 int nof_conflicts = 0; // Used for debugging only 2296 2297 if ( _nof_refval_conflicts == 0 ) 2298 return; 2299 2300 // Check if rewrites are allowed in this parse. 2301 if (!allow_rewrites() && !IgnoreRewrites) { 2302 fatal("Rewriting method not allowed at this stage"); 2303 } 2304 2305 2306 // This following flag is to tempoary supress rewrites. The locals that might conflict will 2307 // all be set to contain values. This is UNSAFE - however, until the rewriting has been completely 2308 // tested it is nice to have. 2309 if (IgnoreRewrites) { 2310 if (Verbose) { 2311 tty->print("rewrites suppressed for local no. "); 2312 for (int l = 0; l < _max_locals; l++) { 2313 if (_new_var_map[l] != l) { 2314 tty->print("%d ", l); 2315 vars()[l] = CellTypeState::value; 2316 } 2317 } 2318 tty->cr(); 2319 } 2320 2321 // That was that... 2322 _new_var_map = NULL; 2323 _nof_refval_conflicts = 0; 2324 _conflict = false; 2325 2326 return; 2327 } 2328 2329 // Tracing flag 2330 _did_rewriting = true; 2331 2332 if (TraceOopMapRewrites) { 2333 tty->print_cr("ref/value conflict for method %s - bytecodes are getting rewritten", method()->name()->as_C_string()); 2334 method()->print(); 2335 method()->print_codes(); 2336 } 2337 2338 assert(_new_var_map!=NULL, "nothing to rewrite"); 2339 assert(_conflict==true, "We should not be here"); 2340 2341 compute_ret_adr_at_TOS(); 2342 if (!_got_error) { 2343 for (int k = 0; k < _max_locals && !_got_error; k++) { 2344 if (_new_var_map[k] != k) { 2345 if (TraceOopMapRewrites) { 2346 tty->print_cr("Rewriting: %d -> %d", k, _new_var_map[k]); 2347 } 2348 rewrite_refval_conflict(k, _new_var_map[k]); 2349 if (_got_error) return; 2350 nof_conflicts++; 2351 } 2352 } 2353 } 2354 2355 assert(nof_conflicts == _nof_refval_conflicts, "sanity check"); 2356 2357 // Adjust the number of locals 2358 method()->set_max_locals(_max_locals+_nof_refval_conflicts); 2359 _max_locals += _nof_refval_conflicts; 2360 2361 // That was that... 2362 _new_var_map = NULL; 2363 _nof_refval_conflicts = 0; 2364 } 2365 2366 void GenerateOopMap::rewrite_refval_conflict(int from, int to) { 2367 bool startOver; 2368 do { 2369 // Make sure that the BytecodeStream is constructed in the loop, since 2370 // during rewriting a new method oop is going to be used, and the next time 2371 // around we want to use that. 2372 BytecodeStream bcs(_method); 2373 startOver = false; 2374 2375 while( !startOver && !_got_error && 2376 // test bcs in case method changed and it became invalid 2377 bcs.next() >=0) { 2378 startOver = rewrite_refval_conflict_inst(&bcs, from, to); 2379 } 2380 } while (startOver && !_got_error); 2381 } 2382 2383 /* If the current instruction is one that uses local variable "from" 2384 in a ref way, change it to use "to". There's a subtle reason why we 2385 renumber the ref uses and not the non-ref uses: non-ref uses may be 2386 2 slots wide (double, long) which would necessitate keeping track of 2387 whether we should add one or two variables to the method. If the change 2388 affected the width of some instruction, returns "TRUE"; otherwise, returns "FALSE". 2389 Another reason for moving ref's value is for solving (addr, ref) conflicts, which 2390 both uses aload/astore methods. 2391 */ 2392 bool GenerateOopMap::rewrite_refval_conflict_inst(BytecodeStream *itr, int from, int to) { 2393 Bytecodes::Code bc = itr->code(); 2394 int index; 2395 int bci = itr->bci(); 2396 2397 if (is_aload(itr, &index) && index == from) { 2398 if (TraceOopMapRewrites) { 2399 tty->print_cr("Rewriting aload at bci: %d", bci); 2400 } 2401 return rewrite_load_or_store(itr, Bytecodes::_aload, Bytecodes::_aload_0, to); 2402 } 2403 2404 if (is_astore(itr, &index) && index == from) { 2405 if (!stack_top_holds_ret_addr(bci)) { 2406 if (TraceOopMapRewrites) { 2407 tty->print_cr("Rewriting astore at bci: %d", bci); 2408 } 2409 return rewrite_load_or_store(itr, Bytecodes::_astore, Bytecodes::_astore_0, to); 2410 } else { 2411 if (TraceOopMapRewrites) { 2412 tty->print_cr("Supress rewriting of astore at bci: %d", bci); 2413 } 2414 } 2415 } 2416 2417 return false; 2418 } 2419 2420 // The argument to this method is: 2421 // bc : Current bytecode 2422 // bcN : either _aload or _astore 2423 // bc0 : either _aload_0 or _astore_0 2424 bool GenerateOopMap::rewrite_load_or_store(BytecodeStream *bcs, Bytecodes::Code bcN, Bytecodes::Code bc0, unsigned int varNo) { 2425 assert(bcN == Bytecodes::_astore || bcN == Bytecodes::_aload, "wrong argument (bcN)"); 2426 assert(bc0 == Bytecodes::_astore_0 || bc0 == Bytecodes::_aload_0, "wrong argument (bc0)"); 2427 int ilen = Bytecodes::length_at(_method(), bcs->bcp()); 2428 int newIlen; 2429 2430 if (ilen == 4) { 2431 // Original instruction was wide; keep it wide for simplicity 2432 newIlen = 4; 2433 } else if (varNo < 4) 2434 newIlen = 1; 2435 else if (varNo >= 256) 2436 newIlen = 4; 2437 else 2438 newIlen = 2; 2439 2440 // If we need to relocate in order to patch the byte, we 2441 // do the patching in a temp. buffer, that is passed to the reloc. 2442 // The patching of the bytecode stream is then done by the Relocator. 2443 // This is neccesary, since relocating the instruction at a certain bci, might 2444 // also relocate that instruction, e.g., if a _goto before it gets widen to a _goto_w. 2445 // Hence, we do not know which bci to patch after relocation. 2446 2447 assert(newIlen <= 4, "sanity check"); 2448 u_char inst_buffer[4]; // Max. instruction size is 4. 2449 address bcp; 2450 2451 if (newIlen != ilen) { 2452 // Relocation needed do patching in temp. buffer 2453 bcp = (address)inst_buffer; 2454 } else { 2455 bcp = _method->bcp_from(bcs->bci()); 2456 } 2457 2458 // Patch either directly in Method* or in temp. buffer 2459 if (newIlen == 1) { 2460 assert(varNo < 4, "varNo too large"); 2461 *bcp = bc0 + varNo; 2462 } else if (newIlen == 2) { 2463 assert(varNo < 256, "2-byte index needed!"); 2464 *(bcp + 0) = bcN; 2465 *(bcp + 1) = varNo; 2466 } else { 2467 assert(newIlen == 4, "Wrong instruction length"); 2468 *(bcp + 0) = Bytecodes::_wide; 2469 *(bcp + 1) = bcN; 2470 Bytes::put_Java_u2(bcp+2, varNo); 2471 } 2472 2473 if (newIlen != ilen) { 2474 expand_current_instr(bcs->bci(), ilen, newIlen, inst_buffer); 2475 } 2476 2477 2478 return (newIlen != ilen); 2479 } 2480 2481 class RelocCallback : public RelocatorListener { 2482 private: 2483 GenerateOopMap* _gom; 2484 public: 2485 RelocCallback(GenerateOopMap* gom) { _gom = gom; }; 2486 2487 // Callback method 2488 virtual void relocated(int bci, int delta, int new_code_length) { 2489 _gom->update_basic_blocks (bci, delta, new_code_length); 2490 _gom->update_ret_adr_at_TOS(bci, delta); 2491 _gom->_rt.update_ret_table (bci, delta); 2492 } 2493 }; 2494 2495 // Returns true if expanding was succesful. Otherwise, reports an error and 2496 // returns false. 2497 void GenerateOopMap::expand_current_instr(int bci, int ilen, int newIlen, u_char inst_buffer[]) { 2498 Thread *THREAD = Thread::current(); // Could really have TRAPS argument. 2499 RelocCallback rcb(this); 2500 Relocator rc(_method, &rcb); 2501 methodHandle m= rc.insert_space_at(bci, newIlen, inst_buffer, THREAD); 2502 if (m.is_null() || HAS_PENDING_EXCEPTION) { 2503 report_error("could not rewrite method - exception occurred or bytecode buffer overflow"); 2504 return; 2505 } 2506 2507 // Relocator returns a new method oop. 2508 _did_relocation = true; 2509 _method = m; 2510 } 2511 2512 2513 bool GenerateOopMap::is_astore(BytecodeStream *itr, int *index) { 2514 Bytecodes::Code bc = itr->code(); 2515 switch(bc) { 2516 case Bytecodes::_astore_0: 2517 case Bytecodes::_astore_1: 2518 case Bytecodes::_astore_2: 2519 case Bytecodes::_astore_3: 2520 *index = bc - Bytecodes::_astore_0; 2521 return true; 2522 case Bytecodes::_astore: 2523 *index = itr->get_index(); 2524 return true; 2525 default: 2526 return false; 2527 } 2528 } 2529 2530 bool GenerateOopMap::is_aload(BytecodeStream *itr, int *index) { 2531 Bytecodes::Code bc = itr->code(); 2532 switch(bc) { 2533 case Bytecodes::_aload_0: 2534 case Bytecodes::_aload_1: 2535 case Bytecodes::_aload_2: 2536 case Bytecodes::_aload_3: 2537 *index = bc - Bytecodes::_aload_0; 2538 return true; 2539 2540 case Bytecodes::_aload: 2541 *index = itr->get_index(); 2542 return true; 2543 2544 default: 2545 return false; 2546 } 2547 } 2548 2549 2550 // Return true iff the top of the operand stack holds a return address at 2551 // the current instruction 2552 bool GenerateOopMap::stack_top_holds_ret_addr(int bci) { 2553 for(int i = 0; i < _ret_adr_tos->length(); i++) { 2554 if (_ret_adr_tos->at(i) == bci) 2555 return true; 2556 } 2557 2558 return false; 2559 } 2560 2561 void GenerateOopMap::compute_ret_adr_at_TOS() { 2562 assert(_ret_adr_tos != NULL, "must be initialized"); 2563 _ret_adr_tos->clear(); 2564 2565 for (int i = 0; i < bb_count(); i++) { 2566 BasicBlock* bb = &_basic_blocks[i]; 2567 2568 // Make sure to only check basicblocks that are reachable 2569 if (bb->is_reachable()) { 2570 2571 // For each Basic block we check all instructions 2572 BytecodeStream bcs(_method); 2573 bcs.set_interval(bb->_bci, next_bb_start_pc(bb)); 2574 2575 restore_state(bb); 2576 2577 while (bcs.next()>=0 && !_got_error) { 2578 // TDT: should this be is_good_address() ? 2579 if (_stack_top > 0 && stack()[_stack_top-1].is_address()) { 2580 _ret_adr_tos->append(bcs.bci()); 2581 if (TraceNewOopMapGeneration) { 2582 tty->print_cr("Ret_adr TOS at bci: %d", bcs.bci()); 2583 } 2584 } 2585 interp1(&bcs); 2586 } 2587 } 2588 } 2589 } 2590 2591 void GenerateOopMap::update_ret_adr_at_TOS(int bci, int delta) { 2592 for(int i = 0; i < _ret_adr_tos->length(); i++) { 2593 int v = _ret_adr_tos->at(i); 2594 if (v > bci) _ret_adr_tos->at_put(i, v + delta); 2595 } 2596 } 2597 2598 // =================================================================== 2599 2600 #ifndef PRODUCT 2601 int ResolveOopMapConflicts::_nof_invocations = 0; 2602 int ResolveOopMapConflicts::_nof_rewrites = 0; 2603 int ResolveOopMapConflicts::_nof_relocations = 0; 2604 #endif 2605 2606 methodHandle ResolveOopMapConflicts::do_potential_rewrite(TRAPS) { 2607 compute_map(CHECK_(methodHandle())); 2608 2609 #ifndef PRODUCT 2610 // Tracking and statistics 2611 if (PrintRewrites) { 2612 _nof_invocations++; 2613 if (did_rewriting()) { 2614 _nof_rewrites++; 2615 if (did_relocation()) _nof_relocations++; 2616 tty->print("Method was rewritten %s: ", (did_relocation()) ? "and relocated" : ""); 2617 method()->print_value(); tty->cr(); 2618 tty->print_cr("Cand.: %d rewrts: %d (%d%%) reloc.: %d (%d%%)", 2619 _nof_invocations, 2620 _nof_rewrites, (_nof_rewrites * 100) / _nof_invocations, 2621 _nof_relocations, (_nof_relocations * 100) / _nof_invocations); 2622 } 2623 } 2624 #endif 2625 return methodHandle(THREAD, method()); 2626 }