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