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