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