src/share/vm/oops/generateOopMap.cpp

Tue, 13 Mar 2012 13:50:48 -0400

author
jiangli
date
Tue, 13 Mar 2012 13:50:48 -0400
changeset 3670
f7c4174b33ba
parent 3063
9f12ede5571a
child 3917
8150fa46d2ed
permissions
-rw-r--r--

7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
Summary: Fold instanceKlass::_enclosing_method_class_index and instanceKlass::_enclosing_method_method_index into the instanceKlass::_inner_classes array.
Reviewed-by: never, coleenp
Contributed-by: Jiangli Zhou <jiangli.zhou@oracle.com>

     1 /*
     2  * Copyright (c) 1997, 2011, 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"
    35 //
    36 //
    37 // Compute stack layouts for each instruction in method.
    38 //
    39 //  Problems:
    40 //  - What to do about jsr with different types of local vars?
    41 //  Need maps that are conditional on jsr path?
    42 //  - Jsr and exceptions should be done more efficiently (the retAddr stuff)
    43 //
    44 //  Alternative:
    45 //  - Could extend verifier to provide this information.
    46 //    For: one fewer abstract interpreter to maintain. Against: the verifier
    47 //    solves a bigger problem so slower (undesirable to force verification of
    48 //    everything?).
    49 //
    50 //  Algorithm:
    51 //    Partition bytecodes into basic blocks
    52 //    For each basic block: store entry state (vars, stack). For instructions
    53 //    inside basic blocks we do not store any state (instead we recompute it
    54 //    from state produced by previous instruction).
    55 //
    56 //    Perform abstract interpretation of bytecodes over this lattice:
    57 //
    58 //                _--'#'--_
    59 //               /  /  \   \
    60 //             /   /     \   \
    61 //            /    |     |     \
    62 //          'r'   'v'   'p'   ' '
    63 //           \     |     |     /
    64 //            \    \     /    /
    65 //              \   \   /    /
    66 //                -- '@' --
    67 //
    68 //    '#'  top, result of conflict merge
    69 //    'r'  reference type
    70 //    'v'  value type
    71 //    'p'  pc type for jsr/ret
    72 //    ' '  uninitialized; never occurs on operand stack in Java
    73 //    '@'  bottom/unexecuted; initial state each bytecode.
    74 //
    75 //    Basic block headers are the only merge points. We use this iteration to
    76 //    compute the information:
    77 //
    78 //    find basic blocks;
    79 //    initialize them with uninitialized state;
    80 //    initialize first BB according to method signature;
    81 //    mark first BB changed
    82 //    while (some BB is changed) do {
    83 //      perform abstract interpration of all bytecodes in BB;
    84 //      merge exit state of BB into entry state of all successor BBs,
    85 //      noting if any of these change;
    86 //    }
    87 //
    88 //  One additional complication is necessary. The jsr instruction pushes
    89 //  a return PC on the stack (a 'p' type in the abstract interpretation).
    90 //  To be able to process "ret" bytecodes, we keep track of these return
    91 //  PC's in a 'retAddrs' structure in abstract interpreter context (when
    92 //  processing a "ret" bytecodes, it is not sufficient to know that it gets
    93 //  an argument of the right type 'p'; we need to know which address it
    94 //  returns to).
    95 //
    96 // (Note this comment is borrowed form the original author of the algorithm)
    98 // ComputeCallStack
    99 //
   100 // Specialization of SignatureIterator - compute the effects of a call
   101 //
   102 class ComputeCallStack : public SignatureIterator {
   103   CellTypeState *_effect;
   104   int _idx;
   106   void setup();
   107   void set(CellTypeState state)         { _effect[_idx++] = state; }
   108   int  length()                         { return _idx; };
   110   virtual void do_bool  ()              { set(CellTypeState::value); };
   111   virtual void do_char  ()              { set(CellTypeState::value); };
   112   virtual void do_float ()              { set(CellTypeState::value); };
   113   virtual void do_byte  ()              { set(CellTypeState::value); };
   114   virtual void do_short ()              { set(CellTypeState::value); };
   115   virtual void do_int   ()              { set(CellTypeState::value); };
   116   virtual void do_void  ()              { set(CellTypeState::bottom);};
   117   virtual void do_object(int begin, int end)  { set(CellTypeState::ref); };
   118   virtual void do_array (int begin, int end)  { set(CellTypeState::ref); };
   120   void do_double()                      { set(CellTypeState::value);
   121                                           set(CellTypeState::value); }
   122   void do_long  ()                      { set(CellTypeState::value);
   123                                            set(CellTypeState::value); }
   125 public:
   126   ComputeCallStack(Symbol* signature) : SignatureIterator(signature) {};
   128   // Compute methods
   129   int compute_for_parameters(bool is_static, CellTypeState *effect) {
   130     _idx    = 0;
   131     _effect = effect;
   133     if (!is_static)
   134       effect[_idx++] = CellTypeState::ref;
   136     iterate_parameters();
   138     return length();
   139   };
   141   int compute_for_returntype(CellTypeState *effect) {
   142     _idx    = 0;
   143     _effect = effect;
   144     iterate_returntype();
   145     set(CellTypeState::bottom);  // Always terminate with a bottom state, so ppush works
   147     return length();
   148   }
   149 };
   151 //=========================================================================================
   152 // ComputeEntryStack
   153 //
   154 // Specialization of SignatureIterator - in order to set up first stack frame
   155 //
   156 class ComputeEntryStack : public SignatureIterator {
   157   CellTypeState *_effect;
   158   int _idx;
   160   void setup();
   161   void set(CellTypeState state)         { _effect[_idx++] = state; }
   162   int  length()                         { return _idx; };
   164   virtual void do_bool  ()              { set(CellTypeState::value); };
   165   virtual void do_char  ()              { set(CellTypeState::value); };
   166   virtual void do_float ()              { set(CellTypeState::value); };
   167   virtual void do_byte  ()              { set(CellTypeState::value); };
   168   virtual void do_short ()              { set(CellTypeState::value); };
   169   virtual void do_int   ()              { set(CellTypeState::value); };
   170   virtual void do_void  ()              { set(CellTypeState::bottom);};
   171   virtual void do_object(int begin, int end)  { set(CellTypeState::make_slot_ref(_idx)); }
   172   virtual void do_array (int begin, int end)  { set(CellTypeState::make_slot_ref(_idx)); }
   174   void do_double()                      { set(CellTypeState::value);
   175                                           set(CellTypeState::value); }
   176   void do_long  ()                      { set(CellTypeState::value);
   177                                           set(CellTypeState::value); }
   179 public:
   180   ComputeEntryStack(Symbol* signature) : SignatureIterator(signature) {};
   182   // Compute methods
   183   int compute_for_parameters(bool is_static, CellTypeState *effect) {
   184     _idx    = 0;
   185     _effect = effect;
   187     if (!is_static)
   188       effect[_idx++] = CellTypeState::make_slot_ref(0);
   190     iterate_parameters();
   192     return length();
   193   };
   195   int compute_for_returntype(CellTypeState *effect) {
   196     _idx    = 0;
   197     _effect = effect;
   198     iterate_returntype();
   199     set(CellTypeState::bottom);  // Always terminate with a bottom state, so ppush works
   201     return length();
   202   }
   203 };
   205 //=====================================================================================
   206 //
   207 // Implementation of RetTable/RetTableEntry
   208 //
   209 // Contains function to itereate through all bytecodes
   210 // and find all return entry points
   211 //
   212 int RetTable::_init_nof_entries = 10;
   213 int RetTableEntry::_init_nof_jsrs = 5;
   215 void RetTableEntry::add_delta(int bci, int delta) {
   216   if (_target_bci > bci) _target_bci += delta;
   218   for (int k = 0; k < _jsrs->length(); k++) {
   219     int jsr = _jsrs->at(k);
   220     if (jsr > bci) _jsrs->at_put(k, jsr+delta);
   221   }
   222 }
   224 void RetTable::compute_ret_table(methodHandle method) {
   225   BytecodeStream i(method);
   226   Bytecodes::Code bytecode;
   228   while( (bytecode = i.next()) >= 0) {
   229     switch (bytecode) {
   230       case Bytecodes::_jsr:
   231         add_jsr(i.next_bci(), i.dest());
   232         break;
   233       case Bytecodes::_jsr_w:
   234         add_jsr(i.next_bci(), i.dest_w());
   235         break;
   236     }
   237   }
   238 }
   240 void RetTable::add_jsr(int return_bci, int target_bci) {
   241   RetTableEntry* entry = _first;
   243   // Scan table for entry
   244   for (;entry && entry->target_bci() != target_bci; entry = entry->next());
   246   if (!entry) {
   247     // Allocate new entry and put in list
   248     entry = new RetTableEntry(target_bci, _first);
   249     _first = entry;
   250   }
   252   // Now "entry" is set.  Make sure that the entry is initialized
   253   // and has room for the new jsr.
   254   entry->add_jsr(return_bci);
   255 }
   257 RetTableEntry* RetTable::find_jsrs_for_target(int targBci) {
   258   RetTableEntry *cur = _first;
   260   while(cur) {
   261     assert(cur->target_bci() != -1, "sanity check");
   262     if (cur->target_bci() == targBci)  return cur;
   263     cur = cur->next();
   264   }
   265   ShouldNotReachHere();
   266   return NULL;
   267 }
   269 // The instruction at bci is changing size by "delta".  Update the return map.
   270 void RetTable::update_ret_table(int bci, int delta) {
   271   RetTableEntry *cur = _first;
   272   while(cur) {
   273     cur->add_delta(bci, delta);
   274     cur = cur->next();
   275   }
   276 }
   278 //
   279 // Celltype state
   280 //
   282 CellTypeState CellTypeState::bottom      = CellTypeState::make_bottom();
   283 CellTypeState CellTypeState::uninit      = CellTypeState::make_any(uninit_value);
   284 CellTypeState CellTypeState::ref         = CellTypeState::make_any(ref_conflict);
   285 CellTypeState CellTypeState::value       = CellTypeState::make_any(val_value);
   286 CellTypeState CellTypeState::refUninit   = CellTypeState::make_any(ref_conflict | uninit_value);
   287 CellTypeState CellTypeState::top         = CellTypeState::make_top();
   288 CellTypeState CellTypeState::addr        = CellTypeState::make_any(addr_conflict);
   290 // Commonly used constants
   291 static CellTypeState epsilonCTS[1] = { CellTypeState::bottom };
   292 static CellTypeState   refCTS   = CellTypeState::ref;
   293 static CellTypeState   valCTS   = CellTypeState::value;
   294 static CellTypeState    vCTS[2] = { CellTypeState::value, CellTypeState::bottom };
   295 static CellTypeState    rCTS[2] = { CellTypeState::ref,   CellTypeState::bottom };
   296 static CellTypeState   rrCTS[3] = { CellTypeState::ref,   CellTypeState::ref,   CellTypeState::bottom };
   297 static CellTypeState   vrCTS[3] = { CellTypeState::value, CellTypeState::ref,   CellTypeState::bottom };
   298 static CellTypeState   vvCTS[3] = { CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
   299 static CellTypeState  rvrCTS[4] = { CellTypeState::ref,   CellTypeState::value, CellTypeState::ref,   CellTypeState::bottom };
   300 static CellTypeState  vvrCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::ref,   CellTypeState::bottom };
   301 static CellTypeState  vvvCTS[4] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
   302 static CellTypeState vvvrCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::ref,   CellTypeState::bottom };
   303 static CellTypeState vvvvCTS[5] = { CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::value, CellTypeState::bottom };
   305 char CellTypeState::to_char() const {
   306   if (can_be_reference()) {
   307     if (can_be_value() || can_be_address())
   308       return '#';    // Conflict that needs to be rewritten
   309     else
   310       return 'r';
   311   } else if (can_be_value())
   312     return 'v';
   313   else if (can_be_address())
   314     return 'p';
   315   else if (can_be_uninit())
   316     return ' ';
   317   else
   318     return '@';
   319 }
   322 // Print a detailed CellTypeState.  Indicate all bits that are set.  If
   323 // the CellTypeState represents an address or a reference, print the
   324 // value of the additional information.
   325 void CellTypeState::print(outputStream *os) {
   326   if (can_be_address()) {
   327     os->print("(p");
   328   } else {
   329     os->print("( ");
   330   }
   331   if (can_be_reference()) {
   332     os->print("r");
   333   } else {
   334     os->print(" ");
   335   }
   336   if (can_be_value()) {
   337     os->print("v");
   338   } else {
   339     os->print(" ");
   340   }
   341   if (can_be_uninit()) {
   342     os->print("u|");
   343   } else {
   344     os->print(" |");
   345   }
   346   if (is_info_top()) {
   347     os->print("Top)");
   348   } else if (is_info_bottom()) {
   349     os->print("Bot)");
   350   } else {
   351     if (is_reference()) {
   352       int info = get_info();
   353       int data = info & ~(ref_not_lock_bit | ref_slot_bit);
   354       if (info & ref_not_lock_bit) {
   355         // Not a monitor lock reference.
   356         if (info & ref_slot_bit) {
   357           // slot
   358           os->print("slot%d)", data);
   359         } else {
   360           // line
   361           os->print("line%d)", data);
   362         }
   363       } else {
   364         // lock
   365         os->print("lock%d)", data);
   366       }
   367     } else {
   368       os->print("%d)", get_info());
   369     }
   370   }
   371 }
   373 //
   374 // Basicblock handling methods
   375 //
   377 void GenerateOopMap ::initialize_bb() {
   378   _gc_points = 0;
   379   _bb_count  = 0;
   380   _bb_hdr_bits.clear();
   381   _bb_hdr_bits.resize(method()->code_size());
   382 }
   384 void GenerateOopMap::bb_mark_fct(GenerateOopMap *c, int bci, int *data) {
   385   assert(bci>= 0 && bci < c->method()->code_size(), "index out of bounds");
   386   if (c->is_bb_header(bci))
   387      return;
   389   if (TraceNewOopMapGeneration) {
   390      tty->print_cr("Basicblock#%d begins at: %d", c->_bb_count, bci);
   391   }
   392   c->set_bbmark_bit(bci);
   393   c->_bb_count++;
   394 }
   397 void GenerateOopMap::mark_bbheaders_and_count_gc_points() {
   398   initialize_bb();
   400   bool fellThrough = false;  // False to get first BB marked.
   402   // First mark all exception handlers as start of a basic-block
   403   typeArrayOop excps = method()->exception_table();
   404   for(int i = 0; i < excps->length(); i += 4) {
   405     int handler_pc_idx = i+2;
   406     bb_mark_fct(this, excps->int_at(handler_pc_idx), 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   typeArrayOop excps = method()->exception_table();
   454   for(int i = 0; i < excps->length(); i += 4) {
   455     int handler_pc_idx = i+2;
   456     BasicBlock *bb = get_basic_block_at(excps->int_at(handler_pc_idx));
   457     // If block is not already alive (due to multiple exception handlers to same bb), then
   458     // make it alive
   459     if (bb->is_dead()) bb->mark_as_alive();
   460   }
   462   BytecodeStream bcs(_method);
   464   // Iterate through all basic blocks until we reach a fixpoint
   465   while (change) {
   466     change = 0;
   468     for (int i = 0; i < _bb_count; i++) {
   469       BasicBlock *bb = &_basic_blocks[i];
   470       if (bb->is_alive()) {
   471         // Position bytecodestream at last bytecode in basicblock
   472         bcs.set_start(bb->_end_bci);
   473         bcs.next();
   474         Bytecodes::Code bytecode = bcs.code();
   475         int bci = bcs.bci();
   476         assert(bci == bb->_end_bci, "wrong bci");
   478         bool fell_through = jump_targets_do(&bcs, &GenerateOopMap::reachable_basicblock, &change);
   480         // We will also mark successors of jsr's as alive.
   481         switch (bytecode) {
   482           case Bytecodes::_jsr:
   483           case Bytecodes::_jsr_w:
   484             assert(!fell_through, "should not happen");
   485             reachable_basicblock(this, bci + Bytecodes::length_for(bytecode), &change);
   486             break;
   487         }
   488         if (fell_through) {
   489           // Mark successor as alive
   490           if (bb[1].is_dead()) {
   491             bb[1].mark_as_alive();
   492             change = 1;
   493           }
   494         }
   495       }
   496     }
   497   }
   498 }
   500 /* If the current instruction in "c" has no effect on control flow,
   501    returns "true".  Otherwise, calls "jmpFct" one or more times, with
   502    "c", an appropriate "pcDelta", and "data" as arguments, then
   503    returns "false".  There is one exception: if the current
   504    instruction is a "ret", returns "false" without calling "jmpFct".
   505    Arrangements for tracking the control flow of a "ret" must be made
   506    externally. */
   507 bool GenerateOopMap::jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int *data) {
   508   int bci = bcs->bci();
   510   switch (bcs->code()) {
   511     case Bytecodes::_ifeq:
   512     case Bytecodes::_ifne:
   513     case Bytecodes::_iflt:
   514     case Bytecodes::_ifge:
   515     case Bytecodes::_ifgt:
   516     case Bytecodes::_ifle:
   517     case Bytecodes::_if_icmpeq:
   518     case Bytecodes::_if_icmpne:
   519     case Bytecodes::_if_icmplt:
   520     case Bytecodes::_if_icmpge:
   521     case Bytecodes::_if_icmpgt:
   522     case Bytecodes::_if_icmple:
   523     case Bytecodes::_if_acmpeq:
   524     case Bytecodes::_if_acmpne:
   525     case Bytecodes::_ifnull:
   526     case Bytecodes::_ifnonnull:
   527       (*jmpFct)(this, bcs->dest(), data);
   528       (*jmpFct)(this, bci + 3, data);
   529       break;
   531     case Bytecodes::_goto:
   532       (*jmpFct)(this, bcs->dest(), data);
   533       break;
   534     case Bytecodes::_goto_w:
   535       (*jmpFct)(this, bcs->dest_w(), data);
   536       break;
   537     case Bytecodes::_tableswitch:
   538       { Bytecode_tableswitch tableswitch(method(), bcs->bcp());
   539         int len = tableswitch.length();
   541         (*jmpFct)(this, bci + tableswitch.default_offset(), data); /* Default. jump address */
   542         while (--len >= 0) {
   543           (*jmpFct)(this, bci + tableswitch.dest_offset_at(len), data);
   544         }
   545         break;
   546       }
   548     case Bytecodes::_lookupswitch:
   549       { Bytecode_lookupswitch lookupswitch(method(), bcs->bcp());
   550         int npairs = lookupswitch.number_of_pairs();
   551         (*jmpFct)(this, bci + lookupswitch.default_offset(), data); /* Default. */
   552         while(--npairs >= 0) {
   553           LookupswitchPair pair = lookupswitch.pair_at(npairs);
   554           (*jmpFct)(this, bci + pair.offset(), data);
   555         }
   556         break;
   557       }
   558     case Bytecodes::_jsr:
   559       assert(bcs->is_wide()==false, "sanity check");
   560       (*jmpFct)(this, bcs->dest(), data);
   564       break;
   565     case Bytecodes::_jsr_w:
   566       (*jmpFct)(this, bcs->dest_w(), data);
   567       break;
   568     case Bytecodes::_wide:
   569       ShouldNotReachHere();
   570       return true;
   571       break;
   572     case Bytecodes::_athrow:
   573     case Bytecodes::_ireturn:
   574     case Bytecodes::_lreturn:
   575     case Bytecodes::_freturn:
   576     case Bytecodes::_dreturn:
   577     case Bytecodes::_areturn:
   578     case Bytecodes::_return:
   579     case Bytecodes::_ret:
   580       break;
   581     default:
   582       return true;
   583   }
   584   return false;
   585 }
   587 /* Requires "pc" to be the head of a basic block; returns that basic
   588    block. */
   589 BasicBlock *GenerateOopMap::get_basic_block_at(int bci) const {
   590   BasicBlock* bb = get_basic_block_containing(bci);
   591   assert(bb->_bci == bci, "should have found BB");
   592   return bb;
   593 }
   595 // Requires "pc" to be the start of an instruction; returns the basic
   596 //   block containing that instruction. */
   597 BasicBlock  *GenerateOopMap::get_basic_block_containing(int bci) const {
   598   BasicBlock *bbs = _basic_blocks;
   599   int lo = 0, hi = _bb_count - 1;
   601   while (lo <= hi) {
   602     int m = (lo + hi) / 2;
   603     int mbci = bbs[m]._bci;
   604     int nbci;
   606     if ( m == _bb_count-1) {
   607       assert( bci >= mbci && bci < method()->code_size(), "sanity check failed");
   608       return bbs+m;
   609     } else {
   610       nbci = bbs[m+1]._bci;
   611     }
   613     if ( mbci <= bci && bci < nbci) {
   614       return bbs+m;
   615     } else if (mbci < bci) {
   616       lo = m + 1;
   617     } else {
   618       assert(mbci > bci, "sanity check");
   619       hi = m - 1;
   620     }
   621   }
   623   fatal("should have found BB");
   624   return NULL;
   625 }
   627 void GenerateOopMap::restore_state(BasicBlock *bb)
   628 {
   629   memcpy(_state, bb->_state, _state_len*sizeof(CellTypeState));
   630   _stack_top = bb->_stack_top;
   631   _monitor_top = bb->_monitor_top;
   632 }
   634 int GenerateOopMap::next_bb_start_pc(BasicBlock *bb) {
   635  int bbNum = bb - _basic_blocks + 1;
   636  if (bbNum == _bb_count)
   637     return method()->code_size();
   639  return _basic_blocks[bbNum]._bci;
   640 }
   642 //
   643 // CellType handling methods
   644 //
   646 void GenerateOopMap::init_state() {
   647   _state_len     = _max_locals + _max_stack + _max_monitors;
   648   _state         = NEW_RESOURCE_ARRAY(CellTypeState, _state_len);
   649   memset(_state, 0, _state_len * sizeof(CellTypeState));
   650   _state_vec_buf = NEW_RESOURCE_ARRAY(char, MAX3(_max_locals, _max_stack, _max_monitors) + 1/*for null terminator char */);
   651 }
   653 void GenerateOopMap::make_context_uninitialized() {
   654   CellTypeState* vs = vars();
   656   for (int i = 0; i < _max_locals; i++)
   657       vs[i] = CellTypeState::uninit;
   659   _stack_top = 0;
   660   _monitor_top = 0;
   661 }
   663 int GenerateOopMap::methodsig_to_effect(Symbol* signature, bool is_static, CellTypeState* effect) {
   664   ComputeEntryStack ces(signature);
   665   return ces.compute_for_parameters(is_static, effect);
   666 }
   668 // Return result of merging cts1 and cts2.
   669 CellTypeState CellTypeState::merge(CellTypeState cts, int slot) const {
   670   CellTypeState result;
   672   assert(!is_bottom() && !cts.is_bottom(),
   673          "merge of bottom values is handled elsewhere");
   675   result._state = _state | cts._state;
   677   // If the top bit is set, we don't need to do any more work.
   678   if (!result.is_info_top()) {
   679     assert((result.can_be_address() || result.can_be_reference()),
   680            "only addresses and references have non-top info");
   682     if (!equal(cts)) {
   683       // The two values being merged are different.  Raise to top.
   684       if (result.is_reference()) {
   685         result = CellTypeState::make_slot_ref(slot);
   686       } else {
   687         result._state |= info_conflict;
   688       }
   689     }
   690   }
   691   assert(result.is_valid_state(), "checking that CTS merge maintains legal state");
   693   return result;
   694 }
   696 // Merge the variable state for locals and stack from cts into bbts.
   697 bool GenerateOopMap::merge_local_state_vectors(CellTypeState* cts,
   698                                                CellTypeState* bbts) {
   699   int i;
   700   int len = _max_locals + _stack_top;
   701   bool change = false;
   703   for (i = len - 1; i >= 0; i--) {
   704     CellTypeState v = cts[i].merge(bbts[i], i);
   705     change = change || !v.equal(bbts[i]);
   706     bbts[i] = v;
   707   }
   709   return change;
   710 }
   712 // Merge the monitor stack state from cts into bbts.
   713 bool GenerateOopMap::merge_monitor_state_vectors(CellTypeState* cts,
   714                                                  CellTypeState* bbts) {
   715   bool change = false;
   716   if (_max_monitors > 0 && _monitor_top != bad_monitors) {
   717     // If there are no monitors in the program, or there has been
   718     // a monitor matching error before this point in the program,
   719     // then we do not merge in the monitor state.
   721     int base = _max_locals + _max_stack;
   722     int len = base + _monitor_top;
   723     for (int i = len - 1; i >= base; i--) {
   724       CellTypeState v = cts[i].merge(bbts[i], i);
   726       // Can we prove that, when there has been a change, it will already
   727       // have been detected at this point?  That would make this equal
   728       // check here unnecessary.
   729       change = change || !v.equal(bbts[i]);
   730       bbts[i] = v;
   731     }
   732   }
   734   return change;
   735 }
   737 void GenerateOopMap::copy_state(CellTypeState *dst, CellTypeState *src) {
   738   int len = _max_locals + _stack_top;
   739   for (int i = 0; i < len; i++) {
   740     if (src[i].is_nonlock_reference()) {
   741       dst[i] = CellTypeState::make_slot_ref(i);
   742     } else {
   743       dst[i] = src[i];
   744     }
   745   }
   746   if (_max_monitors > 0 && _monitor_top != bad_monitors) {
   747     int base = _max_locals + _max_stack;
   748     len = base + _monitor_top;
   749     for (int i = base; i < len; i++) {
   750       dst[i] = src[i];
   751     }
   752   }
   753 }
   756 // Merge the states for the current block and the next.  As long as a
   757 // block is reachable the locals and stack must be merged.  If the
   758 // stack heights don't match then this is a verification error and
   759 // it's impossible to interpret the code.  Simultaneously monitor
   760 // states are being check to see if they nest statically.  If monitor
   761 // depths match up then their states are merged.  Otherwise the
   762 // mismatch is simply recorded and interpretation continues since
   763 // monitor matching is purely informational and doesn't say anything
   764 // about the correctness of the code.
   765 void GenerateOopMap::merge_state_into_bb(BasicBlock *bb) {
   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     typeArrayOop exct  = method()->exception_table();
  1185     for(int i = 0; i< exct->length(); i+=4) {
  1186       int start_pc   = exct->int_at(i);
  1187       int end_pc     = exct->int_at(i+1);
  1188       int handler_pc = exct->int_at(i+2);
  1189       int catch_type = exct->int_at(i+3);
  1191       if (start_pc <= bci && bci < end_pc) {
  1192         BasicBlock *excBB = get_basic_block_at(handler_pc);
  1193         CellTypeState *excStk = excBB->stack();
  1194         CellTypeState *cOpStck = stack();
  1195         CellTypeState cOpStck_0 = cOpStck[0];
  1196         int cOpStackTop = _stack_top;
  1198         // Exception stacks are always the same.
  1199         assert(method()->max_stack() > 0, "sanity check");
  1201         // We remembered the size and first element of "cOpStck"
  1202         // above; now we temporarily set them to the appropriate
  1203         // values for an exception handler. */
  1204         cOpStck[0] = CellTypeState::make_slot_ref(_max_locals);
  1205         _stack_top = 1;
  1207         merge_state_into_bb(excBB);
  1209         // Now undo the temporary change.
  1210         cOpStck[0] = cOpStck_0;
  1211         _stack_top = cOpStackTop;
  1213         // If this is a "catch all" handler, then we do not need to
  1214         // consider any additional handlers.
  1215         if (catch_type == 0) {
  1216           return;
  1222   // It is possible that none of the exception handlers would have caught
  1223   // the exception.  In this case, we will exit the method.  We must
  1224   // ensure that the monitor stack is empty in this case.
  1225   if (_monitor_top == 0) {
  1226     return;
  1229   // We pessimistically assume that this exception can escape the
  1230   // method. (It is possible that it will always be caught, but
  1231   // we don't care to analyse the types of the catch clauses.)
  1233   // We don't set _monitor_top to bad_monitors because there are no successors
  1234   // to this exceptional exit.
  1236   if (TraceMonitorMismatch && _monitor_safe) {
  1237     // We check _monitor_safe so that we only report the first mismatched
  1238     // exceptional exit.
  1239     report_monitor_mismatch("non-empty monitor stack at exceptional exit");
  1241   _monitor_safe = false;
  1245 void GenerateOopMap::report_monitor_mismatch(const char *msg) {
  1246 #ifndef PRODUCT
  1247   tty->print("    Monitor mismatch in method ");
  1248   method()->print_short_name(tty);
  1249   tty->print_cr(": %s", msg);
  1250 #endif
  1253 void GenerateOopMap::print_states(outputStream *os,
  1254                                   CellTypeState* vec, int num) {
  1255   for (int i = 0; i < num; i++) {
  1256     vec[i].print(tty);
  1260 // Print the state values at the current bytecode.
  1261 void GenerateOopMap::print_current_state(outputStream   *os,
  1262                                          BytecodeStream *currentBC,
  1263                                          bool            detailed) {
  1265   if (detailed) {
  1266     os->print("     %4d vars     = ", currentBC->bci());
  1267     print_states(os, vars(), _max_locals);
  1268     os->print("    %s", Bytecodes::name(currentBC->code()));
  1269     switch(currentBC->code()) {
  1270       case Bytecodes::_invokevirtual:
  1271       case Bytecodes::_invokespecial:
  1272       case Bytecodes::_invokestatic:
  1273       case Bytecodes::_invokedynamic:
  1274       case Bytecodes::_invokeinterface:
  1275         int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache();
  1276         constantPoolOop cp    = method()->constants();
  1277         int nameAndTypeIdx    = cp->name_and_type_ref_index_at(idx);
  1278         int signatureIdx      = cp->signature_ref_index_at(nameAndTypeIdx);
  1279         Symbol* signature     = cp->symbol_at(signatureIdx);
  1280         os->print("%s", signature->as_C_string());
  1282     os->cr();
  1283     os->print("          stack    = ");
  1284     print_states(os, stack(), _stack_top);
  1285     os->cr();
  1286     if (_monitor_top != bad_monitors) {
  1287       os->print("          monitors = ");
  1288       print_states(os, monitors(), _monitor_top);
  1289     } else {
  1290       os->print("          [bad monitor stack]");
  1292     os->cr();
  1293   } else {
  1294     os->print("    %4d  vars = '%s' ", currentBC->bci(),  state_vec_to_string(vars(), _max_locals));
  1295     os->print("     stack = '%s' ", state_vec_to_string(stack(), _stack_top));
  1296     if (_monitor_top != bad_monitors) {
  1297       os->print("  monitors = '%s'  \t%s", state_vec_to_string(monitors(), _monitor_top), Bytecodes::name(currentBC->code()));
  1298     } else {
  1299       os->print("  [bad monitor stack]");
  1301     switch(currentBC->code()) {
  1302       case Bytecodes::_invokevirtual:
  1303       case Bytecodes::_invokespecial:
  1304       case Bytecodes::_invokestatic:
  1305       case Bytecodes::_invokedynamic:
  1306       case Bytecodes::_invokeinterface:
  1307         int idx = currentBC->has_index_u4() ? currentBC->get_index_u4() : currentBC->get_index_u2_cpcache();
  1308         constantPoolOop cp    = method()->constants();
  1309         int nameAndTypeIdx    = cp->name_and_type_ref_index_at(idx);
  1310         int signatureIdx      = cp->signature_ref_index_at(nameAndTypeIdx);
  1311         Symbol* signature     = cp->symbol_at(signatureIdx);
  1312         os->print("%s", signature->as_C_string());
  1314     os->cr();
  1318 // Sets the current state to be the state after executing the
  1319 // current instruction, starting in the current state.
  1320 void GenerateOopMap::interp1(BytecodeStream *itr) {
  1321   if (TraceNewOopMapGeneration) {
  1322     print_current_state(tty, itr, TraceNewOopMapGenerationDetailed);
  1325   // Should we report the results? Result is reported *before* the instruction at the current bci is executed.
  1326   // However, not for calls. For calls we do not want to include the arguments, so we postpone the reporting until
  1327   // they have been popped (in method ppl).
  1328   if (_report_result == true) {
  1329     switch(itr->code()) {
  1330       case Bytecodes::_invokevirtual:
  1331       case Bytecodes::_invokespecial:
  1332       case Bytecodes::_invokestatic:
  1333       case Bytecodes::_invokedynamic:
  1334       case Bytecodes::_invokeinterface:
  1335         _itr_send = itr;
  1336         _report_result_for_send = true;
  1337         break;
  1338       default:
  1339        fill_stackmap_for_opcodes(itr, vars(), stack(), _stack_top);
  1340        break;
  1344   // abstract interpretation of current opcode
  1345   switch(itr->code()) {
  1346     case Bytecodes::_nop:                                           break;
  1347     case Bytecodes::_goto:                                          break;
  1348     case Bytecodes::_goto_w:                                        break;
  1349     case Bytecodes::_iinc:                                          break;
  1350     case Bytecodes::_return:            do_return_monitor_check();
  1351                                         break;
  1353     case Bytecodes::_aconst_null:
  1354     case Bytecodes::_new:               ppush1(CellTypeState::make_line_ref(itr->bci()));
  1355                                         break;
  1357     case Bytecodes::_iconst_m1:
  1358     case Bytecodes::_iconst_0:
  1359     case Bytecodes::_iconst_1:
  1360     case Bytecodes::_iconst_2:
  1361     case Bytecodes::_iconst_3:
  1362     case Bytecodes::_iconst_4:
  1363     case Bytecodes::_iconst_5:
  1364     case Bytecodes::_fconst_0:
  1365     case Bytecodes::_fconst_1:
  1366     case Bytecodes::_fconst_2:
  1367     case Bytecodes::_bipush:
  1368     case Bytecodes::_sipush:            ppush1(valCTS);             break;
  1370     case Bytecodes::_lconst_0:
  1371     case Bytecodes::_lconst_1:
  1372     case Bytecodes::_dconst_0:
  1373     case Bytecodes::_dconst_1:          ppush(vvCTS);               break;
  1375     case Bytecodes::_ldc2_w:            ppush(vvCTS);               break;
  1377     case Bytecodes::_ldc:               // fall through:
  1378     case Bytecodes::_ldc_w:             do_ldc(itr->bci());         break;
  1380     case Bytecodes::_iload:
  1381     case Bytecodes::_fload:             ppload(vCTS, itr->get_index()); break;
  1383     case Bytecodes::_lload:
  1384     case Bytecodes::_dload:             ppload(vvCTS,itr->get_index()); break;
  1386     case Bytecodes::_aload:             ppload(rCTS, itr->get_index()); break;
  1388     case Bytecodes::_iload_0:
  1389     case Bytecodes::_fload_0:           ppload(vCTS, 0);            break;
  1390     case Bytecodes::_iload_1:
  1391     case Bytecodes::_fload_1:           ppload(vCTS, 1);            break;
  1392     case Bytecodes::_iload_2:
  1393     case Bytecodes::_fload_2:           ppload(vCTS, 2);            break;
  1394     case Bytecodes::_iload_3:
  1395     case Bytecodes::_fload_3:           ppload(vCTS, 3);            break;
  1397     case Bytecodes::_lload_0:
  1398     case Bytecodes::_dload_0:           ppload(vvCTS, 0);           break;
  1399     case Bytecodes::_lload_1:
  1400     case Bytecodes::_dload_1:           ppload(vvCTS, 1);           break;
  1401     case Bytecodes::_lload_2:
  1402     case Bytecodes::_dload_2:           ppload(vvCTS, 2);           break;
  1403     case Bytecodes::_lload_3:
  1404     case Bytecodes::_dload_3:           ppload(vvCTS, 3);           break;
  1406     case Bytecodes::_aload_0:           ppload(rCTS, 0);            break;
  1407     case Bytecodes::_aload_1:           ppload(rCTS, 1);            break;
  1408     case Bytecodes::_aload_2:           ppload(rCTS, 2);            break;
  1409     case Bytecodes::_aload_3:           ppload(rCTS, 3);            break;
  1411     case Bytecodes::_iaload:
  1412     case Bytecodes::_faload:
  1413     case Bytecodes::_baload:
  1414     case Bytecodes::_caload:
  1415     case Bytecodes::_saload:            pp(vrCTS, vCTS); break;
  1417     case Bytecodes::_laload:            pp(vrCTS, vvCTS);  break;
  1418     case Bytecodes::_daload:            pp(vrCTS, vvCTS); break;
  1420     case Bytecodes::_aaload:            pp_new_ref(vrCTS, itr->bci()); break;
  1422     case Bytecodes::_istore:
  1423     case Bytecodes::_fstore:            ppstore(vCTS, itr->get_index()); break;
  1425     case Bytecodes::_lstore:
  1426     case Bytecodes::_dstore:            ppstore(vvCTS, itr->get_index()); break;
  1428     case Bytecodes::_astore:            do_astore(itr->get_index());     break;
  1430     case Bytecodes::_istore_0:
  1431     case Bytecodes::_fstore_0:          ppstore(vCTS, 0);           break;
  1432     case Bytecodes::_istore_1:
  1433     case Bytecodes::_fstore_1:          ppstore(vCTS, 1);           break;
  1434     case Bytecodes::_istore_2:
  1435     case Bytecodes::_fstore_2:          ppstore(vCTS, 2);           break;
  1436     case Bytecodes::_istore_3:
  1437     case Bytecodes::_fstore_3:          ppstore(vCTS, 3);           break;
  1439     case Bytecodes::_lstore_0:
  1440     case Bytecodes::_dstore_0:          ppstore(vvCTS, 0);          break;
  1441     case Bytecodes::_lstore_1:
  1442     case Bytecodes::_dstore_1:          ppstore(vvCTS, 1);          break;
  1443     case Bytecodes::_lstore_2:
  1444     case Bytecodes::_dstore_2:          ppstore(vvCTS, 2);          break;
  1445     case Bytecodes::_lstore_3:
  1446     case Bytecodes::_dstore_3:          ppstore(vvCTS, 3);          break;
  1448     case Bytecodes::_astore_0:          do_astore(0);               break;
  1449     case Bytecodes::_astore_1:          do_astore(1);               break;
  1450     case Bytecodes::_astore_2:          do_astore(2);               break;
  1451     case Bytecodes::_astore_3:          do_astore(3);               break;
  1453     case Bytecodes::_iastore:
  1454     case Bytecodes::_fastore:
  1455     case Bytecodes::_bastore:
  1456     case Bytecodes::_castore:
  1457     case Bytecodes::_sastore:           ppop(vvrCTS);               break;
  1458     case Bytecodes::_lastore:
  1459     case Bytecodes::_dastore:           ppop(vvvrCTS);              break;
  1460     case Bytecodes::_aastore:           ppop(rvrCTS);               break;
  1462     case Bytecodes::_pop:               ppop_any(1);                break;
  1463     case Bytecodes::_pop2:              ppop_any(2);                break;
  1465     case Bytecodes::_dup:               ppdupswap(1, "11");         break;
  1466     case Bytecodes::_dup_x1:            ppdupswap(2, "121");        break;
  1467     case Bytecodes::_dup_x2:            ppdupswap(3, "1321");       break;
  1468     case Bytecodes::_dup2:              ppdupswap(2, "2121");       break;
  1469     case Bytecodes::_dup2_x1:           ppdupswap(3, "21321");      break;
  1470     case Bytecodes::_dup2_x2:           ppdupswap(4, "214321");     break;
  1471     case Bytecodes::_swap:              ppdupswap(2, "12");         break;
  1473     case Bytecodes::_iadd:
  1474     case Bytecodes::_fadd:
  1475     case Bytecodes::_isub:
  1476     case Bytecodes::_fsub:
  1477     case Bytecodes::_imul:
  1478     case Bytecodes::_fmul:
  1479     case Bytecodes::_idiv:
  1480     case Bytecodes::_fdiv:
  1481     case Bytecodes::_irem:
  1482     case Bytecodes::_frem:
  1483     case Bytecodes::_ishl:
  1484     case Bytecodes::_ishr:
  1485     case Bytecodes::_iushr:
  1486     case Bytecodes::_iand:
  1487     case Bytecodes::_ior:
  1488     case Bytecodes::_ixor:
  1489     case Bytecodes::_l2f:
  1490     case Bytecodes::_l2i:
  1491     case Bytecodes::_d2f:
  1492     case Bytecodes::_d2i:
  1493     case Bytecodes::_fcmpl:
  1494     case Bytecodes::_fcmpg:             pp(vvCTS, vCTS); break;
  1496     case Bytecodes::_ladd:
  1497     case Bytecodes::_dadd:
  1498     case Bytecodes::_lsub:
  1499     case Bytecodes::_dsub:
  1500     case Bytecodes::_lmul:
  1501     case Bytecodes::_dmul:
  1502     case Bytecodes::_ldiv:
  1503     case Bytecodes::_ddiv:
  1504     case Bytecodes::_lrem:
  1505     case Bytecodes::_drem:
  1506     case Bytecodes::_land:
  1507     case Bytecodes::_lor:
  1508     case Bytecodes::_lxor:              pp(vvvvCTS, vvCTS); break;
  1510     case Bytecodes::_ineg:
  1511     case Bytecodes::_fneg:
  1512     case Bytecodes::_i2f:
  1513     case Bytecodes::_f2i:
  1514     case Bytecodes::_i2c:
  1515     case Bytecodes::_i2s:
  1516     case Bytecodes::_i2b:               pp(vCTS, vCTS); break;
  1518     case Bytecodes::_lneg:
  1519     case Bytecodes::_dneg:
  1520     case Bytecodes::_l2d:
  1521     case Bytecodes::_d2l:               pp(vvCTS, vvCTS); break;
  1523     case Bytecodes::_lshl:
  1524     case Bytecodes::_lshr:
  1525     case Bytecodes::_lushr:             pp(vvvCTS, vvCTS); break;
  1527     case Bytecodes::_i2l:
  1528     case Bytecodes::_i2d:
  1529     case Bytecodes::_f2l:
  1530     case Bytecodes::_f2d:               pp(vCTS, vvCTS); break;
  1532     case Bytecodes::_lcmp:              pp(vvvvCTS, vCTS); break;
  1533     case Bytecodes::_dcmpl:
  1534     case Bytecodes::_dcmpg:             pp(vvvvCTS, vCTS); break;
  1536     case Bytecodes::_ifeq:
  1537     case Bytecodes::_ifne:
  1538     case Bytecodes::_iflt:
  1539     case Bytecodes::_ifge:
  1540     case Bytecodes::_ifgt:
  1541     case Bytecodes::_ifle:
  1542     case Bytecodes::_tableswitch:       ppop1(valCTS);
  1543                                         break;
  1544     case Bytecodes::_ireturn:
  1545     case Bytecodes::_freturn:           do_return_monitor_check();
  1546                                         ppop1(valCTS);
  1547                                         break;
  1548     case Bytecodes::_if_icmpeq:
  1549     case Bytecodes::_if_icmpne:
  1550     case Bytecodes::_if_icmplt:
  1551     case Bytecodes::_if_icmpge:
  1552     case Bytecodes::_if_icmpgt:
  1553     case Bytecodes::_if_icmple:         ppop(vvCTS);
  1554                                         break;
  1556     case Bytecodes::_lreturn:           do_return_monitor_check();
  1557                                         ppop(vvCTS);
  1558                                         break;
  1560     case Bytecodes::_dreturn:           do_return_monitor_check();
  1561                                         ppop(vvCTS);
  1562                                         break;
  1564     case Bytecodes::_if_acmpeq:
  1565     case Bytecodes::_if_acmpne:         ppop(rrCTS);                 break;
  1567     case Bytecodes::_jsr:               do_jsr(itr->dest());         break;
  1568     case Bytecodes::_jsr_w:             do_jsr(itr->dest_w());       break;
  1570     case Bytecodes::_getstatic:         do_field(true,  true,  itr->get_index_u2_cpcache(), itr->bci()); break;
  1571     case Bytecodes::_putstatic:         do_field(false, true,  itr->get_index_u2_cpcache(), itr->bci()); break;
  1572     case Bytecodes::_getfield:          do_field(true,  false, itr->get_index_u2_cpcache(), itr->bci()); break;
  1573     case Bytecodes::_putfield:          do_field(false, false, itr->get_index_u2_cpcache(), itr->bci()); break;
  1575     case Bytecodes::_invokevirtual:
  1576     case Bytecodes::_invokespecial:     do_method(false, false, itr->get_index_u2_cpcache(), itr->bci()); break;
  1577     case Bytecodes::_invokestatic:      do_method(true,  false, itr->get_index_u2_cpcache(), itr->bci()); break;
  1578     case Bytecodes::_invokedynamic:     do_method(true,  false, itr->get_index_u4(),         itr->bci()); break;
  1579     case Bytecodes::_invokeinterface:   do_method(false, true,  itr->get_index_u2_cpcache(), itr->bci()); break;
  1580     case Bytecodes::_newarray:
  1581     case Bytecodes::_anewarray:         pp_new_ref(vCTS, itr->bci()); break;
  1582     case Bytecodes::_checkcast:         do_checkcast(); break;
  1583     case Bytecodes::_arraylength:
  1584     case Bytecodes::_instanceof:        pp(rCTS, vCTS); break;
  1585     case Bytecodes::_monitorenter:      do_monitorenter(itr->bci()); break;
  1586     case Bytecodes::_monitorexit:       do_monitorexit(itr->bci()); break;
  1588     case Bytecodes::_athrow:            // handled by do_exception_edge() BUT ...
  1589                                         // vlh(apple): do_exception_edge() does not get
  1590                                         // called if method has no exception handlers
  1591                                         if ((!_has_exceptions) && (_monitor_top > 0)) {
  1592                                           _monitor_safe = false;
  1594                                         break;
  1596     case Bytecodes::_areturn:           do_return_monitor_check();
  1597                                         ppop1(refCTS);
  1598                                         break;
  1599     case Bytecodes::_ifnull:
  1600     case Bytecodes::_ifnonnull:         ppop1(refCTS); break;
  1601     case Bytecodes::_multianewarray:    do_multianewarray(*(itr->bcp()+3), itr->bci()); break;
  1603     case Bytecodes::_wide:              fatal("Iterator should skip this bytecode"); break;
  1604     case Bytecodes::_ret:                                           break;
  1606     // Java opcodes
  1607     case Bytecodes::_lookupswitch:      ppop1(valCTS);             break;
  1609     default:
  1610          tty->print("unexpected opcode: %d\n", itr->code());
  1611          ShouldNotReachHere();
  1612     break;
  1616 void GenerateOopMap::check_type(CellTypeState expected, CellTypeState actual) {
  1617   if (!expected.equal_kind(actual)) {
  1618     verify_error("wrong type on stack (found: %c expected: %c)", actual.to_char(), expected.to_char());
  1622 void GenerateOopMap::ppstore(CellTypeState *in, int loc_no) {
  1623   while(!(*in).is_bottom()) {
  1624     CellTypeState expected =*in++;
  1625     CellTypeState actual   = pop();
  1626     check_type(expected, actual);
  1627     assert(loc_no >= 0, "sanity check");
  1628     set_var(loc_no++, actual);
  1632 void GenerateOopMap::ppload(CellTypeState *out, int loc_no) {
  1633   while(!(*out).is_bottom()) {
  1634     CellTypeState out1 = *out++;
  1635     CellTypeState vcts = get_var(loc_no);
  1636     assert(out1.can_be_reference() || out1.can_be_value(),
  1637            "can only load refs. and values.");
  1638     if (out1.is_reference()) {
  1639       assert(loc_no>=0, "sanity check");
  1640       if (!vcts.is_reference()) {
  1641         // We were asked to push a reference, but the type of the
  1642         // variable can be something else
  1643         _conflict = true;
  1644         if (vcts.can_be_uninit()) {
  1645           // It is a ref-uninit conflict (at least). If there are other
  1646           // problems, we'll get them in the next round
  1647           add_to_ref_init_set(loc_no);
  1648           vcts = out1;
  1649         } else {
  1650           // It wasn't a ref-uninit conflict. So must be a
  1651           // ref-val or ref-pc conflict. Split the variable.
  1652           record_refval_conflict(loc_no);
  1653           vcts = out1;
  1655         push(out1); // recover...
  1656       } else {
  1657         push(vcts); // preserve reference.
  1659       // Otherwise it is a conflict, but one that verification would
  1660       // have caught if illegal. In particular, it can't be a topCTS
  1661       // resulting from mergeing two difference pcCTS's since the verifier
  1662       // would have rejected any use of such a merge.
  1663     } else {
  1664       push(out1); // handle val/init conflict
  1666     loc_no++;
  1670 void GenerateOopMap::ppdupswap(int poplen, const char *out) {
  1671   CellTypeState actual[5];
  1672   assert(poplen < 5, "this must be less than length of actual vector");
  1674   // pop all arguments
  1675   for(int i = 0; i < poplen; i++) actual[i] = pop();
  1677   // put them back
  1678   char push_ch = *out++;
  1679   while (push_ch != '\0') {
  1680     int idx = push_ch - '1';
  1681     assert(idx >= 0 && idx < poplen, "wrong arguments");
  1682     push(actual[idx]);
  1683     push_ch = *out++;
  1687 void GenerateOopMap::ppop1(CellTypeState out) {
  1688   CellTypeState actual = pop();
  1689   check_type(out, actual);
  1692 void GenerateOopMap::ppop(CellTypeState *out) {
  1693   while (!(*out).is_bottom()) {
  1694     ppop1(*out++);
  1698 void GenerateOopMap::ppush1(CellTypeState in) {
  1699   assert(in.is_reference() | in.is_value(), "sanity check");
  1700   push(in);
  1703 void GenerateOopMap::ppush(CellTypeState *in) {
  1704   while (!(*in).is_bottom()) {
  1705     ppush1(*in++);
  1709 void GenerateOopMap::pp(CellTypeState *in, CellTypeState *out) {
  1710   ppop(in);
  1711   ppush(out);
  1714 void GenerateOopMap::pp_new_ref(CellTypeState *in, int bci) {
  1715   ppop(in);
  1716   ppush1(CellTypeState::make_line_ref(bci));
  1719 void GenerateOopMap::ppop_any(int poplen) {
  1720   if (_stack_top >= poplen) {
  1721     _stack_top -= poplen;
  1722   } else {
  1723     verify_error("stack underflow");
  1727 // Replace all occurences of the state 'match' with the state 'replace'
  1728 // in our current state vector.
  1729 void GenerateOopMap::replace_all_CTS_matches(CellTypeState match,
  1730                                              CellTypeState replace) {
  1731   int i;
  1732   int len = _max_locals + _stack_top;
  1733   bool change = false;
  1735   for (i = len - 1; i >= 0; i--) {
  1736     if (match.equal(_state[i])) {
  1737       _state[i] = replace;
  1741   if (_monitor_top > 0) {
  1742     int base = _max_locals + _max_stack;
  1743     len = base + _monitor_top;
  1744     for (i = len - 1; i >= base; i--) {
  1745       if (match.equal(_state[i])) {
  1746         _state[i] = replace;
  1752 void GenerateOopMap::do_checkcast() {
  1753   CellTypeState actual = pop();
  1754   check_type(refCTS, actual);
  1755   push(actual);
  1758 void GenerateOopMap::do_monitorenter(int bci) {
  1759   CellTypeState actual = pop();
  1760   if (_monitor_top == bad_monitors) {
  1761     return;
  1764   // Bail out when we get repeated locks on an identical monitor.  This case
  1765   // isn't too hard to handle and can be made to work if supporting nested
  1766   // redundant synchronized statements becomes a priority.
  1767   //
  1768   // See also "Note" in do_monitorexit(), below.
  1769   if (actual.is_lock_reference()) {
  1770     _monitor_top = bad_monitors;
  1771     _monitor_safe = false;
  1773     if (TraceMonitorMismatch) {
  1774       report_monitor_mismatch("nested redundant lock -- bailout...");
  1776     return;
  1779   CellTypeState lock = CellTypeState::make_lock_ref(bci);
  1780   check_type(refCTS, actual);
  1781   if (!actual.is_info_top()) {
  1782     replace_all_CTS_matches(actual, lock);
  1783     monitor_push(lock);
  1787 void GenerateOopMap::do_monitorexit(int bci) {
  1788   CellTypeState actual = pop();
  1789   if (_monitor_top == bad_monitors) {
  1790     return;
  1792   check_type(refCTS, actual);
  1793   CellTypeState expected = monitor_pop();
  1794   if (!actual.is_lock_reference() || !expected.equal(actual)) {
  1795     // The monitor we are exiting is not verifiably the one
  1796     // on the top of our monitor stack.  This causes a monitor
  1797     // mismatch.
  1798     _monitor_top = bad_monitors;
  1799     _monitor_safe = false;
  1801     // We need to mark this basic block as changed so that
  1802     // this monitorexit will be visited again.  We need to
  1803     // do this to ensure that we have accounted for the
  1804     // possibility that this bytecode will throw an
  1805     // exception.
  1806     BasicBlock* bb = get_basic_block_containing(bci);
  1807     bb->set_changed(true);
  1808     bb->_monitor_top = bad_monitors;
  1810     if (TraceMonitorMismatch) {
  1811       report_monitor_mismatch("improper monitor pair");
  1813   } else {
  1814     // This code is a fix for the case where we have repeated
  1815     // locking of the same object in straightline code.  We clear
  1816     // out the lock when it is popped from the monitor stack
  1817     // and replace it with an unobtrusive reference value that can
  1818     // be locked again.
  1819     //
  1820     // Note: when generateOopMap is fixed to properly handle repeated,
  1821     //       nested, redundant locks on the same object, then this
  1822     //       fix will need to be removed at that time.
  1823     replace_all_CTS_matches(actual, CellTypeState::make_line_ref(bci));
  1827 void GenerateOopMap::do_return_monitor_check() {
  1828   if (_monitor_top > 0) {
  1829     // The monitor stack must be empty when we leave the method
  1830     // for the monitors to be properly matched.
  1831     _monitor_safe = false;
  1833     // Since there are no successors to the *return bytecode, it
  1834     // isn't necessary to set _monitor_top to bad_monitors.
  1836     if (TraceMonitorMismatch) {
  1837       report_monitor_mismatch("non-empty monitor stack at return");
  1842 void GenerateOopMap::do_jsr(int targ_bci) {
  1843   push(CellTypeState::make_addr(targ_bci));
  1848 void GenerateOopMap::do_ldc(int bci) {
  1849   Bytecode_loadconstant ldc(method(), bci);
  1850   constantPoolOop cp  = method()->constants();
  1851   BasicType       bt  = ldc.result_type();
  1852   CellTypeState   cts = (bt == T_OBJECT) ? CellTypeState::make_line_ref(bci) : valCTS;
  1853   // Make sure bt==T_OBJECT is the same as old code (is_pointer_entry).
  1854   // Note that CONSTANT_MethodHandle entries are u2 index pairs, not pointer-entries,
  1855   // and they are processed by _fast_aldc and the CP cache.
  1856   assert((ldc.has_cache_index() || cp->is_object_entry(ldc.pool_index()))
  1857          ? (bt == T_OBJECT) : true, "expected object type");
  1858   ppush1(cts);
  1861 void GenerateOopMap::do_multianewarray(int dims, int bci) {
  1862   assert(dims >= 1, "sanity check");
  1863   for(int i = dims -1; i >=0; i--) {
  1864     ppop1(valCTS);
  1866   ppush1(CellTypeState::make_line_ref(bci));
  1869 void GenerateOopMap::do_astore(int idx) {
  1870   CellTypeState r_or_p = pop();
  1871   if (!r_or_p.is_address() && !r_or_p.is_reference()) {
  1872     // We actually expected ref or pc, but we only report that we expected a ref. It does not
  1873     // really matter (at least for now)
  1874     verify_error("wrong type on stack (found: %c, expected: {pr})", r_or_p.to_char());
  1875     return;
  1877   set_var(idx, r_or_p);
  1880 // Copies bottom/zero terminated CTS string from "src" into "dst".
  1881 //   Does NOT terminate with a bottom. Returns the number of cells copied.
  1882 int GenerateOopMap::copy_cts(CellTypeState *dst, CellTypeState *src) {
  1883   int idx = 0;
  1884   while (!src[idx].is_bottom()) {
  1885     dst[idx] = src[idx];
  1886     idx++;
  1888   return idx;
  1891 void GenerateOopMap::do_field(int is_get, int is_static, int idx, int bci) {
  1892   // Dig up signature for field in constant pool
  1893   constantPoolOop cp     = method()->constants();
  1894   int nameAndTypeIdx     = cp->name_and_type_ref_index_at(idx);
  1895   int signatureIdx       = cp->signature_ref_index_at(nameAndTypeIdx);
  1896   Symbol* signature      = cp->symbol_at(signatureIdx);
  1898   // Parse signature (espcially simple for fields)
  1899   assert(signature->utf8_length() > 0, "field signatures cannot have zero length");
  1900   // The signature is UFT8 encoded, but the first char is always ASCII for signatures.
  1901   char sigch = (char)*(signature->base());
  1902   CellTypeState temp[4];
  1903   CellTypeState *eff  = sigchar_to_effect(sigch, bci, temp);
  1905   CellTypeState in[4];
  1906   CellTypeState *out;
  1907   int i =  0;
  1909   if (is_get) {
  1910     out = eff;
  1911   } else {
  1912     out = epsilonCTS;
  1913     i   = copy_cts(in, eff);
  1915   if (!is_static) in[i++] = CellTypeState::ref;
  1916   in[i] = CellTypeState::bottom;
  1917   assert(i<=3, "sanity check");
  1918   pp(in, out);
  1921 void GenerateOopMap::do_method(int is_static, int is_interface, int idx, int bci) {
  1922  // Dig up signature for field in constant pool
  1923   constantPoolOop cp  = _method->constants();
  1924   Symbol* signature   = cp->signature_ref_at(idx);
  1926   // Parse method signature
  1927   CellTypeState out[4];
  1928   CellTypeState in[MAXARGSIZE+1];   // Includes result
  1929   ComputeCallStack cse(signature);
  1931   // Compute return type
  1932   int res_length=  cse.compute_for_returntype(out);
  1934   // Temporary hack.
  1935   if (out[0].equal(CellTypeState::ref) && out[1].equal(CellTypeState::bottom)) {
  1936     out[0] = CellTypeState::make_line_ref(bci);
  1939   assert(res_length<=4, "max value should be vv");
  1941   // Compute arguments
  1942   int arg_length = cse.compute_for_parameters(is_static != 0, in);
  1943   assert(arg_length<=MAXARGSIZE, "too many locals");
  1945   // Pop arguments
  1946   for (int i = arg_length - 1; i >= 0; i--) ppop1(in[i]);// Do args in reverse order.
  1948   // Report results
  1949   if (_report_result_for_send == true) {
  1950      fill_stackmap_for_opcodes(_itr_send, vars(), stack(), _stack_top);
  1951      _report_result_for_send = false;
  1954   // Push return address
  1955   ppush(out);
  1958 // This is used to parse the signature for fields, since they are very simple...
  1959 CellTypeState *GenerateOopMap::sigchar_to_effect(char sigch, int bci, CellTypeState *out) {
  1960   // Object and array
  1961   if (sigch=='L' || sigch=='[') {
  1962     out[0] = CellTypeState::make_line_ref(bci);
  1963     out[1] = CellTypeState::bottom;
  1964     return out;
  1966   if (sigch == 'J' || sigch == 'D' ) return vvCTS;  // Long and Double
  1967   if (sigch == 'V' ) return epsilonCTS;             // Void
  1968   return vCTS;                                      // Otherwise
  1971 long GenerateOopMap::_total_byte_count = 0;
  1972 elapsedTimer GenerateOopMap::_total_oopmap_time;
  1974 // This function assumes "bcs" is at a "ret" instruction and that the vars
  1975 // state is valid for that instruction. Furthermore, the ret instruction
  1976 // must be the last instruction in "bb" (we store information about the
  1977 // "ret" in "bb").
  1978 void GenerateOopMap::ret_jump_targets_do(BytecodeStream *bcs, jmpFct_t jmpFct, int varNo, int *data) {
  1979   CellTypeState ra = vars()[varNo];
  1980   if (!ra.is_good_address()) {
  1981     verify_error("ret returns from two jsr subroutines?");
  1982     return;
  1984   int target = ra.get_info();
  1986   RetTableEntry* rtEnt = _rt.find_jsrs_for_target(target);
  1987   int bci = bcs->bci();
  1988   for (int i = 0; i < rtEnt->nof_jsrs(); i++) {
  1989     int target_bci = rtEnt->jsrs(i);
  1990     // Make sure a jrtRet does not set the changed bit for dead basicblock.
  1991     BasicBlock* jsr_bb    = get_basic_block_containing(target_bci - 1);
  1992     debug_only(BasicBlock* target_bb = &jsr_bb[1];)
  1993     assert(target_bb  == get_basic_block_at(target_bci), "wrong calc. of successor basicblock");
  1994     bool alive = jsr_bb->is_alive();
  1995     if (TraceNewOopMapGeneration) {
  1996       tty->print("pc = %d, ret -> %d alive: %s\n", bci, target_bci, alive ? "true" : "false");
  1998     if (alive) jmpFct(this, target_bci, data);
  2002 //
  2003 // Debug method
  2004 //
  2005 char* GenerateOopMap::state_vec_to_string(CellTypeState* vec, int len) {
  2006 #ifdef ASSERT
  2007   int checklen = MAX3(_max_locals, _max_stack, _max_monitors) + 1;
  2008   assert(len < checklen, "state_vec_buf overflow");
  2009 #endif
  2010   for (int i = 0; i < len; i++) _state_vec_buf[i] = vec[i].to_char();
  2011   _state_vec_buf[len] = 0;
  2012   return _state_vec_buf;
  2015 void GenerateOopMap::print_time() {
  2016   tty->print_cr ("Accumulated oopmap times:");
  2017   tty->print_cr ("---------------------------");
  2018   tty->print_cr ("  Total : %3.3f sec.", GenerateOopMap::_total_oopmap_time.seconds());
  2019   tty->print_cr ("  (%3.0f bytecodes per sec) ",
  2020   GenerateOopMap::_total_byte_count / GenerateOopMap::_total_oopmap_time.seconds());
  2023 //
  2024 //  ============ Main Entry Point ===========
  2025 //
  2026 GenerateOopMap::GenerateOopMap(methodHandle method) {
  2027   // We have to initialize all variables here, that can be queried directly
  2028   _method = method;
  2029   _max_locals=0;
  2030   _init_vars = NULL;
  2032 #ifndef PRODUCT
  2033   // If we are doing a detailed trace, include the regular trace information.
  2034   if (TraceNewOopMapGenerationDetailed) {
  2035     TraceNewOopMapGeneration = true;
  2037 #endif
  2040 void GenerateOopMap::compute_map(TRAPS) {
  2041 #ifndef PRODUCT
  2042   if (TimeOopMap2) {
  2043     method()->print_short_name(tty);
  2044     tty->print("  ");
  2046   if (TimeOopMap) {
  2047     _total_byte_count += method()->code_size();
  2049 #endif
  2050   TraceTime t_single("oopmap time", TimeOopMap2);
  2051   TraceTime t_all(NULL, &_total_oopmap_time, TimeOopMap);
  2053   // Initialize values
  2054   _got_error      = false;
  2055   _conflict       = false;
  2056   _max_locals     = method()->max_locals();
  2057   _max_stack      = method()->max_stack();
  2058   _has_exceptions = (method()->exception_table()->length() > 0);
  2059   _nof_refval_conflicts = 0;
  2060   _init_vars      = new GrowableArray<intptr_t>(5);  // There are seldom more than 5 init_vars
  2061   _report_result  = false;
  2062   _report_result_for_send = false;
  2063   _new_var_map    = NULL;
  2064   _ret_adr_tos    = new GrowableArray<intptr_t>(5);  // 5 seems like a good number;
  2065   _did_rewriting  = false;
  2066   _did_relocation = false;
  2068   if (TraceNewOopMapGeneration) {
  2069     tty->print("Method name: %s\n", method()->name()->as_C_string());
  2070     if (Verbose) {
  2071       _method->print_codes();
  2072       tty->print_cr("Exception table:");
  2073       typeArrayOop excps = method()->exception_table();
  2074       for(int i = 0; i < excps->length(); i += 4) {
  2075         tty->print_cr("[%d - %d] -> %d", excps->int_at(i + 0), excps->int_at(i + 1), excps->int_at(i + 2));
  2080   // if no code - do nothing
  2081   // compiler needs info
  2082   if (method()->code_size() == 0 || _max_locals + method()->max_stack() == 0) {
  2083     fill_stackmap_prolog(0);
  2084     fill_stackmap_epilog();
  2085     return;
  2087   // Step 1: Compute all jump targets and their return value
  2088   if (!_got_error)
  2089     _rt.compute_ret_table(_method);
  2091   // Step 2: Find all basic blocks and count GC points
  2092   if (!_got_error)
  2093     mark_bbheaders_and_count_gc_points();
  2095   // Step 3: Calculate stack maps
  2096   if (!_got_error)
  2097     do_interpretation();
  2099   // Step 4:Return results
  2100   if (!_got_error && report_results())
  2101      report_result();
  2103   if (_got_error) {
  2104     THROW_HANDLE(_exception);
  2108 // Error handling methods
  2109 // These methods create an exception for the current thread which is thrown
  2110 // at the bottom of the call stack, when it returns to compute_map().  The
  2111 // _got_error flag controls execution.  NOT TODO: The VM exception propagation
  2112 // mechanism using TRAPS/CHECKs could be used here instead but it would need
  2113 // to be added as a parameter to every function and checked for every call.
  2114 // The tons of extra code it would generate didn't seem worth the change.
  2115 //
  2116 void GenerateOopMap::error_work(const char *format, va_list ap) {
  2117   _got_error = true;
  2118   char msg_buffer[512];
  2119   vsnprintf(msg_buffer, sizeof(msg_buffer), format, ap);
  2120   // Append method name
  2121   char msg_buffer2[512];
  2122   jio_snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg_buffer, method()->name()->as_C_string());
  2123   _exception = Exceptions::new_exception(Thread::current(),
  2124                 vmSymbols::java_lang_LinkageError(), msg_buffer2);
  2127 void GenerateOopMap::report_error(const char *format, ...) {
  2128   va_list ap;
  2129   va_start(ap, format);
  2130   error_work(format, ap);
  2133 void GenerateOopMap::verify_error(const char *format, ...) {
  2134   // We do not distinguish between different types of errors for verification
  2135   // errors.  Let the verifier give a better message.
  2136   const char *msg = "Illegal class file encountered. Try running with -Xverify:all";
  2137   _got_error = true;
  2138   // Append method name
  2139   char msg_buffer2[512];
  2140   jio_snprintf(msg_buffer2, sizeof(msg_buffer2), "%s in method %s", msg,
  2141                method()->name()->as_C_string());
  2142   _exception = Exceptions::new_exception(Thread::current(),
  2143                 vmSymbols::java_lang_LinkageError(), msg_buffer2);
  2146 //
  2147 // Report result opcodes
  2148 //
  2149 void GenerateOopMap::report_result() {
  2151   if (TraceNewOopMapGeneration) tty->print_cr("Report result pass");
  2153   // We now want to report the result of the parse
  2154   _report_result = true;
  2156   // Prolog code
  2157   fill_stackmap_prolog(_gc_points);
  2159    // Mark everything changed, then do one interpretation pass.
  2160   for (int i = 0; i<_bb_count; i++) {
  2161     if (_basic_blocks[i].is_reachable()) {
  2162       _basic_blocks[i].set_changed(true);
  2163       interp_bb(&_basic_blocks[i]);
  2167   // Note: Since we are skipping dead-code when we are reporting results, then
  2168   // the no. of encountered gc-points might be fewer than the previously number
  2169   // we have counted. (dead-code is a pain - it should be removed before we get here)
  2170   fill_stackmap_epilog();
  2172   // Report initvars
  2173   fill_init_vars(_init_vars);
  2175   _report_result = false;
  2178 void GenerateOopMap::result_for_basicblock(int bci) {
  2179  if (TraceNewOopMapGeneration) tty->print_cr("Report result pass for basicblock");
  2181   // We now want to report the result of the parse
  2182   _report_result = true;
  2184   // Find basicblock and report results
  2185   BasicBlock* bb = get_basic_block_containing(bci);
  2186   assert(bb->is_reachable(), "getting result from unreachable basicblock");
  2187   bb->set_changed(true);
  2188   interp_bb(bb);
  2191 //
  2192 // Conflict handling code
  2193 //
  2195 void GenerateOopMap::record_refval_conflict(int varNo) {
  2196   assert(varNo>=0 && varNo< _max_locals, "index out of range");
  2198   if (TraceOopMapRewrites) {
  2199      tty->print("### Conflict detected (local no: %d)\n", varNo);
  2202   if (!_new_var_map) {
  2203     _new_var_map = NEW_RESOURCE_ARRAY(int, _max_locals);
  2204     for (int k = 0; k < _max_locals; k++)  _new_var_map[k] = k;
  2207   if ( _new_var_map[varNo] == varNo) {
  2208     // Check if max. number of locals has been reached
  2209     if (_max_locals + _nof_refval_conflicts >= MAX_LOCAL_VARS) {
  2210       report_error("Rewriting exceeded local variable limit");
  2211       return;
  2213     _new_var_map[varNo] = _max_locals + _nof_refval_conflicts;
  2214     _nof_refval_conflicts++;
  2218 void GenerateOopMap::rewrite_refval_conflicts()
  2220   // We can get here two ways: Either a rewrite conflict was detected, or
  2221   // an uninitialize reference was detected. In the second case, we do not
  2222   // do any rewriting, we just want to recompute the reference set with the
  2223   // new information
  2225   int nof_conflicts = 0;              // Used for debugging only
  2227   if ( _nof_refval_conflicts == 0 )
  2228      return;
  2230   // Check if rewrites are allowed in this parse.
  2231   if (!allow_rewrites() && !IgnoreRewrites) {
  2232     fatal("Rewriting method not allowed at this stage");
  2236   // This following flag is to tempoary supress rewrites. The locals that might conflict will
  2237   // all be set to contain values. This is UNSAFE - however, until the rewriting has been completely
  2238   // tested it is nice to have.
  2239   if (IgnoreRewrites) {
  2240     if (Verbose) {
  2241        tty->print("rewrites suppressed for local no. ");
  2242        for (int l = 0; l < _max_locals; l++) {
  2243          if (_new_var_map[l] != l) {
  2244            tty->print("%d ", l);
  2245            vars()[l] = CellTypeState::value;
  2248        tty->cr();
  2251     // That was that...
  2252     _new_var_map = NULL;
  2253     _nof_refval_conflicts = 0;
  2254     _conflict = false;
  2256     return;
  2259   // Tracing flag
  2260   _did_rewriting = true;
  2262   if (TraceOopMapRewrites) {
  2263     tty->print_cr("ref/value conflict for method %s - bytecodes are getting rewritten", method()->name()->as_C_string());
  2264     method()->print();
  2265     method()->print_codes();
  2268   assert(_new_var_map!=NULL, "nothing to rewrite");
  2269   assert(_conflict==true, "We should not be here");
  2271   compute_ret_adr_at_TOS();
  2272   if (!_got_error) {
  2273     for (int k = 0; k < _max_locals && !_got_error; k++) {
  2274       if (_new_var_map[k] != k) {
  2275         if (TraceOopMapRewrites) {
  2276           tty->print_cr("Rewriting: %d -> %d", k, _new_var_map[k]);
  2278         rewrite_refval_conflict(k, _new_var_map[k]);
  2279         if (_got_error) return;
  2280         nof_conflicts++;
  2285   assert(nof_conflicts == _nof_refval_conflicts, "sanity check");
  2287   // Adjust the number of locals
  2288   method()->set_max_locals(_max_locals+_nof_refval_conflicts);
  2289   _max_locals += _nof_refval_conflicts;
  2291   // That was that...
  2292   _new_var_map = NULL;
  2293   _nof_refval_conflicts = 0;
  2296 void GenerateOopMap::rewrite_refval_conflict(int from, int to) {
  2297   bool startOver;
  2298   do {
  2299     // Make sure that the BytecodeStream is constructed in the loop, since
  2300     // during rewriting a new method oop is going to be used, and the next time
  2301     // around we want to use that.
  2302     BytecodeStream bcs(_method);
  2303     startOver = false;
  2305     while( bcs.next() >=0 && !startOver && !_got_error) {
  2306       startOver = rewrite_refval_conflict_inst(&bcs, from, to);
  2308   } while (startOver && !_got_error);
  2311 /* If the current instruction is one that uses local variable "from"
  2312    in a ref way, change it to use "to". There's a subtle reason why we
  2313    renumber the ref uses and not the non-ref uses: non-ref uses may be
  2314    2 slots wide (double, long) which would necessitate keeping track of
  2315    whether we should add one or two variables to the method. If the change
  2316    affected the width of some instruction, returns "TRUE"; otherwise, returns "FALSE".
  2317    Another reason for moving ref's value is for solving (addr, ref) conflicts, which
  2318    both uses aload/astore methods.
  2319 */
  2320 bool GenerateOopMap::rewrite_refval_conflict_inst(BytecodeStream *itr, int from, int to) {
  2321   Bytecodes::Code bc = itr->code();
  2322   int index;
  2323   int bci = itr->bci();
  2325   if (is_aload(itr, &index) && index == from) {
  2326     if (TraceOopMapRewrites) {
  2327       tty->print_cr("Rewriting aload at bci: %d", bci);
  2329     return rewrite_load_or_store(itr, Bytecodes::_aload, Bytecodes::_aload_0, to);
  2332   if (is_astore(itr, &index) && index == from) {
  2333     if (!stack_top_holds_ret_addr(bci)) {
  2334       if (TraceOopMapRewrites) {
  2335         tty->print_cr("Rewriting astore at bci: %d", bci);
  2337       return rewrite_load_or_store(itr, Bytecodes::_astore, Bytecodes::_astore_0, to);
  2338     } else {
  2339       if (TraceOopMapRewrites) {
  2340         tty->print_cr("Supress rewriting of astore at bci: %d", bci);
  2345   return false;
  2348 // The argument to this method is:
  2349 // bc : Current bytecode
  2350 // bcN : either _aload or _astore
  2351 // bc0 : either _aload_0 or _astore_0
  2352 bool GenerateOopMap::rewrite_load_or_store(BytecodeStream *bcs, Bytecodes::Code bcN, Bytecodes::Code bc0, unsigned int varNo) {
  2353   assert(bcN == Bytecodes::_astore   || bcN == Bytecodes::_aload,   "wrong argument (bcN)");
  2354   assert(bc0 == Bytecodes::_astore_0 || bc0 == Bytecodes::_aload_0, "wrong argument (bc0)");
  2355   int ilen = Bytecodes::length_at(_method(), bcs->bcp());
  2356   int newIlen;
  2358   if (ilen == 4) {
  2359     // Original instruction was wide; keep it wide for simplicity
  2360     newIlen = 4;
  2361   } else if (varNo < 4)
  2362      newIlen = 1;
  2363   else if (varNo >= 256)
  2364      newIlen = 4;
  2365   else
  2366      newIlen = 2;
  2368   // If we need to relocate in order to patch the byte, we
  2369   // do the patching in a temp. buffer, that is passed to the reloc.
  2370   // The patching of the bytecode stream is then done by the Relocator.
  2371   // This is neccesary, since relocating the instruction at a certain bci, might
  2372   // also relocate that instruction, e.g., if a _goto before it gets widen to a _goto_w.
  2373   // Hence, we do not know which bci to patch after relocation.
  2375   assert(newIlen <= 4, "sanity check");
  2376   u_char inst_buffer[4]; // Max. instruction size is 4.
  2377   address bcp;
  2379   if (newIlen != ilen) {
  2380     // Relocation needed do patching in temp. buffer
  2381     bcp = (address)inst_buffer;
  2382   } else {
  2383     bcp = _method->bcp_from(bcs->bci());
  2386   // Patch either directly in methodOop or in temp. buffer
  2387   if (newIlen == 1) {
  2388     assert(varNo < 4, "varNo too large");
  2389     *bcp = bc0 + varNo;
  2390   } else if (newIlen == 2) {
  2391     assert(varNo < 256, "2-byte index needed!");
  2392     *(bcp + 0) = bcN;
  2393     *(bcp + 1) = varNo;
  2394   } else {
  2395     assert(newIlen == 4, "Wrong instruction length");
  2396     *(bcp + 0) = Bytecodes::_wide;
  2397     *(bcp + 1) = bcN;
  2398     Bytes::put_Java_u2(bcp+2, varNo);
  2401   if (newIlen != ilen) {
  2402     expand_current_instr(bcs->bci(), ilen, newIlen, inst_buffer);
  2406   return (newIlen != ilen);
  2409 class RelocCallback : public RelocatorListener {
  2410  private:
  2411   GenerateOopMap* _gom;
  2412  public:
  2413    RelocCallback(GenerateOopMap* gom) { _gom = gom; };
  2415   // Callback method
  2416   virtual void relocated(int bci, int delta, int new_code_length) {
  2417     _gom->update_basic_blocks  (bci, delta, new_code_length);
  2418     _gom->update_ret_adr_at_TOS(bci, delta);
  2419     _gom->_rt.update_ret_table (bci, delta);
  2421 };
  2423 // Returns true if expanding was succesful. Otherwise, reports an error and
  2424 // returns false.
  2425 void GenerateOopMap::expand_current_instr(int bci, int ilen, int newIlen, u_char inst_buffer[]) {
  2426   Thread *THREAD = Thread::current();  // Could really have TRAPS argument.
  2427   RelocCallback rcb(this);
  2428   Relocator rc(_method, &rcb);
  2429   methodHandle m= rc.insert_space_at(bci, newIlen, inst_buffer, THREAD);
  2430   if (m.is_null() || HAS_PENDING_EXCEPTION) {
  2431     report_error("could not rewrite method - exception occurred or bytecode buffer overflow");
  2432     return;
  2435   // Relocator returns a new method oop.
  2436   _did_relocation = true;
  2437   _method = m;
  2441 bool GenerateOopMap::is_astore(BytecodeStream *itr, int *index) {
  2442   Bytecodes::Code bc = itr->code();
  2443   switch(bc) {
  2444     case Bytecodes::_astore_0:
  2445     case Bytecodes::_astore_1:
  2446     case Bytecodes::_astore_2:
  2447     case Bytecodes::_astore_3:
  2448       *index = bc - Bytecodes::_astore_0;
  2449       return true;
  2450     case Bytecodes::_astore:
  2451       *index = itr->get_index();
  2452       return true;
  2454   return false;
  2457 bool GenerateOopMap::is_aload(BytecodeStream *itr, int *index) {
  2458   Bytecodes::Code bc = itr->code();
  2459   switch(bc) {
  2460     case Bytecodes::_aload_0:
  2461     case Bytecodes::_aload_1:
  2462     case Bytecodes::_aload_2:
  2463     case Bytecodes::_aload_3:
  2464       *index = bc - Bytecodes::_aload_0;
  2465       return true;
  2467     case Bytecodes::_aload:
  2468       *index = itr->get_index();
  2469       return true;
  2471   return false;
  2475 // Return true iff the top of the operand stack holds a return address at
  2476 // the current instruction
  2477 bool GenerateOopMap::stack_top_holds_ret_addr(int bci) {
  2478   for(int i = 0; i < _ret_adr_tos->length(); i++) {
  2479     if (_ret_adr_tos->at(i) == bci)
  2480       return true;
  2483   return false;
  2486 void GenerateOopMap::compute_ret_adr_at_TOS() {
  2487   assert(_ret_adr_tos != NULL, "must be initialized");
  2488   _ret_adr_tos->clear();
  2490   for (int i = 0; i < bb_count(); i++) {
  2491     BasicBlock* bb = &_basic_blocks[i];
  2493     // Make sure to only check basicblocks that are reachable
  2494     if (bb->is_reachable()) {
  2496       // For each Basic block we check all instructions
  2497       BytecodeStream bcs(_method);
  2498       bcs.set_interval(bb->_bci, next_bb_start_pc(bb));
  2500       restore_state(bb);
  2502       while (bcs.next()>=0 && !_got_error) {
  2503         // TDT: should this be is_good_address() ?
  2504         if (_stack_top > 0 && stack()[_stack_top-1].is_address()) {
  2505           _ret_adr_tos->append(bcs.bci());
  2506           if (TraceNewOopMapGeneration) {
  2507             tty->print_cr("Ret_adr TOS at bci: %d", bcs.bci());
  2510         interp1(&bcs);
  2516 void GenerateOopMap::update_ret_adr_at_TOS(int bci, int delta) {
  2517   for(int i = 0; i < _ret_adr_tos->length(); i++) {
  2518     int v = _ret_adr_tos->at(i);
  2519     if (v > bci)  _ret_adr_tos->at_put(i, v + delta);
  2523 // ===================================================================
  2525 #ifndef PRODUCT
  2526 int ResolveOopMapConflicts::_nof_invocations  = 0;
  2527 int ResolveOopMapConflicts::_nof_rewrites     = 0;
  2528 int ResolveOopMapConflicts::_nof_relocations  = 0;
  2529 #endif
  2531 methodHandle ResolveOopMapConflicts::do_potential_rewrite(TRAPS) {
  2532   compute_map(CHECK_(methodHandle()));
  2534 #ifndef PRODUCT
  2535   // Tracking and statistics
  2536   if (PrintRewrites) {
  2537     _nof_invocations++;
  2538     if (did_rewriting()) {
  2539       _nof_rewrites++;
  2540       if (did_relocation()) _nof_relocations++;
  2541       tty->print("Method was rewritten %s: ", (did_relocation()) ? "and relocated" : "");
  2542       method()->print_value(); tty->cr();
  2543       tty->print_cr("Cand.: %d rewrts: %d (%d%%) reloc.: %d (%d%%)",
  2544           _nof_invocations,
  2545           _nof_rewrites,    (_nof_rewrites    * 100) / _nof_invocations,
  2546           _nof_relocations, (_nof_relocations * 100) / _nof_invocations);
  2549 #endif
  2550   return methodHandle(THREAD, method());

mercurial