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