src/share/vm/oops/generateOopMap.cpp

Tue, 30 Apr 2013 11:56:52 -0700

author
ccheung
date
Tue, 30 Apr 2013 11:56:52 -0700
changeset 4993
746b070f5022
parent 4773
2eef6d34833b
child 5241
f75faf51e8c4
permissions
-rw-r--r--

8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
Reviewed-by: coleenp, zgu, hseigel

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

mercurial