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